前言
现象:HDMI 插入 → AudioPolicy 自动把媒体音频路由切到 HDMI 音频设备,板子扬声器(SPK)静音
执行:cat /proc/asound/cards

可见有三张声卡
现象
HDMI屏幕接线后板子的扬声器便没有媒体声音
需求
RK3576 板子接 HDMI 屏只做显示,媒体声音继续走板载声卡 → 扬声器,不允许插上 HDMI 后声音自动切到 HDMI。
原因
RK 的顺序是:有线/A2DP → HDMI → HDMI0 → SPDIF → SPDIF0 → ... → SPEAKER(最后)
插上 HDMI 后:
- HDMI 设备进入可用设备列表;
- 它在链里排在 SPEAKER 前面,所以 devices2 先被赋成 HDMI;
- devices2 一旦非空,后面的 SPEAKER 分支就被跳过 → 媒体音频全部走 HDMI,板载声卡永远轮不到。
解决
修改位置:frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp
diff --git a/services/audiopolicy/enginedefault/src/Engine.cpp b/services/audiopolicy/enginedefault/src/Engine.cpp
index 2740994862..5a16835547 100644
--- a/services/audiopolicy/enginedefault/src/Engine.cpp
+++ b/services/audiopolicy/enginedefault/src/Engine.cpp
@@ -40,6 +40,7 @@
#include <media/AudioContainers.h>
#include <utils/String8.h>
#include <utils/Log.h>
+#include <cutils/properties.h>
namespace android::audio_policy {
@@ -422,6 +423,21 @@ DeviceVector Engine::getDevicesForStrategyInt(legacy_strategy strategy,
getLastRemovableMediaDevices(GROUP_WIRED));
}
}
+ //-----------------------rk code----------
+ // Some products (tablet/kiosk) need media to keep playing on the local
+ // speaker even when HDMI/SPDIF is connected, instead of being switched to
+ // the HDMI/SPDIF output.
+ // Default is ON so it also works when the property cannot be read
+ // (e.g. not yet labeled / SELinux denied). Set:
+ // audio.media.spk=false
+ // to restore routing media to HDMI/SPDIF.
+ // (labeled audio_config_prop so audioserver is allowed to read it)
+ // Placed after wired/BT check so headphones/A2DP still take precedence.
+ if (devices2.isEmpty() &&
+ property_get_bool("audio.media.spk", true)) {
+ devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER);
+ }
+ //----------------------------------------
if ((devices2.isEmpty()) && (strategy != STRATEGY_SONIFICATION)) {
// no sonification on aux digital (e.g. HDMI)
devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_AUX_DIGITAL);
为什么改这里:
- audio_policy_configuration.xml / mixer 只声明"有哪些设备、能怎么连",不决定谁优先;决定优先级的就是这段代码,所以改那里没用。
- 只要在这条链最前面(耳机/A2DP 之后)加一句:无耳机、无蓝牙时直接选 SPEAKER,后面的 HDMI/SPDIF 分支因 devices2 已非空而自动跳过 → 声音留在扬声器,HDMI 只做显示。
放在这个位置的两点理由:① 耳机/A2DP 仍能正常抢占,插耳机照样切走;② HDMI 只在"有音频需求时"被跳过,视频通路完全不受影响,画面照常显示,只是 HDMI 不再出声。