ClassIn 在 Linux 下无法播放音频
从 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系统有两个声卡card 0HDA Intel HDMI对应 HDMI 输出card 1HDA Intel PCH (ALC3232 Analog)对应耳机孔或内置扬声器由于 ALSA 的 default 设备通常指向 card 0而我的 HDMI 显示器并没有扬声器这意味着 ClassIn 的声音可能被送到了一个没有输出能力的设备上。HDMI 显示器排查那么问题来了我的显示器没有任何扬声器。为什么系统会认为它是一个音频输出设备读取显示器的 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.confoptions snd-hda-intel index1,0index1,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。配置生效了但没有解决问题。ALSA default 设备排查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 busyDevice 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.... pipewirePipeWire 占用了/dev/snd/pcmC0D0p即 card 0 的播放设备。这正是 ClassIn 想要访问的设备。pactl info 21 | 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 声卡硬件设备ClassIn 尝试通过 ALSA 的 default 设备直接访问硬件由于硬件已被 PipeWire 独占ClassIn 无法打开设备播放失败其他应用声音正常是因为它们通过 PipeWirePulseAudio 兼容接口播放而非直接操作 ALSA 硬件解决pipewire-alsa包提供了 ALSA 到 PipeWire 的兼容层。sudo apt install pipewire-alsaALSA 的 default 设备被重定向到 PipeWire而非直接访问硬件。speaker-test -t wav -c 2这次系统不再报错也能正常听到测试声音。打开 ClassIn音频能播放了。总结在 Debian 12默认使用 PipeWire下某些应用如 ClassIn直接通过 ALSA 播放音频时可能失败。其根本原因是 PipeWire 独占了声卡硬件设备导致直接访问 ALSA 硬件的应用无法播放。排查过程中我发现 ALSA default 设备指向了无扬声器的 HDMI 输出并尝试调换声卡顺序但这一步并未解决问题——系统用 PipeWire 作为音频服务。最终的解决方案是安装pipewire-alsa。它将 ALSA 请求桥接到 PipeWire使其能正常播放。如果你的