隔了很久 ,这篇博客解说下BES平台关于EQ 调试和设定的 相关事宜。
1.EQ调试原理
说这个部分是为了同学们更好的分析解决问题
打开所使用工程的target.mk文件,修改宏PC_CMD_UART ?= 1 同时关闭DEBUG=0
Bes提供了多种滤波方式,可在target.mk中进行配置,下图是我使用的配置,具体要怎么配置,可一个根据实际的项目需求更改。
然后我们看下代码部分 在打开PC_CMD_UART ?= 1之后,在apps.cpp 中 app_init 里面有void app_cmd_open()函数;
AUDIO_SECTION_ENABLE ?=1 打开后可以直接写入flash audio区域(4k) 上电开机可以读取参数 并生效。
我们有看到EQ调试单独注册了一个任务 ,用来处理从工具端接收到的RX 数据
如果有发现工具连接 上 但是调试失败 请确认两个因素:
a.工具上选的滤波器类型和软件代码设置是否一致。
b.调试当前音频数据流是否为激活状态(是否有音乐在播放)
2. EQ 调试
a. 工具连接
设备连上手机之后,让设备处于播放音乐状态,打开工具,选择正确的com端口,点击连接按钮,当“connent”按钮变成绿色说明连接成功。工具如下图所示:
b.工具其他设置和参数保存
工具界面默认只开了iir,通过修改./cfg/test_cfg.json文件可以打开其他选项,当然也要配合固件中的配置项,比如target.mk的宏定义中使能了drc,这个就可以把drc相关的调试界面开启,如图:
b.参数导入
可以选择工具上的 按钮“write to flash”或者直接写入"tgt_hardware.c"中
选择“write to flash” 后需要没有搽除 的情况下 flash 数据优先级比较高,会覆盖本地数据
3. 多种EQ 模式
在这里使用函数“audio_eq_set_cfg”就能在播放状态下实时更新EQ 参数,下面提供实例化代码:
注意:所有的EQ 需使用同种滤波器类型。
通过手机 APP BLE 数据修改自定义 EQ :
static int app_tota_data_received_handler(ke_msg_id_t const msgid,
struct ble_tota_rx_data_ind_t *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
#if defined(__APP_INIT__)
uint8_t i;
for(i=0; i<param->length; i++)
TRACE(2,"[cmd: %x]\n", param->data[i]);
#if 1
switch(param->data[1])
{
case 0xa1:
appCommandProcess(param->data);
break;
case 0xb1:
appCommandResponse(param->data);
break;
default:
break;
}
#else
app_ble_push_rx_data(BLE_RX_DATA_SELF_TOTA, app_tota_env.connectionIndex, param->data, param->length);
#endif
#endif
return (KE_MSG_CONSUMED);
}
void appCommandProcess(uint8_t *command)
{
TRACE(1,"=====appCommandProcess====>[cmd: %x]", command[2]);
switch(command[2]){
case EQ_MODE_SETTING:
TRACE(1, "EQ_MODE_SETTING==>:%d", command[3]);
app_data_type.a2dpModeEqType = command[3];
nvrecord_env->a2dpModeEqType= command[3];
nv_record_env_set(nvrecord_env);
switch(app_data_type.a2dpModeEqType)
{
case DEFAULT_MODE:
audio_eq_set_cfg(NULL, &audio_eq_hw_dac_iir_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
case POP_MODE:
audio_eq_set_cfg(NULL, &audio_eq_hw_dac_pop_iir_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
case BASS_MODE:
audio_eq_set_cfg(NULL, &audio_eq_hw_dac_bass_iir_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
case JAZZ_MODE:
audio_eq_set_cfg(NULL, &audio_eq_hw_dac_jazz_iir_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
case SOFT_MODE:
audio_eq_set_cfg(NULL, &audio_eq_hw_dac_soft_iir_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
case CLASSIC_MODE:
audio_eq_set_cfg(NULL, &audio_eq_hw_dac_classic_iir_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
default:
break;
}
break;
case EQ_DEFINITION_SETTING:
TRACE(1, "EQ_DEFINITION_SETTING==>:%d", command[3]);
app_data_type.a2dpModeEqType = DEFINITION_MODE;
for(eq_bank=0; eq_bank<10; eq_bank++)
{
gain_up_down= ((command[eq_bank+3]>>4)&0x0F);
gain= (command[eq_bank+3]&0x0F);
if(gain_up_down>0)
{
app_data_type.audio_def_eq_cfg.param[eq_bank].gain*=(1-gain/10);
}
else
{
app_data_type.audio_def_eq_cfg.param[eq_bank].gain*=(1+gain/10);
}
nvrecord_env->eq_gain[eq_bank]=app_data_type.audio_def_eq_cfg.param[eq_bank].gain;
nvrecord_env->IsEqSeted = TRUE;
}
nv_record_env_set(nvrecord_env);
audio_eq_set_cfg(NULL, &app_data_type.audio_def_eq_cfg, AUDIO_EQ_TYPE_HW_DAC_IIR);
break;
}
}
4. 反相位输出问题
在“audioflinger.c”中有函数“static void af_codec_playback_post_handler(uint8_t *buf, uint32_t len, const struct af_stream_cfg_t *role)”
打开 “AUDIO_OUTPUT_INVERT_RIGHT_CHANNEL” 设定就好。
EQ 设定和讲解大概就是这些了 ,有不足之处 ,请大家指正,谢谢!