pipewire-props
PipeWire object property reference.
- Provided by: pipewire-bin (Version: 1.6.2-1ubuntu1)
- Source: pipewire
- Report a bug
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 device properties are configured in the session manager configuration, see the session manager documentation. Application properties are configured in client.conf (for native PipeWire and ALSA applications), pipewire-pulse.conf (for Pulseaudio applications), and jack.conf (for JACK applications).
In minimal PipeWire setups without a session manager, the device properties can be configured via context.objects in pipewire.conf(5) when creating the devices.
Device configuration using WirePlumber (requires WirePlumber restart to apply). See WirePlumber configuration
# ~/.config/wireplumber/wireplumber.conf.d/custom-props.conf
monitor.alsa.properties = {
alsa.udev.expose-busy = true
}
monitor.alsa.rules = [
{
matches = [ { device.name = "~alsa_card.pci-.*" } ],
actions = { update-props = { api.alsa.soft-mixer = true } }
},
{
matches = [ { node.name = "alsa_output.pci-0000_03_00.1.hdmi-stereo-extra3" } ]
actions = { update-props = { node.description = "Main Audio" } }
}
]
monitor.alsa-midi.properties = {
api.alsa.seq.ump = true
}
monitor.bluez.properties = {
bluez5.hfphsp-backend = ofono
}
monitor.bluez.rules = [
{
matches = [ { device.name = "~bluez_card.*" } ],
actions = { update-props = { bluez5.dummy-avrcp player = true } }
}
]
Native client configuration (requires client application restart to apply). See pipewire-client.conf(5)
# ~/.config/pipewire/client.conf/custom-props.conf
stream.rules = [
{
matches = [ { application.name = "pw-play" } ]
actions = { update-props = { node.description = "Some pw-cat stream" } }
}
]
Pulseaudio client configuration (requires pipewire-pulse(1) restart to apply). See pipewire-pulse.conf(5)
# ~/.config/pipewire/pipewire-pulse.conf/custom-props.conf
stream.rules = [
{
matches = [ { application.name = "paplay" } ]
actions = { update-props = { node.description = "Some paplay stream" } }
}
]
JACK client configuration (requires client restart to apply). See pipewire-jack.conf(5)
# ~/.config/pipewire/jack.conf/custom-props.conf
jack.rules = [
{
matches = [ { client.name = "jack_delay" } ]
actions = { update-props = { node.description = "Some JACK node" } }
}
]
These are common properties for devices.
device.name # string
device.param.PARAM = { ... } # JSON
device.plugged # integer
As a uint64 in nanoseconds.
device.nick # string
device.description # string
Ex. "Foobar USB Headset"
device.serial # string
device.vendor.id # integer
device.vendor.name # string
device.product.id # integer
device.product.name # string
device.class # string
device.form-factor # string
One of "internal", "speaker", "handset", "tv", "webcam", "microphone", "headset", "headphone", "hands-free", "car", "hifi", "computer", "portable"
device.icon # string
A base64 blob containing PNG image data
device.icon-name # string
Ex. "sound-card-speakers-usb"
device.intended-roles # string
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 # string
node.nick # string
node.description # string
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
target.object = <node.name|object.serial>
node.target = <node.name|object.id>
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.dont-fallback = false
node.dont-move = false
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
session.suspend-timeout-seconds = 3 # float
state.restore-props = true
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
The quality of a resampler depends on multiple factors:
Increasing the quality will result in better cutoff and less aliasing at the expense of (much) more CPU consumption, latency and more ringing. The default quality of 4 has been selected as a good compromise between quality and performance with no artifact s that are well below the audible range.
The default resampler quality for the exp window results in a cutoff of 0.87 and a filter size of about 48 taps. It has a Stopband attenuation of about 150 dB.
See Infinite Wave for a comparison of the performance.
You can tune the resampler in a variaty of ways:
resample.disable = false
resample.window = exp
You can also specify a blackman or kaiser window, both with different tradeoffs. The kaiser window has some extra tunable parameters for the specific use cases.
resample.cutoff = 0.0
A higher cutoff value will preserve more high frequency content but depending on the size of the transition band will cause more aliasing.
The default quality 4 setting for all windows is 0.87.
resample.n-taps = 0
A higher number of taps will use more CPU, Latency and cause more ringing but will reduce aliasing.
The default quality setting for the exp window is 48.
resample.param.exp.A = 0.0
The default setting for the exp window is 16.97789.
resample.param.blackman.alpha = 0.0
The default quality setting for the blackman window is 0.16.
resample.param.kaiser.stopband-attenuation = 0.0
A higher value will filter out more of the unwanted frequencies and reduce aliasing at the expense of a larger transition band. A value of 96dB is below the dynamic range of CD quality audio. 150dB is the limit of the precision of the resampler.
The default quality setting for the kaiser window is 130.000000.
resample.param.kaiser.transition-bandwidth = 0.0
A smaller transition band will cause a steeper cutoff with less unwanted frequencies in the final signal at the expense of more a larger filter and more CPU usage and latency. A smaller transition band can also cause more ringing.
The default quality setting for the kaiser window is 0.177032
resample.param.kaiser.alpha = 0.0
This value is usually calculated from the other parameters but can be set explicitly with this property.
The default quality setting for the kaiser window is 4.254931.
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 = true # boolean
alsa.use-ucm # boolean
alsa.udev.expose-busy # boolean
api.alsa.path # string
api.alsa.use-ucm = true # boolean
This option does nothing if 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
api.acp.disable-pro-audio = false # boolean
api.acp.use-eld-channels = false # boolean
audio.channels # integer
audio.rate # integer
audio.format # string
audio.position # JSON array of strings
audio.layout # string
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.dll-bandwidth-max # double
api.alsa.auto-link = false # boolean
latency.internal.rate # integer
latency.internal.ns # integer
api.alsa.path # string
api.alsa.pcm.card # integer
api.alsa.open.ucm # boolean
api.alsa.bind-ctls # boolean
api.alsa.bind-ctl.NAME # boolean
iec958.codecs # JSON array of string
api.alsa.split.parent # boolean
api.alsa.split.position # JSON
api.alsa.split.hw-position # JSON
api.alsa.dsd-lsb = false # boolean
For ALSA MIDI in Wireplumber, MIDI bridge node properties are configured in the monitor properties.
api.alsa.seq.ump = true # boolean
api.alsa.seq.min-pool = 500 # integer
api.alsa.seq.max-pool = 2000 # integer
clock.name = "clock.system.monotonic" # string
api.alsa.path = "default" # string
api.alsa.disable-longname = true # boolean
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.hfphsp-backend-native-pts # boolean
bluez5.disable-dummy-call # boolean
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.hw-offload-datapath # integer
This feature configures the SCO hardware‑offload data path for HFP/HSP using the Bluetooth SIG–specified procedure. It is intended for advanced setups and vendor integrations. Do not edit this unless required; incorrect values can disable SCO offload.
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.bap-server-capabilities.sink.locations # JSON or integer
bluez5.bap-server-capabilities.sink.contexts # integer
bluez5.bap-server-capabilities.sink.supported-contexts # integer
bluez5.bap-server-capabilities.sink.delay-min # integer
bluez5.bap-server-capabilities.sink.delay-max # integer
bluez5.bap-server-capabilities.sink.preferred-delay-min # integer
bluez5.bap-server-capabilities.sink.preferred-delay-max # integer
bluez5.bap-server-capabilities.source.locations # JSON or integer
bluez5.bap-server-capabilities.source.contexts # integer
bluez5.bap-server-capabilities.source.supported-contexts # integer
bluez5.bap-server-capabilities.source.delay-min # integer
bluez5.bap-server-capabilities.source.delay-max # integer
bluez5.bap-server-capabilities.source.preferred-delay-min # integer
bluez5.bap-server-capabilities.source.preferred-delay-max # integer
bluez5.bap-server-tmap-features = null # array of string
bluez5.bap-server-gmap-features = null # array of string
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.bap.preset = "auto" # string
bluez5.bap.rtn # integer
bluez5.bap.latency # integer
bluez5.bap.delay = 40000 # integer
bluez5.framing = false # boolean
bluez5.bap.force-target-latency = "balanced" # string
bluez5.media-source-role # string
bluez5.decode-buffer.latency # integer
node.latency-offset-msec # string
bluez5.debug.iso-mono = false # boolean
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.alias # string
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 name. Ex: "Totem Music Player"
application.process.id # integer
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>