pipewire/doc/pipewire-audio.dox

128 lines
4.1 KiB
Plaintext
Raw Normal View History

/** \page page_audio Audio
2021-07-23 10:06:53 +00:00
This document explains how Audio is implemented.
2022-05-08 17:06:28 +00:00
# Use Cases
2021-07-23 10:06:53 +00:00
2022-05-08 17:06:28 +00:00
## Audio Devices Are Made Available As Processing Nodes/Ports
2021-07-23 10:06:53 +00:00
Applications need to be able to see a port for each stream of an
2022-05-08 17:06:28 +00:00
audio device.
2021-07-23 10:06:53 +00:00
2022-05-08 17:06:28 +00:00
## Audio Devices Can Be Plugged and Unplugged
2021-07-23 10:06:53 +00:00
When devices are plugged and unplugged the associated nodes/ports
need to be created and removed.
2022-05-08 17:06:28 +00:00
## Audio Port In Canonical Format
2021-07-23 10:06:53 +00:00
It must be possible to make individual audio channels available
as a single mono stream with a fixed format and samplerate.
This makes it possible to link any of the audio ports together
without doing conversions.
2022-05-08 17:06:28 +00:00
## Applications Can Connect To Audio Devices
2021-07-23 10:06:53 +00:00
Applications can create ports that can connect to the audio ports
2021-07-23 10:06:53 +00:00
so that data can be provided to or consumed from them.
It should be possible to automatically connect an application to
a sink/source when it requests this.
2022-05-08 17:06:28 +00:00
## Default Audio Sink and Sources
2021-07-23 10:06:53 +00:00
It should be possible to mark a source or sink as the default source
and sink so that applications are routed to them by default.
It should be possible to change the default audio sink/source.
2022-05-08 17:06:28 +00:00
## Application Should Be Able To Move Between Sinks/Sources
2021-07-23 10:06:53 +00:00
It should be possible to move an application from one device to
another dynamically.
2022-05-08 17:06:28 +00:00
## Exclusive Access
2021-07-23 10:06:53 +00:00
Application should be able to connect to a device in exclusive mode.
This allows the application to negotiate a specific format with the
device such as a compressed format.
Exclusive access means that only one application can access the device
because mixing is in general not possible when negotiating
compressed formats.
# Design
## SPA
Audio devices are implemented with an \ref spa_device "SPA Device" object.
2021-07-23 10:06:53 +00:00
This object is then responsible for controlling the \ref spa_node "SPA Nodes" that
2021-07-23 10:06:53 +00:00
provide the audio ports to interface with the device.
2022-05-08 17:06:28 +00:00
The nodes operate on the native audio formats supported by the device.
This includes the sample rate as well as the number of channels and
2021-07-23 10:06:53 +00:00
the audio format.
## Audio Adapter
2022-05-08 17:06:28 +00:00
An SPA Node called the "adapter" is usually used with the SPA device node as
the internal node.
2021-07-23 10:06:53 +00:00
The function of the adapter is to convert the device native format to
the required external format. This can include format or samplerate
conversion but also channel remixing/remapping.
The audio adapter is also responsible for exposing the audio channels
2021-07-23 10:06:53 +00:00
as separate mono ports. This is called the DSP setup.
The audio adapter can also be configured in passthrough mode when it
will not do any conversions but simply pass through the port information
2022-05-08 17:06:28 +00:00
of the internal node. This can be used to implement exclusive access.
2021-07-23 10:06:53 +00:00
Setup of the different configurations of the adapter can be done with
the PortConfig parameter.
2022-05-08 17:06:28 +00:00
## The Session Manager
2021-07-23 10:06:53 +00:00
2022-05-08 17:06:28 +00:00
The session manager is responsible for creating nodes and ports for
2021-07-23 10:06:53 +00:00
the various audio devices. It will need to wrap them into an audio
adapter so that the specific configuration of the node can be
decided by the policy mode.
The session manager should create name and description for the
devices and nodes.
The session manager is responsible for assigning priorities to the
2022-05-08 17:06:28 +00:00
nodes. At least \ref PW_KEY_PRIORITY_SESSION and \ref PW_KEY_PRIORITY_DRIVER
2021-07-23 10:06:53 +00:00
need to be set.
The session manager might need to work with other services to gain
2022-05-08 17:06:28 +00:00
exclusive access to the device (eg. DBus).
2021-07-23 10:06:53 +00:00
# Implementation
2022-05-08 17:06:28 +00:00
## PipeWire Media Session (alsa-monitor)
2021-07-23 10:06:53 +00:00
PipeWire media session uses the \ref SPA_NAME_API_ALSA_ENUM_UDEV plugin
2021-07-23 10:06:53 +00:00
for enumerating the ALSA devices. For each device it does:
- Try to acquire the DBus device reservation object to gain exclusive
access to the device.
2022-05-08 17:06:28 +00:00
- Create an SPA device instance for the device and monitor this device instance.
- For each node created by the device, create an adapter with
2021-07-23 10:06:53 +00:00
an ALSA PCM node in the context of the PipeWire daemon.
The session manager will also create suitable names and descriptions
2022-05-08 17:06:28 +00:00
for the devices and nodes that it creates as well as assign session
2021-07-23 10:06:53 +00:00
and driver priorities.
The session manager has the option to add extra properties on the
2022-05-08 17:06:28 +00:00
devices and nodes that it creates to control their behavior. This
2021-07-23 10:06:53 +00:00
is implemented with match rules.
*/