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 Daemon based on the framework can be configured to be both an audio server (with PulseAudio and JACK features) and a video capture server. It is also designed to replace Pulseadio and JACK.

Installation

Usually you will Install these packages:

 sudo pacman -S pipewire pipewire-pulse wireplumber pipewire-alsa

Install pipewire-jack instead of pipewire-alsa if you are using jack instead of alsa (default):

  sudo pacman -S pipewire pipewire-pulse wireplumber pipewire-jack

pipewire-pulse will replace pulseaudio and pulseaudio-bluetooth providing a layer of compatibility with pulseaudio applications e.g. pavucontrol. PipeWire handles bluetooth audio devices if the pipewire-pulse package is installed.

wireplumber is the "Session / policy manager implementation for PipeWire" and it is usually needed.

Configuration

The default configuration of pipewire is usually sufficient. In most cases, no further configuration is needed.

The default configuration files are located in /usr/share/pipewire. The system-wide configuration files are located in /etc/pipewire. The user-specific configuration files are located in $HOME/.config/pipewire.

Usage

PipeWire is not started by default. You need to start it manually or enable it to start automatically at login. There are many ways to start PipeWire, depending on your system and preferences.

Be aware Depending on how you start PipeWire, The processes can remain active after logging out. This can cause issues.

In general, you need to start the following three processes in the exact order:

 /usr/bin/pipewire
 /usr/bin/pipewire-pulse
 /usr/bin/wireplumber

You can use any of the methods mentioned in Archlinux Autostarting to start these processes automatically at login. Here are some common methods:

Only add programs from the pipewire-related packages you have installed. Here it is assumed you have installed the packages world/pipewire, world/pipewire-pulse and world/wireplumber

xinit

If you are using xinit, you can add the following lines to your ~/.xinitrc file:

 ~/.xinitrc
 ...
 /usr/bin/pipewire &
 /usr/bin/pipewire-pulse &
 /usr/bin/wireplumber &
 exec openbox-session	// or your preferred window manager

This will start PipeWire, PipeWire PulseAudio, and WirePlumber when you start X11. Make sure to replace openbox-session with your preferred window manager or desktop environment.

XDG Autostart

If you are using a desktop environment that supports XDG autostart, you can create a .desktop file in the ~/.config/autostart directory. This file will be executed when you log in to your desktop environment.

 ~/.config/autostart/custom-pipewire.desktop
 ...
 [Desktop Entry]
 Type=Application
 Exec=/path/to/your/start-pipewire.sh
 Hidden=false
 NoDisplay=false
 X-GNOME-Autostart-enabled=true
 Name=PipeWire
 Comment=Start PipeWire and WirePlumber

and

 start-pipewire.sh
 ... 
 #!/bin/bash
 /usr/bin/pipewire &
 /usr/bin/pipewire-pulse &
 /usr/bin/wireplumber &

You can use artix-pipewire-launcher instead of start-pipewire.sh. You can use pipewire.desktop instead of custom-pipewire.desktop.

Desktop Environment

If you are using a desktop environment like KDE, XFCE, or GNOME, you can create a script With the following content:

 ~/.config/autostart/start-pipewire.sh
 ...
 #!/bin/sh
 /usr/bin/pipewire &
 /usr/bin/pipewire-pulse &
 /usr/bin/wireplumber &

Then add the script to your desktop environment's startup applications. The method for doing this varies by desktop environment, but it usually involves going to the settings or preferences and finding a section for startup applications or autostart. For more information, refer to Archlinux's Autostarting page.

Reboot or re-login to see the effect.

You can use artix-pipewire-launcher instead of start-pipewire.sh.

Dinit

For dinit, assuming you installed the *-dinit packages, specifically:

 sudo pacman -S pipewire-dinit pipewire-pulse-dinit wireplumber-dinit

Enable pipewire pipewire-pulse wireplumber:

 dinitctl enable pipewire
 Service 'pipewire' has been enabled.
 Service 'pipewire' started.

 dinitctl enable pipewire-pulse
 Service 'pipewire-pulse' has been enabled.
 Service 'pipewire-pulse' started.

 dinitctl enable wireplumber
 Service 'wireplumber' has been enabled.
 Service 'wireplumber' started.

Should be available immediately

For more infos or troubleshooting see Archlinux's wiki page

PipeWire self autostart

PipeWire can start session managers and other servers automatically. This is done by creating a file in .config/pipewire/pipewire.conf.d called 02-autostart.conf

 ~/.config/pipewire/pipewire.conf.d/02-autostart.conf
 ...
 context.exec = [
 	{ path = "/usr/bin/wireplumber" args = "" condition = [ { exec.session-manager = null } { exec.session-manager = true } ] }
 	{ path = "/usr/bin/pipewire-pulse" args = "" condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] }
 ]

However, This method is not recommended. This method still requires you to start PipeWire using one of the methods mentioned above. It is not a replacement for starting PipeWire. It is just a way to start session managers and other servers automatically when PipeWire starts.

Disabling suspension

To avoid speakers to go idle you can create the file ~/.config/wireplumber/ with this content:

 monitor.alsa.rules = [
  {
    matches = [
      {
        # Matches all sources
        node.name = "~alsa_input.*"
      },
      {
        # Matches all sinks
        node.name = "~alsa_output.*"
      }
    ]
    actions = {
      update-props = {
        session.suspend-timeout-seconds = 0
      }
    }
  }
 ]
 # bluetooth devices
 monitor.bluez.rules = [
  {
    matches = [
      {
        # Matches all sources
        node.name = "~bluez_input.*"
      },
      {
        # Matches all sinks
        node.name = "~bluez_output.*"
      }
    ]
    actions = {
      update-props = {
        session.suspend-timeout-seconds = 0,
    dither.method = "wannamaker3",
    dither.noise = 2,
      }
    }
  }
 ]