脈衝音頻虛擬接收器在 Alsa Underrun 上發生變化
我遇到了一個問題,當 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 中設置設備的虛擬卡,然後將音頻輸出到這些卡。
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 中描述的那樣。