WirePlumber

提供: ArchWiki
ナビゲーションに移動 検索に移動

関連記事

WirePlumber は、PipeWire 用の強力なセッションおよびポリシーマネージャです。モジュール設計に基づき、管理機能を実装し、 Lua プラグインによって、高度な設定と拡張が可能です。

インストール

wireplumber パッケージを インストールしてください。他の PipeWire セッションマネージャーと競合しますので、必ずアンインストールするようにしてください。

WirePlumber は systemd/ユーザー を使ってサーバーを管理し、ソケットを自動で起動します。

オプションとして、ドキュメントを確認するために wireplumber-docs をインストールしてください。

設定

設定ファイルのレイアウト

WirePlumber の設定 は、変更された contextalsa_monitor などのグローバル PipeWire 風味の JSON オブジェクトで設定されていますその行動を変えるために。設定ファイルは、~/.config/wireplumber/ (ユーザー構成)、/etc/wireplumber/ (グローバル構成)、そして /usr/share/wireplumber/ (ストック構成) から読み取られます。

WirePlumber は、メイン設定ファイル を読み取ることから開始します。これは、PipeWire コンテキスト、SPA プラグイン、モジュール、およびコンポーネントを設定する JSON のようなファイルです。これらのコンポーネントの中には、グローバルオブジェクトを動的に変更するために使用される Lua スクリプトエンジンがあります。

パッケージに同梱されているさまざまな設定ファイルがあります。

  • シングルインスタンス設定ファイル/usr/share/wireplumber/wireplumber.conf これはデフォルトの設定であり、他のすべての設定の機能を1つのプロセス内に含んでいます。
    • すべてのメイン設定ファイルで使用されている "context" オブジェクトについては、ドキュメント を参照。
  • メイン設定ファイル /usr/share/wireplumber/main.conf WirePlumber コアに必要なモジュールとコンポーネントをロードし、config-dir/main.lua.d/ から Lua 設定ファイル をロードします。[1] を参照してください。
  • Bluetooth 設定ファイル /usr/share/wireplumber/bluetooth.conf コアプロセスの Bluetooth 接続を処理する WirePlumber プロセスに適しています。これはconfig-dir/bluetooth.lua.d/ から Lua ファイルをロードします。
  • policy 設定ファイルは /usr/share/wireplumber/policy.conf にあります。これは、WirePlumber がノードの移動や変更を判断するためのポリシー機能をカプセル化したものです。config-dir/policy.lua.d/ から Lua ファイルを読み込みます。
    • ポリシー関連オブジェクトについては、ドキュメント を参照してください。

lua.d/ ディレクトリ内の Lua 設定ファイルは、config-dir/scripts/ から Lua スクリプトも読み込みます。これらのスクリプトは Pipewire のロジック/機能の一部を実装しており、特定の状況下では変更する価値がある場合もあります。

設定の変更

WirePlumber を設定する推奨方法は、/etc/wireplumber/ または ~/.config/wireplumber/ 内の適切な lua.d/ ディレクトリに Lua スクリプトを追加することです。 考慮すべき点は次のとおりです。

  • 上書きしたい既存のスクリプトがある場合は、/usr/share/wireplumber/ からコピーしてください。同じ名前で優先順位の低い場所にある設定ファイルは無視されます [2]
  • 新しいスクリプトを追加する場合、50 より大きな数字で始めるべきです (例:51-my-config.lua) デフォルトの設定は、英数字の並び順で 50 かそれ以下で行われることがほとんどだからです。
    • WirePlumber は multi-path merging を実行するため、英数字の並び順がディレクトリの優先順位よりも優先されるため、番号の低いストックの設定が新しいスクリプトよりも先に実行されることに注意してください。
  • 選択するディレクトリは、ストックの設定が行うものと一致している必要がありますが、複数インスタンスを使用する 場合ではない限り、厳密には重要ではありません。
  • Bluetooth デバイスの ALSA プロパティは bluetooth.lua.d/ で設定する必要があります。Bluetooth デバイスの ALSA プロパティは main.lua.d/ で設定されたものでは ありません

ルールマッチングのためのインターフェース名の取得

