PipeWire

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

関連記事

PipeWire は新しい低レベルマルチメディアフレームワークです。 映像と音声を最小の遅延で再生/キャプチャすることを目的としていて、PulseAudioJACKALSAGStreamer をベースとしたアプリケーションと互換性があります。

このフレームワークのデーモンは (PulseAudio と JACK の機能を持った) オーディオサーバーとしても、ビデオキャプチャサーバーとしても設定できます。

また PipeWire は Flatpak のようなコンテナをサポートしており、audiovideo ユーザーグループに依存するのではなく、Flatpak や Wayland にスクリーンや音声を録音する許可を求める Polkit のようなセキュリティモデルを使用しています。

目次

インストール

公式リポジトリから pipewire パッケージを インストール してください。multilib に対応した lib32-pipewire もあります。

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

オプションとして、pipewire-docs をインストールすると、ドキュメントを確認することができます。

Pipewire は、他のオーディオサーバーと置き換えることができます。詳しくは オーディオ を参照してください。

セッション マネージャー

JACK と同様、PipeWire は内部で接続ロジックを実装していません。新しいストリームを監視し、適切な出力デバイスやアプリケーションに接続する負担は、セッションマネージャーとして知られる外部のコンポーネントに任されています。

現在、推奨のセッションマネージャーは1つだけで次になります:

  • WirePlumber — 強力なマネージャであり、現在の推奨品です。モジュール設計に基づいており、実際の管理機能を実装する Lua プラグインがあります。
https://pipewire.pages.freedesktop.org/wireplumber/ || wireplumber

次のセッションマネージャーはサポート外になっており WirePlumber を推奨しています:

  • PipeWire Media Session — いくつかの基本的なデスクトップのユースケースに対応した非常にシンプルなセッションマネージャです。これは主にテスト用と新しいセッションマネージャを構築するための例として実装されました。
https://gitlab.freedesktop.org/pipewire/media-session || pipewire-media-session

PipeWire のインストール時に、どちらかを選ぶように指示されます。後で適切なパッケージをインストールすることで、もう一方のオプションと衝突しますが、置き換えることで切り替えが可能です。

GUI

  • Helvum — PipeWire 用の GTK 製のパッチベイ。 JACK のツールの catia にインスパイアされた。
https://gitlab.freedesktop.org/ryuukyu/helvum || helvum
  • qpwgraph — Qt-based Graph/Patchbay for PipeWire, inspired by the JACK tool QjackCtl.
https://gitlab.freedesktop.org/rncbc/qpwgraph || qpwgraph

設定

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 をインストールします。このパッケージは pulseaudiopulseaudio-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 をインストールするか、jackjack2 をアンインストールして 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 セットアップ

PCHHDMI の 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,0dmix: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 上のコンテンツを共有できます。

ヒント: WebRTC 画面共有が機能しているかどうか、Mozilla の GetUserMedia WebRTX テストページでテストしましょう。
ノート: xdg-desktop-portal 1.10.0 では、D-Bus インターフェースの仕様と実装の不一致が修正されました。[2] そのため、一部のクライアントは xdg-desktop-portal 1.10.0 またはそれ以降で動作しないかもしれません。

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 をインストールします。プリセット設定集については、コミュニティープリセットを参照してください。

ノート: PulseEffects の古いバージョンについては PulseAudio#PulseEffects を参照してください。

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-pulsepipewire-jackcarla をインストールします。はじめに 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
ノート: システム設定で default_null_sink をデフォルトデバイスに設定すると、全てのアプリケーションが default_null_sink にリダイレクトされ、音量の変更がスピーカーではなく default_null_sink に対して行われるようになります。スピーカーの音量を変更したい場合は、デフォルトデバイスをスピーカーから変更せずにアプリケーションの出力先を pavucontrol で default_null_sink に変更してください (PipeWire の互換性レイヤーは次回起動時も出力先を覚えています)。

トラブルシューティング

オーディオ

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.confdefault.clock.rate = 48000 行を編集することで行うことができます。例えば、192kHz にしたい場合は、48000default.clock.rate = 192000 にコメントを解除して変更します。

PipeWire は、DAC がサポートする出力サンプルレートを変更することもできます。設定するには、default.clock.allowed-rates = [ 48000 ] という行をコメント解除して設定します。例えば、[ 44100 48000 88200 96000 ] とします。サンプルレートは、カードがアイドルのときに再生されるオーディオストリームのサンプルレートに従います。

どの出力サンプルレートとサンプルフォーマットが DAC に送られたデータであるかを確認するには(おそらく桁を変更する必要があります)。

cat /proc/asound/card0/pcm0p/sub0/hw_params

どの入力サンプルレートを使用しているかを確認するには、pcm0ppcm0c に変更します。(c は "capture" の略、p は "playback" の略です).

許容されるサンプルレートの変更

