LineageOS 21 x86_64 TV HDMI 无声音修复记录

一、问题说明

设备环境:

LineageOS 21 Android 14 x86_64 TV

系统能够正常通过 HDMI 输出画面,但 YouTube、系统提示音和本地播放器都没有声音。

参考项目:

AndroidTV x86 HDMI Audio Fix https://github.com/RealMartinKevin/androidtv-x86-hdmi-audio-fix

该项目可以帮助检测实际可用的 HDMI ALSA 设备,但它原本通过修改/system/etc/init.sh实现永久修复。LineageOS 21 的系统分区默认受保护,原脚本可能出现Read-only file system

最终处理思路:

  1. 检查 HDMI 声卡和 PCM 设备;
  2. 通过 ELD 确认电视已经被系统识别;
  3. 使用alsa_aplay验证底层 HDMI 音频正常;
  4. 检查 Android Audio Policy 状态;
  5. 修改hdmi_audio_policy_configuration.xml
  6. HDMI_2设置为固定连接设备和默认输出。

二、准备工作

需要准备:

  • 已安装 LineageOS 21 x86_64 TV 的设备;
  • Windows 电脑和 ADB 工具;
  • 已开启 USB 调试;
  • 一个标准 PCM WAV 测试音频;
  • 系统支持adb root

确认连接:

adb devices adb root adb wait-for-device adb shell id

正常应看到:

uid=0(root) gid=0(root)

这表示 ADB Shell 已经是 root,不需要再执行su


三、检查 ALSA 工具

adb shell which alsa_aplay adb shell which alsa_amixer

正常输出:

/system/bin/alsa_aplay /system/bin/alsa_amixer

四、推送测试音频

建议使用双声道、16 bit、48000 Hz 的 PCM WAV 文件。

adb push sample.wav /data/local/tmp/sample.wav adb shell ls -l /data/local/tmp/sample.wav

五、查看声卡

adb shell cat /proc/asound/cards

我的设备输出:

0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xdf120000 irq 130

这里只显示一张HDA Intel PCH,并不代表没有 HDMI 音频。Intel 平台上的 HDMI 音频通常作为同一张 HDA 声卡下面的 PCM 设备存在。


六、查看 HDMI PCM 设备

adb shell cat /proc/asound/pcm

我的设备中可以看到:

00-03: HDMI 0 : HDMI 0 : playback 1 00-07: HDMI 1 : HDMI 1 : playback 1 00-08: HDMI 2 : HDMI 2 : playback 1

对应 ALSA 设备:

plughw:0,3 plughw:0,7 plughw:0,8

第一个数字是声卡号,第二个数字是 PCM 设备号。


七、查看 ELD,确认电视已经连接

ELD 是 HDMI 显示设备向系统上报的音频能力信息。

先列出 ELD 文件:

adb shell ls -l /proc/asound/card0/eld*

一次性读取全部 ELD:

adb shell "for f in /proc/asound/card0/eld#2.*; do echo ==== $f; cat $f; done"

找到包含以下内容的项目:

monitor_present 1 eld_valid 1 monitor_name Mi TV connection_type HDMI

我的设备对应/proc/asound/card0/eld#2.0,关键内容如下:

monitor_present 1 eld_valid 1 monitor_name Mi TV connection_type HDMI speakers [0x1] FL/FR sad0_coding_type [0x1] LPCM sad0_channels 2 sad0_rates [0xe0] 32000 44100 48000 sad0_bits [0xe] 16 20 24

这说明 HDMI 线、电视握手、Intel HDMI 音频驱动和电视的 LPCM 支持都正常。


八、检查 DRM HDMI 接口

adb shell ls -1 /sys/class/drm

我的设备输出:

card1 card1-DP-1 card1-HDMI-A-1 renderD128 version

查看连接状态:

adb shell cat /sys/class/drm/card1-HDMI-A-1/status

正常应返回:

connected

不知道具体接口名称时,可以执行:

adb shell "for f in /sys/class/drm/*/status; do echo ==== $f; cat $f; done"

九、打开 IEC958

adb shell "for ch in 0 1 2 3; do alsa_amixer -c0 set IEC958,$ch on; done"

部分通道提示不存在可以忽略。


十、手动测试 HDMI 设备

依次测试:

adb shell alsa_aplay -Dplughw:0,3 /data/local/tmp/sample.wav adb shell alsa_aplay -Dplughw:0,7 /data/local/tmp/sample.wav adb shell alsa_aplay -Dplughw:0,8 /data/local/tmp/sample.wav

我的设备执行下面这条就能正常出声:

adb shell alsa_aplay -Dplughw:0,3 /data/local/tmp/sample.wav

最终确认:

声卡号:0 设备号:3 ALSA 设备:plughw:0,3

如果alsa_aplay能响,说明 HDMI 硬件、驱动和 ALSA 层都正常,问题位于 Android Audio Policy。

出现权限错误时先执行:

adb root

十一、检查 Android Audio Policy

adb shell dumpsys media.audio_policy > audio_before.txt findstr /n /i "Available output devices Outputs HDMI_2 Selected Device" audio_before.txt

