web-dev-qa-db-ja.com

入力チャンネル数に基づいたPulseAudioプロファイルの自動切り替え

私はHDMIを介して私のレシーバーにオーディオを実行しています。レシーバーには7.1セットアップが接続されています。ただし、私が聴くほとんどのチャンネルのチャンネル数ははるかに少なく、モノラルのものもあれば、ステレオのものもあり、ビット数は5.1です。レシーバーに適切な数のチャンネルが供給されている場合、レシーバーはさまざまなDSP効果を発揮します(たとえば、センターチャンネルを分割する、ベースをサブウーファーに送信する、ドルビーマトリックスサラウンドを自動検出するなど)。サイレントチャネルの束を含む完全な7.1信号を送信すると、これは機能しなくなります。

PulseAudioの出力チャネルの数は、カードに割り当てられたプロファイルによって、カードごと、シンクごとに構成されます。割り当てられたプロファイルは、pacmdpactl、およびさまざまなGUIプログラムを使用して変更できます。

入力ストリームのチャネル使用量に基づいてプロファイルを自動的に変更するように設定するにはどうすればよいですか?たとえば、入力ストリームがフロントレフトとフロントライトのみを使用している場合は、ステレオプロファイル。バックレフトとバックライトも使用している場合は、4チャンネルなどに切り替えます。

41
derobert

これは単なる概念であり、完全なソリューションではありません。

Pulsaudioクライアントに構成を割り当てることができる場合は、patcl subscribeを使用して独自にイベントを処理できる場合があります(たとえば、ムービープレーヤーが接続する場合は7.1構成に切り替え、それ以外の場合はステレオ構成を使用します)。 patcl subscribeから一定のイベントストリームを取得します。これは、クライアント接続を監視することで処理できます。その後、pactl/pacmdを呼び出すだけでプロファイルを変更できます。

Pactl subscribeの出力例:

$ pactl subscribe 
Event 'change' on sink #0
Event 'remove' on sink-input #93
Event 'change' on sink #0
Event 'change' on source #0
Event 'change' on sink #0
Event 'change' on source #0
Event 'new' on sink-input #98
Event 'change' on sink-input #98

チャネル数が異なる複数のクライアントが存在する場合でも、まだ問題があることに注意してください。

さらに、上記のアプローチはかなり制限されています。アプリケーションごとの設定は、アプリケーションの実際に使用されているチャネルの数を検出するには不十分です(たとえば、vlcは5.1または7.1ビデオを再生する場合があります)。 pactlを介して、pulseaudioクライアントの実際に使用されているチャネルの数を取得する方法はわかりませんが、ここでいくつかのオプションを見逃している可能性があります。または、ビデオプレーヤーアプリケーション自体にフックして、そこに不足しているビットフォームを取得することもできます。

2
Till Schäfer