optek_echo_reverb_configuration.c 5.7 KB
#include "os_config.h"

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

#include "app_sdram.h"

#include"optek_hifi2_echo_reverb.h"


#ifdef MIC_REVERB

/*mic reverb*/
#define MIC_DELAY_FIFO_SIZE	(18 * 64)//64ms

#define MIC_REVERB_SAMPLES 8

#define MAX_TAPS (8+2)

#if 1
#define COMB1_DELAY	783   
#define COMB2_DELAY	801   
#define COMB3_DELAY	849   
#define COMB4_DELAY	897   
#define COMB5_DELAY	967   
#define COMB6_DELAY	997   
#define COMB7_DELAY	1073   
#define COMB8_DELAY	1117
 
#define AFH1_DELAY	371       
#define AFH2_DELAY	499 
#else
#define COMB1_DELAY	583   
#define COMB2_DELAY	601   
#define COMB3_DELAY	649   
#define COMB4_DELAY	697   
#define COMB5_DELAY	767   
#define COMB6_DELAY	797   
#define COMB7_DELAY	873   
#define COMB8_DELAY	917
 
#define AFH1_DELAY	371       
#define AFH2_DELAY	499 
#endif


/*gains:  0x08000000 = 1  MAX = 0x80000000-1 */ 
#define MIC_GAIN   (0x08000000)
#define EARLY_GAIN (0x08000000>>4)
#define COMB1_GAIN (0x07b00000)
#define COMB2_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB2_DELAY)
#define COMB3_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB3_DELAY)
#define COMB4_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB4_DELAY)
#define COMB5_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB5_DELAY)
#define COMB6_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB6_DELAY)
#define COMB7_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB7_DELAY)
#define COMB8_GAIN (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*COMB8_DELAY)
#define AFH1_GAIN  (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*AFH1_DELAY)
#define AFH2_GAIN  (0x08000000-(0x08000000-COMB1_GAIN)/COMB1_DELAY*AFH2_DELAY)

const int mic_reverb_gains[2+MAX_TAPS] = {
	MIC_GAIN,
	EARLY_GAIN,
	COMB1_GAIN,
	COMB2_GAIN,
	COMB3_GAIN,
	COMB4_GAIN,
	COMB5_GAIN,
	COMB6_GAIN,
	COMB7_GAIN,
	COMB8_GAIN,
	AFH1_GAIN,
	AFH2_GAIN
};
short mic_reverb_delays[MAX_TAPS] = {COMB1_DELAY, COMB2_DELAY, COMB3_DELAY, COMB4_DELAY,COMB5_DELAY, COMB6_DELAY, COMB7_DELAY, COMB8_DELAY, AFH1_DELAY,AFH2_DELAY};


#define OPTEK_DAPP_MAX_REVERB_BAND	4

const int coef_reverb_band[OPTEK_DAPP_MAX_REVERB_BAND*6] = {
#if 0 
	0x40000000,0x03a92bc0,0x07525780,0x03a92bc0,0xb1fde187,0x1ca6cd7b,
	0x40000000,0x03a92bc0,0x07525780,0x03a92bc0,0xb1fde187,0x1ca6cd7b,
#else	
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x3fb08ec4,0x80d39383,0x3f7c45d7,0x80d6988c,0x3f2fd9a6,
0x40000000,0x3f8cdd00,0x80e645ff,0x3f8cdd00,0x80e71522,0x3f1a8923,
#endif
};


int reverb_gain = 0x08000000;
void *mic_reverb_obj = NULL;

void optek_mic_set_reverb_gain(void * objmem,int reverb_gain)
{
	if (objmem == NULL) return;
	DBG_Printf("reverb gain:0x%x\n",(mic_reverb_gains[1]>>11)*(reverb_gain>>16));
	optek_mic_set_early_gain(objmem,(mic_reverb_gains[1]>>11)*(reverb_gain>>16));
}

U32 reverb_mem[1024*37/4];

