ALSAがXRUNアンダーランを提供したときに出力に設定したパルスオーディオ仮想受信機が変更を開始する問題が発生しました。次のように説明されます。
次のコマンドを使用して、3つの仮想リスナー(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
次に、3つのaplayコマンド(aplay -v -r 48000 -f S16_LE)に出力されるいくつかのDSPコマンドを実行しました。次に、pavucontrolでそれぞれを別々の仮想受信機(Virtual0 - Virtual2)に設定し、それを使用して別のDSPプログラムに接続しました。
問題は、高いCPU使用率のためにALSAが正常に実行されないたびにpavucontrolのソースエントリがしばらく消えたことを示しています。 2)。したがって、各alsaインスタンスで数回のアンダーランが発生した後、すべてのソースが最終的にVirtual2シンクに出力されます。
私は時々ALSAがアンダーランすることを気にしませんが(CPUが完全に最大値に達したときにはほとんど発生しません。これはRaspberry Piです)、ソースを同じシンクに戻したいです。
問題は、各aplayソースの名前が同じであることです。したがって、アンダーランのためにしばらく消えると、その名前の最後のセットリスナーに移動します。これはGUIの最後のセットリスナーになります。
ロードが不足しているときにソースアイテムがしばらく消えるのを防ぐ方法はありますか?または、aplayソース名を一意の名前に変更しますか?
注:興味深いことに、pavucontrolのソースに欠陥がない出力用のmplayerを試してみましたが、残念ながらmplayerはオーディオに許容できないレイテンシを引き起こすため、キャッシュが無効になっても使用できません。 aplayとplay(from 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
デバイスが負荷が少ない間、パルスオーディオから短時間「消える」たびに、少なくとも正しい受信機に戻ります。
OPで説明されているように、まずダミー受信機を作成する必要があります。