681 lines
19 KiB
C
681 lines
19 KiB
C
|
|
|
|||
|
|
#include "system/includes.h"
|
|||
|
|
#include "media/includes.h"
|
|||
|
|
#include "app_config.h"
|
|||
|
|
#include "clock_cfg.h"
|
|||
|
|
#include "media/audio_eq_drc_apply.h"
|
|||
|
|
#include "audio_eq_drc_demo.h"
|
|||
|
|
#include "media/effects_adj.h"
|
|||
|
|
#include "audio_effect/audio_eff_default_parm.h"
|
|||
|
|
#include "audio_effect/audio_sound_track_2_p_x.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
#if 0
|
|||
|
|
//系数切换
|
|||
|
|
void eq_sw_demo()
|
|||
|
|
{
|
|||
|
|
eq_mode_sw();//7种默认系数切换
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//获取当前eq系数表类型
|
|||
|
|
void eq_mode_get_demo()
|
|||
|
|
{
|
|||
|
|
u8 mode ;
|
|||
|
|
mode = eq_mode_get_cur();
|
|||
|
|
}
|
|||
|
|
//宏TCFG_USE_EQ_FILE配0
|
|||
|
|
//自定义系数表动态更新
|
|||
|
|
//本demo 示意更新中心截止频率,增益,总增益,如需设置更多参数,请查看eq_config.h头文件的demo
|
|||
|
|
void eq_update_demo()
|
|||
|
|
{
|
|||
|
|
eq_mode_set_custom_info(0, 200, 2);//第0段,200Hz中心截止频率,2db
|
|||
|
|
eq_mode_set_custom_info(5, 2000, 2);//第5段,2000Hz中心截止频率,2db
|
|||
|
|
|
|||
|
|
set_global_gain(get_eq_cfg_hdl(), song_eq_mode, -2);//设置普通音乐eq 总增益 -2db(可避免最大增益大于0db,导致失真)
|
|||
|
|
|
|||
|
|
eq_mode_set(EQ_MODE_CUSTOM);//设置系数、总增益更新
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//用户自定义eq drc系数
|
|||
|
|
#if 1
|
|||
|
|
|
|||
|
|
static const struct eq_seg_info your_audio_out_eq_tab[] = {//2段系数
|
|||
|
|
{0, EQ_IIR_TYPE_BAND_PASS, 125, 0, 0.7f},
|
|||
|
|
{1, EQ_IIR_TYPE_BAND_PASS, 12000, 0, 0.7f},
|
|||
|
|
};
|
|||
|
|
static int your_eq_coeff_tab[2][5];//2段eq系数表的长度
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
/**@brief 用户自定义eq的系数回调
|
|||
|
|
@param eq:句柄
|
|||
|
|
@param sr:采样率
|
|||
|
|
@param info: 系数地址
|
|||
|
|
@return
|
|||
|
|
@note
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
int eq_get_filter_info_demo(void *_eq, int sr, struct audio_eq_filter_info *info)
|
|||
|
|
{
|
|||
|
|
if (!sr) {
|
|||
|
|
sr = 44100;
|
|||
|
|
}
|
|||
|
|
#if TCFG_EQ_ENABLE
|
|||
|
|
local_irq_disable();
|
|||
|
|
u8 nsection = ARRAY_SIZE(your_audio_out_eq_tab);
|
|||
|
|
for (int i = 0; i < nsection; i++) {
|
|||
|
|
eq_seg_design(&your_audio_out_eq_tab[i], sr, your_eq_coeff_tab[i]);//根据采样率对eq系数表,重计算,得出适用的系数表
|
|||
|
|
}
|
|||
|
|
local_irq_enable();
|
|||
|
|
info->L_coeff = info->R_coeff = (void *)your_eq_coeff_tab;//系数指针赋值
|
|||
|
|
info->L_gain = info->R_gain = 0;//总增益填写,用户可修改(-20~20db),注意大于0db存在失真风险
|
|||
|
|
info->nsection = nsection;//eq段数,根据提供给的系数表来填写,例子是2
|
|||
|
|
#endif//TCFG_EQ_ENABLE
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
/**@brief 更新自定义eq系数后,需要使用本函数将系数更新到eq模块
|
|||
|
|
@param *_drc: 句柄
|
|||
|
|
@return
|
|||
|
|
@note
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
void eq_filter_info_update_demo(void *_eq)
|
|||
|
|
{
|
|||
|
|
#if TCFG_EQ_ENABLE
|
|||
|
|
struct audio_eq *eq = (struct audio_eq *)_eq;
|
|||
|
|
local_irq_disable();
|
|||
|
|
if (eq) {
|
|||
|
|
eq->updata = 1;
|
|||
|
|
}
|
|||
|
|
local_irq_enable();
|
|||
|
|
#endif//TCFG_EQ_ENABLE
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
static struct drc_ch drc_fliter = {0};
|
|||
|
|
#define your_threshold (0)
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
/**@brief 自定义限幅器系数回调
|
|||
|
|
@param *drc: 句柄
|
|||
|
|
@param *info: 系数结构地址
|
|||
|
|
@return
|
|||
|
|
@note
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
int drc_get_filter_info_demo(void *drc, struct audio_drc_filter_info *info)
|
|||
|
|
{
|
|||
|
|
#if TCFG_DRC_ENABLE
|
|||
|
|
float th = your_threshold;//-60 ~0db
|
|||
|
|
int threshold = round(pow(10.0, th / 20.0) * 32768); // 0db:32768, -60db:33
|
|||
|
|
|
|||
|
|
/* drc_fliter.nband = 1; */
|
|||
|
|
/* drc_fliter.type = 1; */
|
|||
|
|
/* drc_fliter._p.limiter[0].attacktime = 5; */
|
|||
|
|
/* drc_fliter._p.limiter[0].releasetime = 300; */
|
|||
|
|
/* drc_fliter._p.limiter[0].threshold[0] = threshold; */
|
|||
|
|
/* drc_fliter._p.limiter[0].threshold[1] = 32768; */
|
|||
|
|
|
|||
|
|
/* info->pch = info->R_pch = &drc_fliter; */
|
|||
|
|
#endif//TCFG_DRC_ENABLE
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
/**@brief 更新自定义限幅器系数后,需要使用本函数将系数更新到drc模块
|
|||
|
|
@param *_drc: 句柄
|
|||
|
|
@return
|
|||
|
|
@note
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
void drc_filter_info_update_demo(void *_drc)
|
|||
|
|
{
|
|||
|
|
#if TCFG_DRC_ENABLE
|
|||
|
|
struct audio_drc *drc = (struct audio_drc *)_drc;
|
|||
|
|
local_irq_disable();
|
|||
|
|
if (drc) {
|
|||
|
|
drc->updata = 1;
|
|||
|
|
}
|
|||
|
|
local_irq_enable();
|
|||
|
|
#endif//TCFG_DRC_ENABLE
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_eq *music_eq_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
struct audio_eq_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
#if (defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE) || (defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE)
|
|||
|
|
parm.out_32bit = 1;//32bit位宽输出
|
|||
|
|
#endif
|
|||
|
|
parm.no_wait = 1;
|
|||
|
|
parm.cb = eq_get_filter_info;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.eq_name = AEID_MUSIC_EQ;
|
|||
|
|
|
|||
|
|
parm.max_nsection = music_mode.eq_parm.seg_num;
|
|||
|
|
parm.nsection = music_mode.eq_parm.seg_num;
|
|||
|
|
parm.seg = music_mode.eq_parm.seg;
|
|||
|
|
parm.global_gain = music_mode.eq_parm.global_gain;
|
|||
|
|
struct audio_eq *eq = audio_dec_eq_open(&parm);
|
|||
|
|
clock_add(EQ_CLK);
|
|||
|
|
return eq;
|
|||
|
|
#endif //TCFG_EQ_ENABLE
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void music_eq_close(struct audio_eq *eq)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
if (eq) {
|
|||
|
|
audio_dec_eq_close(eq);
|
|||
|
|
clock_remove(EQ_CLK);
|
|||
|
|
}
|
|||
|
|
#endif/*TCFG_EQ_ENABLE*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_eq *music_eq2_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if TCFG_DYNAMIC_EQ_ENABLE
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
struct audio_eq_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
#if (defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE) || (defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE)
|
|||
|
|
parm.out_32bit = 1;//32bit位宽输出
|
|||
|
|
#endif
|
|||
|
|
parm.no_wait = 1;
|
|||
|
|
parm.cb = eq_get_filter_info;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.eq_name = AEID_MUSIC_EQ2;
|
|||
|
|
|
|||
|
|
parm.max_nsection = music_eq2_parm.seg_num;
|
|||
|
|
parm.nsection = music_eq2_parm.seg_num;
|
|||
|
|
parm.seg = music_eq2_parm.seg;
|
|||
|
|
parm.global_gain = music_eq2_parm.global_gain;
|
|||
|
|
struct audio_eq *eq = audio_dec_eq_open(&parm);
|
|||
|
|
clock_add(EQ_CLK);
|
|||
|
|
return eq;
|
|||
|
|
#endif //TCFG_EQ_ENABLE
|
|||
|
|
#endif
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void music_eq2_close(struct audio_eq *eq)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
if (eq) {
|
|||
|
|
audio_dec_eq_close(eq);
|
|||
|
|
clock_remove(EQ_CLK);
|
|||
|
|
}
|
|||
|
|
#endif/*TCFG_EQ_ENABLE*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct audio_drc *music_drc_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE
|
|||
|
|
struct audio_drc_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.out_32bit = 1;
|
|||
|
|
parm.cb = drc_get_filter_info;
|
|||
|
|
parm.drc_name = AEID_MUSIC_DRC;
|
|||
|
|
#if defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 1)
|
|||
|
|
parm.nband = CROSSOVER_EN;//
|
|||
|
|
#elif defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 2)
|
|||
|
|
parm.nband = CROSSOVER_EN | MORE_BAND_EN;//
|
|||
|
|
#endif/*TCFG_AUDIO_MDRC_ENABLE*/
|
|||
|
|
|
|||
|
|
parm.crossover = &music_mode.drc_parm.crossover;
|
|||
|
|
parm.wdrc = music_mode.drc_parm.wdrc_parm;
|
|||
|
|
struct audio_drc *drc = audio_dec_drc_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc;
|
|||
|
|
#endif/*TCFG_DRC_ENABLE*/
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void music_drc_close(struct audio_drc *drc)
|
|||
|
|
{
|
|||
|
|
if (drc) {
|
|||
|
|
audio_dec_drc_close(drc);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct audio_eq *esco_eq_open(u32 sample_rate, u8 ch_num, u8 bit_wide)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
struct audio_eq_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
#if (defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE) || (defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE)
|
|||
|
|
parm.out_32bit = bit_wide;//32bit位宽输出
|
|||
|
|
#endif
|
|||
|
|
parm.no_wait = 1;
|
|||
|
|
parm.cb = eq_get_filter_info;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.eq_name = AEID_ESCO_DL_EQ;
|
|||
|
|
u8 index = 0;
|
|||
|
|
if (sample_rate == 8000) { //窄频
|
|||
|
|
index = 1;
|
|||
|
|
}
|
|||
|
|
parm.max_nsection = phone_mode[index].eq_parm.seg_num;
|
|||
|
|
parm.nsection = phone_mode[index].eq_parm.seg_num;
|
|||
|
|
parm.seg = phone_mode[index].eq_parm.seg;
|
|||
|
|
parm.global_gain = phone_mode[index].eq_parm.global_gain;
|
|||
|
|
struct audio_eq *eq = audio_dec_eq_open(&parm);
|
|||
|
|
clock_add(EQ_CLK);
|
|||
|
|
return eq;
|
|||
|
|
#endif //TCFG_EQ_ENABLE
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void esco_eq_close(struct audio_eq *eq)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
if (eq) {
|
|||
|
|
audio_dec_eq_close(eq);
|
|||
|
|
clock_remove(EQ_CLK);
|
|||
|
|
}
|
|||
|
|
#endif/*TCFG_EQ_ENABLE*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_drc *esco_drc_open(u32 sample_rate, u8 ch_num, u8 bit_wide)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE
|
|||
|
|
struct audio_drc_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.out_32bit = bit_wide;
|
|||
|
|
parm.cb = drc_get_filter_info;
|
|||
|
|
parm.drc_name = AEID_ESCO_DL_DRC;
|
|||
|
|
u8 index = 0;
|
|||
|
|
if (sample_rate == 8000) { //窄频
|
|||
|
|
index = 1;
|
|||
|
|
}
|
|||
|
|
parm.wdrc = &phone_mode[index].drc_parm;
|
|||
|
|
struct audio_drc *drc = audio_dec_drc_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc;
|
|||
|
|
#endif/*TCFG_DRC_ENABLE*/
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void esco_drc_close(struct audio_drc *drc)
|
|||
|
|
{
|
|||
|
|
if (drc) {
|
|||
|
|
audio_dec_drc_close(drc);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_eq *music_eq_rl_rr_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
struct audio_eq_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
#if (defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE) || (defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE)
|
|||
|
|
parm.out_32bit = 1;//32bit位宽输出
|
|||
|
|
#endif
|
|||
|
|
parm.no_wait = 1;
|
|||
|
|
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG
|
|||
|
|
parm.cb = low_bass_eq_get_filter_info_demo;
|
|||
|
|
#else
|
|||
|
|
parm.cb = eq_get_filter_info;
|
|||
|
|
#endif
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.eq_name = AEID_MUSIC_RL_EQ;
|
|||
|
|
|
|||
|
|
parm.max_nsection = music_mode.eq_parm.seg_num;
|
|||
|
|
parm.nsection = music_mode.eq_parm.seg_num;
|
|||
|
|
parm.seg = music_mode.eq_parm.seg;
|
|||
|
|
parm.global_gain = music_mode.eq_parm.global_gain;
|
|||
|
|
struct audio_eq *eq = audio_dec_eq_open(&parm);
|
|||
|
|
clock_add(EQ_CLK);
|
|||
|
|
return eq;
|
|||
|
|
#endif //TCFG_EQ_ENABLE
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void music_eq_rl_rr_close(struct audio_eq *eq)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
if (eq) {
|
|||
|
|
audio_dec_eq_close(eq);
|
|||
|
|
clock_remove(EQ_CLK);
|
|||
|
|
}
|
|||
|
|
#endif/*TCFG_EQ_ENABLE*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct audio_drc *music_drc_rl_rr_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE
|
|||
|
|
struct audio_drc_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.out_32bit = 1;
|
|||
|
|
parm.cb = drc_get_filter_info;
|
|||
|
|
parm.drc_name = AEID_MUSIC_RL_DRC;
|
|||
|
|
#if defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 1)
|
|||
|
|
parm.nband = CROSSOVER_EN;//
|
|||
|
|
#elif defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 2)
|
|||
|
|
parm.nband = CROSSOVER_EN | MORE_BAND_EN;//
|
|||
|
|
#endif/*TCFG_AUDIO_MDRC_ENABLE*/
|
|||
|
|
|
|||
|
|
parm.crossover = &rl_drc_parm.crossover;//参数需要修改
|
|||
|
|
parm.wdrc = rl_drc_parm.wdrc_parm;
|
|||
|
|
struct audio_drc *drc = audio_dec_drc_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc;
|
|||
|
|
#endif/*TCFG_DRC_ENABLE*/
|
|||
|
|
#endif
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void music_drc_rl_rr_close(struct audio_drc *drc)
|
|||
|
|
{
|
|||
|
|
if (drc) {
|
|||
|
|
audio_dec_drc_close(drc);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#if defined(LINEIN_MODE_SOLE_EQ_EN) && LINEIN_MODE_SOLE_EQ_EN
|
|||
|
|
struct audio_eq *linein_eq_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
struct audio_eq_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
#if (defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE) || (defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE)
|
|||
|
|
parm.out_32bit = 1;//32bit位宽输出
|
|||
|
|
#endif
|
|||
|
|
parm.no_wait = 1;
|
|||
|
|
parm.cb = eq_get_filter_info;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.eq_name = AEID_LINEIN_EQ;
|
|||
|
|
|
|||
|
|
parm.max_nsection = linein_mode.eq_parm.seg_num;
|
|||
|
|
parm.nsection = linein_mode.eq_parm.seg_num;
|
|||
|
|
parm.seg = linein_mode.eq_parm.seg;
|
|||
|
|
parm.global_gain = linein_mode.eq_parm.global_gain;
|
|||
|
|
struct audio_eq *eq = audio_dec_eq_open(&parm);
|
|||
|
|
clock_add(EQ_CLK);
|
|||
|
|
return eq;
|
|||
|
|
#endif //TCFG_EQ_ENABLE
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void linein_eq_close(struct audio_eq *eq)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE
|
|||
|
|
if (eq) {
|
|||
|
|
audio_dec_eq_close(eq);
|
|||
|
|
clock_remove(EQ_CLK);
|
|||
|
|
}
|
|||
|
|
#endif/*TCFG_EQ_ENABLE*/
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_drc *linein_drc_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE
|
|||
|
|
struct audio_drc_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.out_32bit = 1;
|
|||
|
|
parm.cb = drc_get_filter_info;
|
|||
|
|
parm.drc_name = AEID_LINEIN_DRC;
|
|||
|
|
|
|||
|
|
#if 0
|
|||
|
|
#if defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 1)
|
|||
|
|
parm.nband = CROSSOVER_EN;//
|
|||
|
|
#elif defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 2)
|
|||
|
|
parm.nband = CROSSOVER_EN | MORE_BAND_EN;//
|
|||
|
|
#endif/*TCFG_AUDIO_MDRC_ENABLE*/
|
|||
|
|
|
|||
|
|
parm.crossover = &linein_mode.drc_parm.crossover;
|
|||
|
|
#endif
|
|||
|
|
parm.wdrc = linein_mode.drc_parm.wdrc_parm;
|
|||
|
|
struct audio_drc *drc = audio_dec_drc_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc;
|
|||
|
|
#endif/*TCFG_DRC_ENABLE*/
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void linein_drc_close(struct audio_drc *drc)
|
|||
|
|
{
|
|||
|
|
if (drc) {
|
|||
|
|
audio_dec_drc_close(drc);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
struct music_eq_tool high_bass_eq_parm = {0};
|
|||
|
|
struct eq_seg_info high_bass_eq_seg[] = {
|
|||
|
|
{0, EQ_IIR_TYPE_BAND_PASS, 125, 0, 0.7f},
|
|||
|
|
{1, EQ_IIR_TYPE_BAND_PASS, 12000, 0, 0.3f},
|
|||
|
|
};
|
|||
|
|
struct audio_eq *high_bass_eq_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_AUDIO_OUT_EQ_ENABLE
|
|||
|
|
|
|||
|
|
u16 seg_num = high_bass_eq_parm.seg_num;
|
|||
|
|
for (int i = 0; i < ARRAY_SIZE(high_bass_eq_seg); i++) {
|
|||
|
|
high_bass_eq_seg[i].index = seg_num + i;
|
|||
|
|
memcpy(&high_bass_eq_parm.seg[seg_num + i], &high_bass_eq_seg[i], sizeof(struct eq_seg_info));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_eq_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE && TCFG_AUDIO_OUT_DRC_ENABLE
|
|||
|
|
parm.out_32bit = 1;//32bit位宽输出
|
|||
|
|
#endif
|
|||
|
|
parm.no_wait = 1;
|
|||
|
|
parm.cb = eq_get_filter_info;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.eq_name = AEID_HIGH_BASS_EQ;
|
|||
|
|
seg_num += ARRAY_SIZE(high_bass_eq_seg);
|
|||
|
|
parm.max_nsection = seg_num;
|
|||
|
|
parm.nsection = seg_num;
|
|||
|
|
parm.seg = high_bass_eq_parm.seg;
|
|||
|
|
parm.global_gain = high_bass_eq_parm.global_gain;
|
|||
|
|
|
|||
|
|
parm.fade = 1;//高低音增益更新差异大,会引入哒哒音,此处使能系数淡入
|
|||
|
|
parm.fade_step = 0.4f;//淡入步进(0.1f~1.0f)
|
|||
|
|
|
|||
|
|
struct audio_eq *eq = audio_dec_eq_open(&parm);
|
|||
|
|
clock_add(EQ_CLK);
|
|||
|
|
return eq;
|
|||
|
|
#endif /*TCFG_EQ_ENABLE*/
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void high_bass_eq_close(struct audio_eq *eq)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_AUDIO_OUT_EQ_ENABLE
|
|||
|
|
if (eq) {
|
|||
|
|
audio_dec_eq_close(eq);
|
|||
|
|
clock_remove(EQ_CLK);
|
|||
|
|
}
|
|||
|
|
#endif/*TCFG_EQ_ENABLE*/
|
|||
|
|
}
|
|||
|
|
/*
|
|||
|
|
*index: 0, 更新低音中心频率freq,增益gain
|
|||
|
|
*index: 1, 更新高音中心频率freq,增益gain
|
|||
|
|
* */
|
|||
|
|
void high_bass_eq_udpate(u8 index, int freq, float gain)
|
|||
|
|
{
|
|||
|
|
if (freq) {
|
|||
|
|
high_bass_eq_seg[index].freq = freq;
|
|||
|
|
}
|
|||
|
|
high_bass_eq_seg[index].gain = gain;
|
|||
|
|
printf("index %d ,gain %d\n", index, (int)gain);
|
|||
|
|
cur_eq_set_update(AEID_HIGH_BASS_EQ, &high_bass_eq_seg[index], high_bass_eq_parm.seg_num + ARRAY_SIZE(high_bass_eq_seg), 0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//兼容旧接口
|
|||
|
|
void mix_out_high_bass(u32 cmd, struct high_bass *hb)
|
|||
|
|
{
|
|||
|
|
if (cmd == AUDIO_EQ_HIGH) {
|
|||
|
|
high_bass_eq_udpate(1, hb->freq, hb->gain);
|
|||
|
|
} else if (cmd == AUDIO_EQ_BASS) {
|
|||
|
|
high_bass_eq_udpate(0, hb->freq, hb->gain);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
wdrc_struct_TOOL_SET high_bass_drc_parm = {0};
|
|||
|
|
struct audio_drc *high_bass_drc_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE && TCFG_AUDIO_OUT_DRC_ENABLE
|
|||
|
|
struct threshold_group group[] = {{0, 0}, {50, 50}, {90, 90}};
|
|||
|
|
high_bass_drc_parm.is_bypass = 0;
|
|||
|
|
high_bass_drc_parm.parm.attacktime = 10;
|
|||
|
|
high_bass_drc_parm.parm.releasetime = 300;
|
|||
|
|
high_bass_drc_parm.parm.inputgain = 0;
|
|||
|
|
high_bass_drc_parm.parm.outputgain = 0;
|
|||
|
|
high_bass_drc_parm.parm.threshold_num = ARRAY_SIZE(group);
|
|||
|
|
memcpy(high_bass_drc_parm.parm.threshold, group, sizeof(group));
|
|||
|
|
high_bass_drc_parm.parm.rms_time = 25;
|
|||
|
|
high_bass_drc_parm.parm.algorithm = 0;
|
|||
|
|
high_bass_drc_parm.parm.mode = 1;
|
|||
|
|
|
|||
|
|
struct audio_drc_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
#if defined(TCFG_EQ_ENABLE) && TCFG_EQ_ENABLE && TCFG_AUDIO_OUT_EQ_ENABLE
|
|||
|
|
parm.out_32bit = 1;
|
|||
|
|
#else
|
|||
|
|
parm.out_32bit = 0;
|
|||
|
|
#endif
|
|||
|
|
parm.cb = drc_get_filter_info;
|
|||
|
|
parm.drc_name = AEID_HIGH_BASS_DRC;
|
|||
|
|
parm.wdrc = &high_bass_drc_parm;
|
|||
|
|
struct audio_drc *drc = audio_dec_drc_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc;
|
|||
|
|
#endif/*TCFG_DRC_ENABLE*/
|
|||
|
|
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void high_bass_drc_close(struct audio_drc *drc)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_ENABLE) && TCFG_DRC_ENABLE && TCFG_AUDIO_OUT_DRC_ENABLE
|
|||
|
|
if (drc) {
|
|||
|
|
audio_dec_drc_close(drc);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
/**@brief 高低音限幅器系数回调
|
|||
|
|
@param *drc: 句柄
|
|||
|
|
@param *info: 系数结构地址
|
|||
|
|
@return
|
|||
|
|
@note
|
|||
|
|
*/
|
|||
|
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
int high_bass_drc_set_filter_info(int th)
|
|||
|
|
{
|
|||
|
|
if (th < -60) {
|
|||
|
|
th = -60;
|
|||
|
|
}
|
|||
|
|
if (th > 0) {
|
|||
|
|
th = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct threshold_group group[] = {{0, 0}, {50, 50}, {90, 90}};
|
|||
|
|
group[1].in_threshold = 90 + th;
|
|||
|
|
group[1].out_threshold = 90 + th;
|
|||
|
|
group[2].in_threshold = 90.3f;
|
|||
|
|
group[2].out_threshold = 90 + th;
|
|||
|
|
memcpy(high_bass_drc_parm.parm.threshold, group, sizeof(group));
|
|||
|
|
cur_drc_set_update(AEID_HIGH_BASS_DRC, 0, &high_bass_drc_parm);
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* DRC_PRO
|
|||
|
|
*/
|
|||
|
|
struct audio_drc_pro *music_drc_pro_open(u32 sample_rate, u8 ch_num)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|||
|
|
struct audio_drc_pro_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.out_32bit = 1;
|
|||
|
|
parm.cb = drc_pro_get_filter_info;
|
|||
|
|
parm.drc_pro_name = AEID_MUSIC_DRC_PRO;
|
|||
|
|
#if defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 1)
|
|||
|
|
parm.nband = CROSSOVER_EN;
|
|||
|
|
#elif defined(TCFG_AUDIO_MDRC_ENABLE) && (TCFG_AUDIO_MDRC_ENABLE == 2)
|
|||
|
|
parm.nband = CROSSOVER_EN | MORE_BAND_EN;
|
|||
|
|
#endif
|
|||
|
|
parm.crossover = &music_drc_pro_parm.crossover;
|
|||
|
|
parm.wdrc_pro = music_drc_pro_parm.wdrc_pro_parm;
|
|||
|
|
struct audio_drc_pro *drc_pro = audio_dec_drc_pro_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc_pro;
|
|||
|
|
#endif
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void music_drc_pro_close(struct audio_drc_pro *drc_pro)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|||
|
|
if (!drc_pro) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
audio_dec_drc_pro_close(drc_pro);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
struct audio_drc_pro *esco_drc_pro_open(u32 sample_rate, u8 ch_num, u8 bit_wide)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|||
|
|
struct audio_drc_pro_param parm = {0};
|
|||
|
|
parm.channels = ch_num;
|
|||
|
|
parm.sr = sample_rate;
|
|||
|
|
parm.out_32bit = bit_wide;
|
|||
|
|
parm.cb = drc_pro_get_filter_info;
|
|||
|
|
parm.drc_pro_name = AEID_ESCO_DL_DRC_PRO;
|
|||
|
|
u8 index = 0;
|
|||
|
|
if (sample_rate == 8000) { //窄频
|
|||
|
|
index = 1;
|
|||
|
|
}
|
|||
|
|
parm.wdrc_pro = &phone_drc_pro_parm[index];
|
|||
|
|
struct audio_drc_pro *drc_pro = audio_dec_drc_pro_open(&parm);
|
|||
|
|
clock_add(EQ_DRC_CLK);
|
|||
|
|
return drc_pro;
|
|||
|
|
#endif
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void esco_drc_pro_close(struct audio_drc_pro *drc_pro)
|
|||
|
|
{
|
|||
|
|
#if defined(TCFG_DRC_PRO_ENABLE) && TCFG_DRC_PRO_ENABLE
|
|||
|
|
if (drc_pro) {
|
|||
|
|
audio_dec_drc_pro_close(drc_pro);
|
|||
|
|
clock_remove(EQ_DRC_CLK);
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|