void optek_hifi2_reverb_init(void)
{
	int n_mems;
	void *mem_alloced;
	n_mems = 	optek_mic_reverb_alloc(MAX_TAPS,mic_reverb_delays,MIC_DELAY_FIFO_SIZE,MIC_REVERB_SAMPLES,OPTEK_DAPP_MAX_REVERB_BAND);
	DBG_Printf("reverb n_mems:%d\n",n_mems);
	if (n_mems > sizeof(reverb_mem))
	{
		mic_reverb_obj = 0;
		DBG_Printf("reverb memery fatal error\n");
		delayms(6000);
		return;
	}
	
	mem_alloced = (void *)reverb_mem;
	mic_reverb_obj = optek_mic_reverb_open (mem_alloced, mic_reverb_gains, mic_reverb_delays, MAX_TAPS,MIC_DELAY_FIFO_SIZE,
		MIC_REVERB_SAMPLES, OPTEK_DAPP_MAX_REVERB_BAND, coef_reverb_band);
	optek_mic_set_reverb_gain(mic_reverb_obj,reverb_gain);
}
#endif


#ifdef MIC_ECHO

U32 mic_echo_buffer[20000/4];

void *mic_echo_obj = NULL;

#define ECHO_EARLY_GAIN 	(0x04000000)
#define ECHO_DECAY_GAIN   	(0x05000000)
#define MAX_ECHO_DELAY        220//ms
#define INIT_ECHO_DELAY        220//ms
#define SAVE_BUFFER       FALSE

#define OPTEK_DAPP_MAX_ECHO_BAND	2

const int coef_echo_band[OPTEK_DAPP_MAX_ECHO_BAND*6] = {
#if 1 
	0x40000000,0x0B57FB85,0x16AFF70A,0x0B57FB85,0xDF712C0A,0x0DEEC20A,
	0x40000000,0x0B57FB85,0x16AFF70A,0x0B57FB85,0xDF712C0A,0x0DEEC20A,
#else
/*
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x08cdcd57,0xfeedd47c,0x02700771,0xa383e792,0x26a7c1b3,
0x40000000,0x3fb08ec4,0x80d39383,0x3f7c45d7,0x80d6988c,0x3f2fd9a6,
0x40000000,0x3f8cdd00,0x80e645ff,0x3f8cdd00,0x80e71522,0x3f1a8923,
*/
#endif
};


void optek_mic_set_echo_gain(void * objmem,int echo_gain)
{
	if (objmem == NULL) return;
	DBG_Printf("echo gain:0x%x\n",(ECHO_EARLY_GAIN>>11)*(echo_gain>>16));
	optek_mic_set_echo_early_gain(objmem,(ECHO_EARLY_GAIN>>11)*(echo_gain>>16));
}

U16 echo_delay_ms = 0;
void optek_mic_set_echo_delayms_plus(void)
{
	echo_delay_ms += 10;
	if (echo_delay_ms > MAX_ECHO_DELAY)
		echo_delay_ms = MAX_ECHO_DELAY;

	DBG_Printf("delayms:%d",echo_delay_ms);
	optek_mic_set_echo_delayms(mic_echo_obj,echo_delay_ms);
}
void optek_mic_set_echo_delayms_minus(void)
{
	if (echo_delay_ms >= 10)
		echo_delay_ms -= 10;
	else
		echo_delay_ms = 0;
	DBG_Printf("delayms:%d",echo_delay_ms);

	optek_mic_set_echo_delayms(mic_echo_obj,echo_delay_ms);
}

void optek_hifi2_echo_init(void)
{
	int n_mems;
	void *mem_alloced;
	
	optek_mic_echo_init();
	
	n_mems = 	optek_mic_echo_alloc(MAX_ECHO_DELAY,SAVE_BUFFER,OPTEK_DAPP_MAX_ECHO_BAND);
	DBG_Printf("echo n_mems:%d\n",n_mems);
	if (n_mems > sizeof(mic_echo_buffer))
	{
		mic_echo_obj = 0;
		DBG_Printf("echo memery not enough\n");
		delayms(6000);
		return;
	}
	echo_delay_ms = INIT_ECHO_DELAY;
	mem_alloced = (void *)mic_echo_buffer;
	mic_echo_obj = optek_mic_echo_open (mem_alloced,ECHO_EARLY_GAIN,ECHO_DECAY_GAIN,MAX_ECHO_DELAY,SAVE_BUFFER,
										OPTEK_DAPP_MAX_ECHO_BAND,coef_echo_band);
	optek_mic_set_echo_gain(mic_echo_obj,0x08000000);
	optek_mic_set_echo_delayms(mic_echo_obj,echo_delay_ms);
}

#endif