#ifndef DRC_H_
#define DRC_H_

typedef short spx_int16_t;
typedef int spx_int32_t;
typedef long long spx_word64_t;
typedef unsigned int spx_uint32_t;
typedef spx_int16_t spx_word16_t;
typedef spx_int32_t spx_word32_t;
#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
#define SH32(a,shift) (((shift)>=0) ? ((a) << (shift)) : ((a) >> (-(shift))))
#define MULT32_32_Q14(a, b) (spx_word32_t)(((spx_word64_t)(a)*(spx_word64_t)(b))>>14)
#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits))))
#define ABS32(x)  ((x) < 0 ? (-(x)) :(x))
#define MULT32_32_Q16(a, b) (spx_word32_t)(((spx_word64_t)(a)*(spx_word64_t)(b)) >>16)

static __inline int MULSHIFT32(int x, int y)
{
    return (int)(((int64_t)x * y) >> 32);
}
// 定义64位整数类型用于高精度计算
#define __int64 int64_t

// 可选的信号检测模式配置
//#define ONLY_PEAK_OR_RMS  // 启用峰值或RMS检测选择
#ifdef ONLY_PEAK_OR_RMS
/* 选择使用峰值或RMS计算增益变化 */
#define PEAKSEL 1  // 1=使用峰值检测，0=使用RMS检测
#endif

// 启用的优化特性
#define MODIFIED_PEAKDETECT   // 改进的峰值检测算法
#define MODIFIED_PRECISION    // 改进的精度处理
#define MAXCHANNEL 2          // 最大支持通道数(立体声)
#define DEFINEQNUM 29         // 量化常数(用于定点数精度)

// 定义高通滤波器计算精度参数
#define DEFINEHIGHPASS       30  // 高通滤波器计算的移位位数(提供30位定点精度)
#define DEFINEXGAIN          14   // 输入增益的移位位数(提供14位定点精度)

// 定义滤波器系数结构体
typedef struct __coeff
{
    double alphaf;  // 高通滤波器前馈系数α(浮点表示)
    double betaf;   // 高通滤波器反馈系数β(浮点表示)
    double gammaf;  // 高通滤波器反馈系数γ(浮点表示)
} coeff;

// 定义采样率格式枚举
typedef enum SAMPLERATE_FORMAT
{
    SAMPLERATE_FORMAT_UNSUPPORT = -1,  // 不支持的采样率

    // 标准音频采样率
    SAMPLERATE_FORMAT_8000 = 0,   // 8kHz (电话质量)
    SAMPLERATE_FORMAT_11025,      // 11.025kHz (1/4 CD质量)
    SAMPLERATE_FORMAT_12000,      // 12kHz (语音编码)
    SAMPLERATE_FORMAT_16000,      // 16kHz (宽带语音)
    SAMPLERATE_FORMAT_22050,      // 22.05kHz (1/2 CD质量)
    SAMPLERATE_FORMAT_24000,      // 24kHz (专业音频)
    SAMPLERATE_FORMAT_32000,      // 32kHz (广播质量)
    SAMPLERATE_FORMAT_44100,      // 44.1kHz (CD质量)
    SAMPLERATE_FORMAT_48000,      // 48kHz (专业音频)
    SAMPLERATE_FORMAT_96000,      // 96kHz (高清音频)

    SAMPLERATE_FORMAT_NUM,        // 采样率类型总数(用于数组大小)
} SAMPLERATE_FORMAT;



typedef struct _DRC_init_typedef{
	// ========================
	// DRC模块开关配置
	// ========================
	int32_t Limiter;     // 限幅器开关(1=开启, 0=关闭)
	int32_t Compressor;  // 压缩器开关(1=开启, 0=关闭)
	int32_t Expander;    // 扩展器开关(1=开启, 0=关闭)
	int32_t NoiseGate;   // 噪声门开关(1=开启, 0=关闭)

	// ========================
	// 时间参数配置(单位: ms或s)
	// ========================
	int32_t ATtd;    // 主攻击时间(3ms) - 增益下降速度
	int32_t RTtd;  // 主释放时间(150ms) - 增益恢复速度
	int32_t AVt;     // RMS平均时间(1ms) - 能量检测窗口
	int32_t ATt;     // 峰值攻击时间(1ms) - 瞬态响应速度
	int32_t RTt;    // 峰值释放时间(5s) - 峰值保持时间 -推荐 1-10s 单位ms

	// ========================
	// 动态范围阈值(单位: dB)
	// ========================
	int32_t NT;  // 噪声门阈值(-35dB)
	int32_t ET;  // 扩展器阈值(-30dB)
	int32_t CT;   // 压缩器阈值(-6dB)
	int32_t LT;   // 限幅器阈值(-3dB)

	// ========================
	// 动态范围比率
	// ========================
	float NR;   // 噪声门比率(0.1:1)
	float ER;  // 扩展器比率(0.75:1)
	float CR;     // 压缩器比率(2:1)
	float LR;     // 限幅器比率(∞:1)

	// ========================
	// 高级参数
	// ========================
	float hyst;  // 滞后曲线宽度(0.1) - 防止阈值附近振荡
}DRC_init_typedef;

/*
function :drcinit
init function
input:
  fs:������
return :
   �޷���ֵ
*/
void drcinit(int fs,DRC_init_typedef drc_init_struct);
/*
function :drcdec
drc function
input:
  xout			:���������׵�ַ��
  samplenum	:����sample������ͨ·samplenum = ���������ܳ���/2;˫����samplenum = ���������ܳ���/4;
  nch       :ͨ����
return :
   �޷���ֵ
*/
void drcdec(short* xout,int samplenum, int nch);

#endif//DRC_H_
