我遇到了一个问题,当 ALSA 给出 XRUN 欠载时,pulseaudio 虚拟接收器为我设置的输出开始改变。说明如下:
我使用以下命令(从 Virtual0 到 Virtual2)创建了三个虚拟接收器
pacmd load-module module-null-sink sink_name=Virtual0
pacmd update-sink-proplist Virtual0 device.description=Virtual0
pacmd update-source-proplist Virtual0.monitor device.description=Virtual0
然后我运行一些 DSP 命令,这些命令输出为三个 aplay 命令(aplay -v -r 48000 -f S16_LE)。然后在 pavucontrol 中,我将它们中的每一个设置为一个单独的虚拟接收器(Virtual0 - Virtual2),然后我用它来管道到另一个 DSP 程序。
问题是,每当 ALSA 由于 CPU 使用率高而运行不足时,pavucontrol 中的源条目将短暂消失,然后一两秒后返回,虚拟接收器更改为我在 pavucontrol GUI 中设置的最后一个(通常虚拟2)。因此,在每个 alsa 实例上发生几次欠载之后,所有源最终都会输出到 Virtual2 接收器。
我不介意 ALSA 时不时地欠载(只有在 CPU 完全耗尽时才会很少发生欠载 - 这是一个 Raspberry Pi),但我只是希望源恢复到同一个接收器。
我认为问题在于每个 aplay 源都具有相同的名称。因此,当一个由于欠载而短暂消失时,它会转到该名称的最后一个集合接收器,这恰好是 GUI 中的最后一个集合。
我能做些什么来阻止源条目在欠载时短暂消失吗?或者将 aplay 源名称更改为独特的名称?
请注意:有趣的是,我也尝试使用 mplayer 输出,这绝不会在 pavucontrol 中出现故障,但不幸的是 mplayer 会在音频上引入不可接受的延迟(即使禁用缓存),因此无法使用。aplay 和 play (from sox) 都有问题。
如果有人遇到类似的问题,我最终找到了解决方案。您需要创建一些在 asound.conf 中设置设备的虚拟卡,然后将音频输出到这些卡。
粘贴到 asound.conf 中。
然后运行输出
现在,只要设备在欠载时从 pulseaudio 短暂“消失”,它至少会回到正确的接收器。
确保首先创建虚拟接收器,就像我在 OP 中描述的那样。