/**************************************
		SV_AEC.h
***************************************/

#include "SV_common_include.h"

#define Q_W 31
#define Nfilter_AEC_Outer 80
#define Nfilter_AEC_InEar 200
#if Nfilter_AEC_InEar > Nfilter_AEC_Outer
#define Nfilter_AEC Nfilter_AEC_InEar
#else
#define Nfilter_AEC Nfilter_AEC_Outer
#endif
typedef struct{
	// tuning paramerters
	short	DelayRx;
	short	ValClipp;
	int		Step_aec;
	int		Start_WauxUpdate_sec;

	float	Thr_AECupdate_PwrTx;
	float	Thr_AECupdate_PwrAdfin;
	float	Thr_AECupdate_PwrDiff;
	float	Thr_auxAECupdate_PwrDiff;

	// local buffer/status/variables...
	int		*W;		// Q.31
	int		*Waux;	// Q.31
	int		tx_AEC[FRAMELEN];
	int		tx_AECaux[FRAMELEN];
	int		cnt_NLMSupdate;

	float	pwrDiff_AECinout_dB;
	float	Pwr_Tx_in;

	short	frmVAD_Rx_AEC;
	short	flag_FrmDT;
	short	flag_ringbakctone;
	short   filter_len;
	// flags




}SV_AEC_T;

// Processing
extern float SV_AEC_Exe(int* Outer1_buf, int* Ref_aecin_buf,int n, SV_AEC_T* p_struct);
// Outer1_buf - PCM data where AEC must be applied
// Ref_aecin_buf - Echo reference PCM data
// n - number of samples
// p_struct - pointer to the module structure

// Get parameters
extern short AECStatus_Get_DelayRx(SV_AEC_T* p_struct);
extern short AECStatus_Get_Nfilter_AEC(SV_AEC_T* p_struct);
extern short AECStatus_Get_ValClipp(SV_AEC_T* p_struct);

// Set parameters
extern void SV_AEC_SetPar(float Pwr_Mic1, short frmVAD_Rx_AEC, SV_AEC_T* p_struct);
// flagRingBackTone, int flagFrmDT - parameters to be set
// p_struct - pointer to the module structure

// Init
extern void SV_AEC_Init(int Fs,SV_AEC_T* p_struct);
// Fs - {8000, 16000}
// p_struct - pointer to the module structure (to be initialized)
extern void SV_AEC_Init_for_InEar(int Fs, SV_AEC_T* p_struct);
extern void SV_AEC_Deinit();
