




















我在 Debian (KDE Plasma) 系统上使用 ClassIn 时,发现无法播放任何音频。其他应用程序(如浏览器、媒体播放器)声音正常,仅 ClassIn 存在问题。ClassIn 的音频输出设备选项中也仅有 "default" 一项,无法手动选择其他设备。
从 ClassIn 官方得知,ClassIn 使用 ALSA。
aplay -l
输出如下:
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 0: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
系统有两个声卡:
由于 ALSA 的 "default" 设备通常指向 card 0,而我的 HDMI 显示器并没有扬声器,这意味着 ClassIn 的声音可能被送到了一个没有输出能力的设备上。
那么问题来了:我的显示器没有任何扬声器。为什么系统会认为它是一个音频输出设备?
读取显示器的 EDID 信息:
edid-decode /sys/class/drm/card0-HDMI-A-2/edid
输出中 CTA-861 Extension Block 部分仅包含 Video Data Block 和 Vendor-Specific Data Block,完全没有 Audio Data Block 和 Speaker Allocation Data Block。这说明显示器已经如实向系统报告了自己不支持音频。
那为什么系统还觉得我的显示器有扬声器?搜索得知,Linux 内核的 HDA HDMI 驱动(snd-hda-codec-hdmi)的设计策略是为所有 HDMI 输出端口创建音频设备,而不会根据 EDID 中的音频信息自动禁用无用的端口。
既然 card 0 指向了一个没有扬声器的 HDMI 设备,一个自然的思路是让 PCH 声卡排到第一位,这样 ALSA 的 "default" 就会指向它。
编辑 /etc/modprobe.d/alsa-reorder.conf:
options snd-hda-intel index=1,0
index=1,0 的作用是将先被内核发现的 HDMI 设备降为 card 1,后被发现的 PCH 设备提为 card 0。
我重启设备。再打开ClassIn,依然没有声音。
aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: PCH [HDA Intel PCH], device 0: ALC3232 Analog [ALC3232 Analog]
Subdevices: 0/1
Subdevice #0: subdevice #0
card 1: HDMI [HDA Intel HDMI], device 3: HDMI 0 [HDMI 0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: HDMI [HDA Intel HDMI], device 7: HDMI 1 [HDMI 1]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: HDMI [HDA Intel HDMI], device 8: HDMI 2 [HDMI 2]
Subdevices: 1/1
Subdevice #0: subdevice #0
此时 PCH 已经成功变为 card 0。配置生效了,但没有解决问题。
speaker-test -t wav -c 2
输出:
speaker-test 1.2.15.2
Playback device is default
Stream parameters are 48000Hz, S16_LE, 2 channels
WAV file(s)
ALSA lib pcm_dmix.c:1000:(snd_pcm_dmix_open) [error.pcm] unable to open slave
Playback open error: -16,Device or resource busy
Device or resource busy。这说明声卡硬件已经被其他进程占用,ALSA 无法直接访问。
查看谁占用了音频设备:
fuser -v /dev/snd/*
输出:
USER PID ACCESS COMMAND
/dev/snd/controlC0: user 1114 F.... pipewire
user 1175 F.... wireplumber
/dev/snd/controlC1: user 1175 F.... wireplumber
/dev/snd/pcmC0D0p: user 1114 F...m pipewire
/dev/snd/seq: user 1114 F.... pipewire
PipeWire 占用了 /dev/snd/pcmC0D0p(即 card 0 的播放设备)。这正是 ClassIn 想要访问的设备。
pactl info 2>&1 | head -5
输出:
Server String: /run/user/1000/pulse/native
Library Protocol Version: 35
Server Protocol Version: 35
Is Local: yes
Client Index: 156
系统使用的是 PipeWire(兼容 PulseAudio 接口)。ALSA 声卡硬件设备被占用了
pipewire-alsa 包提供了 ALSA 到 PipeWire 的兼容层。
sudo apt install pipewire-alsa
ALSA 的 "default" 设备被重定向到 PipeWire,而非直接访问硬件。
speaker-test -t wav -c 2
这次系统不再报错,也能正常听到测试声音。打开 ClassIn,音频能播放了。
在 Debian 12+(默认使用 PipeWire)下,某些应用(如 ClassIn)直接通过 ALSA 播放音频时可能失败。其根本原因是 PipeWire 独占了声卡硬件设备,导致直接访问 ALSA 硬件的应用无法播放。
排查过程中,我发现 ALSA default 设备指向了无扬声器的 HDMI 输出,并尝试调换声卡顺序,但这一步并未解决问题——系统用 PipeWire 作为音频服务。
最终的解决方案是安装 pipewire-alsa。它将 ALSA 请求桥接到 PipeWire,使其能正常播放。如果你的 ClassIn 在 Linux 上无法出声,且系统使用 PipeWire,可以检查该包是否已安装。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。