#ifndef _COMMPROC_H_
#define _COMMPROC_H_

#include "generic/typedef.h"
#include "cvp_common.h"

/*降噪版本定义*/
#define ANS_V100	0xA1
#define ANS_V200	0xA2

//aec_cfg:
typedef struct __AEC_CONFIG {
    u8 mic_again;			//DAC增益,default:3(0~14)
    u8 dac_again;			//MIC增益,default:22(0~31)
    u8 aec_mode;        	//AEC模式,default:advance(diable(0), reduce(1), advance(2))
    u8 ul_eq_en;        	//上行EQ使能,default:enable(disable(0), enable(1))
    /*AGC*/
    float ndt_fade_in;  	//单端讲话淡入步进default: 1.f(0.1 ~ 5 dB)
    float ndt_fade_out;  	//单端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
    float dt_fade_in;  		//双端讲话淡入步进default: 1.3f(0.1 ~ 5 dB)
    float dt_fade_out;  	//双端讲话淡出步进default: 0.7f(0.1 ~ 5 dB)
    float ndt_max_gain;   	//单端讲话放大上限,default: 12.f(0 ~ 24 dB)
    float ndt_min_gain;   	//单端讲话放大下限,default: 0.f(-20 ~ 24 dB)
    float ndt_speech_thr;   //单端讲话放大阈值,default: -50.f(-70 ~ -40 dB)
    float dt_max_gain;   	//双端讲话放大上限,default: 12.f(0 ~ 24 dB)
    float dt_min_gain;   	//双端讲话放大下限,default: 0.f(-20 ~ 24 dB)
    float dt_speech_thr;    //双端讲话放大阈值,default: -40.f(-70 ~ -40 dB)
    float echo_present_thr; //单端双端讲话阈值,default:-70.f(-70 ~ -40 dB)
    /*AEC*/
    float aec_dt_aggress;   //原音回音追踪等级, default: 1.0f(1 ~ 5)
    float aec_refengthr;    //进入回音消除参考值, default: -70.0f(-90 ~ -60 dB)
    /*ES*/
    float es_aggress_factor;//回音前级动态压制,越小越强,default: -3.0f(-1 ~ -5)
    float es_min_suppress;	//回音后级静态压制,越大越强,default: 4.f(0 ~ 10)
    /*ANS*/
    float ans_aggress;    	//噪声前级动态压制,越大越强default: 1.25f(1 ~ 2)
    float ans_suppress;    	//噪声后级静态压制,越小越强default: 0.04f(0 ~ 1)
} _GNU_PACKED_ AEC_CONFIG;

struct aec_s_attr {
    u8 agc_en: 1;
    u8 ul_eq_en: 1;
    u8 wideband: 1;
    u8 toggle: 1;
    u8 wn_en: 1;
    u8 dly_est : 1;
    u8 reserved: 2;

    u8 dst_delay;/*延时估计目标延时*/
    u8 EnableBit;
    u8 packet_dump;
    u8 SimplexTail;
    u8 aec_tail_length;			//AEC复杂等级:2~10,default：5
    float AGC_NDT_fade_in_step; 	//in dB
    float AGC_NDT_fade_out_step; 	//in dB
    float AGC_NDT_max_gain;     	//in dB
    float AGC_NDT_min_gain;     	//in dB
    float AGC_NDT_speech_thr;   	//in dB
    float AGC_DT_fade_in_step;  	//in dB
    float AGC_DT_fade_out_step; 	//in dB
    float AGC_DT_max_gain;      	//in dB
    float AGC_DT_min_gain;      	//in dB
    float AGC_DT_speech_thr;    	//in dB
    float AGC_echo_present_thr; 	//In dB
    int AGC_echo_look_ahead;    	//in ms
    int AGC_echo_hold;          	// in ms
    u16 hw_delay_offset;/*dac hardware delay offset*/
    u16 wn_gain;/*white_noise gain*/
    int SimplexThr;
    float ES_AggressFactor;
    float ES_MinSuppress;
    float ES_Unconverge_OverDrive;
    float ANS_AggressFactor;
    float ANS_MinSuppress;
    float ANS_NoiseLevel;
    int (*cvp_advanced_options)(void *aec,
                                void *nlp,
                                void *ns,
                                void *tde,
                                void *agc);
    int (*aec_probe)(short *mic0, short *mic2, short *mic3, short *ref, u16 len);
    int (*aec_post)(s16 *dat, u16 len);
    int (*aec_update)(u8 aec_mode);
    int (*output_handle)(s16 *dat, u16 len);
    u8 output_way;    // 0:dac  1:fm
    u8 ANS_mode;
    u8 fm_tx_start;
    u8 far_noise_gate;//default:10

