这篇写什么?
双屏电视一类组合场景:
- HDMI ARC 接 Soundbar
- 大屏 播 dongle 视频
- 小屏 打开 Zoom 会议
期望:会议起来后 本机喇叭出声(要做 mix / 降噪),Soundbar 侧按产品逻辑静音或不再扛通话。
实际:曾经出现 Speaker 和 ARC 都没声——两边都哑。
根因是两层叠在一起:策略没把 MEDIA 赶到 SPEAKER,HAL 在 ARC 连接时又把喇叭 mute 掉。
一句话:
Zoom 开 → 应 FORCE_SPEAKER,喇叭出声、ARC 不当通话主出路
→ 问题 A:STRATEGY_MEDIA 没选到 SPEAKER
→ 问题 B:ARC 热插拔里 aml_audio_set_speaker_mute(true)
→ 修:Policy 强制选 SPEAKER;去掉 ARC 路径里 mute 喇叭

相关:Android 音量设置流程、拔掉 ARC 后音量飙最大。
一、产品期望(逻辑确认)
| 状态 | HDMI ARC Switch | 喇叭 mute(如 NTP8835 SPK mute) | 听感期望 |
|---|---|---|---|
| 上电、未开 Zoom | on | on(喇叭静音) | 功放 / Soundbar 出声 |
| Zoom 启动后 | off | off(喇叭解静音) | Speaker 出声;Soundbar 不应再当会议主输出 |
为什么 Zoom 要走喇叭?
- TV 侧要做 mix、降噪 等处理
- 多数 Soundbar 没有 这套通话硬解码 / 处理能力
- 所以会议场景应 强制本机 SPEAKER,而不是继续把 MEDIA 甩给 ARC
二、现象
| 条件 | 结果 |
|---|---|
| ARC 接 Soundbar + 大屏 dongle + 小屏 Zoom | Soundbar 无声,喇叭也无声 |
| 用户感受 | 「开会了两边都没声」 |
注意:标题里常写「soundbar 无声」,完整坏例是 双无声——路由错了,再加上喇叭被 HAL 静音。
三、原因拆成两层
1)AudioPolicy:MEDIA + 强制扬声器时,没选到 SPEAKER
在 Engine::getDevicesForStrategyInt 里,当:
strategy == STRATEGY_MEDIA- 且
getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION) == AUDIO_POLICY_FORCE_SPEAKER
原逻辑 没有 明确把输出收到 AUDIO_DEVICE_OUT_SPEAKER,MEDIA 仍可能按外接设备(含 ARC)走,会议场景路由失效或走到「谁都不该出」的状态。
2)HAL:ARC 状态更新时强制 mute 喇叭
ARC 连接热插拔路径里曾有:
aml_audio_set_speaker_mute(adev, "true");
aml_audio_update_arc_status(adev, true);
Zoom 起来后,即便策略想听喇叭,HAL 侧若仍因 ARC 已连接而把 speaker mute 钉死,喇叭也会哑。
两层叠加:
Policy 没选 SPEAKER → ARC/外放路径也不对
HAL 又 mute 了 SPEAKER → 喇叭必哑
结果:双无声
四、修复
1)策略层:MEDIA + FORCE_SPEAKER → 直接选喇叭
示意(合入逻辑):
if (strategy == STRATEGY_MEDIA &&
getForceUse(AUDIO_POLICY_FORCE_FOR_COMMUNICATION) == AUDIO_POLICY_FORCE_SPEAKER) {
devices = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER);
if (!devices.isEmpty()) {
// 选中 SPEAKER
}
break;
}
打开 Zoom(通信强制扬声器)后,MEDIA 策略也优先本机 SPEAKER,不再误跟 ARC。
2)HAL 层:ARC 热插拔不再 mute 喇叭
// aml_audio_set_speaker_mute(adev, "true"); // 去掉强制静音
aml_audio_update_arc_status(adev, true); // ARC 状态更新保留
- 保留
aml_audio_update_arc_status等 ARC 状态维护,避免 HDMI ARC 功能本身坏掉 - 去掉「一连 ARC 就 mute 喇叭」——喇叭静音交给上层产品逻辑 / Zoom 场景策略,而不是 ARC 热插拔一刀切
五、修后行为对照
| 场景 | 修前 | 修后 |
|---|---|---|
| 未开 Zoom,ARC 接 Soundbar | 外放送声(产品期望) | 保持外放能力(ARC 状态仍更新) |
| 开 Zoom | 策略/静音打架 → 双无声 | MEDIA 强制 SPEAKER,喇叭可出声 |
| ARC 功能 | 热插拔会 mute 喇叭 | 热插拔更新 ARC,不再顺带 mute 喇叭 |
验证:双屏 + dongle + Zoom + ARC Soundbar,会议声从本机喇叭出来。
六、排查清单(同类双无声)
- Zoom / 通话是否设置了
AUDIO_POLICY_FORCE_FOR_COMMUNICATION = SPEAKER -
STRATEGY_MEDIA选中的设备是 SPEAKER 还是 HDMI_ARC - HAL 是否在 ARC connect 路径里
set_speaker_mute(true) - 硬件侧:ARC Switch、SPK mute 脚位是否与产品表一致
- 分清「该静音 Soundbar」和「误静音 Speaker」——两者不能一起哑
七、小结
| 层级 | 问题 | 修法 |
|---|---|---|
| AudioPolicy | MEDIA + 强制扬声器时未选 SPEAKER | 显式 getDevicesFromType(SPEAKER) 并 break |
| HAL | ARC 连接强制 mute 喇叭 | 注释掉 mute,保留 ARC 状态更新 |
口诀:开会听喇叭——策略要选到,HAL 别把喇叭锁死。
相关阅读
评论
还没有评论,来做第一个吧
读完了不评论,作者会以为你在沉思