PipeWire
関連記事
PipeWire は新しい低レベルマルチメディアフレームワークです。 映像と音声を最小の遅延で再生/キャプチャすることを目的としていて、PulseAudio、JACK、ALSA、GStreamer をベースとしたアプリケーションと互換性があります。
このフレームワークのデーモンは (PulseAudio と JACK の機能を持った) オーディオサーバーとしても、ビデオキャプチャサーバーとしても設定できます。
また PipeWire は Flatpak のようなコンテナをサポートしており、audio や video ユーザーグループに依存するのではなく、Flatpak や Wayland にスクリーンや音声を録音する許可を求める Polkit のようなセキュリティモデルを使用しています。
目次
- 1 インストール
- 2 設定
- 3 使用方法
- 4 音声のポストプロセッシング
- 5 トラブルシューティング
- 5.1 オーディオ
- 5.1.1 PipeWire にマイクが検出されない
- 5.1.2 新しいデバイスを接続したときにサウンドが自動的に切り替わらない
- 5.1.3 サウンドが自動的に Bluetooth ヘッドフォンに切り替わらない
- 5.1.4 Bluetooth デバイスに接続しても音が出ない
- 5.1.5 音量が小さい
- 5.1.6 increasing RLIMIT_MEMLOCK
- 5.1.7 サンプリングレートを変更する
- 5.1.8 音質(リサンプリング品質)
- 5.1.9 外付けサウンドカードが再接続後に有効にならない
- 5.1.10 音が出ないまたは pactl info が Failure: Connection refused と表示する
- 5.1.11 Bluetooth の音声の品質が低い
- 5.1.12 再生開始時の音声の遅延やポップ/クラックが目立つ
- 5.1.13 再生開始時に音声に遅延が発生する
- 5.1.14 複数のストリームの再生開始時に音声が途切れる
- 5.1.15 音がひずむ
- 5.1.16 スタンバイ後に音声の問題が発生する
- 5.1.17 USB DAC(例:Schiit 社製 DAC)で高レイテンシー
- 5.1.18 音量が 30% になるまで USB DAC から音が出ない
- 5.1.19 リアルタイムオーディオが動作しない
- 5.1.20 同じサウンドカード上の複数のシンクへの同時出力
- 5.1.21 Discord から通知音が鳴らない
- 5.1.22 PipeWire で FMOD ゲームがクラッシュする
- 5.1.23 自動切り替えが機能しない
- 5.1.24 リアルタイムプライオリティの欠落/サスペンド後の負荷によるクラックリング
- 5.2 ビデオ
- 5.1 オーディオ
- 6 参照
インストール
公式リポジトリから pipewire パッケージを インストール してください。multilib に対応した lib32-pipewire もあります。
Pipewire は systemd/ユーザー を使ってサーバーを管理し、ソケットを自動で起動します。
オプションとして、pipewire-docs をインストールすると、ドキュメントを確認することができます。
Pipewire は、他のオーディオサーバーと置き換えることができます。詳しくは オーディオ を参照してください。
セッション マネージャー
JACK と同様、PipeWire は内部で接続ロジックを実装していません。新しいストリームを監視し、適切な出力デバイスやアプリケーションに接続する負担は、セッションマネージャーとして知られる外部のコンポーネントに任されています。
現在、推奨のセッションマネージャーは1つだけで次になります:
- WirePlumber — 強力なマネージャであり、現在の推奨品です。モジュール設計に基づいており、実際の管理機能を実装する Lua プラグインがあります。
次のセッションマネージャーはサポート外になっており WirePlumber を推奨しています:
- PipeWire Media Session — いくつかの基本的なデスクトップのユースケースに対応した非常にシンプルなセッションマネージャです。これは主にテスト用と新しいセッションマネージャを構築するための例として実装されました。
PipeWire のインストール時に、どちらかを選ぶように指示されます。後で適切なパッケージをインストールすることで、もう一方のオプションと衝突しますが、置き換えることで切り替えが可能です。
GUI
- Helvum — PipeWire 用の GTK 製のパッチベイ。 JACK のツールの catia にインスパイアされた。
- qpwgraph — Qt-based Graph/Patchbay for PipeWire, inspired by the JACK tool QjackCtl.
設定
PipeWire パッケージは、初期設定ファイルを/usr/share/pipewire
に用意しています。パッケージのアップデートで変更内容が上書きされてしまうので、これらのファイルを直接編集するべきではありません。PipeWire を設定するには、ファイルを /usr/share/pipewire
からシステム全体の代替場所 /etc/pipewire
か、ユーザーの場所 ~/.config/pipewire
にコピーしてください。[1]
プロファイル
Pipewire では、PulseAudio のプロファイルに加えて、pavucontrol で選択可能なカスタムの Pro Audio プロファイルが提供されています。その効果はこちらで解説しています:https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile
使用方法
音声
PulseAudio や JACK と同様に PipeWire をオーディオサーバーとして使用できます。 PulseAudio サーバーの互換実装と JACK クライアント用の ABI 互換ライブラリを提供することで PulseAudio と JACK の両方を置き換えることを目的としています。詳細についてはこの記事を参照してください。
ALSA/レガシーアプリケーション
pipewire-alsa をインストールして ALSA API を使用するすべてのアプリケーションが PipeWire を使用するよう設定できます。
PulseAudio クライアント
pipewire-pulse をインストールします。このパッケージは pulseaudio と pulseaudio-bluetooth を置き換えます。再起動するか、ログインし直すか、pulseauio.service
を停止して、pipewire-pulse.service
ユーザーユニットを実行すると効果がわかります。
パッケージがユーザーサービス pipewire-pulse.socket
を自動的に有効化するので、通常それ以上の操作は不要です。置き換えが機能しているかどうかを確認するには、次のコマンドを実行して出力を確認してください:
$ pactl info
... Server Name: PulseAudio (on PipeWire x.y.z) ...
さらに詳しい設定 (モジュールなど) については、Migration from PulseAudio および Pipewire-Pulse の設定]に関する公式アップストリーム Wiki を参照してください。
JACK クライアント
pipewire-jack をインストールします。pw-jack
を使用して JACK クライアントを起動すると、元の libjack*
ではなく PipeWire が提供する互換ライブラリが使用されます:
pw-jack application
カスタムバッファサイズを要求することもできます。PIPEWIRE_LATENCY
環境変数を バッファサイズ/サンプルレート
(ブロックのレイテンシ(秒)を意味します) に設定します:
PIPEWIRE_LATENCY="128/48000" pw-jack application
また pipewire-jack-dropinAUR をインストールするか、jack か jack2 をアンインストールして JACK クライアントが互換ライブラリを自動的に読み込むようにもできます。
ldd
を使用して JACK アプリケーションが正しいライブラリにリンクしていることを確認します。
$ ldd /usr/bin/qjackctl | grep -i libjack
libjack.so.0 => /usr/lib/pipewire-0.3/jack/libjack.so.0 (0x00007f7e5080a000)
Bluetooth デバイス
PipeWire は pipewire-pulse パッケージがインストールされている場合 Bluetooth オーディオデバイスを制御します。具体的には、メディアセッションデーモンは /etc/pipewire/media-session.d/with-pulseaudio
が存在する時に自動的にその bluez5
モジュールを有効にします。
プロファイルの自動選択機能
pipewire-media-session は、入力ストリームが必要なときに、HSP/HFP と A2DP プロファイルを自動的に切り替えます。これを有効にするには、bluez5.autoswitch-profile
プロパティを true
にセットしてください。
/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf
... rules = [ { ... actions = { update-props = { ... bluez5.autoswitch-profile = true ...
これらの機能は、WirePlumber ではまだ 実装中 です。
PipeWire ネイティブパッチセット
グラフィカルな視覚化と接続の作成のための Helvum はありますが、それ以外はまだ入っていません。以下は、ワイヤセットの保存、ワイヤセットの読み込み、すべての接続の解除を行う bash スクリプトです。保存と読み込みには、コマンドラインパラメータでファイル名を指定します。
pw-savewires
#!/bin/bash if [[ "$#" -ne 1 ]]; then echo echo 'usage: pw-savewires filename' echo exit 0 fi rm $1 &> /dev/null while IFS= read -r line; do link_on=`echo $line | cut -f 4 -d '"'` link_op=`echo $line | cut -f 6 -d '"'` link_in=`echo $line | cut -f 8 -d '"'` link_ip=`echo $line | cut -f 10 -d '"'` echo "Saving: " "'"$link_on:$link_op"','"$link_in:$link_ip"'" echo "'"$link_on:$link_op"','"$link_in:$link_ip"'" >> $1 done < <(pw-cli dump short link)
pw-loadwires
#!/bin/python import sys import csv import os if len(sys.argv) < 2: print('\n usage: pw-loadwires filename\n') quit() with open(sys.argv[1], newline='') as csvfile: pwwreader = csv.reader(csvfile, delimiter=',', quotechar='"') for row in pwwreader: print('Loading: ' + row[0] + ' --> ' + row[1]) process = os.popen('pw-link ' + row[0] + ' ' + row[1])
pw-dewire
#!/bin/bash while read -r line; do echo 'Dewiring: ' $line '...' pw-link -d $line done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')
ネットワーク上のコンピューターとオーディオ機器を共有する
PipeWire 自体はネットワーク透過型ではありませんが、そのパルス実装は ネットワークストリーミング をサポートしています。ネットワーク上のコンピュータ間でオーディオを共有する簡単な方法は、Avahi デーモンを使って検出することです。
オーディオを共有するすべてのコンピュータで avahi-daemon.service
が実行されていることを確認してください。
ローカルのオーディオデバイスを共有するために、ホスト上で適切なモジュールをロードしてください。
pactl load-module module-native-protocol-tcp listen=192.168.1.10 # Use the local IP address pactl load-module module-zeroconf-publish
次に、クライアントにディスカバリモジュールをロードします。
pactl load-module module-zeroconf-discover
AirPlay レシーバーにオーディオをストリーミングする
AirPlay Receiver を装ったデバイスにオーディオをストリーミングすることが可能です。この機能を有効にするには、RAOP Discover モジュール をロードします。
$ pactl load-module module-raop-discover
専用の設定ファイルを作成することで、このモジュールを自動的にロードすることもできます。
/etc/pipewire/pipewire.conf.d/raop-discover.conf (or ~/.config/pipewire/pipewire.conf.d/raop-discover.conf)
context.modules = [ { name = libpipewire-module-raop-discover args = { } } ]
一部のスピーカーの AirPlay 実装 (Sonos AirPlay 2 スピーカーなど) では、ソースデバイスで着信 UDP トラフィック用にポート 6001 および 6002 を開く必要がある場合があります。
ネイティブ JACK 上で PipeWire を実行する
PipeWire はネイティブ JACK デーモン上の JACK クライアントとして実行することもできます。詳細は JACK and PipeWire を参照してください。
PipeWire シンクとして ALSA dmix デバイスを使用する
PipeWire サーバー(またはユーザーごとに複数) を ALSA dmix デバイス を介して ALSA に出力することが可能です。これにより、ALSA を主要な音声出力システムとして使用しながら、Bluetooth ヘッドフォンなどの ALSA 以外のデバイスを使用することができるようになります。
ALSA dmix セットアップ
PCH
と HDMI
の 2 枚のカードがあるとします。
/proc/asound/cards
0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xdff40000 irq 146 1 [HDMI ]: HDA-Intel - HDA ATI HDMI HDA ATI HDMI at 0xdfe60000 irq 147
PCM は次のようになります。
/proc/asound/pcm
00-00: ALC1220 Analog : ALC1220 Analog : playback 1 : capture 1 00-02: ALC1220 Alt Analog : ALC1220 Alt Analog : capture 1 01-03: HDMI 0 : HDMI 0 : playback 1 01-07: HDMI 1 : HDMI 1 : playback 1 01-08: HDMI 2 : HDMI 2 : playback 1 01-09: HDMI 3 : HDMI 3 : playback 1 01-10: HDMI 4 : HDMI 4 : playback 1 01-11: HDMI 5 : HDMI 5 : playback 1
ALSA 設定が次のようになっているとします。
/etc/asound.conf
ctl.!default { type hw card PCH } pcm.!default { type plug slave.pcm "dmix:PCH,0" } pcm.dhdmi { type plug slave.pcm "dmix:HDMI,9" }
この特定の例では、dmix デバイスは dmix:PCH,0
と dmix:HDMI,9
になります。
PipeWire dmix セットアップ
まず、alsa_monitor.enable()
をコメントアウトして、wireplumber
によるハードウェア ALSA デバイスの監視と追加を停止します。
/etc/wireplumber/main.lua.d/90-enable-all.lua (or ~/.config/wireplumber/main.lua.d/90-enable-all.lua)
... -- Load devices -- alsa_monitor.enable() v4l2_monitor.enable() libcamera_monitor.enable() ...
ここで、dmix デバイスを使用するように pipewire
を設定します。デフォルトの設定ファイル (/usr/share/pipewire/pipewire.conf
) には /pipewire.conf.in#L219-239 コメントアウトされた例 をベースとして使用できます。
独自の要素を context.objects
配列に追加します。
/etc/pipewire/pipewire.conf.d/alsa-dmix.conf (or ~/.config/pipewire/pipewire.conf.d/alsa-dmix.conf)
context.objects = [ # We do not start with dmix, but with an input device. # Do not forget to add an input device. # On a friend's Laptop, I saw Zoom having a nervous # breakdown and endlessly crying because no input device # was configured! You have been warned. { factory = adapter args = { factory.name = api.alsa.pcm.source node.name = "alsa-mic-internal" # name of pulse device (mpv) node.description = "Mic Internal" # name of pulse device (pavucontrol) media.class = "Audio/Source" api.alsa.path = "hw:PCH,0" } } # Okay, now we add our dmix PCMs { factory = adapter args = { factory.name = api.alsa.pcm.sink # sink for dmix node.name = "alsa-dmix-internal" # name of pulse device (mpv) node.description = "PCM Internal" # name of pulse device (pavucontrol) media.class = "Audio/Sink" # Sink for dmix api.alsa.path = "dmix:PCH,0" } } { factory = adapter args = { factory.name = api.alsa.pcm.sink # sink for dmix node.name = "alsa-dmix-hdmi" # name of pulse device (mpv) node.description = "PCM HDMI" # name of pulse device (pavucontrol) media.class = "Audio/Sink" # Sink for dmix # remember this is a non-default dmix from /etc/asound.conf api.alsa.path = "dmix:HDMI,9" } } ]
ユーザー (非 root) として、wpctl status
の出力を確認し、wpctl set-default ID
でデフォルトの入力(ソース) と出力 (シンク) のデバイスを好みのものに設定します。{ic|ID}} はシンク/ソース名の前の数字です。
これで、構成を完全にテストすることができます。
デバイスプロファイルの切り替え
snd_hda_intel
などの一部のハードウェアオーディオデバイスは、デバイスが実行されているプロファイルによって機能が異なります。snd_hda_intel
の場合、HDMI とアナログ出力用に個別のプロファイルがあります。
WirePlumber で HDMI に切り替える:
$ wpctl set-profile <device-ID> 3 $ wpctl status
... ├─ Sinks: │ * 53. Built-in Audio Digital Stereo (HDMI) [vol: 1.00] ...
WirePlumber でアナログに切り替える:
$ wpctl set-profile <device-ID> 1 $ wpctl status
... ├─ Sinks: │ * 51. Built-in Audio Analog Stereo [vol: 0.60] ...
WebRTC 画面共有
ほとんどのアプリケーションは、例えばウェブブラウザで WebRTC を使うとき (例: Google Meet) などに、デスクトップ (あるいは個々のアプリケーション) をキャプチャするために X11 に依存していました。Wayland では、セキュリティ上の理由から画面共有は異なる方法で処理されます。PipeWire はきめ細かなアクセス制御を使用して、Wayland 上のコンテンツを共有できます。
Firefox (バージョン84以降) と Chromium (バージョン110以降) はデフォルトでこの方法をサポートしていますが、Chromium の古いバージョン (バージョン73以降) では、URL chrome://flags/#enable-webrtc-pipewire-capturer
で対応する (実験的) フラグを設定するか、CLI 引数 --enable-features=WebRTCPipeWireCapturer
を用いて、WebRTC PipeWire サポート を有効化する必要があります。
obs-studio (バージョン27以降) は、新しい PipeWire キャプチャソースを使用することにより、この方法をサポートしています。
映像
ソフトウェアはまだ商業利用には適していませんが、試す分には問題ありません。GStreamer を使用して映像ストリームを処理するほとんどのアプリケーションは PipeWire GStreamer プラグインを使用して設定なしで動作するはずです (GStreamer#PipeWire を参照してください)。そのため既に cheese のようなアプリケーションは PipeWire を使用して映像入力を利用できます。
pipewire-v4l2 を使用すると、pw-v4l2
スクリプトを使用してライブラリをプリロードすることも可能になります (/lib/pipewire-0.3/v4l2/libpw-v4l2.so
) は、v4l2 呼び出しをインターセプトし、PipeWire 経由でビデオをルーティングします。
音声のポストプロセッシング
Pipewire モジュールフィルターチェーン
Pipewire には filter-chain
という内部モジュールがあり、音声の入出力を処理するノードを作成することができます。参照してください。
/usr/share/pipewire/filter-chain/ を参照してください。
イコライザー、バーチャルサラウンドサウンド、LADSPA プラグイン、チャンネルミキシングなどの例を紹介します。
システム全体のパラメトリックイコライゼーション
設定ファイルを .config
フォルダにコピーします。
mkdir -p ~/.config/pipewire/pipewire.conf.d cp /usr/share/pipewire/filter-chain/sink-eq6.conf ~/.config/pipewire/pipewire.conf.d/
次に、sink-eq6.conf
を編集して、必要なパラメータを組み込みます。ヘッドフォンの場合、これらは Oratory1990 のデータベース から入手できます。そこにリストされていない場合は、AutoEQ project
プリアンプが必要な場合は、eq_band_1
を変更して、bq_highshelf
フィルタを周波数 0Hz でマイナスゲイン (-120 〜 +20dB のゲインをサポート) で適用します。
label = bq_highshelf control = { "Freq" = 0 "Q" = 1.0 "Gain" = -7.5 }
6 バンドを超える場合は、nodes
リストと対応する links
にさらにエントリを追加して、1 つのフィルタ ":Out" を次のフィルタ ":In" に接続します。たとえば、11 に増やします。バンド (プリアンプ + 10):
{ output = "eq_band_6:Out" input = "eq_band_7:In" } { output = "eq_band_7:Out" input = "eq_band_8:In" } { output = "eq_band_8:Out" input = "eq_band_9:In" } { output = "eq_band_9:Out" input = "eq_band_10:In" } { output = "eq_band_10:Out" input = "eq_band_11:In" }
Pipewire を再起動し、デフォルトのサウンド出力デバイスとして "Equalizer Sink" を選択します。これは、すべてのアプリケーションに適用されます。
EasyEffects
EasyEffects (以前は PulseEffects と呼ばれていました) は多数のエフェクトとフィルタを個々の入出力ストリーム (アプリケーションの音声出力やマイクの入力など) に提供する GTK 製のユーティリティです。注目すべきエフェクトには、入出力イコライザー、出力ラウドネス等化、ベースエンハンスメント、入力ディエッサー、ノイズ抑制プラグインなどがあります。GitHub ページにエフェクトの一覧があります。
EasyEffects を使用するには、easyeffects をインストールします。プリセット設定集については、コミュニティープリセットを参照してください。
NoiseTorch
noisetorchAUR はノイズ抑制に使用できます。ビルド済み (noisetorch-binAUR) や開発版 (noisetorch-gitAUR) のパッケージもあります。
起動すると選択したマイクにモジュールを読み込むことができます。声が出力される閾値を調整することができます。実際の声が削除されない最大のレベルに設定するべきです。
Noise suppression for voice
noise-suppression-for-voice をインストールし、以下のいずれかのオプションを使用します:
- 以下の行を
context.exec
セクションに追加する:
/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
... context.exec = [ ... { path = "/usr/bin/pipewire" args = "-c /usr/share/pipewire/filter-chain/source-rnnoise.conf" } ...
そして、オーディオ設定でノイズキャンセルソースをデフォルトとして設定します。この機能を使う前に、アプリケーションを再起動する必要があるかもしれません。
JamesDSP
JamesDSP for Linux (jamesdspAUR として入手可能) は PipeWire と PulseAudio のためのオープンソースのサウンドエフェクトを提供します。LADSPA や Calf などに依存することなく、独自のエフェクトエンジンを使用しています。JamesDSP は当初 Android デバイス用のオーディオエフェクトプロセッサーとして公開されました。
LADSPA、LV2、VST プラグイン
LADSPA、LV2、VSTのプラグインを使用したい場合は、カスタム PulseAudio null シンクと Carla Jack ホストを利用できます。pipewire-pulse と pipewire-jack と carla をインストールします。はじめに default_null_sink
という名前の PulseAudio の null シンクを作成します。
pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=default_null_sink channel_map=FL,FR
pw-jack carla-rack
で PipeWire を使用する Carla を起動します。Rack タブで使いたいプラグインを全て追加します。プラグインのタイプが stereo であることを確認してください。適用する順番を変えることができます。EasyEffectsのようにリストの最初のプラグインが最初に入力の音声ストリームを受け取ります。その後 Patchbay タブに移動し default_null_sink
の L/R monitor を Carla input に接続し、Carla output を出力したいデバイス (スピーカーやイヤホンや HDMI 出力など) の playback に接続します。設定をフォルダに保存します (~/Documents/carla_sink_effects.carxp
など)。
Firefox で動画を見ている時など、アプリケーションが音声を再生している時に効果を試すことができます。2つの方法があります。一つは Carla の Patchbay タブで Firefox の接続を全て外し default_null_sink
の L/R output に接続する方法です。もう一つは pavucontrol を使用し Firefox の音声ストリームを default_null_sink
に変更する方法です (この方法は同じアプリケーションの次回起動時に同じ接続先を使用するはずです)。
これらの設定を起動時に適用するには、まず2つの systemd ユーザーサービスを作成します:
~/.config/systemd/user/jack-carla-rack.service
[Unit] Description=Load Carla Rack JACK host [Service] PassEnvironment="PIPEWIRE_LINK_PASSIVE=true" Type=exec ExecStart=/usr/bin/pw-jack carla-rack -n [Install] WantedBy=default.target
~/.config/systemd/user/pulseaudio-null-sink@.service
[Unit] Description=Load %i Pulseaudio null sink Before=jack-carla-rack.service After=pipewire-pulse.service [Service] Type=oneshot ExecStart=/usr/bin/pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=%i channel_map=FL,FR ExecStop=/usr/bin/pactl unload-module module-null-sink RemainAfterExit=yes [Install] WantedBy=default.target
jack-carla-rack サービスの Environment を Carla の設定ファイルのフルパスを指定するよう上書きします:
~/.config/systemd/user/jack-carla-rack.service.d/override.conf
Environment="CARLA_CONFIG_FILE=/home/username/Documents/carla_sink_effects.carxp" ExecStart= ExecStart=/usr/bin/pw-jack carla-rack -n $CARLA_CONFIG_FILE
最後に、作成したサービスを有効化します。pulseaudio-null-sink サービスには default_null_sink
引数をつけてください:
systemctl --user enable pulseaudio-null-sink@default_null_sink.service systemctl --user enable jack-carla-rack.service
トラブルシューティング
オーディオ
PipeWire にマイクが検出されない
PipeWire の alsa-monitor
モジュールは、デフォルトで alsa-card-profiles を使ってデバイスを検出します。これがうまくいかない場合は、api.alsa.use-acp
をオフにするか、オプションで api.alsa.use-ucm
をオンにすることを試してみてください。
pipewire-media-session を使用している場合。
/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)
... rules = [ { ... actions = { update-props = { ... api.alsa.use-acp = false ...
それ以外の場合は、wireplumber を使用している場合。
/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)
... alsa_monitor.rules = { { ... apply_properties = { -- Use ALSA-Card-Profile devices. They use UCM or the profile -- configuration to configure the device and mixer settings. -- ["api.alsa.use-acp"] = true, -- Use UCM instead of profile when available. Can be -- disabled to skip trying to use the UCM profile. ["api.alsa.use-ucm"] = true, ...
その後、pipewire を再起動し、利用可能なデバイスを確認します。
$ pw-record --list-targets
Available targets ("*" denotes default): 62 58: description="Built-in Audio" prio=1872 60: description="Built-in Audio" prio=2000 * 62: description="Built-in Audio (Loopback PCM)" prio=1984
新しいデバイスを接続したときにサウンドが自動的に切り替わらない
新しく接続されたデバイスに自動的に切り替えるには、次のファイルを作成します。:
/etc/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf)
# override for pipewire-pulse.conf file pulse.cmd = [ { cmd = "load-module" args = "module-always-sink" flags = [ ] } { cmd = "load-module" args = "module-switch-on-connect" } ]
サウンドが自動的に Bluetooth ヘッドフォンに切り替わらない
pactl load-module module-switch-on-connect
を実行し、ログイン時に自動的にそのコマンドが実行されるようにデスクトップ環境を設定してください。詳しくは wireplumber issue #89 を見てください。
Bluetooth デバイスに接続しても音が出ない
2020-12-07 の時点で、Bluetooth デバイスを接続しても音が出ない場合は、デフォルトのシンクに切り替えるか、シンク入力を正しいシンクに移動する必要があります。pactl list sinks
で使用可能なシンクの一覧を表示し、pactl set-default-sink
でデフォルトのシンクを Bluetooth デバイスに切り替えます。これはこのようなスクリプトを使って udev で自動化できます。
この問題については、この Reddit スレッドを参照してください。スクリプトの作成者によると、ヘッドセットプロファイル (HSP) にまだ問題がある可能性があります。
音量が小さい
PulseAudio を PipeWire で置き換えた後、正しく音が出ても、再起動後に音量が極端に小さくなることがあります。
alsamixer
を開き、F6
を押して適切なサウンドカードを選び ALSA のボリュームが100%であることを確認してください。alsactl
は再起動後もこの設定を維持するはずです。
increasing RLIMIT_MEMLOCK
Dec 13 11:11:11 HOST pipewire-pulse[99999]: Failed to mlock memory 0x7f4f659d8000 32832: This is not a problem but for best performance, consider increasing RLIMIT_MEMLOCK
realtime-privileges をインストールし realtime
グループに自分のユーザーを追加します。
あるいは memlock を 64kB から 128kB に増やすことで、この問題を解決できるようです。systemd/ユーザー で pipewire-pulse
を実行している場合は /etc/security/limits.d/username.conf
に次の行を追加します:
username soft memlock 64 username hard memlock 128
サンプリングレートを変更する
PipeWire のデフォルトでは、グローバルサンプルレートは 48kHz に設定されています。これを変更したい場合(より高い値をサポートする DAC を所有しているなど)、設定ファイル /etc/pipewire/pipewire.conf
の default.clock.rate = 48000
行を編集することで行うことができます。例えば、192kHz にしたい場合は、48000
を default.clock.rate = 192000
にコメントを解除して変更します。
PipeWire は、DAC がサポートする出力サンプルレートを変更することもできます。設定するには、default.clock.allowed-rates = [ 48000 ]
という行をコメント解除して設定します。例えば、[ 44100 48000 88200 96000 ]
とします。サンプルレートは、カードがアイドルのときに再生されるオーディオストリームのサンプルレートに従います。
どの出力サンプルレートとサンプルフォーマットが DAC に送られたデータであるかを確認するには(おそらく桁を変更する必要があります)。
cat /proc/asound/card0/pcm0p/sub0/hw_params
どの入力サンプルレートを使用しているかを確認するには、pcm0p
を pcm0c
に変更します。(c
は "capture" の略、p
は "playback" の略です).
音質(リサンプリング品質)
PulseAudio を resample-method = speex-float-10
または soxr-vhq
で使用していた場合、コメントを解除して resample.XXX
を変更することを検討するとよいかもしれません。resample.quality = 4
を 10
または最大値 15
に変更することを検討してください。(存在しない場合は /usr/share/pipewire/
からコピーしてください)。PipeWire の再起動を忘れないでください (sudo なし): systemctl --user restart pipewire.service pipewire-pulse.socket
(設定変更を適用させたい場合は、pipewire-pulse.socket
を絶対に忘れないでください)。
10
と 15
では、品質の差はほとんどありませんが、CPU 負荷は2〜3倍になっています。また、4
, 10
, 15
のレイテンシーの差はまだ誰も調べていません。Ryzen 2600 で 44100→48000Hz で resample.quality = 15
にすると pipewire
や pipewire-pulse
プロセスが 1CPUコア4.0% の負荷となる。
リサンプラーの比較はこちら:https://src.infinitewave.ca/(18KHz以上、120dB以上は注意)。speeex は Xiph.org Speex と記載されています。
PipeWire は Spa と呼ばれる独自のリサンプリングアルゴリズムを使用しています。SoX の sox
、Speex の speexenc
と同様、PipeWire にはそのスタンドアロン版があります。spa-resample
使い方は
spa-resample -q 15 -f s24 -r 48000 input16bit44100orAnythingElse.wav output24bit48000hz.wav
自分で sink を作れば、他のリサンプラーを使うことも可能でしょう。あるいは、音楽プレーヤーのプラグインを使うことも出来ます(例えば、Qmmp には SoX プラグインがあります)
外付けサウンドカードが再接続後に有効にならない
~/.config/pipewire-media-session/default-profile
にデフォルトプロファイル off のエントリがあれば削除します。それでも解決しない場合は ~/.config/pipewire-media-session/
からすべてのファイルを削除し、systemctl --user restart pipewire.service
で PipeWire を再起動します。
音が出ないまたは pactl info が Failure: Connection refused と表示する
これはアプリケーションが PipeWire-Pulse サービスに接続できていないことを意味します。/etc/pipewire/pipewire-pulse.conf
が存在し空でないことを確認し、systemctl --user restart pipewire-pulse.service
で PipeWire-Pulse を再起動してください。
それでも解決しない場合は strace -f -o /tmp/pipe.txt pactl info
を実行し、pastebin に /tmp/pipe.txt
を貼り付けて、IRC (OFTC の #pipewire) かメーリングリストで相談してください。
Bluetooth の音声の品質が低い
Bluetooth で再生が途切れる場合は systemctl --user status pipewire.service
を実行してみてください。次のようなエラーが表示される場合は、
Feb 17 18:23:01 HOST pipewire[249297]: (bluez_input.18:54:CF:04:00:56.a2dp-sink-60) client too slow! rate:512/48000 pos:370688 status:triggered
pactl list sinks
で現在選択されているコーデックを確認し、/etc/pipewire/media-session.d/bluez-monitor.conf
の bluez5.codecs
を sbc aac ldac aptx aptx_hd
のいずれかに変更してみてください。
/etc/pipewire/media-session.d/bluez-monitor.conf
... properties = { ... bluez5.codecs = [sbc] ...
mSBC サポートの有効化を試すには (Sony 1000XM3 のマイクの問題を修正します):
/etc/pipewire/media-session.d/bluez-monitor.conf
... rules = [ ... actions = { ... update-props = { ... bluez5.msbc-support = true ...
変更を適用するには systemctl --user restart pipewire.service
で PipeWire を再起動する必要があります。
再生開始時の音声の遅延やポップ/クラックが目立つ
これは、非アクティブ時のノードの一時停止が原因です。
これを無効にするには、遅延が発生する場所に応じて /etc/pipewire/media-session.d/*-monitor.conf
を編集し、プロパティ session.suspend-timeout-seconds
を 0 に変更します。無効にするか、他の値を試して、何が機能するかを確認します。
または、/etc/pipewire/media-session.d/media-session.conf
の行 suspend-node
をコメントアウトすることもできます。
再起動 して pipewire.service
と pipewire-pulse.service
の両方の変更を適用して下さい。
wireplumber で、新しいファイルを作成してデフォルト設定を上書きします:
~/.config/wireplumber/main.lua.d/51-disable-suspension.lua (or /etc/wireplumber/main.lua.d/51-disable-suspension.lua)
table.insert (alsa_monitor.rules, { matches = { { -- Matches all sources. { "node.name", "matches", "alsa_input.*" }, }, { -- Matches all sinks. { "node.name", "matches", "alsa_output.*" }, }, }, apply_properties = { ["session.suspend-timeout-seconds"] = 0, -- 0 disables suspend }, })
Bluetooth デバイスの場合は、次の設定も使用します (ファイルの場所が異なることに注意してください):
~/.config/wireplumber/bluetooth.lua.d/51-disable-suspension.lua (or /etc/wireplumber/bluetooth.lua.d/51-disable-suspension.lua)
-- Note: bluez_monitor, not alsa_monitor table.insert (bluez_monitor.rules, { matches = { { -- Matches all sources. -- Note: bluez_input, not alsa_input { "node.name", "matches", "bluez_input.*" }, }, { -- Matches all sinks. -- Note: bluez_output, not alsa_output { "node.name", "matches", "bluez_output.*" }, }, }, apply_properties = { ["session.suspend-timeout-seconds"] = 0, -- 0 disables suspend }, })
pipewire.service
と wireplumber.service
を再起動して、変更を適用します。
サスペンドを完全に無効にする代わりに、タイムアウト値を、ソースがサスペンドされるまでに必要な遅延秒数に変更することもできます。
再生開始時に音声に遅延が発生する
これは非アクティブ時のノードのサスペンドが原因です。遅延が発生する領域に応じて /etc/pipewire/media-session.d/*-monitor.conf
を編集し、プロパティ session.suspend-timeout-seconds
を 0
に変更してサスペンドを無効にするか、他の値を試して動作を確認してみてください。/etc/pipewire/media-session.d/media-session.conf
の suspend-node
の行をコメントアウトすることもできます。変更を適用するには pipewire
と pipewire-pulse
systemd サービスの両方を再起動するか、システムを再起動してください。
複数のストリームの再生開始時に音声が途切れる
この問題は通常 journalctl -b
を実行し、次のような行を探すことで診断できます:
pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940
公式 PipeWire トラブルシューティングガイドによると、この問題を解決するには /etc/pipewire/media-session.d/alsa-monitor.conf
を編集し、api.alsa.headroom = 0
という行のコメントを外し、値を 1024
に変更します。
音がひずむ
- マイクについては、
alsamixer
を起動し、問題があるサウンドカードを選択し、Mic Boost
やInternal Mic Boost
の値を下げてみてください。 /etc/pipewire/pipewire.conf
のdefault.clock.rate = 48000
のコメントを外して、値を44100
に下げてみてください。
スタンバイ後に音声の問題が発生する
スリープから復帰した際に音が消えたり壊れたりする場合は、ALSA を最初期化すると改善するかもしれません:
# alsactl init
USB DAC(例:Schiit 社製 DAC)で高レイテンシー
サンプルレートやフォーマットを変更することで、Schiit Hel 2 などの一部の DAC でレイテンシーを減らすことができるかもしれません [3] pipewire-media-session のマッチングルールを使用すると、デバイスのプロパティを設定することができます [4]
pipewire-media-session の alsa-monitor.conf
のデフォルト設定を /etc/pipewire/media-session.d
か ~/.config/pipewire/media-session.d
にコピーしてください。
そして、以下のような新しいルールブロックを追加してください。
/etc/pipewire/media-session.d/alsa-monitor.conf ~/.config/pipewire/media-session.d/alsa-monitor.conf
rules = { ... { matches = [ { node.name = "alsa_output.<name of node>" } ] actions = { update-props = { audio.format = "S24_3LE" audio.rate = 96000 # Following value should be doubled until audio doesn't cut out or other issues stop occurring api.alsa.period-size = 128 } } } ... }
alsa_output.<node name>
ノードは pw-top
で取得することができます。
DAC は異なるフォーマットやサンプルレートをサポートしているかもしれません。ALSA に問い合わせることで、あなたの DAC が何をサポートしているかを確認することができます。
まず、DAC のカード番号を取得します。
$ aplay -l
... card 3: S2 [Schiit Hel 2], device 0: USB Audio [USB Audio] Subdevices: 0/1 Subdevice #0: subdevice #0 ...
つまり、この例ではカード3ということになります。 サポートされているすべてのサンプルレートとフォーマットを取得します。
$ cat /proc/asound/cardX/streamX
... Playback: ... Interface 1 Altset 1 Format: S16_LE Channels: 2 Endpoint: 0x05 (5 OUT) (ASYNC) Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 Data packet interval: 125 us Bits: 16 ... Interface 1 Altset 2 Format: S24_3LE Channels: 2 Endpoint: 0x05 (5 OUT) (ASYNC) Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 Data packet interval: 125 us Bits: 24 ... Interface 1 Altset 3 Format: S32_LE Channels: 2 Endpoint: 0x05 (5 OUT) (ASYNC) Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 Data packet interval: 125 us Bits: 32 ... ...
この場合、S16_LE, S24_3LE, S32_LE
はサポートされているフォーマットで、44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
はすべてのフォーマットでサポートされているサンプルレートとなります。
音量が 30% になるまで USB DAC から音が出ない
USB DAC の中には、ある一定の音量に達するまで音が出なくなるものがあります [5] 一般的にこれは約 25%〜30% で、最初の音量が不快なほど大きくなり、低い音量を維持することができなくなります。解決策としては、["api.alsa.soft-mixer"]
を true
に設定して、ハードウェアミキサーの音量コントロールを無視することが挙げられます。
wireplumber でこれを実現するには、/usr/share/wireplumber/main.lua.d/50-alsa-config.lua
設定に次を使用して構成フラグメントを追加します。 table.insert
:
~/.config/wireplumber/main.lua.d/51-volume-fix.lua
table.insert (alsa_monitor.rules, { matches = { { -- This matches all cards. { "device.name", "matches", "alsa_card.*" }, }, }, -- Apply properties on the matched object. apply_properties = { -- Don't use the hardware mixer for volume control. It -- will only use software volume. The mixer is still used -- to mute unused paths based on the selected port. ["api.alsa.soft-mixer"] = true, } })
次に、pipewire を再起動します。alsamixer
でマスターボリュームを設定し、# alsactl store
で設定を保存します。これで、ボリュームミキサーを通常どおり使用できるようになります。
リアルタイムオーディオが動作しない
RTKit error: org.freedesktop.DBus.Error.AccessDenied
が systemctl --user status pipewire.service
の出力に表示された場合、pipewire daemon の優先度がリアルタイムに変更されていないことを示します。この問題については、[6] を参照してください。
同じサウンドカード上の複数のシンクへの同時出力
/usr/share/alsa-card-profile/mixer/profile-sets/default.conf
のコピーを作成し、アップデート後も変更が持続するようにします。ここでは、アナログと HDMI の2つのデフォルトマッピングを結合したプロファイルを定義しています。
/usr/share/alsa-card-profile/mixer/profile-sets/multiple.conf
[General] auto-profiles = no [Mapping analog-stereo] device-strings = front:%f channel-map = left,right paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic priority = 15 [Mapping hdmi-stereo] description = Digital Stereo (HDMI) device-strings = hdmi:%f paths-output = hdmi-output-0 channel-map = left,right priority = 9 direction = output [Profile multiple] description = Analog Stereo Duplex + Digital Stereo (HDMI) Output output-mappings = analog-stereo hdmi-stereo input-mappings = analog-stereo
ここで、PipeWire の media-session に、新しい card-profile を使用してデバイスをマッチングするように設定します。識別情報は、$ pw-cli dump device
で見つけることができます。
/etc/pipewire/media-session.d/alsa-monitor.conf
rules = [ { matches = [ { alsa.card_name = "HDA Intel PCH" } ] actions = { update-props = { api.alsa.use-acp = true device.profile-set = "multiple.conf" device.profile = "multiple" api.acp.auto-profile = false api.acp.auto-port = false } } } ]
Discord から通知音が鳴らない
min.quantum が低すぎることが原因かもしれませんので、700以上に設定してみてください。pipewire-pulse.conf の pulse.rules セクションに以下のルールを追加することで、Discord 専用にオーバーライドすることが可能です。
/etc/pipewire/pipewire-pulse.conf (or ~/.config/pipewire/pipewire-pulse.conf)
... pulse.rules = [ ... { # Discord notification sounds fix matches = [ { application.process.binary = "Discord" } ] actions = { update-props = { pulse.min.quantum = 1024/48000 # 21ms } } } ...
PipeWire で FMOD ゲームがクラッシュする
Pillars of Eternity のような古いバージョンの FMOD オーディオエンジン を使っているゲームの中には、PulseAudio バイナリが存在しないと pulseaudio --check
を呼び出してクラッシュするものがあります。回避策としては、/bin/pulseaudio
を/bin/true
にシンボリックリンクすることです[7]
# ln -s /bin/true /bin/pulseaudio
PulseAudio を再インストールする場合は、シンボリックリンクを削除する必要があることに注意してください。
自動切り替えが機能しない
自動切り替えが機能しない場合、WirePlumber の状態に問題がある可能性があります。this comment が提案しているように、WirePlumber のローカル状態を削除し、デーモンを再起動することで改善されるかどうか確認することができます。
$ rm -r ~/.local/state/wireplumber/
次に、wireplumber.service
ユーザーユニット を 再起動 します。
リアルタイムプライオリティの欠落/サスペンド後の負荷によるクラックリング
rtkit の [from 2011] バグにより、サスペンドイベントが発生すると PipeWire のリアルタイム優先度が取り消され、元に戻らなくなります。この原因となる保護を無効にするには、rtkit-daemon.service
を 編集 してください:
/etc/systemd/system/rtkit-daemon.service.d/override.conf
[Service] ExecStart= ExecStart=/usr/lib/rtkit-daemon --no-canary
次に、メディアセッションサービスとともに、rtkit-daemon.service
ユニットと pipewire.service
ユーザー ユニットを再起動します。
ビデオ
OBS(など)がウィンドウ/スクリーンを要求しても何も表示されない
xdg-desktop-portal と xdg-desktop-portal-gtk または xdg-desktop-portal-kde がインストールされていることが確実なら、デーモンの実行状態を確認してください。
OBS では、すべてがうまくいっていれば、stdout
にこのように表示されるはずです。
... info: [pipewire] desktop selected, setting up screencast info: [pipewire] created stream 0x5632d7456850 info: [pipewire] playing stream...
マルチモニタ環境では、slurp パッケージを使用すると、すべての画面をキャプチャすることができます。
参照
- Wiki — PipeWire Wiki on Freedesktop GitLab
- Pipewire Update Blog Post — PipeWire の2018年1月時点での進捗が書かれた記事
- PipeWire Late Summer Update 2020 — 2020年9月からの記事