1. 问题现象与初步排查
最近在调试杰理蓝牙芯片的双机通话功能时,遇到了一个典型问题:当第二台手机作为近端设备连接时,通话过程中近端听不见远端说话的声音。这个现象在单机通话时完全正常,仅在双机模式下出现。作为在蓝牙音频领域摸爬滚打多年的工程师,这类问题往往涉及音频路由、协议栈配置和硬件协同等多个层面的排查。
首先确认基础环境:使用的是AC79系列芯片,SDK版本为v1.5.3,双机模式通过TWS连接建立。测试时两部手机分别标记为PhoneA(远端)和PhoneB(近端),PhoneA的声音可以正常传输到耳机,但PhoneB无法听到PhoneA的声音。通过以下步骤进行初步验证:
- 检查TWS连接状态:使用
btmg tws-info命令确认主从设备连接正常,RSSI值在-60dBm左右 - 验证音频流方向:在log中过滤关键字"audio path",确认下行音频流正常到达从设备
- 基础硬件测试:用示波器检查I2S信号线,确认从设备的DATA线有波形活动
关键发现:虽然音频数据已经传输到从设备,但最终没有从DAC输出。这提示问题可能出在从设备的音频处理链路。
2. 音频通路深度解析
杰理芯片的双机通话音频通路涉及多个处理环节,我们需要拆解整个信号链路:
2.1 上行链路(MIC→手机)
code复制MIC → ADC → 预处理 → 编码 → RF → 手机
- 这个方向在测试中工作正常,两部手机都能听到耳机端的麦克风声音
2.2 下行链路(手机→SPK)
code复制手机 → RF → 解码 → 混音处理 → DAC → SPK
- 问题就出现在这个链路的混音处理环节
在双机模式下,音频流需要经过特殊处理:
code复制PhoneA音频 → 主设备 → TWS转发 → 从设备
PhoneB音频 → 从设备本地处理
两路音频需要在从设备进行混音后输出。通过SDK中的audio_mixer模块日志,发现从设备只处理了本地PhoneB的音频流,未正确混入TWS转发的PhoneA音频。
3. 根本原因定位
经过三天的代码走查和信号跟踪,最终锁定问题根源:
- 混音器配置错误:在
bt_media.c中,双机模式的混音器初始化缺少AUDIO_TYPE_TWS类型注册
c复制// 错误代码
audio_mixer_add_input(AUDIO_TYPE_HFP);
// 缺少 audio_mixer_add_input(AUDIO_TYPE_TWS);
-
事件触发遗漏:当TWS音频流到达时,未正确触发
AUDIO_STREAM_EVENT事件,导致数据积压在缓冲区 -
从设备状态机冲突:在双机通话时,从设备的HFP状态机错误覆盖了TWS音频状态标志
4. 解决方案与验证
4.1 代码层修复
修改bt_media.c中的初始化逻辑:
c复制void bt_media_init(void) {
audio_mixer_add_input(AUDIO_TYPE_HFP);
audio_mixer_add_input(AUDIO_TYPE_TWS); // 新增此行
// ...其他初始化
}
在TWS音频处理回调中添加事件触发:
c复制static void tws_audio_incoming(uint8_t *data, uint32_t len) {
audio_stream_push(data, len);
event_post(EVENT_AUDIO_STREAM); // 确保触发混音事件
}
4.2 参数调整
修改audio_mixer的配置参数:
ini复制[mixer]
tws_latency = 50 ; 原值为100ms
hfp_priority = 1 ; 保证通话优先级
4.3 验证步骤
- 烧录固件后,重新建立TWS连接
- 使用AT命令
AT+HFP=2激活双机模式 - 测试以下场景:
- PhoneA拨入,检查PhoneB收听
- PhoneB拨入,检查PhoneA收听
- 双机同时通话时的混音效果
测试结果:两部手机的声音都能在耳机端清晰听到,延迟控制在150ms以内,符合蓝牙通话标准。
5. 经验总结与避坑指南
在解决这个问题的过程中,总结出几个关键经验:
-
音频流诊断技巧:
- 使用
audio_dump工具实时抓取各节点数据 - 通过
printf打印音频时间戳,检查同步情况 - 关键log过滤词:"mixer", "tws_audio", "hfp_event"
- 使用
-
常见配置陷阱:
- 双机模式需要同时使能
FEATURE_HFP和FEATURE_TWS - 内存池配置要满足双路音频缓冲需求
c复制#define AUDIO_POOL_SIZE (1024*8) // 原值1024*4不足 - 双机模式需要同时使能
-
硬件注意事项:
- 从设备的DAC供电电压需要稳定在3.3V±5%
- I2S时钟线建议加22Ω匹配电阻
- 测试时建议用专业音频分析仪检查THD+N指标
这个问题最终发现是SDK中一个条件编译宏#ifdef HFP_DUAL_DEVICE未正确覆盖所有必要代码段导致的。建议在类似项目开发中:
- 完整测试所有功能组合场景
- 重点检查条件编译边界
- 建立音频通路的自动化测试用例
通过这个案例也反映出,蓝牙音频开发中"听得见"和"听得好"之间往往隔着无数细节。每个参数调整都可能影响最终用户体验,需要开发者具备系统级的调试视角。
