pipewire-props(7)
π
pipewire-props(7) π
Miscellaneous Information Manual
β¨ NAME β¨
pipewire-props β PipeWire object property reference. π
πΈ DESCRIPTION πΈ
okay so PipeWire describes and configures audio and video elements with objects of these main types:
- Node β Audio or video sink/source endpoint
- Device β Sound cards, bluetooth devices, cameras, etc. May have multiple nodes.
- Monitor β Finding devices and handling hotplugging
- Port β Audio/video endpoint in a node
- Link β Connection between ports, that transporting audio/video between them.
- Client β Application connected to PipeWire.
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.
π οΈ CUSTOMIZING PROPERTIES π οΈ
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.
π Examples π
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" } }
}
]
π§ COMMON DEVICE PROPERTIES π§
These are common properties for devices.
device.name# string β A (unique) name for the device. It can be used by command-line and other tools to identify the device.device.param.PARAM = { ... }# JSON β Set value of a device Param to a JSON value when the device is loaded. This works similarly aspw-cli(1)set-paramcommand. ThePARAMshould be replaced with the name of the Param to set, ie. for exampledevice.Param.Props = { ... }to set Props.device.plugged# integer β when the device was created. As auint64in nanoseconds.device.nick# string β a short device nicknamedevice.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 applicabledevice.vendor.name# string β vendor name if applicabledevice.product.id# integer β product ID if applicabledevice.product.name# string β product name if applicabledevice.class# string β device classdevice.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 datadevice.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 (seemedia.role) this device is particularly well suited for, due to latency, quality or form factor.device.disabled = false# boolean β Disable the creation of this device in session manager.
There are other common device.* properties for technical purposes and not usually user-configurable.
See also
Key Names in the API documentation for a full list.
π¦ 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# string β A (unique) name for the node. This is usually set on sink and sources to identify them as targets for linking by the session manager.node.nick# string β A short name for the node.node.description# string β A human readable description of the node or stream.media.nameβ A user readable media name, usually the artist and title. These are usually shown in user facing applications to inform the user about the current playing media.media.titleβ A user readable stream title.media.artistβ A user readable stream artistmedia.copyrightβ User readable stream copyright informationmedia.softwareβ User readable stream generator software informationmedia.languageβ Stream language in POSIX format. Ex:en_GBmedia.filenameβ File name for the streammedia.iconβ Icon for the media, a base64 blob with PNG image datamedia.icon-nameβ An XDG icon name for the media. Ex:audio-x-mp3media.commentβ Extra stream commentmedia.dateβ Date of the mediamedia.formatβ User readable stream format informationobject.linger = falseβ If the object should outlive its creator.device.idβ ID of the device the node belongs to.
π Classifying Properties π
The classifying properties of a node are use for routing the signal to its destination and for configuring the settings.
media.typeβ The media type contains a broad category of the media that is being processed by the node. Possible values include"Audio","Video","Midi"media.categoryβ What kind of processing is done with the media. Possible values include:- 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β The Use case of the media. Possible values include:- 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β The media class is to classify the stream function. Possible values include:- 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β Sets a suggested latency on the node as a fraction. This is just a suggestion, the graph will try to configure this latency or less for the graph. It is however possible that the graph is forced to a higher latency.node.lock-quantum = falseβ When this node is active, the quantum of the graph is locked and not allowed to change automatically. It can still be changed forcibly with metadata or when a node forces a quantum. JACK clients use this property to avoid unexpected quantum changes.node.force-quantum = INTEGERβ While the node is active, force a quantum in the graph. The last node to be activated with this property wins. A value of0unforces the quantum.node.rate = RATEβ Suggest a rate (samplerate) for the graph. The suggested rate will only be applied when doing so would not cause interruptions (devices are idle) and when the rate is in the list of allowed rates in the server.node.lock-rate = falseβ When the node is active, the rate of the graph will not change automatically. It is still possible to force a rate change with metadata or with a node property.node.force-rate = RATEβ When the node is active, force a specific sample rate on the graph. The last node to activate with this property wins. ARATEof0means to force the rate innode.ratedenominator.node.always-process = falseβ okay so when the node is active, it will always get joined with a driver node, even when literally nothing is linked to it. Setting this totruealso impliesnode.want-driver = true. π
This is the default for JACK nodes, because they always need their process callback called.
node.want-driver = trueβ the node wants to be linked to a driver so it can start processing. This is the default for streams and filters since0.3.51. Nodes that are not linked to anything will still be set to the idle state, unlessnode.always-processis set totrue.node.pause-on-idle = falsenode.suspend-on-idle = falseβ when the node is not linked anymore, it becomes idle. Normally idle nodes keep processing and are suspended by the session manager after some timeout. With this property it's possible to immediately pause a node when idle. π«Ά
When the session manager does not suspend nodes (or when there is no session manager at all), the node.suspend-on-idle property can be used instead.
node.loop.name = nullnode.loop.class = data.rtβ add the node to a specific loop name or loop class. By default the node is added to thedata.rtloop class. You can make more specific data loops and then assign the nodes to those. β¨
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β the priority of choosing this device as the driver in the graph. The driver is selected from all linked devices by selecting the device with the highest priority.
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β the name of the clock. This name is auto generated from the card index and stream direction. Devices with the same clock name will not use a resampler to align the clocks. This can be used to link devices together with a shared word clock. π°οΈ
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β instructs the session manager to automatically connect this node to some other node, usually a sink or source.node.exclusive = falseβ if this node wants to be linked exclusively to the sink/source.target.object = <node.name|object.serial>β where the node should link to, this can be anode.nameor anobject.serial.node.target = <node.name|object.id>β where this node should be linked to. This can be anode.nameor anobject.idof a node. β οΈ This property is deprecated, thetarget.objectproperty should be used instead, which uses the more uniqueobject.serialas a possible target.node.dont-reconnect = falseβ when the node has a target configured and the target is destroyed, destroy the node as well. This property also inhibits that the node is moved to another sink/source.
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β if linking this node to its specified target does not succeed, session manager should not fall back to linking it to the default target.node.dont-move = falseβ whether the node target may be changed using metadata.node.passive = falseβ this is a passive node and so it should not keep sinks/sources busy. This property makes the session manager create passive links to the sink/sources. If the node is not otherwise linked (via a non-passive link), the node and the sink it is linked to are idle (and eventually suspended). π΄
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β add the node to a certain link group. Nodes from the same link group are not automatically linked to each other by the session manager. And example is a coupled stream where you don't want the output to link to the input streams, making a useless loop. πstream.dont-remix = falseβ instruct the session manager to not remix the channels of a stream. Normally the stream channel configuration is changed to match the sink/source it is connected to. With this property set totrue, the stream will keep its original channel layout and the session manager will link matching channels with the sink.priority.session # integerβ the priority for selecting this node as the default source or sink.session.suspend-timeout-seconds = 3 # floatβ timeout in seconds, after which an idle node is suspended. Value0means the node will not be suspended.state.restore-props = trueβ whether session manager should save state for this node.
ποΈ Format Properties
Streams and also most device nodes can be configured in a certain format with properties. fr fr this is the glow-up section π
audio.rate = RATEβ forces a samplerate on the node.audio.channels = INTEGERβ the number of audio channels to use. Must be a value between1and64.audio.format = FORMATβ forces an audio format on the node. This is the format used internally in the node because the graph processing format is always float 32. π
Valid formats include: S16, S32, F32, F64, S16LE, S16BE, ...
audio.allowed-ratesβ an array of allowed samplerates for the node. ex."[ 44100 48000 ]"
π§© Other Properties
node.param.PARAM = { ... } # JSONβ set value of a node Param to a JSON value when the device is loaded. This works similarly aspw-cli(1)set-paramcommand. The PARAM should be replaced with the name of the Param to set, ie. for examplenode.param.Props = { ... }to set Props.node.disabled = false # booleanβ disable the creation of this node in session manager.
π 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. It's giving the multitasker of the audio world, honestly. π
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β the volume of the input channels is applied to the volume of the monitor ports. Normally the monitor ports expose the raw unmodified signal on the input ports.
π 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. slay, offloaded β¨
Below is an explanation of the options that can be tuned in the sample converter.
resample.quality = 4β the quality of the resampler. From0to14, the default is4.
The quality of a resampler depends on multiple factors: π§
- Anti-Aliasing, how well are unwanted frequencies filtered out. Poor anti-aliasing will make the original inaudible frequencies audible as distortion and noise.
- Cutoff frequency. At what frequency the transition band will start. This is the frequency where the signal will start to fade out. A too low cutoff might remove too much of the high frequencies and make the sound dull. A too high cutoff might cause aliasing. The cutoff frequency is usually expressed as a ratio of the Nyquist frequency,
1.0being the Nyquist frequency (frequency/2). - Transition band length. How quickly the unwanted frequencies are filtered out. A shorter transition band requires longer filters with more CPU and latency but causes less aliasing. The transition band length is expressed as a ratio of the Nyquist frequency.
- Stopband attenuation. How well the unwanted frequencies are filtered out. This is usually measured in dB.
96dBis below audible on CD quality audio,150dBis below the precision of floating point values. - CPU usage. Better anti-aliasing needs longer filters and is therefore more CPU intensive.
- Latency. Longer filters have a higher Latency. In real-time application the latency should be kept as low as possible. The required latency is usually (filter-length/2)/source-sample-rate, so a resample filter with length of
128on a48Khzsignal has1.3ms((128/2)/48000) of latency. - Ringing. A too short transition band length might cause ringing because of how the sinc filters work. This can sound like flutter on sharp attacks in the audio signal.
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 artifacts that are well below the audible range. π
- Tune the cutoff frequency. Push the cutoff up to keep more of the high frequencies β you pay for it in aliasing.
- Tune the transition band. Shrink the transition band so stuff right around the cutoff gets filtered out harder and you get less aliasing β the tradeoff is more ringing, more CPU and more latency. You do this by bumping the number of taps.
- Tune the stopband attenuation. Crank the attenuation to reduce aliasing, at the cost of a wider transition band. Heads up: this one is kaiser only β the
expandblackmanwindows are locked in at 150dB and 96dB attenuation respectively. resample.disable=falseβ nukes the resampler entirely π. The node can then only negotiate with the graph when the samplerates are actually compatible.resample.window=expβ which window function the resampler uses. Default is an exponential window, because it's the good balance between complexity and quality, periodt.
You can also say blackman or kaiser, both with their own tradeoffs. The kaiser window is the special one with extra tunable parameters for specific use cases.
resample.cutoff=0.0β the resampler cutoff frequency, a value between0.0and1.0. A value of0.0means "use the predefined value based on the resampler quality."
A higher cutoff keeps more high frequency content, but depending on how big the transition band is it'll cause more aliasing.
The default quality 4 setting for all windows is 0.87.
resample.n-taps=0β the resampler number of taps. Value0means it uses a predefined value based on the resampler quality or other window function parameters.
More taps = more CPU, more latency, more ringing, but less aliasing.
The default quality setting for the exp window is 48.
resample.param.exp.A=0.0β theAparameter for the exponential window function. A value of0.0uses a predefined value based on the quality whenever theexpwindow is in use.
The default setting for the exp window is 16.97789.
resample.param.blackman.alpha=0.0β the alpha value of the blackman function. A value of0.0uses a predefined value based on the quality whenever the blackman window is in use.
The default quality setting for the blackman window is 0.16.
resample.param.kaiser.stopband-attenuation=0.0β the kaiser window stopband attenuation parameter, in dB. Default0.0uses a predefined value based on the quality.
A higher value filters out more of the unwanted frequencies and reduces aliasing, at the cost of a larger transition band. For reference: 96dB sits below the dynamic range of CD quality audio, and 150dB is the limit of the resampler's precision.
The default quality setting for the kaiser window is 130.000000.
resample.param.kaiser.transition-bandwidth=0.0β the kaiser window transition bandwidth parameter. Default0.0uses a predefined value based on the quality.
A smaller transition band gives you a steeper cutoff with less unwanted frequencies in the final signal β but a larger filter, more CPU usage and more 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β the kaiser window alpha parameter. Default0.0calculates an alpha value based on thestopband-attenuationandtransition-bandwidthparameters.
This value is usually calculated from the other parameters, but you can set it explicitly with this property π
The default quality setting for the kaiser window is 4.254931.
ποΈ Channel Mixer Parameters
Sources, sinks, capture and playback streams can all apply channel mixing to the incoming signal. It's giving very versatile.
Normally the channel mixer is not used for devices β device channels are usually exposed exactly as they are. That policy is usually enforced by the session manager, so go read its documentation over 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. That volume adjustment happens on the original channel layout. Example: a stereo playback stream that gets up-mixed to 5.1 has 2 volume controls, left and right.
channelmix.disable=falseβ disables the channel mixer completely. The stream will then only be able to link to compatible sources/sinks with the exact same channel layout.channelmix.min-volume=0.0channelmix.max-volume=10.0
These two give the min and max volume values allowed. Any volume that gets set will be clamped to these values.
channelmix.normalize=falseβ makes sure that during such mixing & resampling the original 0 dB level is preserved, so nothing sounds wildly quieter/louder.
While this option prevents clipping, it can in some cases produce too low volume π. Just increase the volume in that case, or disable normalization.
channelmix.lock-volumes=falseβ completely disable volume or mute changes. Defaults tofalse.channelmix.mix-lfe=trueβ mixes the low frequency effect channel into the front center or stereo pair. This might enhance the dynamic range of the signal if there's no subwoofer and the speakers can reproduce the low frequency signal.channelmix.upmix=trueβ enables up-mixing of the front center (FC) when the target has a FC channel. The sum of the stereo channels is used, and an optional lowpass filter can be used (seechannelmix.fc-cutoff).
Also enables up-mixing of LFE when channelmix.lfe-cutoff is set to something other than 0 and the target has an LFE channel. The LFE channel is produced by adding the stereo channels.
If channelmix.upmix is true, up-mixing of the rear channels is enabled too, and it's controlled with the channelmix-upmix-method property.
channelmix.upmix-method=psdβ 3 methods are provided to produce the rear channels in a surround sound:none. No rear channels are produced.simple. Front channels are copied to the rear. Fast, but it can produce phasing effects.psd. The rear channels are 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β applies a lowpass filter to the low frequency effects. The value is expressed in Hz. Typical subwoofers have a cutoff at around150and200. The default value of0disables the feature.channelmix.fc-cutoff=12000β applies a lowpass filter to the front center frequency. The value is expressed in Hz.
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β applies a delay in milliseconds when up-mixing the rear channels. This improves specialization of the sound β¨. A typical delay of12milliseconds is the default.
This is only active when the psd up-mix method is used.
channelmix.stereo-widen=0.0β subtracts some of the front center signal from the stereo channels. This moves the dialogs more to the center speaker and leaves the ambient sound in the stereo channels.
This is only active when up-mix is enabled and a Front Center channel is mixed.
channelmix.hilbert-taps=0β this option applies a 90 degree phase shift to the rear channels to improve specialization. Taps need to be between15and255, and higher values give more accurate results (with more CPU consumption, ofc).
This is only active when the psd up-mix method is used.
dither.noise=0β this option adds N bits of random data to the signal. When nodither.methodis specified, the random data flips between[-(1<<(N-1)), 0]every1024samples. With adither.method, the dither noise is amplified with1<<(N-1)bits.
This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is usually enough β otherwise the noise becomes audible. It's 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 precision for all of the audio processing. Conversion to 24 bits integer sample formats is lossless, and conversion to 32 bits integer sample formats is simply padded with 0 bits at the end. This means the dither noise is always only in the 24 most significant bits. π
dither.method=noneβ optional dithering can be done on the quantized output signal. There are 6 modes available:noneβ no dithering is done.rectangularβ dithering with a rectangular noise distribution. Adds random bits in the[-0.5, 0.5]range to the signal with even distribution.triangularβ dithering with a triangular noise distribution. Adds random bits in the[-1.0, 1.0]range to the signal with triangular distribution around0.0.triangular-hfβ dithering with a sloped triangular noise distribution.wannamaker3β additional noise shaping is performed on the sloped triangular dithering to move the noise to the more inaudible range. This uses the "F-Weighted" noise filter described by Wannamaker.shaped5β additional noise shaping is performed on the triangular dithering to move the noise to the more inaudible range. This uses 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=""β makes the stream also write the raw samples to a WAV file, for debugging purposes π΅οΈββοΈ
π§ Other Parameters
These control low-level technical features:
clock.quantum-limitβ seepipewire.conf(5)resample.peaks=false# boolean β ok so instead of actually resampling, this just spits out peak amplitude values as the output ποΈ. It's the vibe check for volume monitoring, and it gets set as a property on the "recording" stream. Peak girly behavior only πresample.prefill=false# boolean β prefills the resampler buffers with silence π«§. Lowkey affects the very first samples the resampler produces, so likeβ¦ the opening bars of the audio, basically. ngl it matters.adapter.auto-port-config=null# JSON β if you set this, the ports of the node get configured right when it's created, instead of you know, leaving that whole task to the session manager π«Ά. This is useful (only) for minimal configurations where there's no session manager at all. fr fr, only then.
The value is SPA JSON shaped like this:
{
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 of all that β¨.
π₯ ALSA PROPERTIES π₯
π§ Monitor properties
alsa.use-acp=true# boolean β use ALSA Card Profiles (ACP) to configure the device π. It autodetects the ALSA devices that are available and sets up port and hardware mixers for you. Iconic, honestly.alsa.use-ucm# boolean β enable or disable UCM for all the devices π. Default: unset.alsa.udev.expose-busy# boolean β expose the ALSA card even if it's busy / in use π. Defaultfalse. Genuinely useful when some of the PCMs are being hogged by other applications but the other free PCMs should still be exposed. like, don't punish the free ones bestie.
π οΈ Device properties
api.alsa.path# string β the ALSA device path, in the exact form you'd use insnd_pcm_open()andsnd_ctl_open()π.api.alsa.use-ucm=true# boolean β when ACP is enabled and a UCM configuration is available for a device, UCM gets used by default instead of the ACP profiles β¨. This option lets you disable that and use the ACP profiles instead. Heads up: this option does nothing ifalsa.use-acpis set tofalse. periodt.api.alsa.soft-mixer=false# boolean β set this totrueand the hardware mixer is disabled for volume control and mute π«ποΈ. All volume handling then goes through software volume and mute, leaving the hardware mixer untouched. Lowkey interesting for working around bugs in the mixer detection or the decibel reporting. Important though: the hardware mixer will still be used to mute unused audio paths in the device. Useapi.alsa.disable-mixer-pathto also disable mixer path selection, iykyk.api.alsa.disable-mixer-path=false# boolean β set this totrueand hardware mixer path selection is disabled π. What even is the hardware mixer path? It's the configuration of the mixer depending on which jacks are inserted in the card π§. Disable it and you'll have to manually enable and disable mixer controls yourself β but it can work around bugs in the mixer. And the hardware mixer will still be used for volume and mute. To also disable hardware volume and mute, useapi.alsa.soft-mixer. The two options are besties, they work as a pair π«Ά.api.alsa.ignore-dB=false# boolean β set totrueand the decibel setting configured by the driver gets ignored π. Use this when the driver reports wrong settings. not me trusting the driverβ¦ anyway.device.profile-set# string β this option selects a custom ACP profile-set name for the device π. You can configure it in UDev rules, but you can also just specify it here. Default is to use"default.conf"unless there's a matching udev rule.device.profile# string β the initial active profile name π. Default is to start from the"Off"profile and then let the session manager pick the best profile based on its policy.api.acp.auto-profile=true# boolean β automatically select the best profile for the device π. The session manager usually disables this because it handles the whole task itself. You can enable it in custom configurations where the session manager isn't handling it.api.acp.auto-port=true# boolean β automatically select the highest priority port that's available πΈ. Quick vocab moment: "port" is a PulseAudio/ACP term, the equivalent of a "Route" in PipeWire. The session manager usually disables this too, since it handles it instead. Enable it in custom configurations without the session manager doing that job.api.acp.probe-rate# integer β sets the samplerate used for probing the ALSA devices and collecting the profiles and ports π.api.acp.pro-channels# integer β sets the number of channels to use when probing the"Pro Audio"profile ποΈ. Normally the maximum amount of channels gets used, but with this you can reduce it, which can make it possible to use other samplerates on some devices. cute little tradeoff.api.alsa.split-enable# boolean β for UCM devices with split PCMs, don't split into multiple PCMs using alsa-lib plugins πͺ. Instead, addapi.alsa.splitproperties to the emitted nodes with the PCM splitting information.api.acp.disable-pro-audio=false# boolean β disables the"Pro Audio"profile for this device π.api.acp.use-eld-channels=false# boolean β use the channel count and mapping that the connected HDMI device provides via ELD information πΊ. it's giving "let the TV decide".
ποΈ Node properties
audio.channels# integer β the number of audio channels to open the device with π’. The default depends on the profile of the device.audio.rate# integer β the audio rate to open the device with β±οΈ. Default is0, which means open the device with a rate as close to the graph rate as possible. slay.audio.format# string β the audio format to open the device in π΅. By default this is"UNKNOWN", which opens the device in the best possible bits (32/24/16/8..). You can force a format likeS16_LEorS32_LE.audio.position# JSON array of strings β the audio position of the channels in the device π. It's auto detected based on the profile. You can configure an array of channel positions, like"[ FL, FR ]".audio.layout# string β the audio layout of the channels in the device π§. You can use any of the predefined layouts, like"Stereo","5.1"etc.audio.allowed-rates# JSON array of integers β the allowed audio rates to open the device with ποΈ. Default is"[ ]", which means the device can be opened in any supported rate. Only rates from the array will be used to open the device. And when the graph is running at a rate that's not listed in the allowed-rates, the resampler gets used to resample to the nearest allowed rate π.api.alsa.period-size# integer β the period size to open the device in π. By default this is0, which opens the device in the default period size to minimize latency.api.alsa.period-num# integer β the amount of periods to use in the device π’. By default this is0, which means use as many as possible.api.alsa.headroom# integer β the amount of extra space to keep in the ringbuffer π«§. Default is0. You can configure higher values when the device read and write pointers aren't accurately reported. trust issues with the pointers, honestly.api.alsa.start-delay=0# integer β some devices need a little time before they can report accurate hardware pointer positions π΄. In those cases an extra start delay can be added to compensate for the startup delay. This sets the startup delay in samples.api.alsa.disable-mmap=false# boolean β disable the mmap operation of the device and use the ALSA read/write API instead π«. Default isfalse, because mmap is preferred. obviously.api.alsa.disable-batch# boolean β ignore the ALSA batch flag π. If the batch flag is set, ALSA needs an extra period to update the read/write pointers, so ignoring this flag from ALSA can reduce latency. Default isfalse.api.alsa.use-chmap# boolean β use the driver-provided channel map πΊοΈ. Default istruewhen using UCM,falseotherwise β because many drivers don't report this correctly π. classic.api.alsa.multi-rate# boolean β allow devices from the same card to be opened in multiple sample rates πΆ. Default istrue. Some older drivers didn't properly advertise the capabilities of the device and only really supported opening the device in one rate. old drivers stay messy.api.alsa.htimestamp=false# boolean β use ALSA htimestamps in scheduling instead of the system clock β°. Some ALSA drivers produce bad timestamps, so this isn't enabled by default β and it'll be disabled at runtime if it looks like the ALSA timestamps are bad. self-cleaning, we love.api.alsa.htimestamp.max-errors# integer β the number of consecutive errors before htimestamp gets disabled π. Setting this to0makes htimestamp never get disabled. zero means infinite, bestie.api.alsa.disable-tsched=false# boolean β disable timer-based scheduling, and use IRQ for scheduling instead β‘. The"Pro Audio"profile will usually enable this setting if it's expected to work on the hardware.api.alsa.dll-bandwidth-max# double β sets the maximum bandwidth of the DLL (delay-locked loop) filter used to smooth out rate adjustments π. The default value may be too responsive in some scenarios. For example, with UAC2 pitch control, the host reacts more slowly compared to local resampling, so using a lower bandwidth helps avoid oscillations or instability. like, calm down the filter a little π§ββοΈ.api.alsa.auto-link=false# boolean β link follower PCM devices to the driver PCM device when using IRQ-based scheduling π. The"Pro Audio"profile will usually enable this setting if it's expected to work on the hardware.latency.internal.rate# integer β statically set the device systemic latency, in samples at playback rate β³.latency.internal.ns# integer β statically set the device systemic latency, in nanoseconds β±οΈ.api.alsa.path# string β UNDOCUMENTED πapi.alsa.pcm.card# integer β card index to open π. Usually determined fromapi.alsa.path.api.alsa.open.ucm# boolean β open the device using UCM π.api.alsa.bind-ctls# boolean β UNDOCUMENTED πapi.alsa.bind-ctl.NAME# boolean β UNDOCUMENTED πiec958.codecs# JSON array of string β enable only specific IEC958 codecs ποΈ. This can be used to disable some codecs the hardware supports. Available values:PCM,AC3,DTS,MPEG,MPEG2-AAC,EAC3,TRUEHD,DTSHD. pick your fighters.api.alsa.split.parent# boolean β this PCM is a 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.api.alsa.dsd-lsb=false# boolean β use LSB bit order for DSD audio output π§.
πΉ ALSA MIDI PROPERTIES πΉ
ποΈ Node properties
okay so for ALSA MIDI in Wireplumber, the MIDI bridge node properties are configured in the monitor properties. that's the vibe. periodt. β¨
api.alsa.seq.ump = true # booleanβ use MIDI 2.0 if possible. bestie, we love a forward-compatible moment πapi.alsa.seq.min-pool = 500 # integerβ literally labeledUNDOCUMENTED. that's all we get, no cap πapi.alsa.seq.max-pool = 2000 # integerβ alsoUNDOCUMENTED. mysterious icon behavior π΅οΈββοΈclock.name = "clock.system.monotonic" # stringβ the clock to follow. main character clock energy β°api.alsa.path = "default" # stringβ the sequencer device to use. yes ma'am πΉapi.alsa.disable-longname = true # booleanβ if the card long name should not be passed to the MIDI port. sometimes less is more, iykyk π
π BLUETOOTH PROPERTIES π
π‘ Monitor properties
these are settings for the Bluetooth device monitor, not device or node properties. important distinction, bestie π«Ά
bluez5.roles = [ a2dp_sink a2dp_source bap_sink bap_source bap_bcast_sink bap_bcast_source hfp_hf hfp_ag ] # JSON array of stringβ enabled roles. currently some headsets (Sony WH-1000XM3) are not working with bothhsp_agandhfp_agenabled, so by default we enable only HFP. supported roles are: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β enabled A2DP codecs (default: all). possible values:sbc,sbc_xq,aac,aac_eld,aptx,aptx_hd,aptx_ll,aptx_ll_duplex,faststream,faststream_duplex,lc3plus_h3,ldac,opus_05,opus_05_51,opus_05_71,opus_05_duplex,opus_05_pro,opus_g,lc3. codec buffet, obsessed πbluez5.default.rate # integerβ default audio rate.bluez5.default.channels # integerβ default audio channels.bluez5.hfphsp-backend # integerβ HFP/HSP backend (default:native). available values:any,none,hsphfpd,ofono,native.bluez5.hfphsp-backend-native-modem # stringβ that's it. no description in the original, bestie. it's giving mystery box πbluez5.hfphsp-backend-native-pts # booleanβ enable specific workarounds for Bluetooth qualification.bluez5.disable-dummy-call # booleanβ by default a call status event is sent on audio stream connection/disconnection to work around some headset timeout disconnection when the HFP HF is used by another application than the telephony one, e.g. a conference application/website. this prevents sending this event.bluez5.dummy-avrcp player # booleanβ register dummy AVRCP player. some devices have wrongly functioning volume or playback controls if this is not enabled. default:false.bluez5.enable-sbc-xq # booleanβ override device quirk list and enable SBC-XQ for devices for which it is disabled.bluez5.enable-msbc # booleanβ override device quirk list and enable MSBC for devices for which it is disabled.bluez5.enable-hw-volume # booleanβ override device quirk list and enable hardware volume for devices for which it is disabled.bluez5.hw-offload-sco # booleanβ HFP/HSP hardware offload SCO support (default:false). this feature requires a custom configuration that routes SCO audio to ALSA nodes, in a platform-specific way. seetests/examples/bt-pinephone.luain WirePlumber for an example. do not enable this setting if you don't know what all this means, as it won't work. not me warning you dramatically, but also yes πbluez5.hw-offload-datapath # integerβ HFP/HSP hardware offload data path ID (default:0). 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β PipeWire Opus Pro audio profile channel count.bluez5.a2dp.opus.pro.coupled-streams = 1 # integerβ PipeWire Opus Pro audio profile coupled stream count.bluez5.a2dp.opus.pro.locations = "FL,FR,LFE" # stringβ PipeWire Opus Pro audio profile audio channel locations.bluez5.a2dp.opus.pro.max-bitrate = 600000 # integerβ PipeWire Opus Pro audio profile max bitrate.bluez5.a2dp.opus.pro.frame-dms = 50 # integerβ PipeWire Opus Pro audio profile frame duration (1/10 ms).bluez5.a2dp.opus.pro.bidi.channels = 1 # integerβ PipeWire Opus Pro audio profile duplex channels.bluez5.a2dp.opus.pro.bidi.coupled-streams = 0 # integerβ PipeWire Opus Pro audio profile duplex coupled stream count.bluez5.a2dp.opus.pro.bidi.locations = "FC" # stringβ PipeWire Opus Pro audio profile duplex coupled channel locations.bluez5.a2dp.opus.pro.bidi.max-bitrate = 160000 # integerβ PipeWire Opus Pro audio profile duplex max bitrate.bluez5.a2dp.opus.pro.bidi.frame-dms = 400 # integerβ PipeWire Opus Pro audio profile duplex frame duration (1/10 ms).bluez5.bcast_source.config = [] # JSONβ for a per-adapter configuration of multiple BIGs, use an"adapter"entry in the BIG with the BD address. example:
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β supported sampling frequencies for the LC3 codec (default: all). possible values:8000,16000,24000,32000,44100,48000.bluez5.bap-server-capabilities.durations # Array of doublesβ supported frame durations for the LC3 codec (default: all). possible values:7.5,10.bluez5.bap-server-capabilities.channels # Array of integersβ supported audio channel counts for the LC3 codec (default:[1, 2]). possible values:1,2,3,4,5,6,7,8.bluez5.bap-server-capabilities.framelen_min # integerβ minimum number of octets supported per codec frame for the LC3 codec (default:20).bluez5.bap-server-capabilities.framelen_max # integerβ maximum number of octets supported per codec frame for the LC3 codec (default:400).bluez5.bap-server-capabilities.max_frames # integerβ maximum number of codec frames supported per SDU for the LC3 codec (default:2).bluez5.bap-server-capabilities.sink.locations # JSON or integerβ sink audio locations of the server, as channel positions or PACS bitmask. example:FL,FR.bluez5.bap-server-capabilities.sink.contexts # integerβ available sink contexts PACS bitmask of the server.bluez5.bap-server-capabilities.sink.supported-contexts # integerβ supported sink contexts PACS bitmask of the server.bluez5.bap-server-capabilities.sink.delay-min # integerβ minimum presentation delay supported, in microseconds.bluez5.bap-server-capabilities.sink.delay-max # integerβ maximum presentation delay supported, in microseconds.bluez5.bap-server-capabilities.sink.preferred-delay-min # integerβ minimum preferred presentation delay supported, in microseconds.bluez5.bap-server-capabilities.sink.preferred-delay-max # integerβ maximum preferred presentation delay supported, in microseconds.bluez5.bap-server-capabilities.source.locations # JSON or integerβ source audio locations of the server, as channel positions or PACS bitmask. example:FL,FR.bluez5.bap-server-capabilities.source.contexts # integerβ available source contexts PACS bitmask of the server.bluez5.bap-server-capabilities.source.supported-contexts # integerβ supported source contexts PACS bitmask of the server.bluez5.bap-server-capabilities.source.delay-min # integerβ minimum presentation delay supported, in microseconds.bluez5.bap-server-capabilities.source.delay-max # integerβ maximum presentation delay supported, in microseconds.bluez5.bap-server-capabilities.source.preferred-delay-min # integerβ minimum preferred presentation delay supported, in microseconds.bluez5.bap-server-capabilities.source.preferred-delay-max # integerβ maximum preferred presentation delay supported, in microseconds.bluez5.bap-server-tmap-features = null # array of stringβ override advertised TMAP service features. see TMAP specification for their meaning. possible values:"cg","ct","ums","umr","bms","bmr". default: none.bluez5.bap-server-gmap-features = null # array of stringβ override advertised GMAP service features. see GMAP specification for their meaning. possible values:"ugg","ugt","bgs","bgr","ugg-multiplex","ugg-96kbps-source","ugg-multisink","ugt-source","ugt-80kbps-source","ugt-sink","ugt-64kbps-sink","ugt-multiplex","ugt-multisink","ugt-multisource","bgs-96kbps","bgr-multisink","bgr-multiplex". default: none.
π§ Device properties
bluez5.auto-connect # booleanβ auto-connect devices on start up. disabled by default if the property is not specified.bluez5.hw-volume = [ hfp_ag hsp_ag a2dp_source ] # JSON array of stringβ profiles for which to enable hardware volume control.bluez5.profile # stringβ initial device profile. this usually has no effect as the session manager overrides it. lowkey just vibes, but okay πbluez5.a2dp.ldac.quality = "auto" # stringβ LDAC encoding quality. available values: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β AAC variable bitrate mode. available values:0(cbr, default),1-5(quality level).bluez5.a2dp.opus.pro.application = "audio" # stringβ PipeWire Opus Pro Audio encoding mode:audio,voip,lowdelay.bluez5.a2dp.opus.pro.bidi.application = "audio" # stringβ PipeWire Opus Pro Audio duplex encoding mode:audio,voip,lowdelay.bluez5.bap.cig = "auto" # integer, or 'auto'β set CIG ID for BAP unicast streams of the device.bluez5.bap.preset = "auto" # stringβ BAP QoS preset name that needed to be used with vendor config. this property is experimental. available:"48_2_1", ... as in the BAP specification.bluez5.bap.rtn # integerβ BAP QoS preset name that needed to be used with vendor config. this property is experimental. default: as per QoS preset.- π¦
bluez5.bap.latency(integer) β the BAP QoS latency you want applied when you're using a vendor-defined preset. this one is experimental, okurrr. Default: same as the QoS preset. - π¦
bluez5.bap.delay = 40000(integer) β the BAP QoS delay to slap onto a vendor-defined preset. also experimental, no cap. Default: as per the QoS preset. - π¦
bluez5.framing = false(boolean) β BAP QoS framing for vendor-defined presets. experimental bestie. Default: as per QoS preset. - π¦
bluez5.bap.force-target-latency = "balanced"(string) β forces a BAP QoS target latency profile for QoS configuration selection. if it's not set, or you set it to"balanced", then both the low-latency and high-reliability QoS configuration tables get used. this is experimental π. Available:low-latency,high-reliability,balanced
π§ Node properties
- π€
bluez5.media-source-role(string) β the media source role for Bluetooth clients connecting to this instance. Available values:playback: playing stream to speakers πinput: appear as a source node ποΈ
- π€
bluez5.decode-buffer.latency(integer) β applies on media source nodes, and defines the target amount of samples to buffer on the output of the decoder. Default:0, which literally means "figure it out yourself" (automatically determined β¨). - π€
node.latency-offset-msec(string) β applies only for BLE MIDI nodes. it's a latency adjustment applied on the node. larger values add a constant latency, but they reduce the timing jitter caused by the Bluetooth transport. so like, tradeoff city π. - π€
bluez5.debug.iso-mono = false(boolean) β a debugging option that forces ISO sinks to send identical packets out for all streams. debug brainrot only, iykyk π.
π PORT PROPERTIES π
so port properties are usually not directly configurable via PipeWire configuration files, because they're determined by the applications creating them. periodt. but here are some port properties that might be interesting for users:
port.name(string) β port name π·οΈport.alias(string) β port alias π·οΈ
π See also
Key Names in the API documentation for a full list.
π LINK PROPERTIES π
link properties are also usually not directly configurable via PipeWire configuration files, since they're determined by the applications creating them. same vibe as ports, fr fr.
π See also
Key Names in the API documentation for a full list.
π§βπ€βπ§ CLIENT PROPERTIES π§βπ€βπ§
client properties are usually not directly configurable via PipeWire configuration files either β they're determined by the application connecting to PipeWire. but clients are affected by the settings in pipewire.conf(5) and by session manager settings, so like, they're not fully off the grid.
β οΈ Note β only the properties pipewire.* are safe to use for security purposes, like identifying applications and their capabilities. that's because clients can set and change other properties freely π. do not trust the rest for security, bestie, i'm serious.
below are some client properties that might be interesting for users.
- π§Έ
application.name(string) β application keys. this is the application name. Ex:"Totem Music Player" - π§Έ
application.process.id(integer) β process id (pid) - π§Έ
pipewire.sec.pid(integer) β client pid, set by the protocol. note that for PulseAudio applications, this is the PID of thepipewire-pulseprocess π
π See also
Key Names in the API documentation for a full list.
βοΈ RUNTIME SETTINGS βοΈ
okay so objects like devices and nodes also have parameters that you can modify after the object has been created. like the active device profile, channel volumes, and so on. main character energy: the object doesn't have to be born perfect, you can glow it up later π .
for some objects, the parameters also let you change some of the properties. the settings of most ALSA and virtual device parameters can be configured at runtime too. slay.
these settings live in a device parameter called Props in its params field. you can see them, e.g. with 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. consistency icon β¨.
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. so yeah, they vanish like your motivation at 3am π.
π 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. Seehttps://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. and get this β it's possible to override individual files locally by putting a modified copy into the ACP directories under ~/.config or /etc. customizing queen behavior π.
π¦ OTHER OBJECT TYPES π¦
technically, PipeWire objects is what are manipulated by applications using the PipeWire API. grammar? we don't know her. the facts? immaculate.
the list of object types that are usually "exported" (i.e. appear in pw-dump(1) output) is larger than what we talked about above:
- Node
- Device
- Port
- Link
- Client
- Metadata
- Module
- Profiler
- SecurityContext
Monitors do not appear in this list β they're not usually exported, and technically they're also Device objects. they're considered above as a separate object type because they have configurable properties. special little guys π¦.
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. that's it, that's the whole personality.
ποΈ INDEX
okay so this is the master list β literally every property on this page, sorted by which kind of object it lives on. use it like a map, bestie: spot the name you need, then scroll to the section that explains it. no cap, it's giving table of contents but make it fashion. π
π Monitor properties
the monitor-flavoured ones β alsa.*, api.alsa.*, and a whole parade of bluez5.* (plus clock.name at the end, hi queen):
alsa.udev.expose-busyalsa.use-acpalsa.use-ucmapi.alsa.disable-longnameapi.alsa.pathapi.alsa.seq.max-poolapi.alsa.seq.min-poolapi.alsa.seq.umpbluez5.a2dp.opus.pro.bidi.channelsbluez5.a2dp.opus.pro.bidi.coupled-streamsbluez5.a2dp.opus.pro.bidi.frame-dmsbluez5.a2dp.opus.pro.bidi.locationsbluez5.a2dp.opus.pro.bidi.max-bitratebluez5.a2dp.opus.pro.channelsbluez5.a2dp.opus.pro.coupled-streamsbluez5.a2dp.opus.pro.frame-dmsbluez5.a2dp.opus.pro.locationsbluez5.a2dp.opus.pro.max-bitratebluez5.bap-server-capabilities.channelsbluez5.bap-server-capabilities.durationsbluez5.bap-server-capabilities.framelen_maxbluez5.bap-server-capabilities.framelen_minbluez5.bap-server-capabilities.max_framesbluez5.bap-server-capabilities.ratesbluez5.bap-server-capabilities.sink.contextsbluez5.bap-server-capabilities.sink.delay-maxbluez5.bap-server-capabilities.sink.delay-minbluez5.bap-server-capabilities.sink.locationsbluez5.bap-server-capabilities.sink.preferred-delay-maxbluez5.bap-server-capabilities.sink.preferred-delay-minbluez5.bap-server-capabilities.sink.supported-contextsbluez5.bap-server-capabilities.source.contextsbluez5.bap-server-capabilities.source.delay-maxbluez5.bap-server-capabilities.source.delay-minbluez5.bap-server-capabilities.source.locationsbluez5.bap-server-capabilities.source.preferred-delay-maxbluez5.bap-server-capabilities.source.preferred-delay-minbluez5.bap-server-capabilities.source.supported-contextsbluez5.bap-server-gmap-featuresbluez5.bap-server-tmap-featuresbluez5.bcast_source.configbluez5.codecsbluez5.default.channelsbluez5.default.ratebluez5.disable-dummy-callbluez5.dummy-avrcpbluez5.enable-hw-volumebluez5.enable-msbcbluez5.enable-sbc-xqbluez5.hfphsp-backendbluez5.hfphsp-backend-native-modembluez5.hfphsp-backend-native-ptsbluez5.hw-offload-datapathbluez5.hw-offload-scobluez5.rolesclock.name
π§ Device properties
the device-side crew β api.acp.*, api.alsa.*, bluez5.*, and all the device.* classics. (yes, api.alsa.path shows up in more than one list, she contains multitudes β¨)
api.acp.auto-portapi.acp.auto-profileapi.acp.disable-pro-audioapi.acp.pro-channelsapi.acp.probe-rateapi.acp.use-eld-channelsapi.alsa.disable-mixer-pathapi.alsa.ignore-dBapi.alsa.pathapi.alsa.soft-mixerapi.alsa.split-enableapi.alsa.split.parentapi.alsa.use-ucmbluez5.a2dp.aac.bitratemodebluez5.a2dp.ldac.qualitybluez5.a2dp.opus.pro.applicationbluez5.a2dp.opus.pro.bidi.applicationbluez5.auto-connectbluez5.bap.cigbluez5.bap.delaybluez5.bap.force-target-latencybluez5.bap.latencybluez5.bap.presetbluez5.bap.rtnbluez5.framingbluez5.hw-volumebluez5.profiledevice.classdevice.descriptiondevice.disableddevice.form-factordevice.icondevice.icon-namedevice.intended-rolesdevice.namedevice.nickdevice.param.PARAMdevice.pluggeddevice.product.iddevice.product.namedevice.profiledevice.profile-setdevice.serialdevice.vendor.iddevice.vendor.name
π Node properties
the big one. this list is long long β adapter.*, api.alsa.*, audio.*, bluez5.*, channelmix.*, clock.*, debug.*, device.*, dither.*, iec958.*, latency.*, media.*, monitor.*, node.*, object.*, priority.*, resample.*, session.*, state.*, stream.*, and target.object. iconic behavior honestly π
adapter.auto-port-configapi.alsa.auto-linkapi.alsa.bind-ctl.NAMEapi.alsa.bind-ctlsapi.alsa.disable-batchapi.alsa.disable-mmapapi.alsa.disable-tschedapi.alsa.dll-bandwidth-maxapi.alsa.dsd-lsbapi.alsa.headroomapi.alsa.htimestampapi.alsa.htimestamp.max-errorsapi.alsa.multi-rateapi.alsa.open.ucmapi.alsa.pathapi.alsa.pcm.cardapi.alsa.period-numapi.alsa.period-sizeapi.alsa.split.hw-positionapi.alsa.split.positionapi.alsa.start-delayapi.alsa.use-chmapaudio.allowed-ratesaudio.channelsaudio.formataudio.layoutaudio.positionaudio.ratebluez5.debug.iso-monobluez5.decode-buffer.latencybluez5.media-source-rolechannelmix.disablechannelmix.fc-cutoffchannelmix.hilbert-tapschannelmix.lfe-cutoffchannelmix.lock-volumeschannelmix.max-volumechannelmix.min-volumechannelmix.mix-lfechannelmix.normalizechannelmix.rear-delaychannelmix.stereo-widenchannelmix.upmixchannelmix.upmix-methodclock.nameclock.quantum-limitdebug.wav-pathdevice.iddither.methoddither.noiseiec958.codecslatency.internal.nslatency.internal.ratemedia.artistmedia.categorymedia.classmedia.commentmedia.copyrightmedia.datemedia.filenamemedia.formatmedia.iconmedia.icon-namemedia.languagemedia.namemedia.rolemedia.softwaremedia.titlemedia.typemonitor.channel-volumesnode.always-processnode.autoconnectnode.descriptionnode.disablednode.dont-fallbacknode.dont-movenode.dont-reconnectnode.exclusivenode.force-quantumnode.force-ratenode.latencynode.latency-offset-msecnode.link-groupnode.lock-quantumnode.lock-ratenode.loop.classnode.loop.namenode.namenode.nicknode.param.PARAMnode.passivenode.pause-on-idlenode.ratenode.suspend-on-idlenode.targetnode.want-driverobject.lingerpriority.driverpriority.sessionresample.cutoffresample.disableresample.n-tapsresample.param.blackman.alpharesample.param.exp.Aresample.param.kaiser.alpharesample.param.kaiser.stopband-attenuationresample.param.kaiser.transition-bandwidthresample.peaksresample.prefillresample.qualityresample.windowsession.suspend-timeout-secondsstate.restore-propsstream.dont-remixtarget.object
π Port properties
short and sweet. two lil icons, that's the whole group:
port.aliasport.name
πͺͺ Client properties
same energy β three of them, and they're all about who the client is:
application.nameapplication.process.idpipewire.sec.pid
π AUTHORS
The PipeWire Developers β ping them at <https://gitlab.freedesktop.org/pipewire/pipewire/issues> π«Ά, and yeah, PipeWire is available from <https://pipewire.org>. go say hi, they're doing the lord's work honestly.
π¦ SEE ALSO
pipewire.conf(5)β the other page you'll have open in a second terminal tab, fr fr
okay that's the whole entire page, bestie!! you made it to the end π go forth and configure your little heart out. and remember: this was pipewire-props(7) from PipeWire 1.6.8 β that's the version, that's the page, that's the source, and the date line lives down in the footer where the manpage gremlins keep it. slay, bye πβ¨π
π¦ where this page comes from
- alpine 3.24: pipewire-doc 1.6.8-r4 Β· MIT
- ubuntu stonking: pipewire-bin 1.6.8-1ubuntu4 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms