
#include "Define_config.h"
#include "SamsungSolomonVoiceW_Int.h"
//#include "SamsungSolomonVoiceW.h"

#if(FLAG_SELECT_C_DSP == 1)
#include <stdio.h>      
#include <stdlib.h> 
#endif


#define DVTX_CALL_INER     4
#define DVTX_CALL_OUTER    4

#define DVTX_FIXED_ONE(qfrac)        ((unsigned int)      1 << (qfrac))
#define DVTX_FLOAT2FIXED(R, qfrac)   ((int)((float)(R) * (float)DVTX_FIXED_ONE(qfrac) + ((R >= 0) ? 0.5f : -0.5f)))
#ifndef ALIGN64SFX
#if(FLAG_SELECT_C_DSP == 0)
#define ALIGN64SFX __attribute__ ((aligned(16)))
#else
#define ALIGN64SFX
#endif
#endif
/* AGC */
/****************************************************************************************
*	SwingFree AGC Compressor Threshold
****************************************************************************************/
#define	TX_AGC_COMPRESSOR_THRESHOLD_0DB			0			// 0dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M01DB		1			// -1dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M02DB		2			// -2dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M03DB		3 			// -3dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M04DB		4 			// -4dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M05DB		5 			// -5dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M06DB		6 			// -6dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M07DB		7 			// -7dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M08DB		8			// -8dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M09DB		9			// -9dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M10DB		10			// -10dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M11DB		11			// -11dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M12DB		12			// -12dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M13DB		13			// -13dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M14DB		14			// -14dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M15DB		15			// -15dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M16DB		16			// -16dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M17DB		17			// -17dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M18DB		18			// -18dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M19DB		19			// -19dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M20DB		20			// -20dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M21DB		21			// -21dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M22DB		22			// -22dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M23DB		23			// -23dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M24DB		24			// -24dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M25DB		25			// -25dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M26DB		26			// -26dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M27DB		27			// -27dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M28DB		28			// -28dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M29DB		29			// -29dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M30DB		30			// -30dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M31DB		31			// -31dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M32DB		32			// -32dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M33DB		33			// -33dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M34DB		34			// -34dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M35DB		35			// -35dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M36DB		36			// -36dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M37DB		37			// -37dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M38DB		38			// -38dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M39DB		39			// -39dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M40DB		40			// -40dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M41DB		41			// -41dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M42DB		42			// -42dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M43DB		43			// -43dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M44DB		44			// -44dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M45DB		45			// -45dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M46DB		46			// -46dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M47DB		47			// -47dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M48DB		48			// -48dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M49DB		49			// -49dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M50DB		50			// -50dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M51DB		51			// -51dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M52DB		52			// -52dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M53DB		53			// -53dB
#define	TX_AGC_COMPRESSOR_THRESHOLD_M54DB		54			// -54dB


/****************************************************************************************
*	SwingFree AGC Compressor Slope
****************************************************************************************/
#define	TX_AGC_COMPRESSOR_SLOPE_1P0				10			// 1.0
#define TX_AGC_COMPRESSOR_SLOPE_1P5				15			// 1.5
#define TX_AGC_COMPRESSOR_SLOPE_2P0				20			// 2.0
#define	TX_AGC_COMPRESSOR_SLOPE_2P5				25			// 2.5
#define	TX_AGC_COMPRESSOR_SLOPE_3P0				30			// 3.0
#define	TX_AGC_COMPRESSOR_SLOPE_3P5				35			// 3.5
#define	TX_AGC_COMPRESSOR_SLOPE_4P0				40			// 4.0
#define	TX_AGC_COMPRESSOR_SLOPE_4P5				45			// 4.5
#define	TX_AGC_COMPRESSOR_SLOPE_5P0				50			// 5.0
#define	TX_AGC_COMPRESSOR_SLOPE_5P5				55			// 5.5
#define	TX_AGC_COMPRESSOR_SLOPE_6P0				60			// 6.0
#define	TX_AGC_COMPRESSOR_SLOPE_6P5				65			// 6.5
#define	TX_AGC_COMPRESSOR_SLOPE_7P0				70			// 7.0
#define	TX_AGC_COMPRESSOR_SLOPE_7P5				75			// 7.5
#define	TX_AGC_COMPRESSOR_SLOPE_8P0				80			// 8.0
#define	TX_AGC_COMPRESSOR_SLOPE_8P5				85			// 8.5
#define	TX_AGC_COMPRESSOR_SLOPE_9P0				90			// 9.0
#define	TX_AGC_COMPRESSOR_SLOPE_9P5				95			// 9.5
#define	TX_AGC_COMPRESSOR_SLOPE_10P0			100			// 10.0


