PipeWire

PipeWire is a Article description::low-latency, graph-based, processing engine and server, for interfacing with audio and video devices. It can be used to support use-cases currently handled by ALSA, PulseAudio, and/or JACK, and aims to improve handling of audio and video under Linux.

Some key features of PipeWire include:


 * Minimal latency capture/playback of audio and video.
 * Real-time multimedia processing.
 * Multi-process architecture allowing multimedia content sharing between applications.
 * Seamless support for PulseAudio, JACK, ALSA, and GStreamer.
 * Applications sandboxing support with Flatpak, with a security model that facilitates interacting containerized applications.

PipeWire currently ships a PipeWire daemon, an example session manager, tools to introspect and use the PipeWire Daemon, a library to develop PipeWire applications and plugins, and the SPA (Simple Plugin API) used by both the PipeWire daemon and the PipeWire library.

Emerge
Set the screencast USE flag on the ebuilds for which PipeWire support is desired, and PipeWire will be pulled in as a dependency. Alternatively, set the screencast USE flag in make.conf. After changing USE flags, rebuild affected packages:

Alternatively, PipeWire may be emerged independently, though the previous method is usually what is required:

Configuration
Detailed, non Gentoo-specific, configuration documentation can be found at the project's official wiki. Typically things work reasonably well out of the box, and PipeWire's global configuration is usually best left unmodified.

Global PipeWire configuration can be changed by editing the file, and  may be used for per-user configuration. Additionally, PipeWire recognizes multiple environment variables that allow these settings to be changed, per-user, or for individual commands.

In principle, existing PulseAudio or JACK tools can be used to interact with PipeWire when it is set up to behave as a JACK and/or PulseAudio server, but currently only parts of the respective APIs have been implemented.

systemd
PipeWire provides socket and service files when built with the  USE flag. The following command enables systemd's socket activation of PipeWire for the current user:

The socket activation only starts the service when required, which is usually sufficient. Alternatively the user service can be always started when the user logs in by replacing pipewire.socket with pipewire.service:

Starting with 0.3.39, PipeWire also requires to run properly:

In these cases, the  flag is optional but probably safe to use as starting PipeWire with default configuration merely allows using new interfaces but does not change the existing ones i.e. non-PipeWire clients continue using the same libraries and services they were using previously. To also replace PulseAudio and/or JACK, follow the instructions in the relevant section.

OpenRC with elogind (any of Gentoo's desktop profiles)
PipeWire relies on a working D-Bus user daemon with an XDG compliant environment. Both requirements should be automatically met when a desktop profile is used, thanks to their elogind integration. On such systems, starting PipeWire is as simple as running the  binary.

There is no truly standardized way (outside of systemd) to load PipeWire when starting a graphical shell, and users need to choose the correct approach based on how their graphical environment is started. The following table lists some ways to launch PipeWire when logging into a graphical environment:

Login without session management
Ensure there is a viable D-Bus session active:

Check that XDG_RUNTIME_DIR is set. This is usually managed by either systemd-logind, its fork elogind for OpenRC and similar init systems, or seatd - an alternative free-standing implementation of logind. In addition to running one of the 3 logind variants, a PAM module must also be loaded to let the daemon interact with users logging in and out of the system.

On systems without any such logind implementation and the required PAM module, the user must create the require directory and set the environmental variable manually:

The PipeWire executable must also be called:

Replacing PulseAudio
If  is emerged you have to:
 * 1) Turn it off in  set 'autospawn = no' and
 * 2) Disable daemon via configuration by editing  and change 'daemonize' to 'daemonize = no'. Remove any ';' at the beginning of the line.

systemd
First disable PulseAudio's user service (safe to do even if user service was not in use) and then enable the PipeWire and PipeWire-Pulse sockets:

Optionally one can also mask PulseAudio user service and socket but it should be noted that this will not help much if PulseAudio configuration permits autostart [as is default]:

