From 843082e4e594e44fcfa60e995ebe6e9429259fab Mon Sep 17 00:00:00 2001 From: "Simon A. Eugster" Date: Sun, 5 Apr 2026 16:54:46 +0200 Subject: [PATCH] docs: Add user overview docs for PipeWire --- Dockerfile | 51 +++++ doc/Doxyfile.in | 1 + ...ewire-object-types-relationship.drawio.png | Bin 0 -> 32680 bytes doc/dox/overview-for-users.md | 216 ++++++++++++++++++ doc/meson.build | 1 + doc/tree.dox | 1 + 6 files changed, 270 insertions(+) create mode 100644 Dockerfile create mode 100644 doc/dox/media/pipewire-object-types-relationship.drawio.png create mode 100644 doc/dox/overview-for-users.md diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..8642cab99 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +# Build environment for PipeWire +# +# To build the image and tag it with “pw”: +# docker build . -t pw +# +# To run the container with the current directory mounted (so you can build inside the container): +# docker run -it --rm -v $(pwd):/repo pw +# +# In the container, to build docs and not too much else, set up the build directory in “builddir”: +# meson setup builddir --reconfigure --auto-features=disabled -Ddocs=enabled -Dsession-managers=[] -Dflatpak=disabled -Ddbus=disabled -Dpipewire-alsa=disabled +# +# Once configured, build the configured components: +# cd builddir +# meson compile + + +FROM ubuntu:24.04 + +RUN DEBIAN_FRONTEND=noninteractive apt-get update \ + && apt-get -y install \ + debhelper-compat \ + findutils \ + git \ + libapparmor-dev \ + libasound2-dev \ + libavcodec-dev \ + libavfilter-dev \ + libavformat-dev \ + libdbus-1-dev \ + libbluetooth-dev \ + libglib2.0-dev \ + libgstreamer1.0-dev \ + libgstreamer-plugins-base1.0-dev \ + libsbc-dev \ + libsdl2-dev \ + libsnapd-glib-dev \ + libudev-dev \ + libva-dev \ + libx11-dev \ + meson \ + ninja-build \ + pkg-config \ + python3-docutils \ + systemd + +RUN DEBIAN_FRONTEND=noninteractive apt-get -y install \ + doxygen + +USER ubuntu +WORKDIR /repo + diff --git a/doc/Doxyfile.in b/doc/Doxyfile.in index f8cdbf528..c241f9abd 100644 --- a/doc/Doxyfile.in +++ b/doc/Doxyfile.in @@ -58,6 +58,7 @@ PREDEFINED = PA_C_DECL_BEGIN= \ SPA_NORETURN \ SPA_RESTRICT HTML_EXTRA_STYLESHEET = @cssfiles@ +IMAGE_PATH = "@top_srcdir@/doc/dox/media/" MAX_INITIALIZER_LINES = 1 SORT_MEMBER_DOCS = NO diff --git a/doc/dox/media/pipewire-object-types-relationship.drawio.png b/doc/dox/media/pipewire-object-types-relationship.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..adf7e95a8ce045a05144bc9e6762e4b35c226eb1 GIT binary patch literal 32680 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�*%Gklv7uQytur1 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 literal 0 HcmV?d00001 diff --git a/doc/dox/overview-for-users.md b/doc/dox/overview-for-users.md new file mode 100644 index 000000000..31893225a --- /dev/null +++ b/doc/dox/overview-for-users.md @@ -0,0 +1,216 @@ +\page page_overview_for_users Overview for Users + +While the \ref page_overview page describes PipeWire on a technical level for programmers, +this page is intended for end users working with (and not programming on) PipeWire. + +# PipeWire + +- [docs.pipewire.org: PipeWire docs](https://docs.pipewire.org/) – that’s this page +- [pipewire.pages.freedesktop.org: WirePlumber docs](https://pipewire.pages.freedesktop.org/wireplumber/) – WirePlumber reference +- [gitlab.freedesktop.org Wiki](https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home) with guides and links to other docs +- [wiki.archlinux.org: ArchLinux docs](https://wiki.archlinux.org/title/PipeWire) with tool list and examples + +PipeWire is a multimedia framework for Linux. The Kernel uses ALSA, and applications can either use ALSA directly +(but only one application send sound to an ALSA output at the same time), or use a different backend like JACK, +PulseAudio, or (the newest) PipeWire. All those backends do not have the single client limitation and provide +additional features. + +PipeWire uses a powerful graph based approach for routing application freely between producers and consumers. + +PipeWire provides a PulseAudio API (and others like JACK), so clients relying on PulseAudio still work, +they just use the PulseAudio API provided by PipeWire. Therefore, PulseAudio tools like `pavucontrol` still work +(see PulseAudio section below). + + +## PipeWire overview + +Normally, a system with PipeWire also runs WirePlumber. + +**PipeWire** only *provides* the functionality for transporting and transforming audio and video. It is *used* by a session manager. + +There is one PipeWire *server* which is used by a number of PipeWire *clients* (the processes that produce/consume multimedia). +PipeWire, as well as WirePlumber, run in *userspace,* so interfacing with them with `systemd` (and `journald` etc.) +happens in *user context* with the `--user` flag, for example +`systemctl --user status pipewire.service` or `journalctl --user -fu wireplumber.service`. + +**WirePlumber** provides [Session Management](https://pipewire.pages.freedesktop.org/wireplumber/design/understanding_session_management.html): It enables new devices when they appear on ALSA, creates and configures nodes, +create links between nodes to route sound from an application to a consumer, etc. + +### Terminology + +For a more technical description, see \ref page_overview. + +* **Nodes** produce and/or consume data, for example a stereo output to a headset (consumes), an audio player (produces), + a reverb effect filter (consumes, then produces modified audio), etc. +* **Ports** are the connectors on nodes where data enters or exits. A stereo output sound card has two input ports + typically labeled `FL` and `FR` for front left and front right, which may receive data from `vlc` which has + two output ports `FL` and `FR`. (Physically, the sound card can have a stereo jack output, for example, but that is not in the scope of PipeWire.) +* **Links** connect two ports. Audio/Video data only flows when there is a link between ports. + Ports can have multiple incoming/outgoing links, so PipeWire can e.g. send the same `vlc` audio stream to the stereo headset + and a bluetooth headset and an audio recorder. +* **Devices** represent e.g. ALSA PCM sound cards. They have *Profiles*, and the active profile defines properties + like channel setup. For example, a sound card can have a `stereo` profile where only two ports are exposed, + or a `surround7.1` profile with 8 ports available. + +Nodes have various properties like name/description, a vendor (if available), an ID (changes between restart, therefore use `node.name` or `device.name`), etc. +Some specific properties: + +* `media.class` describes the type of the node. A sound card (a *device* in PipeWire) has media class `Audio/Device` + with corresponding `Audio/Source` input and `Audio/Sink` output nodes. A process producing audio is `Stream/Output/Audio`. + +Relationships between different object types (`type` property): + +![Object type relationship](pipewire-object-types-relationship.drawio.png) + +```mermaid +flowchart LR + C[PipeWire:Interface:Client] + D[PipeWire:Interface:Device] + N[PipeWire:Interface:Node] + P[PipeWire:Interface:Port] + L[PipeWire:Interface:Link] + CO[PipeWire:Interface:Core] + M[PipeWire:Interface:Module] + SC[PipeWire:Interface:SecurityContext] + PR[PipeWire:Interface:Profiler] + PM[PipeWire:Interface:Metadata] + N -- target.object --> C + N -- target.object --> D + L -- input + output port --> P + L -- input + output node --> N + +``` + + + +### PipeWire Tools + +* [List of PipeWire programs](https://docs.pipewire.org/page_programs.html) + +This is just a short selection of tools. + +[qpwgraph](https://gitlab.freedesktop.org/rncbc/qpwgraph) gives a quick visual overview over the current system configuration with nodes and links between them. +It also allows creating and deleting links on the fly. + +`pw-dump` dumps the whole configuration (json dump all, nodes etc) + +`pw-cli` allows to query and configure PipeWire, for example setting a sound card profile with +`pw-cli s Profile CARD_ID '{index: PROFILE_ID, save: true}'`, or in interactive mode. +*Important:* In interactive mode, do *not* use quotes around JSON data. + +`wpctl` interfaces with WirePlumber, for example `wpctl status` shows an ASCII representation of the nodes, sources, sinks, and routing. + +### WirePlumber + +WirePlumber creates links based on defaults and priorities as described in [Linking Policy](https://pipewire.pages.freedesktop.org/wireplumber/policies/linking.html). +For example, when an application starts audio playback, it links to the default sound output like the Bluetooth headset. +If that output disappears, it dynamically chooses the next suitable output device. + +### Configuration files and rules + +* [PipeWire docs: configuration overview](https://docs.pipewire.org/page_config.html) + +Both PipeWire and WirePlumber have a set of config files for configuring different parts. They use the same format. + +Rules in config file can define default outputs for specific nodes (e.g. VLC sound always goes to the 7.1 sound card). +[ArchLinux: WirePlumber](https://wiki.archlinux.org/title/WirePlumber) gives a short introduction to using them. + +**PipeWire server configuration** configures the PipeWire instance, defines which modules PipeWire should load, adds device rules, etc. + +* Location: `pipewire/pipewire.conf` +* Docs: [pipewire.conf](https://docs.pipewire.org/page_man_pipewire_conf_5.html) +* Configures: `context.exec`, `context.modules`, `context.properties`, `context.spa-libs`, `device.rules`, `node.rules` + +**PipeWire client configuration** contains configuration for PipeWire and ALSA clients, e.g. if VLC uses the PipeWire or ALSA backend, +its runtime behaviour can be modified with this configuration. +Example: A stream rule defines to always route `vlc` sound output to Bluetooth earbuds and `pw-play` to a stereo headset. + +* Location: `pipewire/client.conf`, for example `~/.config/pipewire/client.conf.d/` +* Docs: [client.conf](https://docs.pipewire.org/page_man_pipewire-client_conf_5.html) and [PipeWire object property reference](https://docs.pipewire.org/page_man_pipewire-props_7.html) (also contains WirePlumber related options!) +* Configures: `alsa.properties`, `alsa.rules`, `stream.properties`, `stream.rules` + +**PulseAudio/JACK configuration** contains configuration for PipeWire’s PulseAudio and JACK servers. + +* Docs: [pipewire-pulse.conf](https://docs.pipewire.org/page_man_pipewire-pulse_conf_5.html), [jack.conf](https://docs.pipewire.org/page_man_pipewire-jack_conf_5.html) + +**WirePlumber configuration** configures general WirePlumber aspects (should it even bring up ALSA devices +or save/restore user settings configured with e.g. `pavucontrol`) and also ALSA/Bluetooth monitor aspects +(choosing a default profile like Stereo or 7.1, setting device priorities that affect default routing, setting device properties, etc.). + +* Location: `wireplumber.conf`, e.g. `~/.config/wireplumber/wireplumber.conf.d/` + +* Docs: [WirePlumber daemon configuration](https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html) and more like [ALSA configuration](https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/alsa.html) +* Configures: `context`, `device`, `linking`, `wireplumber`, `monitor` (like `monitor.alsa.properties`, `monitor.alsa.rules`), `node` (like `node.software-dsp`),`support`, `policy` + + + +#### Writing Rules and Examples + +Rules can use regular expression when strings start with `~`, as explained in [PipeWire: Working with rules](https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/modifying_configuration.html#working-with-rules). + +```text +# Goes to ~/.config/wireplumber/wireplumber.conf.d/wireplumber-default-device.conf +# Restart wireplumber.service so it loads the rules +# This sample rule increases the priority of the stereo output on a Raspberry Pi, +# so it is used by default. +monitor.alsa.rules = [ + { + matches = [ + { + node.name = "alsa_output.platform-fe00b840.mailbox.stereo-fallback" + } + ] + actions = { + update-props = { + priority.driver = 3000 + priority.session = 3000 + } + } + } +] + +``` + +```text +# Goes to ~/.config/pipewire/client.conf.d/default-pw-play-output.conf +# Restart wireplumber.service so it loads the rules +# This sample rule uses a specific sound card for playback with pw-play. +# If it does not exist, WirePlumber takes the next suitable one. +stream.rules = [ + { + matches = [ + { + application.name = "pw-play" + } + ] + actions = { + update-props = { + target.object = "alsa_output.usb-PreSonus_Audio_AudioBox_USB-01.pro-output-0" + } + } + } +] + +``` + + + +### Debugging + +* Setting WirePlumber log level: https://pipewire.pages.freedesktop.org/wireplumber/daemon/logging.html +* `pw-play --target [ID|node.name] myfile.mp3` plays a sound file and tries to use the given target; useful for trying to find out the correct target +* [Automatically Link Pipewire Nodes with Wireplumber](https://bennett.dev/auto-link-pipewire-ports-wireplumber/) + + + +## PulseAudio API + +* [Migrating from PulseAudio to PipeWire](https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Migrate-PulseAudio) +* [PulseAudio clients and usage](https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio) for PipeWire + + Many PulseAudio tools also work for PipeWire, like: + +* `pavucontrol` (GUI to configure sound cards, select profiles, etc.) +* `pactl` (CLI configuration tool, e.g. for setting the default audio sink) +* `paplay` and `parecord` for playing and recording audio + diff --git a/doc/meson.build b/doc/meson.build index f4aa4ba6a..b2cf5a3de 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -50,6 +50,7 @@ extra_docs = [ 'tree.dox', 'dox/index.dox', 'dox/overview.dox', + 'dox/overview-for-users.md', 'dox/modules.dox', 'dox/pulse-modules.dox', 'dox/programs/index.md', diff --git a/doc/tree.dox b/doc/tree.dox index f62bc62dd..418e7dc7a 100644 --- a/doc/tree.dox +++ b/doc/tree.dox @@ -124,6 +124,7 @@ Support interfaces provided by host \} \page page_overview +\page page_overview_for_users \page page_config \page page_programs \page page_modules