PipeWire/WirePlumber時代のLinux desktop音声切り分けメモ

目的

最近の Linux desktop では、アプリからは PulseAudio に見えていても、実体は PipeWire と WirePlumber で動いていることが多い。 音が出ないときは、KDE などの GUI だけで判断せず、PipeWire/Pulse 互換層、WirePlumber、ALSA card profile、application stream の接続先を分けて見る。

最初に見るもの

pactl info
pactl list short sinks
pactl list short sources
pactl list cards
wpctl status
systemctl --user status pipewire pipewire-pulse wireplumber --no-pager -l

まず次を確認する。

  • pipewire.servicepipewire-pulse.servicewireplumber.service が user unit として active か
  • default sink が意図した出力か
  • application stream が意図した sink へ接続されているか
  • HDMI と analog のどちらが既定になっているか
  • analog 出力 port が availablenot available

HDMIとanalog出力の切り替え

HDMI monitor 側が既定 sink になっていると、背面 line-out や headphone から音が出ない。 ALSA card profile と sink port を明示してから、PipeWire/Pulse 側の default sink を変える。

pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo+input:analog-stereo
pactl set-sink-port alsa_output.pci-0000_00_1b.0.analog-stereo analog-output-lineout
pactl set-default-sink alsa_output.pci-0000_00_1b.0.analog-stereo
wpctl status

既存の application stream は、default sink を変えただけでは移動しないことがある。

for i in $(pactl list short sink-inputs | awk '{print $1}'); do
  pactl move-sink-input "$i" alsa_output.pci-0000_00_1b.0.analog-stereo
done

sink 名は環境ごとに違う。 先に pactl list short sinks で実名を確認してから使う。

ALSA mixerも確認する

PipeWire 側で正しい sink に流れていても、ALSA mixer の mute や auto mute で止まることがある。

amixer -c 0
amixer -c 0 set 'Auto-Mute Mode' Disabled
amixer -c 0 set Master 90% unmute
amixer -c 0 set Front 90% unmute
amixer -c 0 set PCM 100%

-c 0 は例である。 実際の card 番号は aplay -l で確認する。

aplay -l
arecord -l

再生確認

GUI の音量テストではなく、device を指定して短い音を流す。

paplay --device=alsa_output.pci-0000_00_1b.0.analog-stereo /usr/share/sounds/alsa/Front_Center.wav

ここで音が出るなら、ALSA、PipeWire、物理ジャックの基本経路は成立している。 残る論点は、default sink の永続化、アプリ stream の移動、desktop UI の表示である。

rtkit warningの見方

PipeWire 起動時に次のような warning が出ることがある。

mod.rt: could not set nice-level to -11: Permission denied

同時に rtkit-daemon が PipeWire、pipewire-pulse、WirePlumber の thread を RT priority や negative nice へ上げているなら、致命的な権限不足ではない可能性が高い。

journalctl --user -b -u pipewire -u pipewire-pulse -u wireplumber --no-pager --output=short-iso
journalctl -b --no-pager --output=short-iso | rg -i 'rtkit|pipewire|wireplumber'

音切れや XRUN が主症状なら、warning の有無より再生中の underrun を見る。

journalctl --user -f | rg -i 'xrun|underrun|overrun|pipewire|wireplumber'

KDE音量UIのstale object

KDE Plasma の音量 applet は、PipeWire object の追加削除や profile 切替に追従する過程で、古い sink/source 名を参照することがある。 pactlwpctl では正常に見えて、KDE 側だけ No object for name ... の warning を出すケースは、音声経路そのものではなく UI 側の stale object として切り分ける。

音が継続して出ているなら優先度は下げてよい。 音量 UI が固まる、device 選択が消える、通知が大量発生する場合は、Plasma volume applet、PulseAudio Qt binding、PipeWire object lifecycle の相性として追う。

FluidSynth user unit

MIDI を使わない環境で fluidsynth.service が user unit として失敗している場合、音声再生の主因ではないことが多い。 ただし systemctl --user --failed や journal に残るとノイズになる。

systemctl --user status fluidsynth --no-pager -l
systemctl --user cat fluidsynth

使わないなら無効化候補にする。 使うなら user unit の hardening、lock file の置き場所、system unit 化を比較する。

再発時の順序

音が出ないときは、次の順で見る。

  1. pactl get-default-sinkwpctl status で既定出力を見る
  2. pactl list short sinks で目的の sink が存在するか見る
  3. pactl list cards で profile と port availability を見る
  4. application stream が別 sink に残っていないか見る
  5. ALSA mixer の mute と auto mute を見る
  6. paplay --device=... で経路を最小確認する
  7. 再生中の journal で xrun / underrun を見る

古い PulseAudio メモを読むときも、現在の実体が PipeWire かどうかを最初に確認する。