Debian はラップトップのスピーカーをヘッドフォンに切り替えますが、HDMI をヘッドフォンに切り替えません。オーディオ出力を自動切り替えできますか?

Debian はラップトップのスピーカーをヘッドフォンに切り替えますが、HDMI をヘッドフォンに切り替えません。オーディオ出力を自動切り替えできますか?

ノートパソコンのスピーカーを使用する場合、ヘッドフォンを接続するとスピーカーからヘッドフォンに出力が自動的に切り替わり、取り外すと逆に切り替わります。モニターのスピーカーを HDMI 経由で使用する場合、自動切り替えはありません。

ヘッドフォンが接続(切断)されているときに、オーディオ出力をデバイス間で自動的に切り替えることはできますか?

Debian 12 (bookworm)、カーネル バージョン 6.7.9-2、pipewire 1.0.5。

答え1

ノート PC のスピーカーとアナログ ヘッドフォン間のオーディオ自動切り替えは、単一のオーディオ チップの異なる出力間で行われます。チップには、この機能に対するハードウェア サポートもあります。HD オーディオ スタイルのフロント パネル オーディオ ジャックでは、サウンド チップ内の切り替え可能な機能が有効になっていると、ヘッドフォンが接続されていることを検出すると、他の出力が自動的にミュートされます。

(たとえば、alsamixerPipewire が提供する簡易ボリューム コントロールではなく、サウンド チップの実際のハードウェア ミキサーを選択した場合は、Auto-Muteトグルとして表示される場合があります。)

古い AC97 スタイルのフロント パネル オーディオ ジャックの場合、実際にはオーディオ ジャック自体の中に機械式スイッチがあり、ヘッドフォン ジャックが接続されるとスピーカー/ライン出力への出力信号が中断されます。

HDMI とあらゆるタイプのヘッドフォン間、またはラップトップのスピーカーと USB ヘッドセット間を切り替える場合、オーディオ データ ストリームを別のオーディオ チップに切り替える必要があります。Pipewire はこれが可能ですが、出力シンクの優先順位が正しく設定され、自動切り替えが有効になっている場合にのみ実行されます。

見るこのブログ記事wireplumber: Debian 12 に含まれる 0.4 シリーズでオーディオ シンクの優先度を確認および調整する方法について説明します。wireplumberバージョン 0.5 では設定方法が変更されているため、バージョン 0.5 以上を使用している場合は、このアドバイスは直接適用されません。

簡単に言うと、最初のステップは、新しいサウンド デバイスが接続されたときに自動切り替えを有効にすることです。 を実行することで、これを一時的に行うことができますpactl load-module module-switch-on-connect

この AskUbuntu.SE の質問を実行するという提案も含まれていますpactl load-module module-switch-on-port-available: 既存のオーディオ デバイスで新しいポートが使用可能になったときに切り替えを有効にすることを理解しています。

上記のコマンドを永続的にするには、/usr/share/pipewire/pipewire-pulse.conf例を読んで、関連する部分をディレクトリ*.conf内のファイルに追加します~/.config/pipewire/pipewire-pulse.conf.d/(存在しない場合は作成します)。例:

pulse.cmd = [
    { cmd = "load-module" args = "module-always-sink" flags = [ ] } #default
    { cmd = "load-module" args = "module-switch-on-connect" } #uncommented
    { cmd = "load-module" args = "module-switch-on-port-available" }  #added
    #{ cmd = "load-module" args = "module-gsettings" flags = [ "nofail" ] }
]

2 番目のステップは、サウンド デバイスに適切な優先順位が割り当てられていることを確認することです。

を使用するwpctl statusと、Pipewire が管理するデバイスの識別番号を表示し、wpctl inspect <number> | grep -e node -e priority特定のオーディオ デバイスの名前、説明、優先順位を表示できます。デフォルトの優先順位が希望どおりでない場合は、~/.config/wireplumber/main.lua.d/60-*.lua次のような内容のファイルを作成して優先順位を調整できます。

rule = {
  matches = {
    {
      { "node.name", "equals", "alsa_output.usb-MOTU_M4_M4MC0570FU-00.Direct__hw_M4__sink" },
    },
  },
  apply_properties = {
    ["priority.driver"] = 1050,
    ["priority.session"] = 1050,
  },
}

「予想される」プライマリ サウンド デバイスのデフォルトの優先度は約 1009 であるため、他のサウンド デバイスに高い値を割り当てると、pipewireそれが使用可能な場合は他のサウンド デバイスよりも優先されます。ただし、1500 を超える値はモニター デバイス用に予約されているため、1500 を超える値を割り当てないでください。

どうやら個々のポートにも優先度の値があるようですが、残念ながら、現時点ではカスタマイズ方法がわかりません。pactl list cards出力はかなり長くなりますが、 で表示できます。

Pipewire ポートの優先順位を調整する良い方法を誰かが知っている場合は、自分で完全な回答を書きたくない場合は、遠慮なく編集してください。

関連情報