BES(恒玄)蓝牙平台EQ 调试和设定

隔了很久 ,这篇博客解说下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 设定和讲解大概就是这些了 ,有不足之处 ,请大家指正,谢谢!

  • 11
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值