Lua スクリプトでは、設定するインターフェイスの オブジェクト のプロパティを使用して matches ルールを指定する必要があります。

WirePlumber によって管理されているすべてのオブジェクトを表示するには、コマンド wpctl status を使用します。ターゲットインターフェイスに割り当てられた ID を見つけます。次に、コマンド wpctl Inspection ID を使用して、必要なプロパティを取得します。

たとえば、ターゲットインターフェイスが HD Audio Controller Analog Stereo であり、次の出力を検討する場合:

$ wpctl status
PipeWire 'pipewire-0' [0.3.56, user@hostname, cookie:1163266174]

Audio
 ├─ Devices:
 │      42. HD Audio Controller                 [alsa]
 │     105. USB PnP Audio Device                [alsa]
 │
 ├─ Sinks:
 │  *   48. HD Audio Controller Analog Stereo   [vol: 0.50]
 │
 ├─ ...
 │
 ├─ Sources:
 │  *  101. USB PnP Audio Device Mono           [vol: 0.74]
 │
 └─ ...

インターフェース ID48 です。

次に、inspect コマンドを使用してオブジェクトの詳細を表示し、そのオブジェクト内のすべてのプロパティをリストします。

$ wpctl inspect 48
id 48, type PipeWire:Interface:Node
    ...
    device.api = "alsa"
    device.class = "sound"
  * device.id = "42"
    device.profile.description = "Analog Stereo"
    device.profile.name = "analog-stereo"
    ...
  * factory.id = "18"
    factory.mode = "merge"
    factory.name = "api.alsa.pcm.sink"
    ...
  * media.class = "Audio/Sink"
  * node.description = "HD Audio Controller Analog Stereo"
  * node.name = "alsa_output.pci-0000_08_00.4.analog-stereo"
  * node.nick = "ALC1220 Analog"
    ...
  * object.path = "alsa:pcm:1:front:1:playback"
  * object.serial = "49"
    ...

Lua 構成スクリプトの matches ルールで使用する device.name または node.name プロパティを選択します。

device.id は動的であり、頻繁に変更されるため、使用は避けてください。

matches ルールでは複数のプロパティが可能です。WirePlumber ALSA 設定のドキュメントalsa_monitor.rules セクションを参照してください。

ノート:
  • このオブジェクトの Endpoint クラスは media.class プロパティから判断できます。
  • ALSA では node オブジェクトはシンクまたはソース / device オブジェクトはカードに対応します。
  • v0.4.9以降、ALSA ノードは PCM 名を使って node.nick を生成します。これは少なくとも UCM を使っている HDA カードでは便利で、全ての出力 (アナログ、HDMI など) が一つのプロファイル上で node として公開されます。
ヒント:
  • コマンド pw-top は、現在使用中の PipeWire DeviceNode を表示します。
  • PipeWire の同様の検査コマンドは pw-cli info ID です。

デバイス/ノードのプロパティを変更する

デバイスやノードのプロパティ(説明やニックネームなど)を変更するには、Lua スクリプトを作成し、~/.config/wireplumber に適切なパスと名前で追加する必要があります。

例えば ALSA ノードの説明を変更するには、 ~/.config/wireplumber/main.lua.d/51-alsa-rename.lua のようなファイルを作成して、以下のような内容を記述してください。

51-alsa-rename.lua
rule = {
  matches = {
    {
      { "node.name", "equals", "alsa_output.pci-0000_00_1f.3.output_analog-stereo" },
    },
  },
  apply_properties = {
    ["node.description"] = "Laptop",
  },
}

table.insert(alsa_monitor.rules,rule)

もし、Bluetooth ノードやデバイスの何かを変更したい場合は、以下のような内容で ~/.config/wireplumber/bluetooth.lua.d/51-rename.lua を作成するとよいでしょう。

51-rename.lua
rule = {
  matches = {
    {
      { "node.name", "equals", "bluez_output.02_11_45_A0_B3_27.a2dp-sink" },
    },
  },
  apply_properties = {
    ["node.nick"] = "Headphones",
  },
}

table.insert(bluez_monitor.rules,rule)