OpenRC
To have PipeWire to act as a PulseAudio user daemon/server, no action is required on XDG-compliant desktops. If using a manual start solution, be sure to call $ in your scripts.

Verifying that it worked
Make sure prior that has been launched either manually or as script stated in the previous sections.

To check whether PipeWire is now acting as the PulseAudio user daemon/server, use this pactl command in a Bash compatible shell:

Replacing JACK
To have JACK clients routed through PipeWire, currently the only method supported by Gentoo is to run them via pw-jack which uses LD_PRELOAD to redirect clients from JACK's original libraries to PipeWire's alternatives:

It should be noted that either due to PipeWire incompleteness or Gentoo configuration shortcomings, not every client will work. Some may even ungracefully exit due to missing symbols. It will likely also require re-configuration of JACK clients, because they will attempt to use their old configuration files, if such exist.

Alternatively it should be possible to have PipeWire connect to a real jackd and act as a gateway for non-JACK applications but, unless there already is a working JACK setup, this is not recommended for the overall worse user experience with JACK.

CS:GO (and other games using the Valve's Source engine)
The default sound buffer length is 0.025. This can sometimes be too low causing cracking audio; for now the workaround is to increase the size of the application's audio buffer from within CS:GO :

"snd_mixahead is the length of the sound buffer in seconds, so 0.05 is 50ms (0.10, edited: 25ms is the default). This is essentially the audio delay, so reducing it gives better synchronization. Not all hardware can handle a buffer setting this low though, so if you hear any crackling or pops at 0.05, increase this setting by 0.01 until the crackling/pops disappear."

Increasing RLIMIT_MEMLOCK for PulseAudio clients (systemd specific)
In case if messages such as this are observed:

one can adjust the amount of memory that pipewire-pulse process can lock via:

and add in the blank space in the upper section of the editor window (not forgetting to save the file afterwards, of course):

If the system is shared between multiple users, this has to be done for each user (or the created override file has to be copied over with appropriate permissions).

Finally, to have the override applied one must reload the configuration and then restart the service:

The current unit default is set to  (same as 128K) by the Gentoo package which as of PipeWire 0.3.21 appears to allow for 1 PulseAudio client (subsequent clients will receive buffers backed by unlocked memory). Increasing the number to 256K as seen above should allow for 3 clients with buffers locked to memory at the same time.

While this is just a conjecture, it seems very likely that the LimitMEMLOCK which sets the per-unit hard limit (and implicitly also the LimitMEMLOCKSoft to the same value) must be within the bounds set on the user in question, which is 64 kilobytes for users without realtime capability. To actually have the default 128K or any other value above 64 kilobytes applied, one therefore must set a new limit for non-system accounts:

The new limits are only in effect on new logins, therefore the user must log out and back in. This is usually enough but if pipewire-pulse.service survived the logout, then it must be manually restarted as described previously in this subsection.

Increasing RLIMIT_MEMLOCK for JACK clients (and PulseAudio clients with OpenRC)
Unlike the case of PulseAudio clients, for which the user service does memory locking of buffers, JACK clients do it themselves. In the likely event that the clients report being unable to lock memory, in addition to the hard limit (max permitted value) described in previous sub-section on PulseAudio RLIMIT_MEMLOCK, the soft limit (the default value) must also be raised:

Bluetooth
By default, Bluetooth support is disabled to avoid clashes with PulseAudio's Bluetooth stack since currently the main use case is as an addition to not a replacement for PA. Uncomment PipeWire's bluez5 module for Bluetooth devices to be listed:

{{FileBox|filename=/etc/pipewire/media-session.d/media-session.conf|1= ... modules = { ...   default = [ ...       bluez5          # bluetooth support ...   ]    ... }}

Then run:

External resources

 * https://venam.nixers.net/blog/unix/2021/06/23/pipewire-under-the-hood.html - A blog explaining PipeWire from a unique perspective.
 * https://lwn.net/Articles/847412/ - PipeWire: The Linux audio/video bus (LWN).