「PipeWire」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(6人の利用者による、間の75版が非表示)
2行目: 2行目:
 
[[en:PipeWire]]
 
[[en:PipeWire]]
 
[[fi:PipeWire]]
 
[[fi:PipeWire]]
  +
[[pt:PipeWire]]
  +
[[ru:PipeWire]]
  +
[[zh-hans:PipeWire]]
  +
{{Related articles start}}
  +
{{Related|PipeWire/サンプル}}
  +
{{Related|WirePlumber}}
  +
{{Related articles end}}
  +
[https://pipewire.org PipeWire] は新しい低レベルマルチメディアフレームワークです。
  +
映像と音声を最小の遅延で再生/キャプチャすることを目的としていて、[[PulseAudio]]、[[JACK]]、[[ALSA]]、[[GStreamer]] をベースとしたアプリケーションと互換性があります。
   
  +
このフレームワークのデーモンは (PulseAudio と JACK の機能を持った) オーディオサーバーとしても、ビデオキャプチャサーバーとしても設定できます。
[http://pipewire.org PipeWire] は、GNOME が開発した新しいマルチメディアフレームワークです。開発を担当しているのはWim Taymans です。
 
   
PipeWire は [[Flatpak]] のようなコンテナをサポートしており、 [https://wiki.archlinux.jp/index.php/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A8%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97#.E3.82.B0.E3.83.AB.E3.83.BC.E3.83.97.E7.AE.A1.E7.90.86 ユーザーグループ] の ''オーディオ'' や ''ビデオ'' に依存するのではなく、Flatpak や Wayland にスクリーンやオーディオを録音する許可を求める [[Polkit]] のようなセキュリティモデルを使用しています。
+
また PipeWire は [[Flatpak]] のようなコンテナをサポートしており、''audio'' や ''video'' [[ユーザーとグループ#グループ管理|ユーザーグループ]]に依存するのではなく、Flatpak や Wayland にスクリーンや音声を録音する許可を求める [[Polkit]] のようなセキュリティモデルを使用しています。
   
 
== インストール ==
 
== インストール ==
   
公式リポジトリ {{pkg|pipewire}} パッケージを [[インストール]] します。
+
公式リポジトリから {{Pkg|pipewire}} パッケージを [[インストール]] してください。[[multilib]] に対応した {{Pkg|lib32-pipewire}} もあります。
   
Pipewire は [[systemd/ユーザー]] を使用してサーバー管理と自動ソケット起動を行います。サービスの起動動作とログの詳細については、それぞれの [[systemd/ユーザー]] を参照してください
+
Pipewire は [[systemd/ユーザー]] を使てサーバー管理し、ソケットを自動で起動ます。
   
  +
オプションとして、{{Pkg|pipewire-docs}} をインストールすると、ドキュメントを確認することができます。
必要に応じて、 {{pkg|pipewire-docs}} をインストールしてドキュメントを確認します。 {{pkg|pipewire-alsa}}、 {{pkg|pipewire-pulse}}、 {{pkg|pipewire-jack}} などの他のパッケージは、 [https://wiki.archlinux.org/index.php/PipeWire#Audio PulseAudio/JACKの代わりにPipeWireを使用] したくない場合を除き、通常は必要ありません。 multilib をサポートするために、 {{aur|lib 32-pipewire}}、 {{aur|lib 32-pipewire-jack}} も利用できます。
 
   
  +
Pipewire は、他のオーディオサーバーと置き換えることができます。詳しくは [[PipeWire#オーディオ|オーディオ]] を参照してください。
== 使用方法 ==
 
   
=== WebRTC スクリンの共有===
+
=== セッション マネジャー ===
   
  +
[[JACK]] と同様、PipeWire は内部で接続ロジックを実装していません。新しいストリームを監視し、適切な出力デバイスやアプリケーションに接続する負担は、セッションマネージャーとして知られる外部のコンポーネントに任されています。
ほとんどのブラウザは、 WebRTC を使用しているとき (例えば Google Hongouts で) デスクトップ (または個々のアプリケーション) をキャプチャするために X11 に依存していました。 Wayland では、セキュリティ上の理由から、共有メカニズムは異なる方法で処理されます。 PipeWire は、アクセスコントロールを使用して、 Wayland の下のコンテンツを共有できます。
 
   
  +
現在、推奨のセッションマネージャーは1つだけで次になります:
これには {{pkg|xdg-desktop-portal}} とそのバックレンドの1つが必要です [http://jgrulich.cz/2018/07/04/04/how-to-enable-and-use-screen-sharing-on-wayland] インストールする利用可能なバックエンドは次のとおりです。
 
  +
* {{App|[[WirePlumber]]| 強力なマネージャであり、現在の推奨品です。モジュール設計に基づいており、実際の管理機能を実装する Lua プラグインがあります。|https://pipewire.pages.freedesktop.org/wireplumber/|{{Pkg|wireplumber}}}}
   
  +
次のセッションマネージャーはサポート外になっており WirePlumber を推奨しています:
* {{pkg|xdg-desktop-portal-gtk}} gnomeの場合。
 
* {{pkg|xdg-desktop-portal-kde}} KDEの場合。
 
* {{pkg|xdg-desktop-portal-wlr}} wlroots ベースのコンポジター(例えば [[Sway]]、 [https://github.com/djpohly/dwl dwl])
 
   
  +
* {{App|PipeWire Media Session|いくつかの基本的なデスクトップのユースケースに対応した非常にシンプルなセッションマネージャです。これは主にテスト用と新しいセッションマネージャを構築するための例として実装されました。|https://gitlab.freedesktop.org/pipewire/media-session|{{Pkg|pipewire-media-session}}}}
Firefox(84+)はデフォルトでこのメソッドをサポートしていますが、Chromium(73以降)では、[https://bugs.chromium.org/p/chromium/issues/detail?id=682122 WebRTC PipeWireサポート] を有効にする必要があります。次のURLの対応する(実験的)フラグ
 
chrome://flags/#enable-webrtc-pipewire-capturer
 
   
  +
PipeWire のインストール時に、どちらかを選ぶように指示されます。後で適切なパッケージをインストールすることで、もう一方のオプションと衝突しますが、置き換えることで切り替えが可能です。
{{ic|xdg-Desktop-Portal-WLR}} の作業には、 {{ic|xdg_current_desktop}} [https://github.com/emersion/xdg-desktop-portal-wlr#running] を設定する必要があります。
 
XDG_CURRENT_DESKTOP=SWAY をエクスポートします
 
   
  +
=== GUI ===
Chromium は現在 PipeWire 0.2 を使用しているので、ArchはPipeWire 0.3 では、{{pkg|LibpipeWire02}} も作業するために {{pkg|libpipewire02}} をインストールする必要があります。
 
   
  +
* {{App|Helvum|PipeWire 用の GTK 製のパッチベイ。 JACK のツールの catia にインスパイアされた。|https://gitlab.freedesktop.org/ryuukyu/helvum|{{pkg|helvum}}}}
{{Tip|複数のモニタがある場合に {{ic|xdg-desktop-portal-wlr}} を使用して個々のモニタを共有するには、 {{ic|1=--output=''Monitor''}} フラグをユニットのサービスファイルの {{ic|1=ExecStart=} オプション [[Systemd#Editing_provided_units|editing]] で追加します。行全体は {{ic|1=ExecStart=@libexecdir@/xdg-desktop-portal-wlr--output=eDP-1}} のようになります。}}}}
 
  +
* {{App|qpwgraph|Qt-based Graph/Patchbay for PipeWire, inspired by the JACK tool QjackCtl.|https://gitlab.freedesktop.org/rncbc/qpwgraph|{{Pkg|qpwgraph}}}}
   
  +
== 設定 ==
{{Accuracy|[https://github.com/flatpak/xdg-desktop-portal-gtk/pull/225 この要求] が統合されたため、{{Pkg|xdg-desktop-portal-gtk}} の特定のアプリケーション/ウィンドウの共有に関する次の注記が正しくない可能性があります。また、 [https://github.com/flatpak/xdg-desktop-portal-gtk/issues/204] のディスカッションの追跡チケットも参照してください。}}
 
   
  +
PipeWire パッケージは、初期設定ファイルを{{ic|/usr/share/pipewire}} に用意しています。パッケージのアップデートで変更内容が上書きされてしまうので、これらのファイルを直接編集するべきではありません。PipeWire を設定するには、ファイルを {{ic|/usr/share/pipewire}} からシステム全体の代替場所 {{ic|/etc/pipewire}} か、ユーザーの場所 {{ic|~/.config/pipewire}} にコピーしてください。[https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PipeWire#configuration-file-pipewireconf]
唯一サポートされている機能はデスクトップ全体を共有することであり、特定のアプリ/ウィンドウを共有することではありません [https://github.com/emersion/xdg-desktop-portal-wlr/wiki/FAQ#will-this-let-me-share-individual-windows] [https://github.com/KDE/xdg-desktop-portal-kde/blob/master/TODO]
 
   
=== Video ===
+
=== プロファイル ===
   
  +
Pipewire では、PulseAudio のプロファイルに加えて、pavucontrol で選択可能なカスタムの ''Pro Audio'' プロファイルが提供されています。その効果はこちらで解説しています:https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile
ソフトウェアはまだ製造済みではありませんが、[https://wiki.archlinux.jp/index.php/GStreamer GStreamer] に頼るほとんどのアプリケーション。 PipeWire GStreamer プラグインのおかげで、ビデオストリームはボックス外で機能するはずです。例えばの用途のような用途。そのため、 {{pkg|cheese}} したがって、すでにそれを使用してビデオ入力を共有できます。
 
   
=== audio ===
+
== 使用方法 ==
   
  +
=== 音声 ===
PulseAudio と Jack と同様に、 PipeWire をオーディオサーバーとして使用できます。 PulseAudio 互換のサーバー実装と JACK クライアント用の ABI 互換ライブラリを提供することで、 PulseAudio と Jack の両方を置き換えることを目的としています。詳細については、[https://blogs.gnome.org/uraeus/2020/09/04/pipewire-late-summer-update-2020/ このブログエントリ]
 
  +
  +
PulseAudio や JACK と同様に PipeWire をオーディオサーバーとして使用できます。 PulseAudio サーバーの互換実装と JACK クライアント用の ABI 互換ライブラリを提供することで PulseAudio と JACK の両方を置き換えることを目的としています。詳細については[https://blogs.gnome.org/uraeus/2020/09/04/pipewire-late-summer-update-2020/ この記事]を参照してください。
   
 
==== ALSA/レガシーアプリケーション ====
 
==== ALSA/レガシーアプリケーション ====
   
{{pkg|pipewire-alsa}} をインストールして、 PipeWire を介して ALSA API を使用してすべてのアプリケーションをルーティングします。
+
{{pkg|pipewire-alsa}} をインストールして ALSA API を使用するすべてのアプリケーションが PipeWire 使用するよう設定できます。
   
 
==== PulseAudio クライアント ====
 
==== PulseAudio クライアント ====
   
{{pkg|pipewire-pulse}} をインストールします。通常、ユザーサービス {{ic|pipewire-pulse.socket}} がパッケージによって自的に有効にする必要があるためそれ以上の動作は不要で。システム起動時にPipeWireが正しく機能しない場合はユーザーサービス {{ic|pipewire-pulse.service}} {{ic|pipewire.service}} が起動して実行されていを検証します。 [[Systemd/ユーザー]]を参照してください
+
{{pkg|pipewire-pulse}} をインストールします。このパッケジは {{pkg|pulseaudio}} と {{pkg|pulseaudio-bluetooth}} を置き換えます。再起動するログインし直、{{ic|pulseauio.service}} を[[停止]]して、{{ic|pipewire-pulse.service}} ユーザーユニットを実行ると効果がわかります。
 
再起動または再ログインして効果を確認してください。
 
   
換が機能しているかどうかを確認するには、次のコマンドを実行して出力を参照してください
+
パッケージがユーザーサービス {{ic|pipewire-pulse.socket}} を自動的に有効化するので、通常それ以上の操作は不要です。置きが機能しているかどうかを確認するには、次のコマンドを実行して出力を確認してください:
   
{{hc|1=$ pactl info|2=
+
{{hc|$ pactl info|2=
 
...
 
...
Server Name: PulseAudio (on PipeWire 0.3.16)
+
Server Name: PulseAudio (on PipeWire ''x.y.z'')
 
...
 
...
 
}}
 
}}
   
  +
さらに詳しい設定 (モジュールなど) については、[https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Migrate-PulseAudio Migration from PulseAudio] および [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio Pipewire-Pulse の設定]]に関する公式アップストリーム Wiki を参照してください。
==== JACK clients ====
 
   
  +
==== JACK クライアント ====
{{pkg|pipewire-jack}} をインストールし、 {{ic|PW-JACK}} を使用して、元の {{ic|libjack*}} ではなく互換性のあるライブラリを持つジャッククライアントを起動します。
 
  +
  +
{{pkg|pipewire-jack}} をインストールします。{{ic|pw-jack}} を使用して JACK クライアントを起動すると、元の {{ic|libjack*}} ではなく PipeWire が提供する互換ライブラリが使用されます:
   
 
pw-jack ''application''
 
pw-jack ''application''
   
  +
カスタムバッファサイズを要求することもできます。{{ic|PIPEWIRE_LATENCY}}環境変数を {{ic|バッファサイズ/サンプルレート}} (ブロックのレイテンシ(秒)を意味します) に設定します:
BufferSize/SampLerate (秒単位でブロック待ち時間に等しい) を設定することで、カスタムバッファサイズを要求することも可能です。
 
   
 
PIPEWIRE_LATENCY="128/48000" pw-jack ''application''
 
PIPEWIRE_LATENCY="128/48000" pw-jack ''application''
   
あるいは、 {{aur|pipewire-jack-dropin}}} またはアンインストール {{pkg|jack2}}}/{{pkg|jack2}} を自動的にロードさせるため}
+
また {{aur|pipewire-jack-dropin}} インストールするか、{{pkg|jack}}{{pkg|jack2}} をアンインストールして JACK クライアントが互換ライブラリを自動的に読み込むようもできます。
   
JACK アプリケーションが正しいライブラリにリンクしていることを確認するには、{{ic|LDD}} を使用します。
+
{{ic|ldd}} を使用して JACK アプリケーションが正しいライブラリにリンクしていることを確認します。
   
 
{{hc|1=$ ldd /usr/bin/qjackctl {{!}} grep -i libjack|2=
 
{{hc|1=$ ldd /usr/bin/qjackctl {{!}} grep -i libjack|2=
87行目: 96行目:
 
==== Bluetooth デバイス ====
 
==== Bluetooth デバイス ====
   
PipeWire は、Bluetooth オーディオデバイスをハンドルします。 {{pkg|pipewire-pulse}} パッケージがインストールされている場合。具体的には、メディアセッションデーモンは {{ic|/etc/pipewire/media-session.d/with-pulseaudio}} をチェックし、ファイルが存在する場合は自動的にその {{ic|BLUEZ5}} モジュールを有効にします。
+
PipeWire は {{pkg|pipewire-pulse}} パッケージがインストールされている場合 Bluetooth オーディオデバイスを制御します。具体的には、メディアセッションデーモンは {{ic|/etc/pipewire/media-session.d/with-pulseaudio}} が存在する時に自動的にその {{ic|bluez5}} モジュールを有効にします。
   
  +
===== プロファイルの自動選択機能 =====
==== ネイティブジャックの上で PipeWire を実行します ====
 
   
  +
{{Pkg|pipewire-media-session}} は、入力ストリームが必要なときに、HSP/HFP と A2DP プロファイルを自動的に切り替えます。これを有効にするには、{{ic|bluez5.autoswitch-profile}} プロパティを {{ic|true}} にセットしてください。
PipeWire は、必要に応じてネイティブジャックデーモンの上にあるジャッククライアントとして実行することもできます。詳細については、[https://gitlab.freedesktop.org/pipewire/pipewire//wikis/jack and pipewire] を参照してください。
 
   
  +
{{hc|/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf|output=
== オーディオの後処理 ==
 
  +
...
  +
rules = [
  +
{
  +
...
  +
actions = {
  +
update-props = {
  +
...
  +
bluez5.autoswitch-profile = true
  +
...
  +
}}
   
  +
これらの機能は、[[WirePlumber]] ではまだ [https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/90 実装中] です。
=== パルス効果 ===
 
   
  +
==== PipeWire ネイティブパッチセット ====
PulseEffects は GTK ユーティリティで、個々のアプリケーション出力ストリームとマイク入力ストリームに多数のオーディオエフェクトとフィルタを提供します。注目すべきエフェクトには、入出力イコライザー、出力ラウドネスイコライゼーションとベースエンハンスメント、入力ディエッサーとノイズリダクションプラグインなどがあります。エフェクトの全リストについては、 [https://github.com/wwmm/pulseeffects GitHubページ] を参照してください。
 
   
  +
グラフィカルな視覚化と接続の作成のための Helvum はありますが、それ以外はまだ入っていません。以下は、ワイヤセットの保存、ワイヤセットの読み込み、すべての接続の解除を行う bash スクリプトです。保存と読み込みには、コマンドラインパラメータでファイル名を指定します。
PipeWire で PulseEffects を使用するには、{{Pkg|pulseeffects}} または {{AUR|pulseeffects-git}} をインストールします。
 
   
  +
{{hc|pw-savewires|<nowiki>
{{Note|これにより、 {{Pkg|pipewire-pulse}} と [[#PulseAudio clients|PulseAudio を PipeWire に置き換えて]] インストールされます。詳細は、 {{Bug|69437}} を参照してください。レガシーバージョンについては、 [[PulseAudio#PulseEffects]] を参照してください。}}
 
  +
#!/bin/bash
   
  +
if [[ "$#" -ne 1 ]]; then
プリセット設定のコレクションについては、[https://github.com/wwmm/pulseeffects/wiki/Community-presets Community Presets] を参照してください。
 
  +
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)
  +
</nowiki>}}
  +
  +
{{hc|pw-loadwires|<nowiki>
  +
#!/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])
  +
</nowiki>}}
  +
  +
{{hc|pw-dewire|<nowiki>
  +
#!/bin/bash
  +
while read -r line; do
  +
echo 'Dewiring: ' $line '...'
  +
pw-link -d $line
  +
done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')
  +
</nowiki>}}
  +
  +
==== ネットワーク上のコンピューターとオーディオ機器を共有する ====
  +
  +
PipeWire 自体はネットワーク透過型ではありませんが、そのパルス実装は [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio#network-support ネットワークストリーミング] をサポートしています。ネットワーク上のコンピュータ間でオーディオを共有する簡単な方法は、[[Avahi]] デーモンを使って検出することです。
  +
オーディオを共有するすべてのコンピュータで {{ic|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 レシーバーにオーディオをストリーミングする =====
  +
  +
[[Wikipedia:ja:AirPlay#Receivers|AirPlay Receiver]] を装ったデバイスにオーディオをストリーミングすることが可能です。この機能を有効にするには、[https://docs.pipewire.org/page_module_raop_discover.html RAOP Discover モジュール] をロードします。
  +
  +
$ pactl load-module module-raop-discover
  +
  +
専用の設定ファイルを作成することで、このモジュールを自動的にロードすることもできます。
  +
  +
{{hc|/etc/pipewire/pipewire.conf.d/raop-discover.conf (or ~/.config/pipewire/pipewire.conf.d/raop-discover.conf)|2=
  +
context.modules = [
  +
{
  +
name = libpipewire-module-raop-discover
  +
args = { }
  +
}
  +
]
  +
}}
  +
  +
一部のスピーカーの AirPlay 実装 (Sonos AirPlay 2 スピーカーなど) では、ソースデバイスで着信 UDP トラフィック用にポート 6001 および 6002 を開く必要がある場合があります。
  +
  +
==== ネイティブ JACK 上で PipeWire を実行する ====
  +
  +
PipeWire はネイティブ JACK デーモン上の JACK クライアントとして実行することもできます。詳細は [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/JACK JACK and PipeWire] を参照してください。
  +
  +
==== PipeWire シンクとして ALSA dmix デバイスを使用する ====
  +
  +
PipeWire サーバー(またはユーザーごとに複数) を [[Advanced Linux Sound Architecture#Dmix|ALSA dmix デバイス]] を介して ALSA に出力することが可能です。これにより、ALSA を主要な音声出力システムとして使用しながら、Bluetooth ヘッドフォンなどの ALSA 以外のデバイスを使用することができるようになります。
  +
  +
===== ALSA dmix セットアップ =====
  +
  +
{{ic|PCH}} と {{ic|HDMI}} の 2 枚のカードがあるとします。
  +
  +
{{hc|/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 は次のようになります。
  +
  +
{{hc|/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 設定が次のようになっているとします。
  +
  +
{{hc|/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 デバイスは {{ic|dmix:PCH,0}} と {{ic|dmix:HDMI,9}} になります。
  +
  +
===== PipeWire dmix セットアップ =====
  +
  +
まず、{{ic|alsa_monitor.enable()}} をコメントアウトして、{{ic|wireplumber}} によるハードウェア ALSA デバイスの監視と追加を停止します。
  +
  +
{{hc|/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 デバイスを使用するように {{ic|pipewire}} を設定します。デフォルトの設定ファイル ({{ic|/usr/share/pipewire/pipewire.conf}}) には [https://gitlab.freedesktop.org/pipewire/pipewire/-/blob/0.3.59/src/daemon /pipewire.conf.in#L219-239 コメントアウトされた例] をベースとして使用できます。
  +
  +
独自の要素を {{ic|context.objects}} 配列に追加します。
  +
  +
{{hc|/etc/pipewire/pipewire.conf.d/alsa-dmix.conf (or ~/.config/pipewire/pipewire.conf.d/alsa-dmix.conf)|output=
  +
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) として、{{ic|wpctl status}} の出力を確認し、{{ic|wpctl set-default ''ID''}} でデフォルトの入力(ソース) と出力 (シンク) のデバイスを好みのものに設定します。{ic|''ID''}} はシンク/ソース名の前の数字です。
  +
  +
これで、構成を完全にテストすることができます。
  +
  +
==== デバイスプロファイルの切り替え ====
  +
  +
{{ic|snd_hda_intel}} などの一部のハードウェアオーディオデバイスは、デバイスが実行されているプロファイルによって機能が異なります。{{ic|snd_hda_intel}} の場合、HDMI とアナログ出力用に個別のプロファイルがあります。
  +
  +
WirePlumber で HDMI に切り替える:
  +
  +
{{hc|
  +
$ wpctl set-profile <device-ID> 3
  +
$ wpctl status
  +
|output=
  +
...
  +
├─ Sinks:
  +
│ * 53. Built-in Audio Digital Stereo (HDMI) [vol: 1.00]
  +
...
  +
}}
  +
  +
WirePlumber でアナログに切り替える:
  +
  +
{{hc|
  +
$ wpctl set-profile <device-ID> 1
  +
$ wpctl status
  +
|output=
  +
...
  +
├─ Sinks:
  +
│ * 51. Built-in Audio Analog Stereo [vol: 0.60]
  +
...
  +
}}
  +
  +
=== WebRTC 画面共有 ===
  +
  +
ほとんどのアプリケーションは、例えばウェブブラウザで WebRTC を使うとき (例: Google Meet) などに、デスクトップ (あるいは個々のアプリケーション) をキャプチャするために X11 に依存していました。Wayland では、セキュリティ上の理由から画面共有は異なる方法で処理されます。PipeWire はきめ細かなアクセス制御を使用して、Wayland 上のコンテンツを共有できます。
  +
  +
{{Tip|WebRTC 画面共有が機能しているかどうか、[https://mozilla.github.io/webrtc-landing/gum_test.html Mozilla の GetUserMedia WebRTX テストページ]でテストしましょう。}}
  +
  +
{{Note|1={{Pkg|xdg-desktop-portal}} 1.10.0 では、D-Bus インターフェースの仕様と実装の不一致が修正されました。[https://github.com/flatpak/xdg-desktop-portal/pull/609] そのため、一部のクライアントは xdg-desktop-portal 1.10.0 またはそれ以降で動作しないかもしれません。}}
  +
  +
Firefox (バージョン84以降) と Chromium (バージョン110以降) はデフォルトでこの方法をサポートしていますが、Chromium の古いバージョン (バージョン73以降) では、URL {{ic|chrome://flags/#enable-webrtc-pipewire-capturer}} で対応する (実験的) フラグを設定するか、CLI 引数 {{ic|1=--enable-features=WebRTCPipeWireCapturer}} を用いて、[https://bugs.chromium.org/p/chromium/issues/detail?id=682122 WebRTC PipeWire サポート] を有効化する必要があります。
  +
  +
{{Pkg|obs-studio}} (バージョン27以降) は、新しい PipeWire キャプチャソースを使用することにより、この方法をサポートしています。
  +
  +
=== 映像 ===
  +
  +
ソフトウェアはまだ商業利用には適していませんが、試す分には問題ありません。[[GStreamer]] を使用して映像ストリームを処理するほとんどのアプリケーションは PipeWire GStreamer プラグインを使用して設定なしで動作するはずです ([[GStreamer#PipeWire]] を参照してください)。そのため既に {{pkg|cheese}} のようなアプリケーションは PipeWire を使用して映像入力を利用できます。
  +
  +
{{Pkg|pipewire-v4l2}} を使用すると、{{ic|pw-v4l2}} スクリプトを使用してライブラリをプリロードすることも可能になります ({{ic|/lib/pipewire-0.3/v4l2/libpw-v4l2.so}}) は、v4l2 呼び出しをインターセプトし、PipeWire 経由でビデオをルーティングします。
  +
  +
== 音声のポストプロセッシング ==
  +
  +
=== Pipewire モジュールフィルターチェーン ===
  +
  +
Pipewire には {{ic|[https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Filter-Chain filter-chain]}} という内部モジュールがあり、音声の入出力を処理するノードを作成することができます。参照してください。
  +
/usr/share/pipewire/filter-chain/ を参照してください。
  +
イコライザー、バーチャルサラウンドサウンド、LADSPA プラグイン、チャンネルミキシングなどの例を紹介します。
  +
  +
==== システム全体のパラメトリックイコライゼーション ====
  +
  +
設定ファイルを {{ic|.config}} フォルダにコピーします。
  +
mkdir -p ~/.config/pipewire/pipewire.conf.d
  +
cp /usr/share/pipewire/filter-chain/sink-eq6.conf ~/.config/pipewire/pipewire.conf.d/
  +
次に、{{ic|sink-eq6.conf}} を編集して、必要なパラメータを組み込みます。ヘッドフォンの場合、これらは [https://old.reddit.com/r/oratory1990/wiki/index Oratory1990 のデータベース] から入手できます。そこにリストされていない場合は、[https://github.com/jaakkopasanen/AutoEq/tree/master/results/ AutoEQ project]
  +
  +
プリアンプが必要な場合は、{{ic|eq_band_1}} を変更して、{{ic|bq_highshelf}} フィルタを周波数 0Hz でマイナスゲイン (-120 〜 +20dB のゲインをサポート) で適用します。
  +
label = bq_highshelf
  +
control = { "Freq" = 0 "Q" = 1.0 "Gain" = -7.5 }
  +
  +
6 バンドを超える場合は、{{ic|nodes}} リストと対応する {{ic|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 製のユーティリティです。注目すべきエフェクトには、入出力イコライザー、出力ラウドネス等化、ベースエンハンスメント、入力ディエッサー、ノイズ抑制プラグインなどがあります。[https://github.com/wwmm/easyeffects GitHub ページ]にエフェクトの一覧があります。
  +
  +
EasyEffects を使用するには、{{pkg|easyeffects}} をインストールします。プリセット設定集については、[https://github.com/wwmm/easyeffects/wiki/Community-presets コミュニティープリセット]を参照してください。
  +
  +
{{Note|PulseEffects の古いバージョンについては [[PulseAudio#PulseEffects]] を参照してください。}}
  +
  +
=== NoiseTorch ===
  +
  +
{{aur|noisetorch}} はノイズ抑制に使用できます。ビルド済み ({{aur|noisetorch-bin}}) や開発版 ({{aur|noisetorch-git}}) のパッケージもあります。
  +
  +
起動すると選択したマイクにモジュールを読み込むことができます。声が出力される閾値を調整することができます。実際の声が削除されない最大のレベルに設定するべきです。
  +
  +
=== Noise suppression for voice ===
  +
  +
{{pkg|noise-suppression-for-voice}} をインストールし、以下のいずれかのオプションを使用します:
  +
  +
* 以下の行を {{ic|context.exec}} セクションに追加する:
  +
  +
{{hc|/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)|output=
  +
...
  +
context.exec = [
  +
...
  +
{ path = "/usr/bin/pipewire" args = "-c /usr/share/pipewire/filter-chain/source-rnnoise.conf" }
  +
...
  +
}}
  +
  +
* https://github.com/werman/noise-suppression-for-voice#pipewire に従う
  +
  +
そして、オーディオ設定でノイズキャンセルソースをデフォルトとして設定します。この機能を使う前に、アプリケーションを再起動する必要があるかもしれません。
  +
  +
=== JamesDSP ===
  +
  +
[https://github.com/Audio4Linux/JDSP4Linux#readme JamesDSP for Linux] ({{AUR|jamesdsp}} として入手可能) は PipeWire と PulseAudio のためのオープンソースのサウンドエフェクトを提供します。LADSPA や Calf などに依存することなく、独自のエフェクトエンジンを使用しています。JamesDSP は当初 Android デバイス用のオーディオエフェクトプロセッサーとして公開されました。
  +
  +
=== LADSPA、LV2、VST プラグイン ===
  +
  +
LADSPA、LV2、VSTのプラグインを使用したい場合は、カスタム PulseAudio null シンクと Carla Jack ホストを利用できます。{{pkg|pipewire-pulse}} と {{pkg|pipewire-jack}} と {{pkg|carla}} をインストールします。はじめに {{ic|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
  +
  +
{{ic|pw-jack carla-rack}} で PipeWire を使用する Carla を起動します。''Rack'' タブで使いたいプラグインを全て追加します。プラグインのタイプが ''stereo'' であることを確認してください。適用する順番を変えることができます。EasyEffectsのようにリストの最初のプラグインが最初に入力の音声ストリームを受け取ります。その後 ''Patchbay'' タブに移動し {{ic|default_null_sink}} の L/R monitor を Carla input に接続し、Carla output を出力したいデバイス (スピーカーやイヤホンや HDMI 出力など) の playback に接続します。設定をフォルダに保存します ({{ic|~/Documents/carla_sink_effects.carxp}} など)。
  +
  +
Firefox で動画を見ている時など、アプリケーションが音声を再生している時に効果を試すことができます。2つの方法があります。一つは Carla の ''Patchbay'' タブで Firefox の接続を全て外し {{ic|default_null_sink}} の L/R output に接続する方法です。もう一つは {{pkg|pavucontrol}} を使用し Firefox の音声ストリームを {{ic|default_null_sink}} に変更する方法です (この方法は同じアプリケーションの次回起動時に同じ接続先を使用するはずです)。
  +
  +
これらの設定を起動時に適用するには、まず2つの systemd ユーザーサービスを作成します:
  +
  +
{{hc|~/.config/systemd/user/jack-carla-rack.service|output=
  +
[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
  +
}}
  +
{{hc|~/.config/systemd/user/pulseaudio-null-sink@.service|output=
  +
[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 の設定ファイルのフルパスを指定するよう上書きします:
  +
  +
{{hc|~/.config/systemd/user/jack-carla-rack.service.d/override.conf|output=
  +
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'' サービスには {{ic|default_null_sink}} 引数をつけてください:
  +
  +
systemctl --user enable pulseaudio-null-sink@default_null_sink.service
  +
systemctl --user enable jack-carla-rack.service
  +
  +
{{Note|システム設定で {{ic|default_null_sink}} をデフォルトデバイスに設定すると、全てのアプリケーションが {{ic|default_null_sink}} にリダイレクトされ、音量の変更がスピーカーではなく {{ic|default_null_sink}} に対して行われるようになります。スピーカーの音量を変更したい場合は、デフォルトデバイスをスピーカーから変更せずにアプリケーションの出力先を pavucontrol で {{ic|default_null_sink}} に変更してください (PipeWire の互換性レイヤーは次回起動時も出力先を覚えています)。}}
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
   
=== PipeWire によってマイクが検出されません===
 
   
  +
=== オーディオ ===
PipeWire の {{ic|alsa-monitor}} モジュールは、デフォルトで {{pkg|alsa-card-profiles}} を使用してデバイスを検出します。これでうまくいかない場合は、 {{ic|api.alsa.use-acp}} をオフにするか、 {{ic|/etc/pipewire/media-session.d/alsa-monitor.conf}} の {{ic|rules}}->最初のルール->{{ic|actions}}->{{ic|update-props}} の下でオプションとして {{ic|api.alsa.use-ucm}} をオンにしてみてください。
 
   
  +
==== PipeWire にマイクが検出されない ====
...
 
  +
update-props = {
 
  +
PipeWire の {{ic|alsa-monitor}} モジュールは、デフォルトで {{Pkg|alsa-card-profiles}} を使ってデバイスを検出します。これがうまくいかない場合は、{{ic|api.alsa.use-acp}} をオフにするか、オプションで {{ic|api.alsa.use-ucm}} をオンにすることを試してみてください。
api.alsa.use-acp = false
 
  +
...
 
  +
{{Pkg|pipewire-media-session}} を使用している場合。
  +
{{hc|/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)|output=
  +
...
  +
rules = [
  +
{
  +
...
  +
actions = {
  +
update-props = {
  +
...
  +
api.alsa.use-acp = false
  +
...
  +
}}
  +
  +
それ以外の場合は、{{Pkg|wireplumber}} を使用している場合。
  +
{{hc|/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)|output=
  +
...
  +
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 を再起動し、使用可能なデバイスをチェックします。
+
その後pipewire を再起動し、用可能なデバイスを確認します。
   
{{hc|1=
+
{{hc| 1=
 
$ pw-record --list-targets
 
$ pw-record --list-targets
 
|2=
 
|2=
127行目: 529行目:
 
}}
 
}}
   
=== Bluetooth デバイス接続しても音聞こえない ===
+
==== 新しいデバイス接続したときにサウンド自動的に切り替わらない ====
   
  +
新しく接続されたデバイスに自動的に切り替えるには、次のファイルを作成します。:
2020-12-07 の時点で、Bluetooth デバイスを接続しても音が出ない場合は、デフォルトのシンクに切り替えるか、シンク入力を正しいシンクに移動する必要があります。 {{ic|pactl list sinks}} を使用して使用可能なシンクを一覧表示し、{{ic|pactl set-default-sink}} を使用してデフォルトのシンクを Bluetooth デバイスに切り替えます。これは [https://gist.github.com/tinywrkb/04e7fd644afa9b92d33a3a99ab07ee9e この1] のようなスクリプトを使って [[udev]] で自動化できます。
 
   
  +
{{hc|/etc/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf (or ~/.config/pipewire/pipewire-pulse.conf.d/switch-on-connect.conf)|output=
この問題については、この [https://www.reddit.com/r/archlinux/comments/jydd02/pipewirepulse_03164_in_testing_now_replaces/gd3m7fu/?context=3 Redditスレッド] を参照してください。スクリプトの作成者によると、ヘッドセットプロファイル (HSP) にまだ問題がある可能性があります。
 
  +
# 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 ヘッドフォンに切り替わらない ====
=== 音量が小さい ===
 
   
  +
{{ic|pactl load-module module-switch-on-connect}} を実行し、ログイン時に自動的にそのコマンドが実行されるようにデスクトップ環境を設定してください。詳しくは [https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/89 wireplumber issue #89] を見てください。
PulseAudio を Pipewire に置き換えた後、サウンドは正常に動作しましたが、再起動後にボリュームが極端に低くなりました。
 
   
  +
==== Bluetooth デバイスに接続しても音が出ない ====
{{ic|alsamixer}} を開き、{{ic|F6}} を使って適切なサウンドカードを選び、 ALSA のボリュームが100%であることを確認してください。 {{ic|alsactl}} は、再起動後もこの設定を維持する必要があります。
 
   
  +
2020-12-07 の時点で、Bluetooth デバイスを接続しても音が出ない場合は、デフォルトのシンクに切り替えるか、シンク入力を正しいシンクに移動する必要があります。{{ic|pactl list sinks}} で使用可能なシンクの一覧を表示し、{{ic|pactl set-default-sink}} でデフォルトのシンクを Bluetooth デバイスに切り替えます。これは[https://gist.github.com/tinywrkb/04e7fd644afa9b92d33a3a99ab07ee9e このようなスクリプト]を使って [[udev]] で自動化できます。
=== RLIMIT_MEMLOCK の増加===
 
   
  +
この問題については、この [https://www.reddit.com/r/archlinux/comments/jydd02/pipewirepulse_03164_in_testing_now_replaces/gd3m7fu/?context=3 Reddit スレッド]を参照してください。スクリプトの作成者によると、ヘッドセットプロファイル (HSP) にまだ問題がある可能性があります。
12月13日 11:11:11 HOST pipewire-pulse [99999] :mlock memory 0x7f4f659d8000 32832:に失敗しました。これは問題ではありませんが、最高のパフォーマンスを得るために、 RLIMIT_MEMLOCK の増加を検討してください。
 
   
  +
==== 音量が小さい ====
{{pkg|realtime-privileges}} をインストールし、 {{ic|realtime}} グループに自分のユーザーを追加します。
 
   
  +
PulseAudio を PipeWire で置き換えた後、正しく音が出ても、再起動後に音量が極端に小さくなることがあります。
あるいは、memlock を 64kB から 128kB に増やすことで、この問題を解決できるようです。[[systemd/ユーザー]] で {{ic|pipewire-pulse}} を実行している場合は、{{ic|/etc/security/limits.d/username.conf} に次を追加します。
 
  +
  +
{{ic|alsamixer}} を開き、{{ic|F6}} を押して適切なサウンドカードを選び ALSA のボリュームが100%であることを確認してください。{{ic|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
  +
  +
{{pkg|realtime-privileges}} をインストールし {{ic|realtime}} グループに自分のユーザーを追加します。
  +
  +
あるいは memlock を 64kB から 128kB に増やすことで、この問題を解決できるようです。[[systemd/ユーザー]] で {{ic|pipewire-pulse}} を実行している場合は {{ic|/etc/security/limits.d/username.conf}} に次の行を追加します:
   
 
username soft memlock 64
 
username soft memlock 64
 
username hard memlock 128
 
username hard memlock 128
   
  +
==== サンプリングレートを変更する ====
=== 再接続後に外付けサウンドカードがアクティブにならない ===
 
  +
  +
PipeWire のデフォルトでは、グローバルサンプルレートは 48kHz に設定されています。これを変更したい場合(より高い値をサポートする DAC を所有しているなど)、設定ファイル {{ic|/etc/pipewire/pipewire.conf}} の {{ic|1=default.clock.rate = 48000}} 行を編集することで行うことができます。例えば、192kHz にしたい場合は、{{ic|48000}} を {{ic|1=default.clock.rate = 192000}} にコメントを解除して変更します。
  +
  +
PipeWire は、DAC がサポートする出力サンプルレートを変更することもできます。設定するには、{{ic|1=default.clock.allowed-rates = [ 48000 ]}} という行をコメント解除して設定します。例えば、{{ic|[ 44100 48000 88200 96000 ]}} とします。サンプルレートは、カードがアイドルのときに再生されるオーディオストリームのサンプルレートに従います。
  +
  +
どの出力サンプルレートとサンプルフォーマットが DAC に送られたデータであるかを確認するには(おそらく桁を変更する必要があります)。
  +
cat /proc/asound/card0/pcm0p/sub0/hw_params
  +
どの入力サンプルレートを使用しているかを確認するには、{{ic|pcm0p}} を {{ic|pcm0c}} に変更します。({{ic|c}} は "capture" の略、{{ic|p}} は "playback" の略です).
  +
  +
==== 許容されるサンプルレートの変更 ====
  +
  +
PipeWire は、DAC がサポートする出力サンプルレートを動的に変更することもできます。サンプルレートは、再生中のオーディオストリームのサンプルレートに従います。
  +
  +
{{hc|/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)|output=
  +
...
  +
context.properties = {
  +
...
  +
'''default.clock.allowed-rates = [ ''sample_rate_1'' ''sample_rate_2'' ''sample_rate_3'' ... ]'''
  +
...
  +
}}
  +
たとえば、{{ic|[ 44100 48000 88200 96000 ]}} です。DAC でサポートされている値については、ハードウェアのマニュアルを参照してください。
  +
  +
開発者の [https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1523] によると: "PipeWire は最大16の異なるサンプルレートを許容し、可能な限り切り替えます。" つまり、上記の設定では、'''再サンプリングは行われない'''ということです。
  +
  +
DAC に送信されるデータがどの出力サンプルレートとサンプルフォーマットであるかを確認するには (おそらく桁を変更する必要があります):
  +
  +
$ cat /proc/asound/card0/pcm0p/sub0/hw_params
  +
  +
どの入力サンプルレートが使用されているかを確認するには、{{ic|pcm0p}} を {{ic|pcm0c}} に変更します ({{ic|c}} は "capture" の略で、{{ic|p}} は "playback" の略です)
  +
  +
==== 音質 (リサンプリング品質) ====
  +
  +
PulseAudio を {{ic|1=resample-method = speex-float-10}} または {{ic|soxr-vhq}} で使用していた場合、コメントを解除して {{ic|1=resample.XXX}} を変更することを検討するとよいかもしれません。{{ic|1=resample.quality = 4}} を {{ic|10}} または最大値 {{ic|15}} に変更することを検討してください。(存在しない場合は {{ic|/usr/share/pipewire/}} からコピーしてください)。PipeWire の再起動を忘れないでください (sudo なし): {{ic|systemctl --user restart pipewire.service pipewire-pulse.socket}} (設定変更を適用させたい場合は、{{ic|pipewire-pulse.socket}}を絶対に忘れないでください)。
  +
  +
{{ic|10}} と {{ic|15}} では、品質の差はほとんどありませんが、CPU 負荷は2〜3倍になっています。また、{{ic|4}}, {{ic|10}}, {{ic|15}} のレイテンシーの差はまだ誰も調べていません。Ryzen 2600 で 44100→48000Hz で {{ic|1= resample.quality = 15}} にすると {{ic|pipewire}} や {{ic|pipewire-pulse}} プロセスが 1CPUコア4.0% の負荷となる。
  +
  +
リサンプラーの比較はこちら:https://src.infinitewave.ca/(18KHz以上、120dB以上は注意)。speeex は ''Xiph.org Speex'' と記載されています。
  +
  +
PipeWire は Spa と呼ばれる独自のリサンプリングアルゴリズムを使用しています。SoX の {{ic|sox}}、Speex の {{ic|speexenc}} と同様、PipeWire にはそのスタンドアロン版があります。{{ic|spa-resample}} 使い方は
  +
spa-resample -q 15 -f s24 -r 48000 input16bit44100orAnythingElse.wav output24bit48000hz.wav
  +
  +
自分で sink を作れば、他のリサンプラーを使うことも可能でしょう。あるいは、音楽プレーヤーのプラグインを使うことも出来ます(例えば、Qmmp には SoX プラグインがあります)
  +
  +
==== 外付けサウンドカードが再接続後に有効にならない ====
  +
  +
{{ic|~/.config/pipewire-media-session/default-profile}} にデフォルトプロファイル ''off'' のエントリがあれば削除します。それでも解決しない場合は {{ic|~/.config/pipewire-media-session/}} からすべてのファイルを削除し、{{ic|systemctl --user restart pipewire.service}} で PipeWire を再起動します。
  +
  +
==== 音が出ないまたは pactl info が Failure: Connection refused と表示する ====
   
{{ic|~/.config/pipewire-media-session/default-profile}}デフォルトプロファイル ''オフ'' のエントリがあるかどうか確認し、削除します。それでも解決しない場合は、 {{ic|~/.config/pipewire-media-session/}} からすべてのファイル削除し、 {{ic|systemctl--user restart pipewire.service}} を使用して PipeWire を再起動します
+
これはアプリケーションが PipeWire-Pulse サービス接続できていないこと意味します。{{ic|/etc/pipewire/pipewire-pulse.conf}} が存在し空でないこと確認し、{{ic|systemctl --user restart pipewire-pulse.service}} PipeWire-Pulse を再起動してください
   
  +
それでも解決しない場合は {{ic|strace -f -o /tmp/pipe.txt pactl info}} を実行し、pastebin に {{ic|/tmp/pipe.txt}} を貼り付けて、IRC (OFTC の [ircs://irc.oftc.net/pipewire #pipewire]) かメーリングリストで相談してください。
=== No Sound または pactl info show Failure:Connection refused ===
 
これは、アプリケーションが PipeWire-Pulse サービスに接続できず、{{ic|/etc/pipewire/pipewire-pulse.conf}} が存在し空でないことを確認し、 {{ic|systemctl--user restart pipewire-pulse.service}} を使用して PipeWire-Pulse を再起動して下さい。
 
   
  +
==== Bluetooth の音声の品質が低い====
それでも解決しない場合は、 {{ic|strace-f-o/tmp/pipe.txt pactl情報}} と pastebin {{ic|/tmp/pipe.txt}} を実行し、IRC (Freenode '''#pipewire''') かメーリングリストでヘルプを探してください。
 
   
  +
Bluetooth で再生が途切れる場合は {{ic|systemctl --user status pipewire.service}} を実行してみてください。次のようなエラーが表示される場合は、
=== Bluetooth のオーディオ品質が低い===
 
   
 
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
 
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
   
Bluetooth 再生が途切れる場合は、{{ic|systemctl --user status pipewire.service}} で {{ic|pipewire.service}}を確認してください。このようなエラーが発生した場合は、{{ic|pactl list sinks}} を使用して現在選択されているコーデックをチェックし、 {{ic|/etc/pipewire/media-session.d/bluez-monitor.conf} の {{ic|bluez 5.codecs}} を {{ic|sbc aac ldac aptx aptx_hd の場合}} のいずれかに設定して変更を試み、変更を有効にするために {{ic|systemctl--user restart pipewire.service}} を使用して PipeWire を再起動します
+
{{ic|pactl list sinks}} 現在選択されているコーデックを確認し、{{ic|/etc/pipewire/media-session.d/bluez-monitor.conf}} の {{ic|bluez5.codecs}} を {{ic|sbc aac ldac aptx aptx_hd}} のいずれかに変更してみてください
   
{{hc|head=/etc/pipewire/media-session.d/bluez-monitor.conf|output=
+
{{hc|/etc/pipewire/media-session.d/bluez-monitor.conf|output=
 
...
 
...
 
properties = {
 
properties = {
 
...
 
...
 
bluez5.codecs = [sbc]
 
bluez5.codecs = [sbc]
...}}
+
...
  +
}}
   
  +
mSBC サポートの有効化を試すには (Sony 1000XM3 のマイクの問題を修正します):
=== PipeWire の更新と再起動後 (git/>=0.3.23) デバイスが検出されません===
 
   
  +
{{hc|/etc/pipewire/media-session.d/bluez-monitor.conf|output=
commit 012a68f8[https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/012a68f8ef33705f1a40ec8ac294b8cce7f6aa88] の時点で、新しい systemd サービスが追加され、デフォルトでは無効になっています。これは、システムリブート時に {{ic|pipewire-media-session}} が実行されないことを意味します。サービスの実行を有効にするには、次の手順に従います。 {{ic|systemctl--user enable--now pipewire-media-session.service}}
 
  +
...
  +
rules = [
  +
...
  +
actions = {
  +
...
  +
update-props = {
  +
...
  +
bluez5.msbc-support = true
  +
...
  +
}}
   
  +
変更を適用するには {{ic|systemctl --user restart pipewire.service}} で PipeWire を再起動する必要があります。
ユーザーまたはパッケージマネージャが更新後に構成ファイルの変更をソートしていない場合、 pipewire.service で {{ic|pipewire-media-session}} の別のインスタンスが実行されている可能性があります。実行をチェックしてください :{{ic|systemctl --user status pipewire.service}}
 
   
  +
==== 再生開始時の音声の遅延やポップ/クラックが目立つ ====
実行中の pipewire および pipewire-media-session が表示される場合は、システムまたはユーザ設定、あるいはその両方を更新します。
 
   
  +
これは、非アクティブ時のノードの一時停止が原因です。
{{hc|head=/etc/pipewire/pipewire.conf および/または ~/.config/pipewire/pipewire.conf|output=
 
  +
context.exec = {
 
  +
{{pkg|pipiwire-media-session}} を使用:
  +
  +
これを無効にするには、遅延が発生する場所に応じて {{ic|/etc/pipewire/media-session.d/*-monitor.conf}} を編集し、プロパティ {{ic|session.suspend-timeout-seconds}} を 0 に変更します。無効にするか、他の値を試して、何が機能するかを確認します。
  +
  +
または、{{ic|/etc/pipewire/media-session.d/media-session.conf}} の行 {{ic|suspend-node}} をコメントアウトすることもできます。
  +
  +
[[再起動]] して {{ic|pipewire.service}} と {{ic|pipewire-pulse.service}} の両方の変更を適用して下さい。
  +
  +
{{pkg|wireplumber}} で、新しいファイルを作成してデフォルト設定を上書きします:
  +
  +
{{hc|~/.config/wireplumber/main.lua.d/51-disable-suspension.lua
  +
(or /etc/wireplumber/main.lua.d/51-disable-suspension.lua)|2=
  +
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 デバイスの場合は、次の設定も使用します (ファイルの場所が異なることに注意してください):
  +
  +
{{hc|~/.config/wireplumber/bluetooth.lua.d/51-disable-suspension.lua
  +
(or /etc/wireplumber/bluetooth.lua.d/51-disable-suspension.lua)|2=
  +
-- 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
  +
},
  +
})
  +
}}
  +
  +
{{ic|pipewire.service}} と {{ic|wireplumber.service}} を再起動して、変更を適用します。
  +
  +
サスペンドを完全に無効にする代わりに、タイムアウト値を、ソースがサスペンドされるまでに必要な遅延秒数に変更することもできます。
  +
  +
==== 複数のストリームの再生が開始されると音声が途切れる ====
  +
  +
この問題は通常、{{ic|pipewire-pulse.service}} [[systemd/ユーザー|ユーザーユニット]] の [[journal]] を読み取り、次のような行を見つけることで診断できます。
  +
  +
pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940
  +
  +
[https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Troubleshooting#underrununderflow-and-broken-pipe-errors 公式 PipeWire トラブルシューティングガイド] によると、{{pkg|pipewire-media-session}} のこの問題を解決するには:
  +
  +
{{hc|/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf|2=
  +
api.alsa.headroom = 1024
  +
}}
  +
  +
{{pkg|wireplumber}} を使用する場合:
  +
  +
{{hc|/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)|2=
  +
apply_properties = {
  +
["api.alsa.headroom"] = 1024,
  +
},
  +
}}
  +
  +
カーネルページのロックやスケジューリングの遅延が原因で音声の途切れが発生する場合は、[[ゲーム#カーネルパラメータを調整して応答時間を安定化させる|カーネルパラメータを調整して応答時間を安定化させる]] を参照してください。
  +
  +
==== 音がひずむ ====
  +
* マイクについては、{{ic|alsamixer}} を起動し、問題があるサウンドカードを選択し、{{ic|Mic Boost}} や {{ic|Internal Mic Boost}} の値を下げてみてください。
  +
* {{ic|/etc/pipewire/pipewire.conf}} の {{ic|1=default.clock.rate = 48000}} のコメントを外して、値を {{ic|44100}} に下げてみてください。
  +
  +
==== スタンバイ後に音声の問題が発生する ====
  +
  +
スリープから復帰した際に音が消えたり壊れたりする場合は、ALSA を最初期化すると改善するかもしれません:
  +
  +
# alsactl init
  +
  +
==== USB DAC(例:Schiit 社製 DAC)で高レイテンシー ====
  +
  +
サンプルレートやフォーマットを変更することで、Schiit Hel 2 などの一部の DAC でレイテンシーを減らすことができるかもしれません [https://www.reddit.com/r/osugame/comments/msifdd/usb_dacamp_and_audio_lag/] ''pipewire-media-session'' のマッチングルールを使用すると、デバイスのプロパティを設定することができます [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-pipewire-media-session#matching-rules]
  +
''pipewire-media-session'' の {{ic|alsa-monitor.conf}} のデフォルト設定を {{ic|/etc/pipewire/media-session.d}} か {{ic|~/.config/pipewire/media-session.d}} にコピーしてください。
  +
そして、以下のような新しいルールブロックを追加してください。
  +
  +
{{hc|/etc/pipewire/media-session.d/alsa-monitor.conf
  +
~/.config/pipewire/media-session.d/alsa-monitor.conf|output=
  +
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
  +
}
  +
}
  +
}
  +
...
  +
}
  +
}}
  +
  +
{{ic|alsa_output.<node name>}} ノードは {{ic|pw-top}} で取得することができます。
  +
  +
DAC は異なるフォーマットやサンプルレートをサポートしているかもしれません。[[ALSA]] に問い合わせることで、あなたの DAC が何をサポートしているかを確認することができます。
  +
  +
まず、DAC のカード番号を取得します。
  +
  +
{{hc|$ aplay -l|
  +
...
  +
card 3: S2 [Schiit Hel 2], device 0: USB Audio [USB Audio]
  +
Subdevices: 0/1
  +
Subdevice #0: subdevice #0
  +
...
  +
}}
  +
  +
つまり、この例ではカード3ということになります。
  +
サポートされているすべてのサンプルレートとフォーマットを取得します。
  +
  +
{{hc|$ cat /proc/asound/cardX/streamX|
  +
...
  +
Playback:
 
...
 
...
  +
Interface 1
# 以下の行はコメントアウトする必要があります
 
  +
Altset 1
#"/usr/bin/pipewire-media-session" = { args = "" }
 
  +
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
  +
...
  +
...
  +
}}
  +
  +
この場合、{{ic|S16_LE, S24_3LE, S32_LE}} はサポートされているフォーマットで、{{ic|44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000}} はすべてのフォーマットでサポートされているサンプルレートとなります。
  +
  +
==== 音量が 30% になるまで USB DAC から音が出ない ====
  +
  +
USB DAC の中には、ある一定の音量に達するまで音が出なくなるものがあります [https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1117] 一般的にこれは約 25%〜30% で、最初の音量が不快なほど大きくなり、低い音量を維持することができなくなります。解決策としては、{{ic|["api.alsa.soft-mixer"]}} を {{ic|true}} に設定して、ハードウェアミキサーの音量コントロールを無視することが挙げられます。
  +
  +
{{Pkg|wireplumber}} でこれを実現するには、{{ic|/usr/share/wireplumber/main.lua.d/50-alsa-config.lua}} 設定に次を使用して構成フラグメントを追加します。 {{ic|table.insert}}:
  +
  +
{{hc|~/.config/wireplumber/main.lua.d/51-volume-fix.lua|output=
  +
  +
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 を再起動します。{{ic|alsamixer}} でマスターボリュームを設定し、{{ic|# alsactl store}} で設定を保存します。これで、ボリュームミキサーを通常どおり使用できるようになります。
  +
  +
==== リアルタイムオーディオが動作しない ====
  +
  +
{{ic|RTKit error: org.freedesktop.DBus.Error.AccessDenied}} が {{ic|systemctl --user status pipewire.service}} の出力に表示された場合、pipewire daemon の優先度がリアルタイムに変更されていないことを示します。この問題については、[https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1069] を参照してください。
  +
  +
==== 同じサウンドカード上の複数のシンクへの同時出力 ====
  +
  +
{{ic|/usr/share/alsa-card-profile/mixer/profile-sets/default.conf}} のコピーを作成し、アップデート後も変更が持続するようにします。ここでは、アナログと HDMI の2つのデフォルトマッピングを結合したプロファイルを定義しています。
  +
  +
{{hc|/usr/share/alsa-card-profile/mixer/profile-sets/multiple.conf|2=
  +
[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 を使用してデバイスをマッチングするように設定します。識別情報は、{{ic|$ pw-cli dump device}} で見つけることができます。
  +
  +
{{hc|/etc/pipewire/media-session.d/alsa-monitor.conf|2=
  +
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 専用にオーバーライドすることが可能です。
  +
  +
{{hc|/etc/pipewire/pipewire-pulse.conf (or ~/.config/pipewire/pipewire-pulse.conf)|output=
  +
...
  +
pulse.rules = [
 
...
 
...
  +
{
}
 
  +
# Discord notification sounds fix
  +
matches = [ { application.process.binary = "Discord" } ]
  +
actions = {
  +
update-props = {
  +
pulse.min.quantum = 1024/48000 # 21ms
  +
}
  +
}
  +
}
  +
...
 
}}
 
}}
  +
  +
==== PipeWire で FMOD ゲームがクラッシュする ====
  +
  +
[[Wikipedia:Pillars_of_Eternity|Pillars of Eternity]] のような古いバージョンの [[Wikipedia:FMOD|FMOD オーディオエンジン]] を使っているゲームの中には、PulseAudio バイナリが存在しないと {{ic|pulseaudio --check}} を呼び出してクラッシュするものがあります。回避策としては、{{ic|/bin/pulseaudio}}を{{ic|/bin/true}}にシンボリックリンクすることです[https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1514]
  +
  +
# ln -s /bin/true /bin/pulseaudio
  +
  +
PulseAudio を再インストールする場合は、シンボリックリンクを削除する必要があることに注意してください。
  +
  +
==== 自動切り替えが機能しない ====
  +
  +
自動切り替えが機能しない場合、[[WirePlumber]] の状態に問題がある可能性があります。[https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/191#note_1252549 this comment] が提案しているように、[[WirePlumber]] のローカル状態を削除し、デーモンを再起動することで改善されるかどうか確認することができます。
  +
  +
$ rm -r ~/.local/state/wireplumber/
  +
  +
次に、{{ic|wireplumber.service}} [[systemd/ユーザー|ユーザーユニット]] を [[ヘルプ:読み方# systemd ユニットのコントロール|再起動]] します。
  +
  +
==== リアルタイムプライオリティの欠落/サスペンド後の負荷によるクラックリング ====
  +
  +
rtkit の [[https://github.com/heftig/rtkit/issues/13 from 2011]] バグにより、サスペンドイベントが発生すると PipeWire のリアルタイム優先度が取り消され、元に戻らなくなります。この原因となる保護を無効にするには、{{ic|rtkit-daemon.service}} を [[編集]] してください:
  +
  +
{{hc|/etc/systemd/system/rtkit-daemon.service.d/override.conf|2=
  +
[Service]
  +
ExecStart=
  +
ExecStart=/usr/lib/rtkit-daemon --no-canary
  +
}}
  +
  +
次に、メディアセッションサービスとともに、{{ic|rtkit-daemon.service}} ユニットと {{ic|pipewire.service}} ユーザー ユニットを再起動します。
  +
  +
=== ビデオ ===
  +
  +
==== OBS(など)がウィンドウ/スクリーンを要求しても何も表示されない ====
  +
  +
{{Pkg|xdg-desktop-portal}} と {{Pkg|xdg-desktop-portal-gtk}} または {{Pkg|xdg-desktop-portal-kde}} がインストールされていることが確実なら、デーモンの実行状態を確認してください。
  +
  +
OBS では、すべてがうまくいっていれば、{{ic|stdout}} にこのように表示されるはずです。
  +
  +
...
  +
info: [pipewire] desktop selected, setting up screencast
  +
info: [pipewire] created stream 0x5632d7456850
  +
info: [pipewire] playing stream...
  +
  +
マルチモニタ環境では、{{Pkg|slurp}} パッケージを使用すると、すべての画面をキャプチャすることができます。
   
 
== 参照 ==
 
== 参照 ==
   
* [https://github.com/PipeWire/pipewire/wiki Wiki] — PipeWire Wiki on GitHub
+
* [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home Wiki] — PipeWire Wiki on Freedesktop GitLab
 
* [https://blogs.gnome.org/uraeus/2018/01/26/an-update-on-pipewire-the-multimedia-revolution-an-update/ Pipewire Update Blog Post] — PipeWire の2018年1月時点での進捗が書かれた記事
 
* [https://blogs.gnome.org/uraeus/2018/01/26/an-update-on-pipewire-the-multimedia-revolution-an-update/ Pipewire Update Blog Post] — PipeWire の2018年1月時点での進捗が書かれた記事
* [https://blogs.gnome.org/uraeus/2020/09/04/pipewire-late-summer-update-2020/ PipeWire Late Summer Update 2020] — 2020年9月からのブログ投稿
+
* [https://blogs.gnome.org/uraeus/2020/09/04/pipewire-late-summer-update-2020/ PipeWire Late Summer Update 2020] — 2020年9月からの記事

2023年11月29日 (水) 03:11時点における最新版

関連記事

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

参照