/****************************************************************************************
*  SwingFree AGC Expansion Threshold
****************************************************************************************/
#define	TX_AGC_EXPANSION_THRESHOLD_M55DB		55			// -55dB
#define	TX_AGC_EXPANSION_THRESHOLD_M56DB		56			// -56dB
#define	TX_AGC_EXPANSION_THRESHOLD_M57DB		57			// -57dB
#define	TX_AGC_EXPANSION_THRESHOLD_M58DB		58			// -58dB
#define	TX_AGC_EXPANSION_THRESHOLD_M59DB		59			// -59dB
#define	TX_AGC_EXPANSION_THRESHOLD_M60DB		60			// -60dB
#define	TX_AGC_EXPANSION_THRESHOLD_M61DB		61			// -61dB
#define	TX_AGC_EXPANSION_THRESHOLD_M62DB		62			// -62dB
#define	TX_AGC_EXPANSION_THRESHOLD_M63DB		63			// -63dB
#define	TX_AGC_EXPANSION_THRESHOLD_M64DB		64			// -64dB
#define	TX_AGC_EXPANSION_THRESHOLD_M65DB		65			// -65dB
#define	TX_AGC_EXPANSION_THRESHOLD_M66DB		66			// -66dB
#define	TX_AGC_EXPANSION_THRESHOLD_M67DB		67			// -67dB
#define	TX_AGC_EXPANSION_THRESHOLD_M68DB		68			// -68dB
#define	TX_AGC_EXPANSION_THRESHOLD_M69DB		69			// -69dB
#define	TX_AGC_EXPANSION_THRESHOLD_M70DB		70			// -70dB
#define	TX_AGC_EXPANSION_THRESHOLD_M71DB		71			// -71dB
#define	TX_AGC_EXPANSION_THRESHOLD_M72DB		72			// -72dB
#define	TX_AGC_EXPANSION_THRESHOLD_M73DB		73			// -73dB
#define	TX_AGC_EXPANSION_THRESHOLD_M74DB		74			// -74dB
#define	TX_AGC_EXPANSION_THRESHOLD_M75DB		75			// -75dB
#define	TX_AGC_EXPANSION_THRESHOLD_M76DB		76			// -76dB
#define	TX_AGC_EXPANSION_THRESHOLD_M77DB		77			// -77d8
#define	TX_AGC_EXPANSION_THRESHOLD_M78DB		78			// -78dB
#define	TX_AGC_EXPANSION_THRESHOLD_M79DB		79			// -79dB
#define	TX_AGC_EXPANSION_THRESHOLD_M80DB		80			// -80dB
#define	TX_AGC_EXPANSION_THRESHOLD_M81DB		81			// -81dB
#define	TX_AGC_EXPANSION_THRESHOLD_M82DB		82			// -82dB
#define	TX_AGC_EXPANSION_THRESHOLD_M83DB		83			// -83dB
#define	TX_AGC_EXPANSION_THRESHOLD_M84DB		84			// -84dB
#define	TX_AGC_EXPANSION_THRESHOLD_M85DB		85			// -85dB
#define	TX_AGC_EXPANSION_THRESHOLD_M86DB		86			// -86dB
#define	TX_AGC_EXPANSION_THRESHOLD_M87DB		87			// -87d8
#define	TX_AGC_EXPANSION_THRESHOLD_M88DB		88			// -88dB
#define	TX_AGC_EXPANSION_THRESHOLD_M89DB		89			// -89dB
#define	TX_AGC_EXPANSION_THRESHOLD_M90DB		90			// -90dB