修改前,系统虽然能看到:

HDMI_2 AUDIO_DEVICE_OUT_HDMI hdmi_stereo hdmi_multi

HDMI_2只出现在Declared devicesSupported devices中。

真正可用的输出仍然只有:

Available output devices (2): Speaker Telephony Tx

媒体流始终选择:

Selected Device: AUDIO_DEVICE_OUT_SPEAKER

这说明 HDMI 配置模块已经加载,但HDMI_2没有被标记为可用输出。


十二、将根目录重新挂载为可写

先查看根目录挂载状态:

adb shell mount | findstr " on / "

我的系统最初是:

/dev/loop0 on / type ext4 (ro,seclabel,relatime)

重新挂载为可写:

adb root adb shell mount -o remount,rw /

再次检查,成功后会显示:

/dev/loop0 on / type ext4 (rw,seclabel,relatime)

可以测试写入:

adb shell touch /system/test_rw adb shell ls -l /system/test_rw adb shell rm /system/test_rw

不要使用adb remount,部分 Android-x86 系统会提示 overlayfs 不受支持。也不要执行mount -o remount,rw /system,因为/system不是独立挂载点,真正的挂载点是/


十三、找到 HDMI 配置文件

adb shell "grep -R -l 'HDMI_2' /vendor/etc /system/etc 2>/dev/null"

我的设备返回:

/vendor/etc/hdmi_audio_policy_configuration.xml

十四、拉取配置文件

adb pull /vendor/etc/hdmi_audio_policy_configuration.xml . copy hdmi_audio_policy_configuration.xml hdmi_audio_policy_configuration.xml.original

建议使用 Notepad++ 或 Visual Studio Code 编辑,保持 UTF-8 和 Unix 换行格式。


十五、修改 HDMI Audio Policy

找到:

<modulename="hdmi"halVersion="2.0">

<mixPorts>前面加入:

<attachedDevices><item>HDMI_2</item></attachedDevices><defaultOutputDevice>HDMI_2</defaultOutputDevice>

修改后的结构:

<modulename="hdmi"halVersion="2.0"><attachedDevices><item>HDMI_2</item></attachedDevices><defaultOutputDevice>HDMI_2</defaultOutputDevice><mixPorts>...</mixPorts><devicePorts>...</devicePorts><routes>...</routes></module>

attachedDevices会让HDMI_2作为固定连接设备进入可用设备列表;defaultOutputDevice会将 HDMI 设置为该模块的默认输出。

不要删除原有的mixPortsdevicePortsroutes


十六、备份并推回设备

adb push hdmi_audio_policy_configuration.xml /data/local/tmp/ adb shell cp -a /vendor/etc/hdmi_audio_policy_configuration.xml /vendor/etc/hdmi_audio_policy_configuration.xml.bak adb shell cp /data/local/tmp/hdmi_audio_policy_configuration.xml /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chmod 644 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chown 0:0 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell sync adb reboot

十七、重启后验证

adb root adb wait-for-device adb shell dumpsys media.audio_policy > audio_after.txt findstr /n /i "Available output devices Outputs HDMI_2 Selected Device" audio_after.txt

修复成功后应看到:

Available output devices (3): Speaker HDMI_2 Telephony Tx

活动输出中应出现:

IOProfile name:hdmi_stereo Devices: {AUDIO_DEVICE_OUT_HDMI, @:}

媒体流会选择:

Selected Device: {AUDIO_DEVICE_OUT_HDMI, @:}

此时 YouTube、系统提示音和播放器都可以通过电视正常出声。


十八、修复前后对比

修改前

ALSA plughw:0,3 可以出声 Android 系统没有 HDMI 声音 Available output devices (2) HDMI_2 只存在于 Declared devices Selected Device 为 Speaker

修改后

Available output devices (3) HDMI_2 进入可用设备列表 hdmi_stereo 成为活动输出 Selected Device 为 AUDIO_DEVICE_OUT_HDMI YouTube 和系统声音正常

十九、恢复原配置

adb root adb shell mount -o remount,rw / adb shell cp /vendor/etc/hdmi_audio_policy_configuration.xml.bak /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chmod 644 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chown 0:0 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell sync adb reboot

二十、注意事项

  1. 不同设备的声卡号和设备号可能不同,必须先执行:

    adb shell cat /proc/asound/pcm
  2. 不同设备的 HDMI 配置名称可能不是HDMI_2,应先搜索配置文件。

  3. alsa_aplay能响,才说明底层 HDMI 音频链路正常。

  4. HDMI_2出现在Declared devices,不代表已经可以使用。

  5. 必须在Available output devices中看到 HDMI,系统应用才可能路由到 HDMI。

  6. 修改 XML 前一定要备份。

  7. Windows CMD 中没有grep,应使用findstr,或者把管道放进adb shell "..."中执行。

  8. 重启后可能需要重新执行adb root

  9. 如果仍然无声,可以先把电视数字音频输出设置为 PCM。

  10. 本方法适用于“ALSA 直出有声,但 Android Audio Policy 没有启用 HDMI”的情况。对于内核完全未识别 HDMI 声卡的设备无效。