2022/11/17

Linuxのディストリに採用されてきているPipeWireとは

2020年代に入って “PipeWire” というマルチメディア関係のソフトウェアがLinuxディストリビューションに採用されるようになってきたので、サウンドサーバとしての情報を主にまとめてみた。

  1. 概要
  2. Ubuntu 22.10時点での状況
  3. 標準サンプリングレートの変更
  4. Debian/UbuntuにおけるJACK互換機能のインストールと使用法
  5. JACKアプリケーションの音飛びは?
  6. 入力音声を出力する(ループバック)
  7. 互換機能を通さず直接使えるソフトは?

概要

既存のPulseAudioやJACK Audio Connection Kitといったサウンドサーバを置き換えつつ、スクリーンキャスト(動画キャプチャ)についての仕組みも備えている。

自動的に起動して動作し続ける類のソフトであり、手動で起動するものではない。

  • 複数のサウンドバックエンドを搭載
    • 既存のPulseAudio(汎用のサウンドサーバ)とJACK(音楽の制作用途にも適したサウンドサーバ)の両方のサウンドサーバを置き換えることが可能で、既存の両サウンドサーバに対応するアプリケーションをそのままPipeWireで使える
    • PulseAudioの普及前にはALSA API(libasound)を通してALSA対応サウンドデバイスに音を出力する形もよく使われていたが、そのような形でサウンドデバイスを扱うソフトにもPipeWireは対応している
    • サウンド関係の設定方法は既存のサウンドサーバなどとは全く異なり、既存のサウンドサーバ用にカスタマイズした設定は使えない
  • 映像のキャプチャ機能はWayland環境にも対応している

Ubuntu 22.10時点での状況

Ubuntu 22.10において本物のPulseAudioが取り除かれ、同サーバに相当する機能のみがPipeWireで置き換えられている。

PulseAudio固有の設定をカスタマイズしてきた既存ユーザはPipeWireでのやり方に合わせる必要がある。

標準サンプリングレートの変更

以下は各一般ユーザでの手順となるが、全ユーザに対して適用する場合は管理者(root)権限で/etc/pipewire/pipewire.confとしてコピー後の直接編集でもよい。

  1. 環境変数XDG_CONFIG_HOMEが未定義の場合は[ホームディレクトリ]/.config/、定義済みの場合はその値のディレクトリの下にpipewireディレクトリが存在しなければ作成する
  2. /usr/share/pipewire/pipewire.confを前述のディレクトリの中にコピー
  3. コピーしたファイル内のdefault.clock.rate = [Hz単位のサンプリングレート] の行の内容を変更して上書き保存

適用するにはGUI環境に再ログインするか、GUI端末ソフトでsystemctl --user restart pipewireを実行する。

音の出ているときに/proc/asound/[サウンドカード]/stream[番号]を確認すると、手元の環境では、設定前が

Playback:
  Status: Running
    Interface = 1
    Altset = 2
    Packet Size = 294
    Momentary freq = 48000 Hz (0x30.0000)
  ...

のようになっていたのが、default.clock.rate = 96000を指定すると

Playback:
  Status: Running
    Interface = 1
    Altset = 4
    Packet Size = 582
    Momentary freq = 96000 Hz (0x60.0000)
  ...

のようになって、常に96kHzで出力されていることが確認できた。

設定ファイルの詳細についての文書(英語)は端末でman pipewire.confを実行すると参照できる。設定ファイルはその内容によって複数ファイルに分かれており、必要に応じて同様に前述のディレクトリにファイルをコピーして編集する。

Debian/UbuntuにおけるJACK互換機能のインストールと使用法

pipewire-jackというパッケージを追加するとpw-jackというコマンドがJACK互換ライブラリとともにインストールされる。JACK互換ライブラリは移行期間向けに本物のJACKライブラリと共存可能になっている。過去にpipewire-audio-client-librariesの名前でも入れられたが、分割されて

  • ALSA API(libasound)対応アプリケーション向けのpipewire-alsa
  • JACK API(libjack)対応アプリケーション向けのpipewire-jack

の構成になった。

pw-jackコマンドはJACKアプリケーションを実行するコマンド行の最初に挿入する形で用いる。

("jack_lsp -c" をPipeWireの互換機能で実行)
$ pw-jack jack_lsp -c

JACKの代わりにPipeWireを使いたい場合、シェルのエイリアスとしてalias my_jack_app='pw-jack my_jack_app'のように設定すると便利かもしれないが、将来、本物のJACKライブラリがなくなってPipeWireのものに置き換わった場合には、pw-jackは要らなくなる。

JACK互換機能についてはどの程度テストされているのか不明な部分もあるが、映像や音声の再生程度の用途であれば大体問題なく動作している印象がある。

JACKアプリケーションの音飛びは?

本物のJACKサーバは音飛びしやすく、リアルタイム優先度などの設定やカーネルの調整が必要なことが多かったが、PipeWireのJACK互換機能では、手元の環境では最初からPipeWireがnice値-11で動作するようになっているためか、音の再生のみを行う用途においては音飛びが起きることはほとんどないため、特に音飛び対策の設定変更はしていない。

https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Performance-tuning

の一部にその辺りの関係の設定例があるので、JACKのポートを多数接続する用途において音飛びが発生するなど、必要があればいじるかもしれない。

入力音声を出力する(ループバック)

ライン入力などの入力から入ってきている音声が聞こえない場合、pw-loopbackコマンドを実行すると、このコマンドを終了するまでの間、出力先デバイスから聞こえるようになる。

オンボードサウンドのライン入力からの音声を別のライン入力のないUSBデバイスから出力する場合などに使える。

デバイスが多数ある場合はオプションでの指定が必要になる場合があるが、入力を使わないデバイスで入力を無効(出力のみ)に設定しておくことで省略できる。

他に、pw-jack qjackctlqpwgraphなどで入力デバイスと出力デバイスを手動で接続する方法もある。この場合は接続解除も手動で行う。

互換機能を通さず直接使えるソフトは?

2022年秋時点では十分に揃っているとは言えないかもしれない。しばらくはPulseAudioに相当する互換機能に頼る形が続くと思われるが、ソフトウェアによっては現在利用できる最新リリースにはなくても既に実装が済んでいて今後1年以内に公開されるディストリにおいて標準で利用可能になるかもしれないものもある。色々なディストリへの普及の状況にもよるが、過去のPulseAudioと同様、将来デスクトップ環境などでもネイティブで扱えるようになっていく可能性は十分にある。

  • 音声・動画プレーヤのmpvPipeWireネイティブの音声バックエンドが0.35系から利用可能
  • AudaciousにPipeWireネイティブの音声バックエンドが実装され、次期リリース(4.2系の次)から利用可能になりそう
  • G4Musicなど、PipeWireにネイティブ対応したオーディオプレーヤは他にもある
  • Easy Effectsでは外部パッケージの音声プラグインを利用してリアルタイムに効果がかけられる(Debian/Ubuntuではcalf-pluginslsp-pluginsなどを別途インストールしておく)
  • GStreamer 1.0にはPipeWireネイティブの入出力プラグイン群(pipewiresinkpipewiresrc)が既にあり、Ubuntu 22.10時点で利用可能
  • Wineの音声ドライバの開発に向けた段階的な取り組みがあり、開発者がWineの開発リポジトリでも準備の作業をしているため、数年以内には標準で利用可能になっているかもしれない