optek_mic_processing_collection.c 6.06 KB
#include "os_config.h"

#include "common.h"

#include "c_def.h"
#include "debug.h"
#include "oem.h"

#include "codec.h"

#include "optek_hifi2_dapp.h"

#include "../dsp/optek_hifi2_bqriir.h"

#include "../dsp/optek_hifi2_vol.h"
#include "../dsp/optek_hifi2_drc_vol.h"
#include "../dsp/optek_hifi2_drc.h"
#include "../dsp//optek_hifi2_mixer.h"
#include "../dsp//optek_hifi2_3D.h"
#include "../dsp//optek_vol_table.h"
#include "../dsp//optek_hifi2_ebass.h"

#include "app_dac.h"

#include "app_main.h"
//#include "prompt_tone.h"
#include "optek_hifi2_echo_reverb.h"


#ifdef MIC_DODGE_ENABLE

/*******************************************
mic dodge (mic  priority) 
mic 16bit music 24bit
*******************************************/
#define MIC_DODGE_THRESHOLD 0x100
#define MIC_DODGE_LEVER_A 	optek_vol_vol_table[240+300]//-(300/10)db
#define MIC_DODGE_LEVER_R 	optek_vol_vol_table[240+300+2]//-(300/10)db
#define MIC_DODGE_UP_RATE 	optek_vol_up_rate[1] //0.01db/ms
#define MIC_DODGE_DOWN_RATE optek_vol_down_rate[1]//0.01db/ms

struct{
	U16 mic_dodge_threshold;
	int mic_dodge_processing_buffer[100/4];
	void * mic_dodge_handle;
	U8  mic_dodge_on;
	U8  mic_dodge_enable;
} mic_dodge;

void optek_mic_dodge_init(void)
{
	mic_dodge.mic_dodge_threshold = MIC_DODGE_THRESHOLD;
	mic_dodge.mic_dodge_on = FALSE;
	mic_dodge.mic_dodge_enable = FALSE;

	mic_dodge.mic_dodge_handle =  optek_drc_vol_open (mic_dodge.mic_dodge_processing_buffer, 0x80000000, 0x80000000, MIC_DODGE_DOWN_RATE, MIC_DODGE_UP_RATE, 
					OPTEK_DRC_LEV_DOWN_RATE_0P0001DB, 0x0,DAPP_0p1MS_SAMPLES_44_1kHz);
	optek_drc_vol_open_vol (mic_dodge.mic_dodge_handle, 0x08000000, 0x08000000, 0x08000000, OPTEK_VOL_UP_RATE_0P2DB,
					 OPTEK_VOL_DOWN_RATE_0P2DB, 0, 0);

	optek_drc_vol_set_vol (mic_dodge.mic_dodge_handle, 0x08000000, 0x08000000);
	optek_drc_vol_set_mute_off(mic_dodge.mic_dodge_handle);
}
void optek_mic_dodge_open(void)
{
	mic_dodge.mic_dodge_enable = TRUE;
}
void optek_mic_dodge_close(void)
{
	mic_dodge.mic_dodge_enable = FALSE;
}
static void optek_mic_dodge_on(void)
{
	DBG_Printf("dodge on\n");
	optek_drc_vol_set_drc(mic_dodge.mic_dodge_handle, MIC_DODGE_LEVER_A, MIC_DODGE_LEVER_R, MIC_DODGE_DOWN_RATE, MIC_DODGE_UP_RATE, 
				OPTEK_DRC_LEV_DOWN_RATE_0P0005DB, 0,DAPP_0p1MS_SAMPLES_44_1kHz);
}

static void optek_mic_dodge_off(void)
{
	DBG_Printf("dodge off\n");
	optek_drc_vol_set_drc(mic_dodge.mic_dodge_handle, 0x80000000, 0x80000000, MIC_DODGE_DOWN_RATE, MIC_DODGE_UP_RATE, 
				OPTEK_DRC_LEV_DOWN_RATE_0P0001DB, 0x0,DAPP_0p1MS_SAMPLES_44_1kHz);
}

void optek_mic_dodge_processing(int * pmusic,U16 samples,U16 mic_level)
{
	if (mic_dodge.mic_dodge_enable)
	{
		if (mic_level > mic_dodge.mic_dodge_threshold)
		{
			if (!mic_dodge.mic_dodge_on)
			{
				mic_dodge.mic_dodge_on = TRUE;
				optek_mic_dodge_on();
			}
		}
		else if (mic_level < (mic_dodge.mic_dodge_threshold>>1))
		{
			if (mic_dodge.mic_dodge_on)
			{
				mic_dodge.mic_dodge_on = FALSE;
				optek_mic_dodge_off();
			}
		}
		optek_drc_soft_vol_stereo_24b_process (mic_dodge.mic_dodge_handle, pmusic, pmusic, samples);
	}
}
#endif

#ifdef MIC_VOCAL_REMOVER_ENABLE