Lua スクリプトのファイル名と場所は、WirePlumber's マルチパスマージ で、デフォルトの設定ファイル

(例:/usr/share/wireplumber/main.lua.d/50-alsa-config.lua)デバイスをロードして有効にするファイル

(例:/usr/share/wireplumber/main.lua.d/90-enable-all.lua)の前に実行できるよう設計されています。

デバイスやノードを選択するためのマッチングルールや、変更できるプロパティは ALSA 設定Bluetooth 設定 に記載されています。

デバイス/ノードの無効化

WirePlumber v0.4.7 からは、プロパティ device.disabled または node.disabled で任意のデバイスやノードを無効にできるようになりました。

~/.config/wireplumber/main.lua.d/51-alsa-disable.lua
rule = {
  matches = {
    {
      { "device.name", "equals", "alsa_card.pci-0000_08_00.4" },
    },
  },
  apply_properties = {
    ["device.disabled"] = true,
  },
}

table.insert(alsa_monitor.rules,rule)

システム内の alsa_card.* の名前については、WirePlumber#Obtain interface name for rules matching を参照してください。

ノート: 一般的な使用例としては、NVIDIA の HDMI オーディオ出力を無効にする場合など。

ノードの優先度の設定

自動的に選択されるシンクまたはソースを変更するには、その priority.driverpriority.session の値を設定する必要があります。

/etc/wireplumber/wireplumber.conf.d/52-set-priorities.conf
monitor.alsa.rules = [
  {
    matches = [
      {
        node.name = "alsa_output.usb-Generic_USB_Audio-00.HiFi__Speaker__sink"
      }
    ]
    actions = {
      update-props = {
        priority.driver = 100
        priority.session = 100
      }
    }
  }
]

この例では、Asus B650E-F マザーボードのオンボードオーディオのスピーカー出力シンクの優先度を 100 に設定しています。これは元々の値である 1000 から低く設定されています。そのため、他の出力シンク(例えばオンボードオーディオデバイスの S/PDIF 出力や接続されているヘッドホンなど)がデフォルトで選択されることになります。それらのデバイスはより高い優先度を持っているため、アナログスピーカー出力ではなく、そちらが選ばれることになります。

同じサウンドカード上の複数のシンクへの同時出力

PipeWire#同じサウンドカード上の複数のシンクへの同時出力 を参照してください。

一時的なデバイスへの同時出力

オンボードデバイスと外部デバイスに同時に音声を出力したい場合がありますが、外部デバイスが常に接続されているとは限りません。 これを実現するために、接続されているハードウェアに関係なく常に存在する仮想ノードを作成します。そして、外部デバイス(この例では USB ヘッドホン)を接続するたびに仮想ノードへリンクさせます。

まず、ログイン時に実行されるスクリプトを作成します(ウィンドウマネージャーの "スタートアップ" 機能を使用するのが簡単です)

/usr/local/sbin/create-virtual-sink.sh
#!/bin/bash

# Create a new sink called Simultaneous Output
pw-cli create-node adapter '{ factory.name=support.null-audio-sink node.name="Simultaneous Output" node.description="Simultaneous Output" media.class=Audio/Sink object.linger=true audio.position=[FL FR] }'

# Connect the normal permanent sound card output to the new sink
pw-link "Simultaneous Output:monitor_FL" alsa_output.pci-0000_05_04.0.analog-stereo:playback_FL
pw-link "Simultaneous Output:monitor_FR" alsa_output.pci-0000_05_04.0.analog-stereo:playback_FR

# Switch the default output to the new virtual sink
wpctl set-default `wpctl status | grep "\. Simultaneous Output" | egrep '^ │( )*[0-9]*' -o | cut -c6-55 | egrep -o '[0-9]*'`

上記の例では、最初の出力デバイスは "通常の" オンボードサウンドカード (alsa_output.pci-0000_05_04.0.analog-stereo) のみです。 自身のサウンドカードの識別名を確認するには、wpctl statuswpctl inspect を実行してください。

USB ヘッドホンが接続されたときに仮想出力へリンクするスクリプトを実行します:

link-virtual-sink-headphones.sh
#!/bin/bash
# link the virtual sync to your headphones should run when detected by UDEV

