KunSpace
返回博客

Zoom + ARC Soundbar 双无声:策略没选 Speaker,HAL 还把喇叭 mute 了

2026年6月29日
尚无阅读

读完了?别空手走啊 😏

读都读完了,不点个赞说不过去吧

写评论

读完了不评论,作者会以为你在沉思

这篇写什么?

双屏电视一类组合场景:

  • HDMI ARC 接 Soundbar
  • 大屏 播 dongle 视频
  • 小屏 打开 Zoom 会议

期望:会议起来后 本机喇叭出声(要做 mix / 降噪),Soundbar 侧按产品逻辑静音或不再扛通话。
实际:曾经出现 Speaker 和 ARC 都没声——两边都哑。

根因是两层叠在一起:策略没把 MEDIA 赶到 SPEAKERHAL 在 ARC 连接时又把喇叭 mute 掉

一句话:

Zoom 开 → 应 FORCE_SPEAKER,喇叭出声、ARC 不当通话主出路
  → 问题 A:STRATEGY_MEDIA 没选到 SPEAKER
  → 问题 B:ARC 热插拔里 aml_audio_set_speaker_mute(true)
  → 修:Policy 强制选 SPEAKER;去掉 ARC 路径里 mute 喇叭

Zoom + ARC 双无声:策略与 HAL

相关: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 别把喇叭锁死。


相关阅读

评论

还没有评论,来做第一个吧

读完了不评论,作者会以为你在沉思