pipewire-props(7) | Miscellaneous Information Manual | pipewire-props(7) |
NAME¶
pipewire-props - PipeWire object property reference.
DESCRIPTION¶
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
COMMON DEVICE PROPERTIES¶
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
COMMON NODE PROPERTIES¶
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.
Identifying Properties¶
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
Classifying Properties¶
The classifying properties of a node are use for routing the signal to its destination and for configuring the settings.
media.type
media.category
- Playback: media playback.
- Capture: media capture.
- Duplex: media capture and playback or media processing in general.
- Monitor: a media monitor application. Does not actively change media data but monitors activity.
- Manager: Will manage the media graph.
media.role
- Movie: Movie playback with audio and video.
- Music: Music listening.
- Camera: Recording video from a camera.
- Screen: Recording or sharing the desktop screen.
- Communication: VOIP or other video chat application.
- Game: Game.
- Notification: System notification sounds.
- DSP: Audio or Video filters and effect processing.
- Production: Professional audio processing and production.
- Accessibility: Audio and Visual aid for accessibility.
- Test: Test program.
media.class
- Video/Source: a producer of video, like a webcam.
- Video/Sink: a consumer of video, like a display window.
- Audio/Source: a source of audio samples like a microphone.
- Audio/Sink: a sink for audio samples, like an audio card.
- Audio/Duplex: a node that is both a sink and a source.
- Stream/Output/Audio: a playback stream.
- Stream/Input/Audio: a capture stream.
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..
Scheduling Properties¶
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.
Session Manager Properties¶
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
Format Properties¶
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
Other Properties¶
node.param.PARAM = { ... } # JSON
node.disabled = false # boolean
AUDIO ADAPTER PROPERTIES¶
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.
Merger Parameters¶
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
Resampler Parameters¶
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:
- The hardware of a device node does not support the graph samplerate. Resampling will occur from the graph samplerate to the hardware samplerate.
- The hardware clock of a device does not run at the same speed as the graph clock and adaptive resampling is required to match the clocks.
- A stream does not have the same samplerate as the graph and needs to be resampled.
- An application wants to activate adaptive resampling in a stream to make it match some other clock.
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
Channel Mixer Parameters¶
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
- 1.
- none. No rear channels are produced.
- 2.
- simple. Front channels are copied to the rear. This is fast but can produce phasing effects.
- 3.
- psd. The rear channels as produced from the front left and right ambient sound (the difference between the channels). A delay and optional phase shift are added to the rear signal to make the sound bigger.
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:
- 1.
- none No dithering is done.
- 2.
- rectangular Dithering with a rectangular noise distribution. This adds random bits in the [-0.5, 0.5] range to the signal with even distribution.
- 3.
- triangular Dithering with a triangular noise distribution. This add random bits in the [-1.0, 1.0] range to the signal with triangular distribution around 0.0.
- 4.
- triangular-hf Dithering with a sloped triangular noise distribution.
- 5.
- wannamaker3 Additional noise shaping is performed on the sloped triangular dithering to move the noise to the more inaudible range. This is using the 'F-Weighted' noise filter described by Wannamaker.
- 6.
- shaped5 Additional noise shaping is performed on the triangular dithering to move the noise to the more inaudible range. This is using the Lipshitz filter.
Dithering is only useful for conversion to a format with less than 24 bits and will be disabled otherwise.
Debug Parameters¶
debug.wav-path = ''
Other Parameters¶
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 PROPERTIES¶
Monitor properties¶
alsa.use-acp # boolean
alsa.udev.expose-busy # boolean
Device properties¶
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.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
Node properties¶
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
BLUETOOTH PROPERTIES¶
Monitor properties¶
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:
- hsp_hs (HSP Headset),
- hsp_ag (HSP Audio Gateway),
- hfp_hf (HFP Hands-Free),
- hfp_ag (HFP Audio Gateway)
- a2dp_sink (A2DP Audio Sink)
- a2dp_source (A2DP Audio Source)
- bap_sink (LE Audio Basic Audio Profile Sink)
- bap_source (LE Audio Basic Audio Profile Source)
- bap_bcast_sink (LE Audio Basic Audio Profile Broadcast Sink)
- bap_bcast_source (LE Audio Basic Audio Profile Broadcast Source)
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,
"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 ] }
]
}
]
} ]
Device properties¶
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
- auto (Adaptive Bitrate, default)
- hq (High Quality, 990/909kbps)
- sq (Standard Quality, 660/606kbps)
- mq (Mobile use Quality, 330/303kbps)
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'
Node properties¶
bluez5.media-source-role # string
- playback: playing stream to speakers
- input: appear as source node.
PORT PROPERTIES¶
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¶
Link properties are usually not directly configurable via PipeWire configuration files, as they are determined by applications creating them.
See also
CLIENT PROPERTIES¶
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
RUNTIME SETTINGS¶
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.
ALSA CARD PROFILES¶
The sound card profiles ('Analog stereo', 'Analog stereo duplex', ...) except 'Pro Audio' come from two sources:
- UCM: ALSA Use Case Manager: the profile configuration system from ALSA. See https://github.com/alsa-project/alsa-ucm-conf/
- ACP ('Alsa Card Profiles'): Pulseaudio's profile system ported to PipeWire. See https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/
See the above links on how to configure these systems.
For ACP, PipeWire looks for the profile configuration files under
- ~/.config/alsa-card-profile
- /etc/alsa-card-profile
- /usr/share/alsa-card-profile/mixer`.
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.
OTHER OBJECT TYPES¶
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:
- Node
- Device
- Port
- Link
- Client
- Metadata
- Module
- Profiler
- SecurityContext
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.
INDEX¶
Monitor properties¶
- alsa.udev.expose-busy
- alsa.use-acp
- bluez5.a2dp.opus.pro.bidi.channels
- bluez5.a2dp.opus.pro.bidi.coupled-streams
- bluez5.a2dp.opus.pro.bidi.frame-dms
- bluez5.a2dp.opus.pro.bidi.locations
- bluez5.a2dp.opus.pro.bidi.max-bitrate
- bluez5.a2dp.opus.pro.channels
- bluez5.a2dp.opus.pro.coupled-streams
- bluez5.a2dp.opus.pro.frame-dms
- bluez5.a2dp.opus.pro.locations
- bluez5.a2dp.opus.pro.max-bitrate
- bluez5.bcast_source.config
- bluez5.codecs
- bluez5.default.channels
- bluez5.default.rate
- bluez5.dummy-avrcp
- bluez5.enable-hw-volume
- bluez5.enable-msbc
- bluez5.enable-sbc-xq
- bluez5.hfphsp-backend
- bluez5.hfphsp-backend-native-modem
- bluez5.hw-offload-sco
- bluez5.roles
Device properties¶
- api.acp.auto-port
- api.acp.auto-profile
- api.acp.pro-channels
- api.acp.probe-rate
- api.alsa.ignore-dB
- api.alsa.path
- api.alsa.soft-mixer
- api.alsa.use-ucm
- bluez5.a2dp.aac.bitratemode
- bluez5.a2dp.ldac.quality
- bluez5.a2dp.opus.pro.application
- bluez5.a2dp.opus.pro.bidi.application
- bluez5.auto-connect
- bluez5.bap.cig
- bluez5.hw-volume
- bluez5.profile
- device.class
- device.description
- device.disabled
- device.form-factor
- device.icon
- device.icon-name
- device.intended-roles
- device.name
- device.nick
- device.param.PARAM
- device.plugged
- device.product.id
- device.product.name
- device.profile
- device.profile-set
- device.serial
- device.vendor.id
- device.vendor.name
Node properties¶
- adapter.auto-port-config
- api.alsa.auto-link
- api.alsa.bind-ctls
- api.alsa.disable-batch
- api.alsa.disable-mmap
- api.alsa.disable-tsched
- api.alsa.headroom
- api.alsa.htimestamp
- api.alsa.htimestamp.max-errors
- api.alsa.multi-rate
- api.alsa.open.ucm
- api.alsa.path
- api.alsa.period-num
- api.alsa.period-size
- api.alsa.start-delay
- api.alsa.use-chmap
- audio.allowed-rates
- audio.channels
- audio.format
- audio.position
- audio.rate
- bluez5.media-source-role
- channelmix.disable
- channelmix.fc-cutoff
- channelmix.hilbert-taps
- channelmix.lfe-cutoff
- channelmix.lock-volumes
- channelmix.max-volume
- channelmix.min-volume
- channelmix.mix-lfe
- channelmix.normalize
- channelmix.rear-delay
- channelmix.stereo-widen
- channelmix.upmix
- channelmix.upmix-method
- clock.name
- clock.quantum-limit
- debug.wav-path
- device.id
- dither.method
- dither.noise
- iec958.codecs
- latency.internal.ns
- latency.internal.rate
- media.artist
- media.category
- media.class
- media.comment
- media.copyright
- media.date
- media.filename
- media.format
- media.icon
- media.icon-name
- media.language
- media.name
- media.role
- media.software
- media.title
- media.type
- monitor.channel-volumes
- node.always-process
- node.autoconnect
- node.description
- node.disabled
- node.dont-reconnect
- node.exclusive
- node.force-quantum
- node.force-rate
- node.latency
- node.link-group
- node.lock-quantum
- node.lock-rate
- node.loop.class
- node.loop.name
- node.name
- node.param.PARAM
- node.passive
- node.pause-on-idle
- node.rate
- node.suspend-on-idle
- node.target
- node.want-driver
- object.linger
- priority.driver
- priority.session
- resample.disable
- resample.peaks
- resample.prefill
- resample.quality
- stream.dont-remix
- target.object
Port properties¶
- port.alias
- port.name
Client properties¶
- application.name
- application.process.id
- pipewire.sec.pid
AUTHORS¶
The PipeWire Developers <https://gitlab.freedesktop.org/pipewire/pipewire/issues>; PipeWire is available from <https://pipewire.org>
SEE ALSO¶
1.2.7 | PipeWire |