
如果我在 ALSA 中通过 USB 声卡播放音乐,并且不小心拔掉 USB 线,那么它会自动停止播放,这样很容易检测问题并修复它:
$ mpv --audio-device=alsa/hw:2 sound.wav
(+) Audio --aid=1 (pcm_s16le 2ch 44100Hz)
AO: [alsa] 44100Hz stereo 2ch s16
A: 00:00:05 / 00:03:41 (2%)
[ao/alsa] Device lost, trying to recover...
...
Exiting... (Interrupted by error)
[2]
但是,如果我通过 Pulseaudio 播放音乐并拔掉 USB 电缆,那么它会“故障转移”到另一个接收器并继续播放:
$ mpv --audio-device=pulse/alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-stereo sound.wav
(+) Audio --aid=1 (pcm_s16le 2ch 44100Hz)
AO: [pulse] 44100Hz stereo 2ch s16
A: 00:00:16 / 00:03:41 (7%)
# no error message
在这种情况下,我只有两个接收器,拔掉 USB 设备会导致音频连接移动到 PCI 设备,这恰好是我的笔记本电脑扬声器:
$ pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_06_00.6.analog-stereo>
name: <alsa_output.usb-C-Media_Electronics_Inc._USB_Audio_Device-00.analog-stereo>
重新连接 USB 电缆后,音频仍然通过笔记本电脑扬声器发出。
如果我知道如何控制 Pulseaudio,它的行为可能会很有用,但我不知道。特别是,我希望能够控制在故障转移时激活哪个接收器,并且我希望能够禁用故障转移,以便在拔出 USB 电缆时客户端应用程序中出现错误。
显然,根据具体情况,默认行为可能会让我感到尴尬。例如,如果我在公共场所用耳机收听私人内容,并且 Pulseaudio 决定通过我的笔记本电脑扬声器重新路由它,那将非常烦人。如果我可以将 USB 接收器配置为故障转移到空接收器(丢弃样本)或错误接收器(在客户端中产生错误),这种情况就会得到纠正。其中任何一个都可能吗?
答案1
通过 Pulseaudio 版本 13.0,可以禁用接收器疏散
pactl unload-module module-rescue-streams
或者通过注释掉 中的适当行/etc/pulse/default.pa
。
从版本 14.0 开始,module-rescue-streams
成为核心功能的一部分并且无法卸载。然而,一个新的布尔选项已被介绍以便可以禁用它。 14.0 之后,可以通过添加rescue-streams=no
来禁用接收器疏散/etc/pulse/daemon.conf
。
目前还没有计划允许用户配置给定流在接收器发生故障时疏散到哪个接收器。流总是被疏散到默认接收器。