/**************************************
		SV_AGC.h
***************************************/

#include "SV_common_include.h"

#define PEAKPreAGC_KNEETABLE_LEN	4
#define ATTACK_RELEASE_LEN			3
#define LONGTERMBUFLEN_MAX			200
#define DELAY_BUF_SIZE				4800
#define LOOKFORWARD_TIME			1
#define QGAIN_L						22
#define MAX_FS						48000

#define QINPCM						15
#define NOISEBITS					0
#define QTAU						(24-8)

typedef struct {
	int		*p_wrptr;
	int		dly;
	int		dly_buf[DELAY_BUF_SIZE];
}DelayBuf_T;

typedef struct{
	int			samplerate;

	int			lookForwardTime;
	int			kneeLen;

	int			xknee_tbl[PEAKPreAGC_KNEETABLE_LEN];
	int			yknee_tbl[PEAKPreAGC_KNEETABLE_LEN];

	float		attack_tbl[ATTACK_RELEASE_LEN];
	float		release_tbl[ATTACK_RELEASE_LEN];

	int			tau_attack;
	int			tau_release;

	int			gain_var;
	int			gain_dec_sm;
	int			gain_dec_sm_prev;

	int			longterm_idx;
	int			longtermBuflen;
	int			longtermVal;
	int			tau_attack_longterm;
	int			tau_release_longterm;
	INT64		longterm_buf[LONGTERMBUFLEN_MAX];

	DelayBuf_T	delay_buf_struct;
}SV_AGC_T;

// Processing
extern void SV_AGC_2ch_Exe(int* inout1, int* inout2, int n, SV_AGC_T* p_struct);
// inout - PCM data where AEC must be applied
// n - number of samples
// p_struct - pointer to the module structure

// Init
extern void SV_AGC_Init(int Fs, SV_AGC_T* p_struct);
// Fs - {8000, 16000}
// p_struct - pointer to the module structure (to be initialized)
