mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-02 09:01:50 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			176 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
/** \page page_daemon PipeWire Daemon
 | 
						||
 | 
						||
The PipeWire daemon is the central process that manages data exchange between
 | 
						||
devices and clients.
 | 
						||
 | 
						||
Typically general, users run one PipeWire daemon that listens for incoming
 | 
						||
connections and manages devices. Clients (including the \ref
 | 
						||
page_session_manager) are separate processes that talk to the daemon using the
 | 
						||
PipeWire socket (default: `$XDG_RUNTIME_DIR/pipewire-0`). This approach
 | 
						||
provides address-space separation between the privileged daemon and
 | 
						||
non-privileged clients.
 | 
						||
 | 
						||
\dot
 | 
						||
digraph pw {
 | 
						||
  compound=true;
 | 
						||
  node [shape="box"];
 | 
						||
 | 
						||
  subgraph cluster_pw {
 | 
						||
	rankdir="TB";
 | 
						||
	label="PipeWire daemon";
 | 
						||
	style="dashed";
 | 
						||
 | 
						||
	subgraph cluster_prot_native {
 | 
						||
		label="pipewire-module-protocol-native";
 | 
						||
		style="solid";
 | 
						||
		socket [label="$XDG_RUNTIME_DIR/pipewire-0"];
 | 
						||
		mod_impl [label="module implementation"];
 | 
						||
 | 
						||
		socket -> mod_impl;
 | 
						||
	}
 | 
						||
	core [label="PipeWire Core"];
 | 
						||
	alsa [label="PipeWire ALSA support"];
 | 
						||
 | 
						||
	mod_impl -> core;
 | 
						||
	core -> alsa;
 | 
						||
  }
 | 
						||
 | 
						||
  kernel
 | 
						||
 | 
						||
  client1 [ label="Media Player" ];
 | 
						||
  client2 [ label="Audio Software" ];
 | 
						||
  sm [ label="Session Manager", style="dotted" ];
 | 
						||
 | 
						||
  client1 -> socket;
 | 
						||
  client2 -> socket;
 | 
						||
  sm -> socket;
 | 
						||
  alsa -> kernel;
 | 
						||
}
 | 
						||
\enddot
 | 
						||
 | 
						||
As shown above, the protocol is handled by the \ref
 | 
						||
page_module_protocol_native. From PipeWire's point-of-view this module is just
 | 
						||
another module.
 | 
						||
 | 
						||
# Configuration Files
 | 
						||
 | 
						||
On startup, the daemon reads a configuration file to configure itself.
 | 
						||
It executes a series of commands listed in the config file. The lookup order
 | 
						||
for configuration files are:
 | 
						||
 | 
						||
- `$XDG_CONFIG_HOME/pipewire/pipewire.conf` (usually `$HOME/.config/pipewire/pipewire.conf`)
 | 
						||
- `$sysconfdir/pipewire/pipewire.conf` (usually `/etc/pipewire/pipewire.conf`)
 | 
						||
- `$datadir/pipewire/pipewire.conf` (usually `/usr/share/pipewire/pipewire.conf`)
 | 
						||
 | 
						||
The first configuration file found is loaded as the base configuration.
 | 
						||
 | 
						||
Next, configuration sections are collected in the directories in this
 | 
						||
order:
 | 
						||
 | 
						||
- `$datadir/pipewire/pipewire.conf.d/` (usually `/usr/share/pipewire/pipewire.conf.d/`)
 | 
						||
- `$sysconfdir/pipewire/pipewire.conf.d/` (usually `/etc/pipewire/pipewire.conf.d/`)
 | 
						||
- `$XDG_CONFIG_HOME/pipewire/pipewire.conf.d/` (usually `$HOME/.config/pipewire/pipewire.conf.d/`)
 | 
						||
 | 
						||
They are applied to the global configuration file. Properties are overwritten
 | 
						||
and array elements are appended. This makes it possible to make small custom customizations
 | 
						||
or additions to the main configuration file.
 | 
						||
 | 
						||
The environment variables `PIPEWIRE_CONFIG_DIR`, `PIPEWIRE_CONFIG_PREFIX`, 
 | 
						||
and `PIPEWIRE_CONFIG_NAME`. Can be used to specify an alternative configuration
 | 
						||
directory, subdirectory, and filename respectively.
 | 
						||
 | 
						||
## Configuration File Format
 | 
						||
 | 
						||
PipeWire's configuration file format is JSON. In addition to true JSON 
 | 
						||
PipeWire also understands a more compact JSON representation. Where
 | 
						||
`"` can be omitted around strings, no trailing commas are required and
 | 
						||
`:` or `=` can be used to separate object keys from their values.
 | 
						||
Also, `#` can be used to start a comment until the end of the line.
 | 
						||
 | 
						||
The configuration file format is grouped into sections.  A section is
 | 
						||
either a dictionary (`{}`) or an array (`[]`). Dictionary and array entries
 | 
						||
are separated by whitespace and may be simple value assignment, an array or
 | 
						||
a dictionary. For example:
 | 
						||
 | 
						||
```
 | 
						||
# A dictionary section
 | 
						||
context.properties = {
 | 
						||
       # Keys often have a dot notation
 | 
						||
       core.daemon = true
 | 
						||
}
 | 
						||
 | 
						||
# An array section containing three dictionary objects
 | 
						||
context.modules = [
 | 
						||
    # a dictionary object with one key assigned to a string
 | 
						||
    { name = libpipewire-module-protocol-native }
 | 
						||
    { name = libpipewire-module-profiler }
 | 
						||
 | 
						||
    # a dictionary object with two keys, one assigned to a string
 | 
						||
    # the other one to an array of strings
 | 
						||
    { name = libpipewire-module-portal
 | 
						||
      flags = [ ifexists nofail ]
 | 
						||
    }
 | 
						||
]
 | 
						||
```
 | 
						||
 | 
						||
Allowed configuration file sections are:
 | 
						||
 | 
						||
- **context.properties**  (dictionary):   These   properties  configure  the
 | 
						||
  pipewire instance.
 | 
						||
- **context.spa-libs** (dictionary): Maps plugin features with globs to a
 | 
						||
  spa library.
 | 
						||
- **context.modules** (array): Each entry in the array is a dictionary with
 | 
						||
  the name of the module to load, including optional args and flags. Most
 | 
						||
  modules support being loaded multiple times.
 | 
						||
- **context.objects** (array):  Each entry in the array is a dictionary con‐
 | 
						||
  taining the factory to create an object from and optional  extra  argu‐
 | 
						||
  ments specific to that factory.
 | 
						||
- **context.exec**  (array): Each entry in the array is dictionary containing
 | 
						||
  the path of a program to execute on startup and optional args. This ar‐
 | 
						||
  ray usually contains an entry to start the session manager.
 | 
						||
 | 
						||
 | 
						||
# Logging
 | 
						||
 | 
						||
The `PIPEWIRE_DEBUG` environment variable can be used to enable
 | 
						||
more debugging. This variable supports one of two formats:
 | 
						||
 | 
						||
- `PIPEWIRE_DEBUG=<level>` where `<level>` is either a numerical log level or its
 | 
						||
   respective key, see below.
 | 
						||
- `PIPEWIRE_DEBUG=<glob1>:<level1>,<glob2>:<level2>,...` where the globs are
 | 
						||
  shell globs to match on log topics and the levels are the respective
 | 
						||
  log level to set for that topic. Globs are applied in order and a matching
 | 
						||
  glob overrides an earlier glob for that category. For example,
 | 
						||
  `PIPEWIRE_DEBUG=*:E,mod.*:D,mod.foo:X` enables global error messages,
 | 
						||
  debugging on all modules but no messages on the foo module.
 | 
						||
- `<level>` specifies the log level:
 | 
						||
 | 
						||
  + `X` or `0`: No logging is enabled.
 | 
						||
  + `E` or `1`: Error logging is enabled.
 | 
						||
  + `W` or `2`: Warnings are enabled.
 | 
						||
  + `I` or `3`: Informational messages are enabled.
 | 
						||
  + `D` or `4`: Debug messages are enabled.
 | 
						||
  + `T` or `5`: Trace messages are enabled. These messages can be logged
 | 
						||
     	from the realtime threads.
 | 
						||
 | 
						||
PipeWire uses a `category.topic` naming scheme, with the following categories:
 | 
						||
 | 
						||
- `pw.*`: PipeWire internal topics.
 | 
						||
- `mod.*`: Module topics, for example `mod.foo` would usually refer to the
 | 
						||
  `foo` module.
 | 
						||
- `ms.*`: Media session topics.
 | 
						||
- `ms.mod.*`: Media session modules, for example `ms.foo` would usually refer
 | 
						||
   to the `media-session-foo` module.
 | 
						||
- `conn.*`: Connection specific topics such as printing raw messages sent over
 | 
						||
  a communication socket. These are in a separate namespace as they are
 | 
						||
  usually vastly more verbose than the normal debugging topics.
 | 
						||
  This namespace must be explicitly enabled with a `conn.<glob>` glob.
 | 
						||
 | 
						||
The behavior of the logging can be further controlled with the following
 | 
						||
environment variables:
 | 
						||
 | 
						||
- `PIPEWIRE_LOG_SYSTEMD=false`: Disable logging to the systemd journal.
 | 
						||
- `PIPEWIRE_LOG=<filename>`: Redirect the log to the given filename.
 | 
						||
- `PIPEWIRE_LOG_LINE=false`: Don't log filename, function, and source code line.
 | 
						||
 | 
						||
*/
 |