#ifndef __HW_EQ_H #define __HW_EQ_H #include "generic/typedef.h" #include "generic/list.h" #include "os/os_api.h" #include "effects/eq_func_define.h" #include "system/spinlock.h" enum { //运行模式 NORMAL = 0, //正常模式 MONO, //单声道模式 STEREO //立体声模式 }; enum { //输出数据类型 DATO_SHORT = 0, //short DATO_INT, //int DATO_FLOAT //float }; enum { //输入数据类型 DATI_SHORT = 0, //short DATI_INT, // int DATI_FLOAT //float }; enum { //输入数据存放模式 BLOCK_DAT_IN = 0, //块模式,例如输入数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据 SEQUENCE_DAT_IN, //序列模式,例如输入数据是2通道,先存放第通道的第一个数据,再存放第2个通道的第一个数据,以此类推。 }; enum { //输出数据存放模式 BLOCK_DAT_OUT = 0,//块模式,例如输出数据是2通道,先存放完第1通道的所有数据,再存放第2通道的所有数据 SEQUENCE_DAT_OUT, //序列模式,例如输入数据是2通道,先存放第通道的第一个数据,再存放第2个通道的第一个数据,以此类推。 }; /*eq IIR type*/ typedef enum { EQ_IIR_TYPE_HIGH_PASS = 0x00, EQ_IIR_TYPE_LOW_PASS, EQ_IIR_TYPE_BAND_PASS, EQ_IIR_TYPE_HIGH_SHELF, EQ_IIR_TYPE_LOW_SHELF, EQ_IIR_TYPE_HIGH_SHELF_Q_TYPE, EQ_IIR_TYPE_LOW_SHELF_Q_TYPE, EQ_IIR_TYPE_HIGH_PASS_ADVANCE,//在gain位置存阶数,0~6阶级,0:disbale EQ_IIR_TYPE_LOW_PASS_ADVANCE,//在gain位置存阶数,0~6阶级,0:disbale } EQ_IIR_TYPE; struct eq_seg_info { u16 index; u16 iir_type; ///> 1))*5 , 顺序是按照硬件EQ摆放了 ) 段数:((nSOS & 1) + (nSOS >> 1))*/ /* * 多阶级低通滤波器 fc: 低通滤波器-3dB衰减频点 fs: 采样率 nSOS: 生成多少个2阶IIR coeff: 输出系数地址 ( 大小为 nSOS*5 , 顺序是按照硬件EQ摆放了 )*/ extern void butterworth_lp_design(int fc, int fs, int nSOS, float *coeff); /* fc: 通滤波器-3dB衰减频点 fs: 采样率 nSOS: 生成nSOS阶IIR coeff: 输出系数地址 ( 大小为((nSOS & 1) + (nSOS >> 1))*5 , 顺序是按照硬件EQ摆放了 ) 段数:((nSOS & 1) + (nSOS >> 1))*/ extern void butterworth_hp_design(int fc, int fs, int nSOS, float *coeff); /*----------------------------------------------------------------------------*/ /**@brief 低通滤波器 @param fc:中心截止频率 @param fs:采样率 @param quality_factor:q值 @param coeff:计算后,系数输出地址 @return @note */ /*----------------------------------------------------------------------------*/ extern void design_lp(int fc, int fs, float quality_factor, float *coeff); /*----------------------------------------------------------------------------*/ /**@brief 高通滤波器 @param fc:中心截止频率 @param fs:采样率 @param quality_factor:q值 @param coeff:计算后,系数输出地址 @return @note */ /*----------------------------------------------------------------------------*/ extern void design_hp(int fc, int fs, float quality_factor, float *coeff); /*----------------------------------------------------------------------------*/ /**@brief 带通滤波器 @param fc:中心截止频率 @param fs:采样率 @param gain:增益 @param quality_factor:q值 @param coeff:计算后,系数输出地址 @return @note */ /*----------------------------------------------------------------------------*/ extern void design_pe(int fc, int fs, float gain, float quality_factor, float *coeff); /*----------------------------------------------------------------------------*/ /**@brief 低频搁架式滤波器 @param fc:中心截止频率 @param fs:采样率 @param gain:增益 @param quality_factor:q值 @param coeff:计算后,系数输出地址 @return @note */ /*----------------------------------------------------------------------------*/ extern void design_ls(int fc, int fs, float gain, float quality_factor, float *coeff); /*----------------------------------------------------------------------------*/ /**@brief 高频搁架式滤波器 @param fc:中心截止频率 @param fs:采样率 @param gain:增益 @param quality_factor:q值 @param coeff:计算后,系数输出地址 @return @note */ /*----------------------------------------------------------------------------*/ extern void design_hs(int fc, int fs, float gain, float quality_factor, float *coeff); /*----------------------------------------------------------------------------*/ /**@brief 滤波器系数检查 @param coeff:滤波器系数 @return @note */ /*----------------------------------------------------------------------------*/ extern int eq_stable_check(float *coeff); float eq_db2mag(float x); /*----------------------------------------------------------------------------*/ /**@brief 获取直通的滤波器系数 @param coeff:滤波器系数 @return @note */ /*----------------------------------------------------------------------------*/ extern void eq_get_AllpassCoeff(void *Coeff); /*----------------------------------------------------------------------------*/ /**@brief 在EQ中断中调用 @param *eq:句柄 @return @note */ /*----------------------------------------------------------------------------*/ void audio_hw_eq_irq_handler(struct hw_eq *eq); /*----------------------------------------------------------------------------*/ /**@brief EQ初始化 @param *eq:句柄 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_init(struct hw_eq *eq, u32 eq_section_num); /*----------------------------------------------------------------------------*/ /**@brief 打开一个通道 @param *ch:通道句柄 @param *eq:句柄 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_ch_open(struct hw_eq_ch *ch, struct hw_eq *eq); /*----------------------------------------------------------------------------*/ /**@brief 设置回调接口 @param *ch:通道句柄 @param *handler:回调的句柄 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_ch_set_handler(struct hw_eq_ch *ch, struct hw_eq_handler *handler); // /*----------------------------------------------------------------------------*/ /**@brief 设置通道基础信息 @param *ch:通道句柄 @param channels:通道数 @param out_32bit:是否输出32bit位宽数据 1:是 0:16bit位宽 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_ch_set_info(struct hw_eq_ch *ch, u8 channels, u8 out_32bit); int audio_hw_eq_ch_set_info_new(struct hw_eq_ch *ch, struct hw_eq_info *info); /*----------------------------------------------------------------------------*/ /**@brief 设置硬件转换系数 @param *ch:通道句柄 @param *info:系数、增益等信息 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_ch_set_coeff(struct hw_eq_ch *ch, struct eq_coeff_info *info); /*----------------------------------------------------------------------------*/ /**@brief 启动一次转换 @param *ch:eq句柄 @param *input:输入数据地址 @param *output:输出数据地址 @param len:输入数据长度 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_ch_start(struct hw_eq_ch *ch, void *input, void *output, int len); /*----------------------------------------------------------------------------*/ /**@brief 关闭一个通道 @param *ch:eq句柄 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_ch_close(struct hw_eq_ch *ch); /*----------------------------------------------------------------------------*/ /**@brief 获取eq是否正在运行状态 @param *ch:eq句柄 @return @note */ /*----------------------------------------------------------------------------*/ int audio_hw_eq_is_running(struct hw_eq *eq); void audio_hw_eq_spin_lock(struct hw_eq *eq); void audio_hw_eq_spin_unlock(struct hw_eq *eq); void design_ls_Q(int fc, int fs, float gain, float quality_factor, float *coeff); void design_hs_Q(int fc, int fs, float gain, float quality_factor, float *coeff); #endif /*__HW_EQ_H*/