# wait a second for the drivers to load
sleep 1s

# link the headphones to your virtual sink
sudo -u user1 env XDG_RUNTIME_DIR=/run/user/1000 pw-link "Simultaneous Output:monitor_FL" alsa_output.usb-Kingston_HyperX_Cloud_Flight_S_000000000001-00.analog-stereo:playback_FL
sudo -u user1 env XDG_RUNTIME_DIR=/run/user/1000 pw-link "Simultaneous Output:monitor_FR" alsa_output.usb-Kingston_HyperX_Cloud_Flight_S_000000000001-00.analog-stereo:playback_FR

# finish and return the code for success
exit 0

このスクリプトは、USB ヘッドホンが接続されたときに自動実行されるように設定するのが理想的です。 udev ページに記載されている手順に従い、カスタムルールを作成してください。 (ただし、udev はスクリプト 実行前 にドライバをロードしないため、nohup などを使った中間スクリプトが必要になります)

また、上記スクリプトの XDG_RUNTIME_DIR の値を自身のユーザー ID に合わせて修正し、user1 を自分のユーザー名に変更する必要があります。

この仮想出力には、同様の方法で任意の数のデバイスを追加できます。

デバイスの接続状態を視覚的に確認したい場合は、qpwgraph ツールを使用すると便利です。

ヒントとテクニック

壊れた設定を削除

WirePlumber の設定が破損している場合、すべてのユーザー設定を削除することができます:

systemctl --user stop wireplumber.service
rm -r ~/.local/state/wireplumber # 設定を削除
systemctl --user start wireplumber.service

キーボードで音量コントロール

次のコマンドをボリュームキーにバインドするには、キーボードショートカット#Xorg を参照してください: XF86AudioRaiseVolumeXF86AudioLowerVolumeXF86AudioMute、および XF86AudioMicMute

音量を 150% の制限で上げるには:

$ wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+

音量を下げるには:

$ wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-

ボリュームをミュート/ミュート解除するには:

$ wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle

マイクをミュート/ミュート解除するには:

$ wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle
ヒント: デフォルト以外のシンクまたはソースを使用するには、wpctl status を実行して利用可能なすべてのシンクをリストし、@DEFAULT_AUDIO_SINK@ または _SOURCE@

音量レベルを表示

デフォルトのシンクの音量レベルとミュート状態を取得するには、次の手順を実行します。

$ wpctl get-volume @DEFAULT_AUDIO_SINK@
Volume: 0.45
ノート: ミュートステータスは、シンクがミュートされている場合にのみ表示されます。

Bluetooth プロファイルの自動切り替えを無効化

PipeWire#プロファイルの自動選択機能 を参照してください。

ログアウト後も Bluetooth を実行し続ける/ヘッドレス Bluetooth

デフォルトでは、/usr/share/wireplumber/bluetooth.lua.d/50-bluez-config.lua により logind モジュールが有効化されます。このモジュールは、セッションが終了すると Bluetooth を無効化します。この挙動は以下の設定で無効化できます:

/etc/wireplumber/bluetooth.lua.d/50-bluez-config.lua (あるいは ~/.config/wireplumber/bluetooth.lua.d/50-bluez-config.lua)
bluez_monitor.properties = {
  ["with-logind"] = false,
}
ノート: これに加えて、PipeWire/Wireplumber を実行しているユーザーに対しては残留 (lingering) を有効にする必要があります。

オーディオスタックの統合を無効化

他のオーディオソリューション (例: PulseAudio/JACK/ALSA) を使用するために PipeWire/WirePlumber にオーディオデバイスの制御を任せたくないが、それでも画面共有やビデオ用途で利用したい場合は、wireplumber@.serviceテンプレートユニット を利用して、異なるデフォルトプロファイルセットを有効にできます。

WirePlumber には、ビデオ関連のみを有効にし、オーディオ統合 (Bluetooth オーディオを含む) を無効にするプロファイル設定が含まれています。これを適用するには、video-only テンプレート ユーザーユニット を有効にします。

wireplumber.service ユーザーユニット無効化し、wireplumber@video-only.service ユーザーユニット有効化してください。

参照