| pipewire-props(7) | Miscellaneous Information Manual | pipewire-props(7) |
pipewire-props - PipeWire object property reference.
PipeWire describes and configures audio and video elements with objects of the following main types:
Node
Device
Monitor
Port
Link
Client
All objects have properties ('props'), most of which can be set in configuration files or at runtime when the object is created.
Some of the properties are 'common properties' (for example node.description) and can be set on all objects of the given type. Other properties control settings of a specific kinds of device or node (ALSA, Bluetooth, ...), and have meaning only for those objects.
Usually, all the properties are configured in the session manager configuration. For how to configure them, see the session manager documentation. In minimal PipeWire setups without a session manager, they can be configured via context.objects in pipewire.conf(5).
See also
These are common properties for devices.
device.name # string
device.param.PARAM = { ... } # JSON
device.plugged # integer
when the device was created.
As a uint64 in nanoseconds.
device.nick # string
a short device nickname
device.description # string
localized human readable device one-line description.
Ex. 'Foobar USB Headset'
device.serial # string
Serial number if applicable.
device.vendor.id # integer
vendor ID if applicable
device.vendor.name # string
vendor name if applicable
device.product.id # integer
product name if applicable
device.product.name # string
product ID if applicable
device.class # string
device class
device.form-factor # string
form factor if applicable.
One of 'internal', 'speaker', 'handset', 'tv', 'webcam', 'microphone', 'headset', 'headphone', 'hands-free', 'car', 'hifi', 'computer', 'portable'
device.icon # string
icon for the device.
A base64 blob containing PNG image data
device.icon-name # string
an XDG icon name for the device.
Ex. 'sound-card-speakers-usb'
device.intended-roles # string
intended use.
A space separated list of roles (see media.role) this device is particularly well suited for, due to latency, quality or form factor.
device.disabled = false # boolean
There are other common device.* properties for technical purposes and not usually user-configurable.
See also
The properties here apply to general audio or video input/output streams, and other nodes such as sinks or sources corresponding to real or virtual devices.
These contain properties to identify the node or to display the node in a GUI application.
node.name
node.description
media.name
media.title
media.artist
media.copyright
media.software
media.language
media.filename
media.icon
media.icon-name
media.comment
media.date
media.format
object.linger = false
device.id
The classifying properties of a node are use for routing the signal to its destination and for configuring the settings.
media.type
media.category
media.role
media.class
The session manager assigns special meaning to the nodes based on the media.class. Sink or Source classes are used as targets for Stream classes, etc..
node.latency = 1024/48000
node.lock-quantum = false
JACK clients use this property to avoid unexpected quantum changes.
node.force-quantum = INTEGER
A value of 0 unforces the quantum.
node.rate = RATE
node.lock-rate = false
node.force-rate = RATE
A RATE of 0 means to force the rate in node.rate denominator.
node.always-process = false
This is the default for JACK nodes, that always need their process callback called.
node.want-driver = true
node.pause-on-idle = false
node.suspend-on-idle = false
When the session manager does not suspend nodes (or when there is no session manager), the node.suspend-on-idle property can be used instead.
node.loop.name = null
node.loop.class = data.rt
Other well known names are main-loop.0 and the main node.loop.class which runs the node data processing in the main loop.
priority.driver # integer
Normally, the session manager assigns higher priority to sources so that they become the driver in the graph. The reason for this is that adaptive resampling should be done on the sinks rather than the source to avoid signal distortion when capturing audio.
clock.name # string
In Pro Audio mode, nodes from the same device are assumed to have the same clock and no resampling will happen when linked together. So, linking a capture port to a playback port will not use any adaptive resampling in Pro Audio mode.
In Non Pro Audio profile, no such assumption is made and adaptive resampling is done in all cases by default. This can also be disabled by setting the same clock.name on the nodes.
node.autoconnect = true
node.exclusive = false
node.target = <node.name|object.id>
target.object = <node.name|object.serial>
node.dont-reconnect = false
Note that if a stream should appear/disappear in sync with the target, a session manager (WirePlumber) script should be written instead.
node.passive = false
This is used for filter nodes that sit in front of sinks/sources and need to suspend together with the sink/source.
node.link-group = ID
stream.dont-remix = false
priority.session # integer
Streams and also most device nodes can be configured in a certain format with properties.
audio.rate = RATE
audio.channels = INTEGER
audio.format = FORMAT
Valid formats include: S16, S32, F32, F64, S16LE, S16BE, ...
audio.allowed-rates
node.param.PARAM = { ... } # JSON
node.disabled = false # boolean
Most audio nodes (ALSA, Bluetooth, audio streams from applications, ...) have common properties for the audio adapter. The adapter performs sample format, sample rate and channel mixing operations.
All properties listed below are node properties.
The merger is used as the input for a sink device node or a capture stream. It takes the various channels and merges them into a single stream for further processing.
The merger will also provide the monitor ports of the input channels and can apply a software volume on the monitor signal.
monitor.channel-volumes = false
Source, sinks, capture and playback streams contain a high quality adaptive resampler. It uses sinc based resampling with linear interpolation of filter banks to perform arbitrary resample factors. The resampler is activated in the following cases:
PipeWire performs most of the sample conversions and resampling in the client (Or in the case of the PulseAudio server, in the pipewire-pulse server that creates the streams). This ensures all the conversions are offloaded to the clients and the server can deal with one single format for performance reasons.
Below is an explanation of the options that can be tuned in the sample converter.
resample.quality = 4
Increasing the quality will result in better cutoff and less aliasing at the expense of (much) more CPU consumption. The default quality of 4 has been selected as a good compromise between quality and performance with no artifacts that are well below the audible range.
See Infinite Wave for a comparison of the performance.
resample.disable = false
Source, sinks, capture and playback streams can apply channel mixing on the incoming signal.
Normally the channel mixer is not used for devices, the device channels are usually exposed as they are. This policy is usually enforced by the session manager, so we refer to its documentation there.
Playback and capture streams are usually configured to the channel layout of the sink/source they connect to and will thus perform channel mixing.
The channel mixer also implements a software volume. This volume adjustment is performed on the original channel layout. ex: A stereo playback stream that is up-mixed to 5.1 has 2 a left an right volume control.
channelmix.disable = false
channelmix.min-volume = 0.0
channelmix.max-volume = 10.0
channelmix.normalize = false
While this options prevents clipping, it can in some cases produce too low volume. Increase the volume in that case or disable normalization.
channelmix.lock-volumes = false
channelmix.mix-lfe = true
channelmix.upmix = true
Also enabled up-mixing of LFE when channelmix.lfe-cutoff is set to something else than 0 and the target has an LFE channel. The LFE channel is produced by adding the stereo channels.
If channelmix.upmix is true, the up-mixing of the rear channels is also enabled and controlled with the channelmix-upmix-method property.
channelmix.upmix-method = psd
channelmix.lfe-cutoff = 150
channelmix.fc-cutoff = 12000
Since the front center contains the dialogs, a typical cutoff frequency is 12000 Hz.
This option is only active when the up-mix is enabled.
channelmix.rear-delay = 12.0
This is only active when the psd up-mix method is used.
channelmix.stereo-widen = 0.0
This is only active when up-mix is enabled and a Front Center channel is mixed.
channelmix.hilbert-taps = 0
This is only active when the psd up-mix method is used.
dither.noise = 0
This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is usually enough, otherwise the noise will become audible. This is usually used together with session.suspend-timeout-seconds to disable suspend in the session manager.
Note that PipeWire uses floating point operations with 24 bits precission for all of the audio processing. Conversion to 24 bits integer sample formats is lossless and conversion to 32 bits integer sample formats are simply padded with 0 bits at the end. This means that the dither noise is always only in the 24 most significant bits.
dither.method = none
There are 6 modes available:
Dithering is only useful for conversion to a format with less than 24 bits and will be disabled otherwise.
debug.wav-path = ''
These control low-level technical features:
clock.quantum-limit
resample.peaks = false # boolean
resample.prefill = false # boolean
adapter.auto-port-config = null # JSON
Value is SPA JSON of the form:
{
mode = "none", # "none", "passthrough", "convert", "dsp"
monitor = false, # boolean
control = false, # boolean
position = "preserve" # "unknown", "aux", "preserve"
}
See spa_param_port_config for the meaning.
alsa.use-acp # boolean
alsa.udev.expose-busy # boolean
api.alsa.path # string
api.alsa.use-ucm = true # boolean
This option does nothing if api.alsa.use-acp is set to false.
api.alsa.soft-mixer = false # boolean
api.alsa.disable-mixer-path = false # boolean
api.alsa.ignore-dB = false # boolean
device.profile-set # string
device.profile # string
api.acp.auto-profile = true # boolean
api.acp.auto-port = true # boolean
api.acp.probe-rate # integer
api.acp.pro-channels # integer
api.alsa.split-enable # boolean
For UCM devices with split PCMs, don't split to multiple PCMs using alsa-lib plugins, but instead add api.alsa.split properties to emitted nodes with PCM splitting information.
audio.channels # integer
audio.rate # integer
audio.format # string
audio.position # JSON array of strings
audio.allowed-rates # JSON array of integers
Only rates from the array will be used to open the device. When the graph is running with a rate not listed in the allowed-rates, the resampler will be used to resample to the nearest allowed rate.
api.alsa.period-size # integer
api.alsa.period-num # integer
api.alsa.headroom # integer
api.alsa.start-delay = 0 # integer
api.alsa.disable-mmap = false # boolean
api.alsa.disable-batch # boolean
api.alsa.use-chmap # boolean
api.alsa.multi-rate # boolean
api.alsa.htimestamp = false # boolean
api.alsa.htimestamp.max-errors # integer
api.alsa.disable-tsched = false # boolean
api.alsa.auto-link = false # boolean
latency.internal.rate # integer
latency.internal.ns # integer
api.alsa.path # string
api.alsa.open.ucm # boolean
api.alsa.bind-ctls # boolean
iec958.codecs # JSON array of string
api.alsa.split.parent # boolean
PCM is UCM SplitPCM parent PCM, to be opened with SplitPCM set.
api.alsa.split.position # JSON
(SPA JSON list) If present, this is a virtual device corresponding to a subset of channels in an underlying PCM, listed in this property. Informative property.
api.alsa.split.hw-position # JSON
(SPA JSON list) Channel map of the underlying split PCM. Informative property.
The following are settings for the Bluetooth device monitor, not device or node properties:
bluez5.roles = [ a2dp_sink a2dp_source bap_sink bap_source bap_bcast_sink bap_bcast_source hfp_hf hfp_ag ] # JSON array of string
Currently some headsets (Sony WH-1000XM3) are not working with both hsp_ag and hfp_ag enabled, so by default we enable only HFP.
Supported roles:
bluez5.codecs # JSON array of string
bluez5.default.rate # integer
bluez5.default.channels # integer
bluez5.hfphsp-backend # integer
bluez5.hfphsp-backend-native-modem # string
bluez5.dummy-avrcp player # boolean
bluez5.enable-sbc-xq # boolean
bluez5.enable-msbc # boolean
bluez5.enable-hw-volume # boolean
bluez5.hw-offload-sco # boolean
This feature requires a custom configuration that routes SCO audio to ALSA nodes, in a platform-specific way. See tests/examples/bt-pinephone.lua in WirePlumber for an example. Do not enable this setting if you don't know what all this means, as it won't work.
bluez5.a2dp.opus.pro.channels = 3 # integer
bluez5.a2dp.opus.pro.coupled-streams = 1 # integer
bluez5.a2dp.opus.pro.locations = 'FL,FR,LFE' # string
bluez5.a2dp.opus.pro.max-bitrate = 600000 # integer
bluez5.a2dp.opus.pro.frame-dms = 50 # integer
bluez5.a2dp.opus.pro.bidi.channels = 1 # integer
bluez5.a2dp.opus.pro.bidi.coupled-streams = 0 # integer
bluez5.a2dp.opus.pro.bidi.locations = 'FC' # string
bluez5.a2dp.opus.pro.bidi.max-bitrate = 160000 # integer
bluez5.a2dp.opus.pro.bidi.frame-dms = 400 # integer
bluez5.bcast_source.config = [] # JSON
bluez5.bcast_source.config = [
{
"broadcast_code": "Børne House",
"encryption: false,
"sync_factor": 2,
"bis": [
{ # BIS configuration
"qos_preset": "16_2_1", # QOS preset name from table Table 6.4 from BAP_v1.0.1.
"audio_channel_allocation": 1, # audio channel allocation configuration for the BIS
"metadata": [ # metadata configurations for the BIS
{ "type": 1, "value": [ 1, 1 ] }
]
}
]
} ]
bluez5.bap-server-capabilities.rates # Array of integers
bluez5.bap-server-capabilities.durations # Array of doubles
bluez5.bap-server-capabilities.channels # Array of integers
bluez5.bap-server-capabilities.framelen_min # integer
bluez5.bap-server-capabilities.framelen_max # integer
bluez5.bap-server-capabilities.max_frames # integer
bluez5.auto-connect # boolean
bluez5.hw-volume = [ hfp_ag hsp_ag a2dp_source ] # JSON array of string
bluez5.profile # string
bluez5.a2dp.ldac.quality = 'auto' # string
bluez5.a2dp.aac.bitratemode = 0 # integer
bluez5.a2dp.opus.pro.application = 'audio' # string
bluez5.a2dp.opus.pro.bidi.application = 'audio' # string
bluez5.bap.cig = 'auto' # integer, or 'auto'
bluez5.media-source-role # string
Port properties are usually not directly configurable via PipeWire configuration files, as they are determined by applications creating them. Below are some port properties may interesting for users:
port.name # string
port name
port.alias # string
port alias
See also
Link properties are usually not directly configurable via PipeWire configuration files, as they are determined by applications creating them.
See also
Client properties are usually not directly configurable via PipeWire configuration files, as they are determined by the application connecting to PipeWire. Clients are however affected by the settings in pipewire.conf(5) and session manager settings.
Note
Below are some client properties may interesting for users.
application.name # string
application keys
application name. Ex: 'Totem Music Player'
application.process.id # integer
process id (pid)
pipewire.sec.pid # integer
Note that for PulseAudio applications, this is the PID of the pipewire-pulse process.
See also
Objects such as devices and nodes also have parameters that can be modified after the object has been created. For example, the active device profile, channel volumes, and so on.
For some objects, the parameters also allow changing some of the properties. The settings of most ALSA and virtual device parameters can be configured also at runtime.
These settings are available in device parameter called Props in its params field. They can be seen e.g. using pw-dump <id> for an ALSA device:
{
...
"Props": [
{
...
"params": [
"audio.channels",
2,
"audio.rate",
0,
"audio.format",
"UNKNOWN",
"audio.position",
"[ FL, FR ]",
"audio.allowed-rates",
"[ ]",
"api.alsa.period-size",
0,
"api.alsa.period-num",
0,
"api.alsa.headroom",
0,
"api.alsa.start-delay",
0,
"api.alsa.disable-mmap",
false,
"api.alsa.disable-batch",
false,
"api.alsa.use-chmap",
false,
"api.alsa.multi-rate",
true,
"latency.internal.rate",
0,
"latency.internal.ns",
0,
"clock.name",
"api.alsa.c-1"
]
}
...
They generally have the same names and meaning as the corresponding properties.
One or more params can be changed using pw-cli(1):
pw-cli s <id> Props '{ params = [ "api.alsa.headroom" 1024 ] }'
These settings are not saved and need to be reapplied for each session
manager restart.
The sound card profiles ('Analog stereo', 'Analog stereo duplex', ...) except 'Pro Audio' come from two sources:
See the above links on how to configure these systems.
For ACP, PipeWire looks for the profile configuration files under
The path and profile-set files are in subdirectories paths and profile-sets of these directories. It is possible to override individual files locally by putting a modified copy into the ACP directories under ~/.config or /etc.
Technically, PipeWire objects is what are manipulated by applications using the PipeWire API.
The list of object types that are usually 'exported' (i.e. appear in pw-dump(1) output) is larger than considered above:
Monitors do not appear in this list; they are not usually exported, and technically also Device objects. They are considered above as a separate object type because they have configurable properties.
Metadata objects are what is manipulated with pw-metadata(1)
Modules can be loaded in configuration files, or by PipeWire applications.
The Profiler and SecurityContext objects only provide corresponding PipeWire APIs.
The PipeWire Developers <https://gitlab.freedesktop.org/pipewire/pipewire/issues>; PipeWire is available from <https://pipewire.org>
| 1.4.2 | PipeWire |