PipeWire は、DAC がサポートする出力サンプルレートを動的に変更することもできます。サンプルレートは、再生中のオーディオストリームのサンプルレートに従います。

/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)
...
context.properties = {
    ...
    default.clock.allowed-rates = [ sample_rate_1 sample_rate_2 sample_rate_3 ... ]
    ...

たとえば、[ 44100 48000 88200 96000 ] です。DAC でサポートされている値については、ハードウェアのマニュアルを参照してください。

開発者の [3] によると: "PipeWire は最大16の異なるサンプルレートを許容し、可能な限り切り替えます。" つまり、上記の設定では、再サンプリングは行われないということです。

DAC に送信されるデータがどの出力サンプルレートとサンプルフォーマットであるかを確認するには (おそらく桁を変更する必要があります):

$ cat /proc/asound/card0/pcm0p/sub0/hw_params

どの入力サンプルレートが使用されているかを確認するには、pcm0ppcm0c に変更します (c は "capture" の略で、p は "playback" の略です)

音質 (リサンプリング品質)

PulseAudio を resample-method = speex-float-10 または soxr-vhq で使用していた場合、コメントを解除して resample.XXX を変更することを検討するとよいかもしれません。resample.quality = 410 または最大値 15 に変更することを検討してください。(存在しない場合は /usr/share/pipewire/ からコピーしてください)。PipeWire の再起動を忘れないでください (sudo なし): systemctl --user restart pipewire.service pipewire-pulse.socket (設定変更を適用させたい場合は、pipewire-pulse.socketを絶対に忘れないでください)。

1015 では、品質の差はほとんどありませんが、CPU 負荷は2〜3倍になっています。また、4, 10, 15 のレイテンシーの差はまだ誰も調べていません。Ryzen 2600 で 44100→48000Hz で resample.quality = 15 にすると pipewirepipewire-pulse プロセスが 1CPUコア4.0% の負荷となる。

リサンプラーの比較はこちら:https://src.infinitewave.ca/(18KHz以上、120dB以上は注意)。speeexXiph.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.confbluez5.codecssbc 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 を再起動する必要があります。

再生開始時の音声の遅延やポップ/クラックが目立つ

これは、非アクティブ時のノードの一時停止が原因です。

pipiwire-media-session を使用:

これを無効にするには、遅延が発生する場所に応じて /etc/pipewire/media-session.d/*-monitor.conf を編集し、プロパティ session.suspend-timeout-seconds を 0 に変更します。無効にするか、他の値を試して、何が機能するかを確認します。

または、/etc/pipewire/media-session.d/media-session.conf の行 suspend-node をコメントアウトすることもできます。

再起動 して pipewire.servicepipewire-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.servicewireplumber.service を再起動して、変更を適用します。

サスペンドを完全に無効にする代わりに、タイムアウト値を、ソースがサスペンドされるまでに必要な遅延秒数に変更することもできます。

複数のストリームの再生が開始されると音声が途切れる

この問題は通常、pipewire-pulse.service ユーザーユニットjournal を読み取り、次のような行を見つけることで診断できます。

pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940

公式 PipeWire トラブルシューティングガイド によると、pipewire-media-session のこの問題を解決するには:

/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf
api.alsa.headroom = 1024

wireplumber を使用する場合:

/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)
apply_properties = {
    ["api.alsa.headroom"] = 1024,
},

カーネルページのロックやスケジューリングの遅延が原因で音声の途切れが発生する場合は、カーネルパラメータを調整して応答時間を安定化させる を参照してください。

音がひずむ

  • マイクについては、alsamixer を起動し、問題があるサウンドカードを選択し、Mic BoostInternal Mic Boost の値を下げてみてください。
  • /etc/pipewire/pipewire.confdefault.clock.rate = 48000 のコメントを外して、値を 44100 に下げてみてください。

スタンバイ後に音声の問題が発生する

スリープから復帰した際に音が消えたり壊れたりする場合は、ALSA を最初期化すると改善するかもしれません:

# alsactl init

USB DAC(例:Schiit 社製 DAC)で高レイテンシー

サンプルレートやフォーマットを変更することで、Schiit Hel 2 などの一部の DAC でレイテンシーを減らすことができるかもしれません [4] pipewire-media-session のマッチングルールを使用すると、デバイスのプロパティを設定することができます [5] pipewire-media-sessionalsa-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 の中には、ある一定の音量に達するまで音が出なくなるものがあります [6] 一般的にこれは約 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.AccessDeniedsystemctl --user status pipewire.service の出力に表示された場合、pipewire daemon の優先度がリアルタイムに変更されていないことを示します。この問題については、[7] を参照してください。

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

/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にシンボリックリンクすることです[8]

# 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-portalxdg-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 パッケージを使用すると、すべての画面をキャプチャすることができます。

参照