While I did setup my new laptop directly with PipeWire back in December 2021, my existing desktop PC did remain with a PulseAudio setup.
What is PipeWire?
PipeWire is a new low-level multimedia framework. It aims to offer capture and playback for both audio and video with minimal latency and support for PulseAudio, JACK, ALSA and GStreamer-based applications.
The reason I wanted to switch was, that I had some troubles with my bluetooth headphones (only the SBC codec was available in the A2DP profile and I had some reliability issues) and I heard that PipeWire should make this better.
Most of the pipewire packages were already installed as dependencies for other packages:
pacman -Qi pipewire
Name : pipewire Version : 1:0.3.71-1 Description : Low-latency audio/video router and processor Architecture : x86_64 URL : https://pipewire.org Licenses : MIT LGPL Groups : None Provides : None Depends On : libpipewire=1:0.3.71-1 libcamera-base.so=0.0.5-64 libcamera.so=0.0.5-64 libdbus-1.so=3-64 libglib-2.0.so=0-64 libncursesw.so=6-64 libpipewire-0.3.so=0-64 libreadline.so=8-64 libsystemd.so=0-64 libudev.so=1-64 Optional Deps : gst-plugin-pipewire: GStreamer plugin pipewire-alsa: ALSA configuration pipewire-audio: Audio support pipewire-docs: Documentation pipewire-jack: JACK support pipewire-pulse: PulseAudio replacement pipewire-roc: ROC streaming pipewire-session-manager: Session manager [installed] pipewire-v4l2: V4L2 interceptor pipewire-x11-bell: X11 bell pipewire-zeroconf: Zeroconf support realtime-privileges: realtime privileges with rt module rtkit: realtime privileges with rtkit module [installed] Required By : lib32-pipewire obs-studio telegram-desktop wireplumber xdg-desktop-portal xdg-desktop-portal-wlr Optional For : chromium electron electron19 qt5-webengine qt6-webengine sdl2 Conflicts With : None Replaces : None Installed Size : 3.11 MiB Packager : David Runge <firstname.lastname@example.org> Build Date : So 21 Mai 2023 15:17:29 Install Date : Di 23 Mai 2023 22:53:42 Install Reason : Installed as a dependency for another package Install Script : Yes Validated By : Signature
But first we install
$ sudo pacman -S pipewire-audio
Then we remove
pulseaudio-alsa and install
$ sudo pacman -Rs pulseaudio-alsa $ sudo pacman -S pipewire-alsa
Then we install
pipewire-pulse (which will remove
$ sudo pacman -S pipewire-pulse resolving dependencies... looking for conflicting packages... :: pipewire-pulse and pulseaudio are in conflict. Remove pulseaudio? [y/N] y :: pipewire-pulse and pulseaudio-bluetooth are in conflict. Remove pulseaudio-bluetooth? [y/N] y
When trying to stop the (now uninstalled) pulseaudio service to start pipewire I got an error:
$ sudo systemctl stop pulseaudio.service Failed to stop pulseaudio.service: Unit pulseaudio.service not loaded.
Since I didn't want to invest too much time (maybe I should just have stopped it before uninstalling it?) I just logged out and back in to restart my session.1
After restarting the session pulseaudio clients seemed to be broken:
$ pactl stat Connection failure: Connection refused pa_context_connect() failed: Connection refused
It turns out that for some reason the pipewire-pulse.socket listener wasn't active:
$ systemctl --user status pipewire-pulse.socket ○ pipewire-pulse.socket - PipeWire PulseAudio Loaded: loaded (/usr/lib/systemd/user/pipewire-pulse.socket; enabled; preset: enabled) Active: inactive (dead) Triggers: ● pipewire-pulse.service Listen: /run/user/1000/pulse/native (Stream)
Starting it is as easy as
systemctl --user start pipewire-pulse.socket and
pactl shows some output:
$ pactl stat Currently in use: 2 blocks containing 8.0 KiB bytes total. Allocated during whole lifetime: 2 blocks containing 8.0 KiB bytes total. Sample cache size: 0 B
Also pavucontrol now shows me LDAC, AAC, and SBC-XQ in addition to just SBC:
I should probably have used
systemctl --user stop pulseaudio.service, since these are user units. ↩