PipeWire/WirePlumber時代のLinux desktop音声切り分けメモ
Posted:
目的
最近の 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.service、pipewire-pulse.service、wireplumber.serviceが user unit として active か- default sink が意図した出力か
- application stream が意図した sink へ接続されているか
- HDMI と analog のどちらが既定になっているか
- analog 出力 port が
availableかnot 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 名を参照することがある。
pactl と wpctl では正常に見えて、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 化を比較する。
再発時の順序
音が出ないときは、次の順で見る。
pactl get-default-sinkとwpctl statusで既定出力を見るpactl list short sinksで目的の sink が存在するか見るpactl list cardsで profile と port availability を見る- application stream が別 sink に残っていないか見る
- ALSA mixer の mute と auto mute を見る
paplay --device=...で経路を最小確認する- 再生中の journal で
xrun/underrunを見る
古い PulseAudio メモを読むときも、現在の実体が PipeWire かどうかを最初に確認する。