int ssub2InterStereo( short *xlr, int nums, short *out );


U8 vocal_mode;
void *vocal_remover_lpf;//for keep bass
enum {
	AUDIO_NORMAL = 0,	//L/R chanal
	AUDIO_LL,	//L chanal
	AUDIO_RR,	//R chanal
	AUDIO_VOCAL_CUT	//L/R chanal cut vocal
};

//  4*6
const int coef_vocal_remover[4*6] = {
			0x40000000,
	0x0452ebc1,0xf8253661,0x039c4ca6,0x82eb764b,0x3d28f87e,
			0x40000000,
	0x0452ebc1,0xf8253661,0x039c4ca6,0x82eb764b,0x3d28f87e,
			0x40000000,
	0x0452ebc1,0xf8253661,0x039c4ca6,0x82eb764b,0x3d28f87e,
			0x40000000,
	0x0452ebc1,0xf8253661,0x039c4ca6,0x82eb764b,0x3d28f87e,
};

U8 vocal_remover_filter_mem[300];
void vocal_remover_init(void)
{
	void *mem_alloced;
	mem_alloced = vocal_remover_filter_mem;
	vocal_mode = AUDIO_NORMAL;
	vocal_remover_lpf = optek_bqriir_open(mem_alloced, 4,coef_vocal_remover);  //   4
}

void vacal_mode_switch(void)
{
	switch(vocal_mode)
	{
		case AUDIO_NORMAL:
			vocal_mode = AUDIO_VOCAL_CUT;
			break;
		case AUDIO_LL:
			vocal_mode = AUDIO_RR;
			break;
		case AUDIO_RR:
			vocal_mode = AUDIO_VOCAL_CUT;
			break;
		case AUDIO_VOCAL_CUT:
			vocal_mode = AUDIO_NORMAL;
			break;
	}
	DBG_Printf("vacal mode switch to:%d\n",vocal_mode);
}

void optek_vocal_remover_processing(short * pmusic,U16 byte_len)
{
	short *voice_cancel = pmusic + byte_len/2;
	u32 i;
	
	switch(vocal_mode)
	{
		case AUDIO_NORMAL:
			break;
		case AUDIO_LL:
			for(i=0; i<byte_len/2; i+=2)
			{
				pmusic[i+1] = pmusic[i];
			}
			break;
		case AUDIO_RR:
			for(i=0;i<byte_len/2;i+=2)
			{
				pmusic[i] = pmusic[i+1];
			}
			break;
		case AUDIO_VOCAL_CUT:
			optek_bqdiir_stereo_16b_process(vocal_remover_lpf,voice_cancel, pmusic,byte_len/2);
				
			ssub2InterStereo(pmusic,byte_len/2,pmusic);//l-R
			//mono to stereo
			for(i=0;i<byte_len/4;i++)
			{
				int temp;
				temp = pmusic[byte_len/4 - i - 1] + voice_cancel[byte_len/2 - 2*i -1];
				if(temp>=0x8000)
					temp = 0x7fff;
				else if (temp <= -0x7fff)
					temp = -0x7fff;
				
				pmusic[byte_len/2 - 2*i -1] = temp;
					
				temp=pmusic[byte_len/4 - i - 1] + voice_cancel[byte_len/2 - 2*i -2];
				if(temp>=0x8000)
					temp = 0x7fff;
				else if (temp <= -0x7fff)
					temp = -0x7fff;				

				pmusic[byte_len/2 - 2*i -2]  = temp;					
			}
			break;
	}	
}
#endif

#ifdef MIC_EQ_ENABLE
#define MIC_EQ_CNT 4
const int coef_mic_eq[MIC_EQ_CNT*6] = {
/*
		0x4000000,
0x0003428b,0x00068517,0x0003428b,0x829428f4,0x3d78e13c,
		0x40000000,
0x0003428b,0x00068517,0x0003428b,0x829428f4,0x3d78e13c,
*/

		0x40000000,
		0x40000000,   
		0x0,   
		0x0,   
		0x0,   
		0x0,

		0x40000000,
		0x40000000,   
		0x0,   
		0x0,   
		0x0,   
		0x0,

		0x40000000,
		0x40000000,   
		0x0,   
		0x0,   
		0x0,   
		0x0,

		0x40000000,
		0x40000000,   
		0x0,   
		0x0,   
		0x0,   
		0x0,
};

U8 mic_eq_filter_mem[300];
void *mic_eq_filter;
void mic_eq_init(void)
{
	void *mem_alloced;
	mem_alloced = mic_eq_filter_mem;
	mic_eq_filter = optek_bqriir_open(mem_alloced, MIC_EQ_CNT,coef_mic_eq);
}

void optek_mic_eq_processing(short * pmic,U16 byte_len)
{
	optek_bqdiir_mono_16b_process(mic_eq_filter,pmic, pmic,byte_len/2);
}

#endif