From 843082e4e594e44fcfa60e995ebe6e9429259fab Mon Sep 17 00:00:00 2001 From: "Simon A. Eugster" Date: Sun, 5 Apr 2026 16:54:46 +0200 Subject: [PATCH 1/3] 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 From 3454e2d46543339326adff5aca1220a2d4116197 Mon Sep 17 00:00:00 2001 From: "Simon A. Eugster" Date: Tue, 7 Apr 2026 22:18:56 +0200 Subject: [PATCH 2/3] docs: Explain PipeWire role, add graphics --- doc/dox/media/LinuxSoundStack.drawio.svg | 4 ++ doc/dox/media/SoundMixing.drawio.svg | 4 ++ doc/dox/media/SoundStack.svg | 65 ++++++++++++++++++ ...ewire-object-types-relationship.drawio.png | Bin 32680 -> 0 bytes ...ewire-object-types-relationship.drawio.svg | 4 ++ doc/dox/overview-for-users.md | 4 +- doc/dox/overview.dox | 39 ++++++++++- 7 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 doc/dox/media/LinuxSoundStack.drawio.svg create mode 100644 doc/dox/media/SoundMixing.drawio.svg create mode 100644 doc/dox/media/SoundStack.svg delete mode 100644 doc/dox/media/pipewire-object-types-relationship.drawio.png create mode 100644 doc/dox/media/pipewire-object-types-relationship.drawio.svg diff --git a/doc/dox/media/LinuxSoundStack.drawio.svg b/doc/dox/media/LinuxSoundStack.drawio.svg new file mode 100644 index 000000000..0ace8cfbc --- /dev/null +++ b/doc/dox/media/LinuxSoundStack.drawio.svg @@ -0,0 +1,4 @@ + + + +
ALSA
ALSA
PulseAudio
or JACK
PulseAudio...
ALSA API
ALSA API
JACK API
JACK API
PulseAudio API
PulseAudio API
PipeWire
PipeWire
Linux Kernel
Linux Kern...
Application
Application
ALSA
ALSA
Application
Application
Application
Application
ALSA
ALSA
Linux Kernel
Linux Kern...
ALSA
ALSA
Linux Kernel
Linux Kern...
Application
Application
PulseAudio or Jack backend
PulseAudio or Jack backend
PipeWire
PipeWire
Application
Application
Application
Application
Application
Application
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/media/SoundMixing.drawio.svg b/doc/dox/media/SoundMixing.drawio.svg new file mode 100644 index 000000000..05d0c16ff --- /dev/null +++ b/doc/dox/media/SoundMixing.drawio.svg @@ -0,0 +1,4 @@ + + + +
Firefox
Firefox
Audacity
Audacity
VLC
VLC
Mixer
Mixer
Mixer
Mixer
L
L
R
R
L
L
R
R
L
L
R
R
L
L
R
R
L
L
R
R
L
L
R
R
L
L
R
R
ALSA
ALSA
PipeWire
PipeWire
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/media/SoundStack.svg b/doc/dox/media/SoundStack.svg new file mode 100644 index 000000000..517451bbd --- /dev/null +++ b/doc/dox/media/SoundStack.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + diff --git a/doc/dox/media/pipewire-object-types-relationship.drawio.png b/doc/dox/media/pipewire-object-types-relationship.drawio.png deleted file mode 100644 index adf7e95a8ce045a05144bc9e6762e4b35c226eb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32680 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�*%Gklv7uQytur1 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 diff --git a/doc/dox/media/pipewire-object-types-relationship.drawio.svg b/doc/dox/media/pipewire-object-types-relationship.drawio.svg new file mode 100644 index 000000000..4d7752f74 --- /dev/null +++ b/doc/dox/media/pipewire-object-types-relationship.drawio.svg @@ -0,0 +1,4 @@ + + + +
Input + output node
Input + output node
Input + output port
Input + output port
PipeWire:Interface:Link
PipeWire:Interface:Link
target.object
target.object
target.object
target.object
PipeWire:Interface:Node
PipeWire:Interface:Node
PipeWire:Interface:Port
PipeWire:Interface:Port
PipeWire:Interface:Client
PipeWire:Interface:Client
PipeWire:Interface:Device
PipeWire:Interface:Device
PipeWire:Interface:Module
PipeWire:Interface:Module
PipeWire:Interface:Profiler
PipeWire:Interface:Profil...
PipeWire:Interface:Metadata
PipeWire:Interface:Metada...
PipeWire:Interface:SecurityContext
PipeWire:Interface:SecurityContext
PipeWire:Interface:Core
PipeWire:Interface:Core
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/overview-for-users.md b/doc/dox/overview-for-users.md index 31893225a..281bd8cfb 100644 --- a/doc/dox/overview-for-users.md +++ b/doc/dox/overview-for-users.md @@ -24,7 +24,7 @@ they just use the PulseAudio API provided by PipeWire. Therefore, PulseAudio too ## PipeWire overview -Normally, a system with PipeWire also runs WirePlumber. +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. @@ -60,7 +60,7 @@ Some specific properties: Relationships between different object types (`type` property): -![Object type relationship](pipewire-object-types-relationship.drawio.png) +![Object type relationship](pipewire-object-types-relationship.drawio.svg) ```mermaid flowchart LR diff --git a/doc/dox/overview.dox b/doc/dox/overview.dox index 9e2530163..294c05660 100644 --- a/doc/dox/overview.dox +++ b/doc/dox/overview.dox @@ -1,5 +1,38 @@ /** \page page_overview Overview +# The role of PipeWire + +Today’s Linux systems use ALSA (Advanced Linux Sound Architecture) to play and record sound and video. +ALSA is built directly into the Linux Kernel including drivers for sound cards, and applications can use ALSA to play sound. +However, each sound card can only be used by one application at a time – which is one reason why another layer like PipeWire is required: +It mixes multiple audio streams together and sends that to ALSA directly. + +\image html SoundMixing.drawio.svg + +There are a number of popular sound servers for Linux like JACK for low latency or PulseAudio. +PipeWire is the newest one, combining the advantages of its predecessors. + +Applications are programmed to support a certain backend, or sometimes they support more than one. +PipeWire provides API interfaces that look like e.g. ALSA or PulseAudio, so an application only supporting PulseAudio actually works with PipeWire because it looks like PulseAudio to the application. +Therefore, tools like `pavucontrol` *also* work for PipeWire! + +\image html LinuxSoundStack.drawio.svg + +# What do I need? + +Normally, a system with PipeWire also runs **WirePlumber.** + +While **PipeWire** *provides* the functionality for transporting and transforming audio and video, it does not actively react to events like connecting Bluetooth earbuds. +This is the task of the session manager which *uses* PipeWire. + +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. + # Concepts ## The PipeWire Server @@ -48,9 +81,9 @@ A recommended pattern that is often used is a single client be a daemon that dea It provides another, higher-level API compared to the PipeWire one, and runs Lua scripts that implement the management logic using the said API. It ships with default scripts and configuration that handle linking policies as well as monitoring and automatic spawning of ALSA, bluez, libcamera and v4l2 devices. The API is available for any process, not only from WirePlumber’s Lua scripts. - -### Node implementation - + +### Node implementation + With the nodes which they implement, clients can send multimedia data into the graph or obtain multimedia data from the graph. A client can create multiple PipeWire nodes. That allows one to create more complex applications; From 671cd08ed382c3a93d8a0fdb69fec3d7f21f0965 Mon Sep 17 00:00:00 2001 From: "Simon A. Eugster" Date: Thu, 16 Apr 2026 22:19:19 +0200 Subject: [PATCH 3/3] docs: Add routing examples --- doc/dox/media/Routing-Direct.drawio.svg | 4 ++ doc/dox/media/Routing-FilterChain.drawio.svg | 4 ++ .../Routing-FilterChainDouble.drawio.svg | 4 ++ doc/dox/media/Routing-Remap.drawio.svg | 4 ++ doc/dox/overview.dox | 59 ++++++++++++++++++- 5 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 doc/dox/media/Routing-Direct.drawio.svg create mode 100644 doc/dox/media/Routing-FilterChain.drawio.svg create mode 100644 doc/dox/media/Routing-FilterChainDouble.drawio.svg create mode 100644 doc/dox/media/Routing-Remap.drawio.svg diff --git a/doc/dox/media/Routing-Direct.drawio.svg b/doc/dox/media/Routing-Direct.drawio.svg new file mode 100644 index 000000000..365c0d1cc --- /dev/null +++ b/doc/dox/media/Routing-Direct.drawio.svg @@ -0,0 +1,4 @@ + + + +
VLC
VLC
Stereo
Headset
Stereo...
L
L
R
R
L
L
R
R
L
L
R
R
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/media/Routing-FilterChain.drawio.svg b/doc/dox/media/Routing-FilterChain.drawio.svg new file mode 100644 index 000000000..fc966249e --- /dev/null +++ b/doc/dox/media/Routing-FilterChain.drawio.svg @@ -0,0 +1,4 @@ + + + +
VLC
VLC
Filter Chain
EQ
Filter Chai...
L
L
R
R
L
L
R
R
Stereo
Headset
Stereo...
L
L
R
R
L
L
R
R
R
R
L
L
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/media/Routing-FilterChainDouble.drawio.svg b/doc/dox/media/Routing-FilterChainDouble.drawio.svg new file mode 100644 index 000000000..3e5b68934 --- /dev/null +++ b/doc/dox/media/Routing-FilterChainDouble.drawio.svg @@ -0,0 +1,4 @@ + + + +
VLC
VLC
Filter Chain
EQ 1
Filter Chai...
L
L
R
R
L
L
Filter Chain Reverb
Filter Chain Rev...
L
L
R
R
L
L
R
R
L
L
Filter Chain
EQ 1
Filter Chai...
R
R
R
R
Stereo
Headset
Stereo...
L
L
R
R
L
L
R
R
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/media/Routing-Remap.drawio.svg b/doc/dox/media/Routing-Remap.drawio.svg new file mode 100644 index 000000000..5020723bd --- /dev/null +++ b/doc/dox/media/Routing-Remap.drawio.svg @@ -0,0 +1,4 @@ + + + +
VLC
VLC
Virtual
5.1 Interface
Virtual...
8-Channel
Audio Interface
8-Channel...
L
L
R
R
FC
FC
FL
FL
FR
FR
LFE
LFE
RL
RL
RL
RL
FC
FC
FL
FL
FR
FR
LFE
LFE
RL
RL
RL
RL
FC
FC
FL
FL
FR
FR
LFE
LFE
RL
RL
RL
RL
AUX0
AUX0
AUX1
AUX1
AUX2
AUX2
AUX3
AUX3
AUX4
AUX4
AUX5
AUX5
AUX6
AUX6
AUX7
AUX7
Virtual
Stereo Interface
Virtual...
L
L
R
R
Text is not SVG - cannot display
\ No newline at end of file diff --git a/doc/dox/overview.dox b/doc/dox/overview.dox index 294c05660..24ed4aaa5 100644 --- a/doc/dox/overview.dox +++ b/doc/dox/overview.dox @@ -6,18 +6,73 @@ Today’s Linux systems use ALSA (Advanced Linux Sound Architecture) to play and ALSA is built directly into the Linux Kernel including drivers for sound cards, and applications can use ALSA to play sound. However, each sound card can only be used by one application at a time – which is one reason why another layer like PipeWire is required: It mixes multiple audio streams together and sends that to ALSA directly. +In addition, PipeWire also supports video and MIDI streams. \image html SoundMixing.drawio.svg +# Strengths of PipeWire + +PipeWire has 3 core strengths that make it so popular today: + +- Backwards compatibility with older sound servers – your favourite application just runs +- Low latency audio processing – important for audio professionals +- Powerful routing – define where streams go + +## Compatibility + There are a number of popular sound servers for Linux like JACK for low latency or PulseAudio. PipeWire is the newest one, combining the advantages of its predecessors. Applications are programmed to support a certain backend, or sometimes they support more than one. -PipeWire provides API interfaces that look like e.g. ALSA or PulseAudio, so an application only supporting PulseAudio actually works with PipeWire because it looks like PulseAudio to the application. -Therefore, tools like `pavucontrol` *also* work for PipeWire! +Even if they do not support PipeWire, they still work with PipeWire because it provides interfaces +that look like e.g. ALSA or PulseAudio. +Even configuration tools like `pavucontrol`, which configures audio devices like volume, profile (Stereo or 7.1 etc.), and so on, work for PipeWire! \image html LinuxSoundStack.drawio.svg +## Routing + +Routing choices are made whenever you play back audio. +(Same for recording and video/MIDI, but for simplicity we will focus on audio for now.) + +When you play back an mp3 file with `vlc`, does it play on your laptop speakers or on your HDMI screen? +What happens when you plug in your USB headphones, or connect your wireless earbuds? +Every time a decision needs to be made where the audio stream goes after it leaves `vlc`. +This is called *routing,* and it works a bit like connecting parts with cables, for example `vlc` and the earbuds. + +PipeWire can do that, but it can do much more. + +- Equalise audio before sending it to the speaker? The \ref page_module_filter_chain "Filter Chain" module + does this – or you can use it to run any LADSPA/ffmpeg/… filter live over your audio stream. +- Play back on a different PC? Route audio to the \ref page_module_pulse_tunnel "Pulse Tunnel" module. +- Pretend your 6-channel audio interface is 3 different stereo sound cards, or your 10-channel interface + is a 7.1 Surround interface? The \ref page_module_loopback "Loopback" module does that. +- Cancel an echo in a video call? Use the \ref page_module_echo_cancel "Echo Cancel" module. + +### Routing Examples + +To illustrate routing, let’s start with a simple setup: +VLC plays sound directly on the Jack output of your device. + +\image html Routing-Direct.drawio.svg + +Now we can place an equaliser in-between to lift some frequencies. + +\image html Routing-FilterChain.drawio.svg + +Actually, let’s lift the frequencies of the left speaker differently, +and then add a reverb filter from LADSPA. + +\image html Routing-FilterChainDouble.drawio.svg + +Or, we want to use the first 6 channels of an 8-channel interface as 5.1 +and the remaining two channels as stereo output. + +\image html Routing-Remap.drawio.svg + +Most of these settings need configuration files, there is no GUI yet. +To unlock the full power of PipeWire, you will have to dive into the deeper areas of Lake Audio! + # What do I need? Normally, a system with PipeWire also runs **WirePlumber.**