/****************************************************************************************
*	SwingFree AGC Expansion Slope
****************************************************************************************/
#define	TX_AGC_EXPANSION_SLOPE_1_1P0			10			// 1/1.0   
#define	TX_AGC_EXPANSION_SLOPE_1_1P5			15			// 1/1.5   
#define	TX_AGC_EXPANSION_SLOPE_1_2P0			20			// 1/2.0   
#define	TX_AGC_EXPANSION_SLOPE_1_2P5			25			// 1/2.5   
#define	TX_AGC_EXPANSION_SLOPE_1_3P0			30			// 1/3.0   
#define	TX_AGC_EXPANSION_SLOPE_1_3P5			35			// 1/3.5   
#define	TX_AGC_EXPANSION_SLOPE_1_4P0			40			// 1/4.0		
#define	TX_AGC_EXPANSION_SLOPE_1_4P5			45			// 1/4.5   
#define	TX_AGC_EXPANSION_SLOPE_1_5P0			50			// 1/5.0   
#define	TX_AGC_EXPANSION_SLOPE_1_5P5			55			// 1/5.5   
#define	TX_AGC_EXPANSION_SLOPE_1_6P0			60			// 1/6.0   
#define	TX_AGC_EXPANSION_SLOPE_1_6P5			65			// 1/6.5   
#define	TX_AGC_EXPANSION_SLOPE_1_7P0			70			// 1/7.0   
#define	TX_AGC_EXPANSION_SLOPE_1_7P5			75			// 1/7.5   
#define	TX_AGC_EXPANSION_SLOPE_1_8P0			80			// 1/8.0   
#define	TX_AGC_EXPANSION_SLOPE_1_8P5			85			// 1/8.5   
#define	TX_AGC_EXPANSION_SLOPE_1_9P0			90			// 1/9.0   
#define	TX_AGC_EXPANSION_SLOPE_1_9P5			95			// 1/9.5   
#define	TX_AGC_EXPANSION_SLOPE_1_10P0   		100			// 1/10.0


//Q17
static short Gain_Echo_PSD_GEAR_WB[40] ALIGN64SFX =
{
	5,   //	63	Hz
	5,   //	94	Hz
	5,   //	125	Hz
	5,   //	188	Hz
	5,   //	250	Hz
	20,   //	344	Hz
	20,   //	438	Hz
	20,   //	531	Hz
	20,   //	656	Hz
	300,   //	781	Hz
	300,   //	906	Hz
	300,   //	1031	Hz
	300,   //	1188	Hz
	300,   //	1344	Hz
	300,   //	1500	Hz
	300,   //	1656	Hz
	300,   //	1813	Hz
	300,   //	2000	Hz
	3300,   //	2188	Hz
	300,   //	2375	Hz
	3300,   //	2563	Hz
	3300,   //	2750	Hz
	3300,   //	2938	Hz
	3300,   //	3125	Hz
	3500,   //	3313	Hz
	3500,   //	3531	Hz
	3500,   //	3750	Hz
	3500,   //	3969	Hz
	3500,   //	4219	Hz
	3500,   //	4469	Hz
	3500,   //	4719	Hz
	3500,   //	5031	Hz
	3500,   //	5344	Hz
	3500,   //	5719	Hz
	3500,   //	6094	Hz
	3500,   //	6469	Hz
	3500,   //	6844	Hz
	3500,   //	7219	Hz
	3500,   //	7594	Hz
	3500,   //	7969	Hz
};

static short FixedXi_GEAR_NB[40][3] ALIGN64SFX =
{
	{ 2, 5, 15 },//	31	~	31
{ 2, 5, 15 },//	63	~	63
{ 2, 5, 15 },//	94	~	94
{ 2, 5, 15 },//	125	~	156
{ 2, 5, 15 },//	188	~	219
{ 2, 5, 15 },//	250	~	313
{ 2, 5, 15 },//	344	~	406
{ 2, 5, 15 },//	438	~	500
{ 2, 5, 15 },//	531	~	625
{ 2, 5, 15 },//	656	~	750
{ 2, 5, 15 },//	781	~	875
{ 2, 5, 15 },//	906	~	1000
{ 2, 5, 15 },//	1031	~	1156
{ 2, 5, 15 },//	1188	~	1313
{ 2, 5, 15 },//	1344	~	1469
{ 2, 5, 15 },//	1500	~	1625
{ 2, 5, 15 },//	1656	~	1781
{ 2, 5, 15 },//	1813	~	1969
{ 2, 5, 15 },//	2000	~	2156
{ 10, 10, 15 },//	2188	~	2344
{ 10, 10, 15 },//	2375	~	2531
{ 10, 10, 15 },//	2563	~	2719
{ 10, 10, 15 },//	2750	~	2906
{ 10, 10, 15 },//	2938	~	3094
{ 10, 10, 15 },//	3125	~	3281
{ 15, 15, 15 },//	3313	~	3500
{ 15, 15, 15 },//	3531	~	3719
{ 15, 15, 15 },//	3750	~	3938
{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 },{ 15, 15, 15 }
};

