我遇到一个问题,当 ALSA 给出 XRUN 欠载时,我设置的输出的脉冲音频虚拟接收器开始改变。说明如下:
我使用以下命令创建了三个虚拟接收器(从 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(来自 sox)都有这个问题。
答案1
如果有人遇到类似的问题,我最终找到了解决方案。您需要创建一些在 asound.conf 中设置设备的虚拟卡,然后将音频输出到这些卡。
sudo nano /etc/asound.conf
粘贴到 asound.conf 中。
pcm.VirtualCard0 {
type pulse
device Virtual0
}
ctl.VirtualCard0 {
type pulse
device Virtual0
}
pcm.VirtualCard1 {
type pulse
device Virtual1
}
ctl.VirtualCard1 {
type pulse
device Virtual1
}
pcm.VirtualCard2 {
type pulse
device Virtual2
}
ctl.VirtualCard2 {
type pulse
device Virtual2
}
然后运行输出
aplay -v -r 48000 -f S16_LE -DVirtualCard0
aplay -v -r 48000 -f S16_LE -DVirtualCard1
aplay -v -r 48000 -f S16_LE -DVirtualCard2
现在,每当设备在欠载时从pulseaudio中短暂“消失”时,它至少会回到正确的接收器。
确保您首先创建虚拟接收器,就像我在OP中描述的那样。