Alsa Underrunのパルスオーディオ仮想受信機の変更

Alsa Underrunのパルスオーディオ仮想受信機の変更

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で説明されているように、まずダミー受信機を作成する必要があります。

関連情報