    float AEC_RefEngThr;
    float AEC_DT_AggressiveFactor;
    //float AES_AggressFactor;
    //float AES_RefEngThr;

    /*Extended-Parameters*/
    u16 ref_sr;
    u16 ref_channel;    /*参考数据声道数*/
    u16 adc_ref_en;    /*adc回采参考数据使能*/

    /*DNS Parameters*/
    float DNS_GainFloor;    //最小压制 range[0:1.00]
    float DNS_OverDrive;    //降噪强度 range[0:6.0]
    float DNS_highGain;     //EQ强度   range[1.0:3.5]
    float DNS_rbRate;       //混响强度 range[0:0.9]

};

/*
*********************************************************************
*                  			AEC Init
* Description: AEC模块初始化
* Arguments  : attr	AEC模块参数
* Return	 : 0 成功 其他 失败
* Note(s)    : None.
*********************************************************************
*/
s32 aec_init(struct aec_s_attr *attr);

/*
*********************************************************************
*                  				AEC Exit
* Description: AEC退出
* Arguments  : None.
* Return	 : 0 成功 其他 失败
* Note(s)    : None.
*********************************************************************
*/
s32 aec_exit();
u32 aec_output_read(s16 *buf, u16 npoint);

/*
*********************************************************************
*                  			AEC Input
* Description: AEC源数据输入
* Arguments  : dat	参考数据
*			   len	参考数据长度
* Return	 : 0 成功 其他 失败
* Note(s)    : None.
*********************************************************************
*/
s32 aec_fill_in_data(void *dat, u16 len);

/*
*********************************************************************
*                  			AEC Reference
* Description: AEC参考数据输入
* Arguments  : dat	参考数据
*			   len	参考数据长度
* Return	 : 0 成功 其他 失败
* Note(s)    : None.
*********************************************************************
*/
s32 aec_fill_ref_data(void *dat, u16 len);

/*adc回采dac数据做ref*/
int aec_fill_in_ref_data(void *dat, u16 len);

/*
*********************************************************************
*                  			AEC Toggle
* Description: AEC bypass设置
* Arguments  : toggle	bypass开关
* Return	 : None.
* Note(s)    : 该接口用于切换算法开关，1为正常流程，0为bypass，数据
* 			   不经算法处理
*********************************************************************
*/
void aec_toggle(u8 toggle);

/*
*********************************************************************
*                  			AEC CFG Updata
* Description: AEC模块配置动态更新
* Arguments  : cfg AEC模块参数
* Return	 : 0 成功 其他 失败
* Note(s)    : 该接口用于使用过程，动态修改模块参数
*********************************************************************
*/
int aec_cfg_update(AEC_CONFIG *cfg);

/*
*********************************************************************
*                  			AEC Reboot
* Description: AEC模块重新启动
* Arguments  : enablebit 重新启动使能的模块
* Return	 : 0 成功 其他 失败
* Note(s)    : 该接口用于重新启动AEC模块
*********************************************************************
*/
int aec_reboot(u8 enablebit);

int sms_tde_init(struct aec_s_attr *attr);
int sms_tde_exit();
int sms_tde_fill_in_data(void *dat, u16 len);
int sms_tde_fill_ref_data(void *dat, u16 len);
int sms_tde_fill_in_ref_data(void *dat, u16 len);
void sms_tde_toggle(u8 toggle);
int cvp_sms_read_ref_data(void);
int cvp_sms_tde_read_ref_data(void);

#endif