//Q17
static short Gain_Echo_PSD_GEAR_NB[40] ALIGN64SFX =
{
	100,   //	63	Hz
	500,   //	94	Hz
	500,   //	125	Hz
	500,   //	188	Hz
	500,   //	250	Hz
	500,   //	344	Hz
	800,   //	438	Hz
	800,   //	531	Hz
	800,   //	656	Hz
	800,   //	781	Hz
	1800,   //	906	Hz
	1800,   //	1031	Hz
	1800,   //	1188	Hz
	5800,   //	1344	Hz
	5800,   //	1500	Hz
	5800,   //	1656	Hz
	5800,   //	1813	Hz
	32000,   //	2000	Hz
	32000,   //	2188	Hz
	32000,   //	2375	Hz
	32000,   //	2563	Hz
	32000,   //	2750	Hz
	32000,   //	2938	Hz
	32000,   //	3125	Hz
	32000,   //	3313	Hz
	32000,   //	3531	Hz
	32000,   //	3750	Hz
	32000,   //	3969	Hz
	32000,   //	4219	Hz
	32000,   //	4469	Hz
	32000,   //	4719	Hz
	32000,   //	5031	Hz
	32000,   //	5344	Hz
	32000,   //	5719	Hz
	32000,   //	6094	Hz
	32000,   //	6469	Hz
	32000,   //	6844	Hz
	32000,   //	7219	Hz
	32000,   //	7594	Hz
	32000,   //	7969	Hz
};

void Setting_Params_FRAME_param(SamsungSolomonVoiceWTxFRAMEParam* FRAME_param, short bandwidth);
void Setting_Params_AEC_Inner_param(SamsungSolomonVoiceWTxAECParam* AEC_Inner_param);
void Setting_Params_AEC_Outer_1_param(SamsungSolomonVoiceWTxAECParam* AEC_Outer_param_1);
void Setting_Params_AEC_Outer_2_param(SamsungSolomonVoiceWTxAECParam* AEC_Outer_param_2);
void Setting_Params_BF_param(SamsungSolomonVoiceWTxBFParam* BF_param);
void Setting_Params_VADACC_param(SamsungSolomonVoiceWTxVADACCParam* VADACC_param);
void Setting_Params_RES_Inner_param(SamsungSolomonVoiceWTxRESParam* RES_Inner_param);
void Setting_Params_RES_Outer_param(SamsungSolomonVoiceWTxRESParam* RES_Outer_param);
void Setting_Params_NS_Inner_param(SamsungSolomonVoiceWTxNSParam* NS_Inner_param);
void Setting_Params_NS_Outer_param(SamsungSolomonVoiceWTxNSParam* NS_Outer_param);
void Setting_Params_PreNS_Inner_param(SamsungSolomonVoiceWTxPRENSParam* PreNS_param);
void Setting_Params_PreNS_Outer_param(SamsungSolomonVoiceWTxPRENSParam* PreNS_param);
void Setting_Params_ANC_Inner_param(SamsungSolomonVoiceWTxANCParam* ANC_param);
void Setting_Params_ANC_Outer_param(SamsungSolomonVoiceWTxANCParam* ANC_param);
void Setting_Params_Mix_param(SamsungSolomonVoiceWTxMixParam* Mix_param);
void Setting_Params_AGC_NSIN_param(SamsungSolomonVoiceWTxAGCParam* AGC_param);
void Setting_Params_AGC_NSOUT_param(SamsungSolomonVoiceWTxAGCParam* AGC_param);
void Setting_Params_MBDRC_param(SamsungSolomonVoiceWTxMBDRCParam* MBDRC_param);
void Setting_Params_FIR_param(SamsungSolomonVoiceWTxFIRParam* FIR_param);
int FN_NBcall_ParaConfig(SamsungSolomonVoiceWTxNSParam* NS_Outer_param, SamsungSolomonVoiceWTxAECParam* AEC_Outer_param);

#if(FLAG_SELECT_C_DSP == 1)
int SamsungSolomonVoiceEngineInOutConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_Rx_Inner, short *Speech_Rx_Outer, short *Speech_Tx_Acc, short *OutSignal,
	short *Output_buf_Inner_NB, short *Output_buf_Inner_WB, short *Output_buf_Outer);
#else
int SamsungSolomonVoiceEngineInOutConfig(SamsungSolomonVoiceEngine_Handle_t* SamsungDiamondVoiceEngine_vars_Tx,
	short *Speech_Tx_Inner, short *Speech_Tx_Outer_1, short *Speech_Tx_Outer_2, short *Speech_Rx_Inner, short *Speech_Rx_Outer, short *Speech_Tx_Acc, short *OutSignal);
#endif
