概要
筆者の自宅で動いているサーバを更新するにあたり、Linuxのアップグレードを実施した。アップグレード直後から PipeWire がマシン全体で適用されてしまっており、従来の PulseAudio との間でポートやリソースの競合が発生していた。
そのため、今回利用していた PulseAudio から PipeWire への完全な移行を実施する。
PipeWire は PulseAudio 互換レイヤー(pipewire-pulse)を備えているため、ホスト側の設定を適切に入れ替えるだけで、クライアント(Docker等)側の変更を最小限に抑えて解決できる。
環境
- OS: Linux (Ubuntu 24.04 / Debian系 等、PipeWire標準採用のディストリビューション)
- Audio Server: PipeWire (wireplumber / pipewire-pulse)
- Container: Docker (Python / PyAudio)
- Tools: pulseaudio-utils (pactl)
発生していたエラー
-
pulseaudio --load=module-native-protocol-tcp --exit-idle-time=-1 --daemon実行後、pulseaudio --checkを実行してもデーモンが立ち上がっていない。 - にもかかわらず、
E: [pulseaudio] pid.c: Daemon already running.、E: [pulseaudio] main.c: D-Bus name org.pulseaudio.Server already taken.が発生する -
ps aux | grep pipewireを実行すると、以下のような結果が出る。
app-pulseaudio@autostart.service generated -
pipewire-pulse.service enabled enabled
pulseaudio-x11.service static -
pulseaudio.service enabled enabled
pipewire-pulse.socket enabled enabled
pulseaudio.socket enabled enabled
ツールの入れ替え方法
-
既存の PulseAudio を完全にクリーンアップ
PipeWireとの衝突を避けるため、旧来のデーモンを削除し、残存しているPIDファイルやソケットを掃除。$ sudo apt purge -y pulseaudio $ sudo apt autoremove -y $ rm -rf ~/.config/pulse /run/user/$(id -u)/pulse -
pulseaudio-utilsが無いと、pactlが利用できないため、インストール。
$ sudo apt install pavucontrol pulseaudio-utils -
デーモンの起動と確認
$ pactl load-module module-native-protocol-tcp auth-anonymous=1 listen=0.0.0.0 $ ss -antl | grep 4713 LISTEN 0 32 0.0.0.0:4713 0.0.0.0:* -
docker側に掴んでもらうため、
docker-compose.ymlに以下を追記... environment: ... - PULSE_SERVER=172.17.0.1 extra_hosts: - "host.docker.internal:host-gateway"
所感
当初は PulseAudio の再起動で解決を試みたが、OS標準の PipeWire がシステム全体を統治している環境では、無理に旧来のデーモンを維持するよりも、PipeWire の互換機能を活用する方が楽です。