libpipewire-module-roc-source

title: libpipewire-module-roc-source(7)

summary: ROC source

text:
# libpipewire-module-roc-source(7)

## NAME
libpipewire-module-roc-source - ROC source

## DESCRIPTION
The roc-source module creates a PipeWire source that receives samples from ROC sender and passes them to the sink it is connected to.

One can then connect it to any audio device.

## MODULE NAME
libpipewire-module-roc-source

## MODULE OPTIONS
Options specific to the behavior of this module

- source.props = {}: properties to be passed to the source stream

- source.name = <str>: node.name of the source

- local.ip = <str>: local sender ip

- local.source.port = <str>: local receiver TCP/UDP port for source packets

- local.repair.port = <str>: local receiver TCP/UDP port for receiver packets

- local.control.port = <str>: local receiver TCP/UDP port for control packets

- sess.latency.msec = <str>: target network latency in milliseconds

- roc.resampler.backend = <str>: Possible values: default, builtin, speex, speexdec.

- roc.resampler.profile = <str>: Possible values: default, high, medium, low.

- roc.latency-tuner.backend = <str>: Possible values: default, niq

- roc.latency-tuner.profile = <str>: Possible values: default, intact, responsive, gradual

- fec.code = <str>: Possible values: default, disable, rs8m, ldpc

- resampler.profile = <str>: Deprecated, use roc.resampler.profile

- log.level = <str>: log level for roc-toolkit. Possible values: DEFAULT, NONE, ERROR, INFO, DEBUG, TRACE; DEFAULT follows the log level of the PipeWire context.

## GENERAL OPTIONS
Options with well-known behavior:

- node.name

- node.description

- node.virtual

- media.class

- audio.position

## EXAMPLE CONFIGURATION

```
 # ~/.config/pipewire/pipewire.conf.d/my-roc-source.conf

 context.modules = [

  {   name = libpipewire-module-roc-source

      args = {

          local.ip = 0.0.0.0

          #roc.resampler.backend = default

          roc.resampler.profile = medium

          #roc.latency-tuner.backend = default

          #roc.latency-tuner.profile = default

          fec.code = disable

          sess.latency.msec = 5000

          local.source.port = 10001

          local.repair.port = 10002

          local.control.port = 10003

          source.name = "ROC Source"

          source.props = {

             node.name = "roc-source"

          }

          audio.position = [ FL FR ]

          log.level = DEFAULT

      }

  }
]
```


libpipewire-module-rt

package: pipewire-libs-devel

title: libpipewire-module-rt(7)

summary: RT

text:
# libpipewire-module-rt(7)

## NAME
libpipewire-module-rt - RT

## DESCRIPTION
The rt modules can give real-time priorities to processing threads.

It uses the operating system's scheduler to enable realtime scheduling for certain threads to assist with low latency audio processing. This requires RLIMIT_RTPRIO to be set to a value that's equal to this module's rt.prio parameter or higher. Most distros will come with some package that configures this for certain groups or users. If this is not set up and DBus is available, then this module will fall back to using the Portal Realtime DBus API or RTKit.

## MODULE NAME
libpipewire-module-rt

## MODULE OPTIONS

- nice.level: The nice value set for the application thread. It improves performance of the communication with the pipewire daemon.

- rt.prio: The realtime priority of the data thread. Higher values are higher priority.

- rt.time.soft, rt.time.hard: The amount of CPU time an RT thread can consume without doing any blocking calls before the kernel kills the thread. This is a safety measure to avoid lockups of the complete system when some thread consumes 100%.

- rlimits.enabled: enable the use of rtlimits, default true.

- rtportal.enabled: enable the use of realtime portal, default true

- rtkit.enabled: enable the use of rtkit, default true

- uclamp.min: the minimum utilisation value the scheduler should consider

- uclamp.max: the maximum utilisation value the scheduler should consider

The nice level is by default set to an invalid value so that clients don't automatically have the nice level raised.

The PipeWire server processes are explicitly configured with a valid nice level.

## CONFIG OVERRIDE
A module.rt.args config section can be added to override the module arguments.

```
# ~/.config/pipewire/pipewire.conf.d/my-rt-args.conf
module.rt.args = {

    #nice.level = 22
}
```

## EXAMPLE CONFIGURATION

```
context.modules = [
{   name = libpipewire-module-rt

    args = {

        #nice.level   = 20

        #rt.prio      = 88

        #rt.time.soft = -1

        #rt.time.hard = -1

        #rlimits.enabled = true

        #rtportal.enabled = true

        #rtkit.enabled = true

        #uclamp.min = 0

        #uclamp.max = 1024

    }

    flags = [ ifexists nofail ]
}
]
```

branch: sisyphus


libpipewire-module-rtp-sap

title: libpipewire-module-rtp-sap(7)

summary: SAP Announce and create RTP streams

text:
# libpipewire-module-rtp-sap(7)

## NAME
libpipewire-module-rtp-sap - SAP Announce and create RTP streams

## DESCRIPTION
The rtp-sap module announces RTP streams that match the rules with the announce-stream action.

It will create source RTP streams that are announced with SAP when they match the rule with the create-stream action.

If no stream.rules are given, it will announce all streams with sess.sap.announce = true and it will create a receiver for all announced streams.

## MODULE NAME
libpipewire-module-rtp-sap

## MODULE OPTIONS
Options specific to the behavior of this module

- local.ifname = <str>: interface name to use

- sap.ip = <str>: IP address of the SAP messages, default "224.0.0.56"

- sap.port = <int>: port of the SAP messages, default 9875

- sap.cleanup.sec = <int>: cleanup interval in seconds, default 90 seconds

- source.ip =<str>: source IP address, default "0.0.0.0"

- net.ttl = <int>: TTL to use, default 1

- net.loop = <bool>: loopback multicast, default false

- stream.rules = <rules>: match rules, use create-stream and announce-stream actions

- sap.max-sessions = <int>: maximum number of concurrent send/receive sessions to track

- sap.preamble-extra = [strings]: extra attributes to add to the atomic SDP preamble

- sap.end-extra = [strings]: extra attributes to add to the end of the SDP message

## GENERAL OPTIONS
Options with well-known behavior:

•

remote.name

## EXAMPLE CONFIGURATION

```
# ~/.config/pipewire/pipewire.conf.d/my-rtp-sap.conf
context.modules = [
{   name = libpipewire-module-rtp-sap

    args = {

        #local.ifname = "eth0"

        #sap.ip = "224.0.0.56"

        #sap.port = 9875

        #sap.cleanup.sec = 5

        #source.ip = "0.0.0.0"

        #net.ttl = 1

        #net.loop = false

        stream.rules = [

            {   matches = [

                    # any of the items in matches needs to match, if one does,

                    # actions are emitted.

                    {   # all keys must match the value. ! negates. ~ starts regex.

                        #rtp.origin = "wim 3883629975 0 IN IP4 0.0.0.0"

                        #rtp.payload = "127"

                        #rtp.fmt = "L16/48000/2"

                        #rtp.session = "PipeWire RTP Stream on fedora"

                        #rtp.ts-offset = 0

                        #rtp.ts-refclk = "private"

                        sess.sap.announce = true

                    }

                ]

                actions = {

                    announce-stream = {

                    }

                }

            }

            {   matches = [

                    {   # all keys must match the value. ! negates. ~ starts regex.

                        #rtp.origin = "wim 3883629975 0 IN IP4 0.0.0.0"

                        #rtp.payload = "127"

                        #rtp.fmt = "L16/48000/2"

                        #rtp.session = "PipeWire RTP Stream on fedora"

                        #rtp.ts-offset = 0

                        #rtp.ts-refclk = "private"

                        rtp.session = "~.*"

                    }

                ]

                actions = {

                    create-stream = {

                        #sess.latency.msec = 100

                        #sess.ts-direct = false

                        #target.object = ""

                    }

                }

            }

        ]

    }
}
]
```

Since

0.3.67


libpipewire-module-rtp-session

title: libpipewire-module-rtp-session(7)

summary: RTP session

text:
# libpipewire-module-rtp-session(7)

## NAME
libpipewire-module-rtp-session - RTP session

## DESCRIPTION
The rtp-session module creates a media session that is announced with avahi/mDNS/Bonjour.

Other machines on the network that run a compatible session will see each other and will be able to send audio/midi between each other.

The session setup is based on apple-midi and is compatible with apple-midi when the session is using midi.

## MODULE NAME
libpipewire-module-rtp-session

## MODULE OPTIONS
Options specific to the behavior of this module

- local.ifname = <str>: interface name to use

- control.ip =<str>: control IP address, default "0.0.0.0"

- control.port =<int>: control port, default "0"

- net.mtu = <int>: MTU to use, default 1280

- net.ttl = <int>: TTL to use, default 1

- net.loop = <bool>: loopback multicast, default false sess.discover-local: discover local services as well, default false

- sess.min-ptime = <int>: minimum packet time in milliseconds, default 2

- sess.max-ptime = <int>: maximum packet time in milliseconds, default 20

- sess.latency.msec = <int>: receiver latency in milliseconds, default 100

- sess.name = <str>: a session name

- sess.ts-offset = <int>: an offset to apply to the timestamp, default -1 = random offset

- sess.ts-refclk = <string>: the name of a reference clock

- sess.media = <string>: the media type audio|midi|opus, default midi

- stream.props = {}: properties to be passed to the stream

## GENERAL OPTIONS
Options with well-known behavior:

- remote.name

- audio.format

- audio.rate

- audio.channels

- audio.layout

- audio.position

- node.name

- node.description

- media.name

- node.group

- node.latency

- node.virtual

- media.class

## EXAMPLE CONFIGURATION

```
 # ~/.config/pipewire/pipewire.conf.d/my-rtp-session.conf

 context.modules = [

 {   name = libpipewire-module-rtp-session

     args = {

         #local.ifname = "eth0"

         #control.ip = "0.0.0.0"

         #control.port = 0

         #net.mtu = 1280

         #net.ttl = 1

         #net.loop = false

         #sess.discover-local = false

         #sess.min-ptime = 2

         #sess.max-ptime = 20

         #sess.name = "PipeWire RTP stream"

         #sess.media = "audio"

         stream.props = {

             node.name = "rtp-sink"

             #audio.format = "S16BE"

             #audio.rate = 48000

             #audio.channels = 2

             #audio.position = [ FL FR ]

         }

     }
}
]
```

Since

0.3.60


libpipewire-module-rtp-sink

title: libpipewire-module-rtp-sink(7)

summary: RTP sink

text:
# libpipewire-module-rtp-sink(7)

## NAME
libpipewire-module-rtp-sink - RTP sink

## DESCRIPTION
The rtp-sink module creates a PipeWire sink that sends audio RTP packets.

## MODULE NAME
libpipewire-module-rtp-sink

## MODULE OPTIONS
Options specific to the behavior of this module

- source.ip =<str>: source IP address, default "0.0.0.0"

- destination.ip =<str>: destination IP address, default "224.0.0.56"

- destination.port =<int>: destination port, default random between 46000 and 47024

- local.ifname = <str>: interface name to use

- net.mtu = <int>: MTU to use, default 1280

- net.ttl = <int>: TTL to use, default 1

- net.loop = <bool>: loopback multicast, default false

- sess.min-ptime = <float>: minimum packet time in milliseconds, default 2

- sess.max-ptime = <float>: maximum packet time in milliseconds, default 20

- sess.name = <str>: a session name

- rtp.ptime = <float>: size of the packets in milliseconds, default up to MTU but between sess.min-ptime and sess.max-ptime

- rtp.framecount = <int>: number of samples per packet, default up to MTU but between sess.min-ptime and sess.max-ptime

- sess.latency.msec = <float>: target node latency in milliseconds, default as rtp.ptime

- sess.ts-offset = <int>: an offset to apply to the timestamp, default -1 = random offset

- sess.ts-refclk = <string>: the name of a reference clock

- sess.media = <string>: the media type audio|midi|opus, default audio

- stream.props = {}: properties to be passed to the stream

- aes67.driver-group = <string>: for AES67 streams, can be specified in order to allow the sink to be driven by a different node than the PTP driver.

## GENERAL OPTIONS
Options with well-known behavior:

- remote.name

- audio.format

- audio.rate

- audio.channels

- audio.layout

- audio.position

- node.name

- node.description

- media.name

- node.group

- node.latency

- node.virtual

- media.class

## EXAMPLE CONFIGURATION

```
 # ~/.config/pipewire/pipewire.conf.d/my-rtp-sink.conf

 context.modules = [

 {   name = libpipewire-module-rtp-sink

     args = {

         #local.ifname = "eth0"

         #source.ip = "0.0.0.0"

         #destination.ip = "224.0.0.56"

         #destination.port = 46000

         #net.mtu = 1280

         #net.ttl = 1

         #net.loop = false

         #sess.min-ptime = 2

         #sess.max-ptime = 20

         #sess.name = "PipeWire RTP stream"

         #sess.media = "audio"

         #audio.format = "S16BE"

         #audio.rate = 48000

         #audio.channels = 2

         #audio.position = [ FL FR ]

         stream.props = {

             node.name = "rtp-sink"

         }

     }
}
]
```

Since

0.3.60


libpipewire-module-rtp-source

title: libpipewire-module-rtp-source(7)

summary: RTP source

text:
# libpipewire-module-rtp-source(7)

## NAME
libpipewire-module-rtp-source - RTP source

## DESCRIPTION
The rtp-source module creates a PipeWire source that receives audio RTP packets.

These RTP packets may contain raw PCM data, Opus encoded audio, or midi audio.

This module is usually loaded from the SAP Announce and create RTP streams so that the source.ip and source.port and format parameters matches that of the sender that is announced via SAP.

## MODULE NAME
libpipewire-module-rtp-source

## MODULE OPTIONS
Options specific to the behavior of this module

- local.ifname = <str>: interface name to use

- source.ip = <str>: the source ip address, default 224.0.0.56. Set this to the IP address you want to receive packets from or 0.0.0.0 to receive from any source address.

- source.port = <int>: the source port

- node.always-process = <bool>: true to receive even when not running

- sess.latency.msec = <float>: target network latency in milliseconds, default 100

- sess.ignore-ssrc = <bool>: ignore SSRC, default false

- sess.media = <string>: the media type audio|midi|opus, default audio

- sess.ts-direct = <bool>: use direct timestamp mode, default false (see the Buffer Modes section below)

- stream.may-pause = <bool>: pause the stream when no data is reveived, default false

- stream.props = {}: properties to be passed to the stream

## GENERAL OPTIONS
Options with well-known behavior:

- remote.name

- audio.format

- audio.rate

- audio.channels

- audio.layout

- audio.position

- media.name

- media.class

- node.name

- node.description

- node.group

- node.latency

- node.virtual

## EXAMPLE CONFIGURATION

```
# ~/.config/pipewire/pipewire.conf.d/my-rtp-source.conf
context.modules = [
{   name = libpipewire-module-rtp-source

    args = {

        #local.ifname = eth0

        #source.ip = 224.0.0.56

        #source.port = 0

        sess.latency.msec = 100

        #sess.ignore-ssrc = false

        #node.always-process = false

        #sess.media = "audio"

        #audio.format = "S16BE"

        #audio.rate = 48000

        #audio.channels = 2

        #audio.position = [ FL FR ]

        stream.props = {

           #media.class = "Audio/Source"

           node.name = "rtp-source"

        }

    }
}
]
```

## BUFFER MODES
RTP source nodes created by this module use an internal ring buffer. Received RTP audio data is written into this ring buffer. When the node's process callback is run, it reads from that ring buffer and provides audio data from it to the graph.

The sess.ts-direct option controls the buffer mode, which defines how this ring buffer is used. The RTP source nodes created by this module can operate in one of two of these buffer modes. In both modes, the RTP source node uses the timestamps of incoming RTP packets to write into the ring buffer (more specifically, at the position timestamp + latency from the sess.latency.msec option). The modes are:

1.

Constant latency mode: This is the default mode. It is used when sess.ts-direct is set to false. sess.latency.msec then defines the ideal fill level of the ring buffer. If the fill level is above or below this, then a DLL is used to adjust the consumption of the buffer contents. If the fill level is below a critical value (that's the amount of data that is needed in a cycle), or if the fill level equals the total buffer size (meaning that no more data can be fed into the buffer), the buffer contents are resynchronized, meaning that the existing contents are thrown away, and the ring buffer is reset. This buffer mode is useful for when a constant latency is desired, and the actual moment playback starts is unimportant (meaning that playback is not necessarily in sync with other devices). This mode requires no special graph driver.

2.

Direct timestamp mode: This is an alternate mode, used when sess.ts-direct is set to true. In this mode, ring buffer over- and underrun and fill level are not directly tracked; instead, they are handled implicitly. There is no constant latency maintained. The current time (more specifically, the spa_io_clock::position field of spa_io_position::clock) is directly used during playback to retrieve audio data. This assumes that a graph driver is used whose time is somehow synchronized to the sender's. Since the current time is directly used as an offset within the ring buffer, the correct data is always pulled from the ring buffer, that is, the data that shall be played now, in sync with the sender (and with other receivers). This buffer mode is useful for when receivers shall play in sync with each other, and shall use one common synchronized time, provided through the spa_io_clock . sess.latency.msec functions as a configurable assumed maximum transport delay instead of a constant latency quantity in this mode. The DLL is not used in this mode, since the graph driver is assumed to be synchronized to the sender, as said, so any output sinks in the graph will already adjust their consumption pace to match the pace of the graph driver. AES67 sessions use this mode, for example.

Since

0.3.60


libpipewire-module-session-manager

title: libpipewire-module-session-manager(7)

summary: Session Manager

text:
# libpipewire-module-session-manager(7)

## NAME
libpipewire-module-session-manager - Session Manager

## DESCRIPTION
This module implements some useful objects for implementing a session manager.

It is not yet actively used.

## MODULE NAME
libpipewire-module-session-manager


libpipewire-module-snapcast-discover

title: libpipewire-module-snapcast-discover(7)

summary: Snapcast Discover

text:
# libpipewire-module-snapcast-discover(7)

## NAME
libpipewire-module-snapcast-discover - Snapcast Discover

## DESCRIPTION
Automatically creates a Snapcast sink device based on zeroconf information.

This module will load module-protocol-simple for each announced stream that matches the rule with the create-stream action and passes the properties to the module.

If no stream.rules are given, it will create a sink for all announced snapcast servers.

A new stream will be created on the snapcast server with the given snapcast.stream-name or PipeWire-<hostname>. You will need to route this new stream to clients with the snapcast control application.

## MODULE NAME
libpipewire-module-snapcast-discover

## MODULE OPTIONS
Options specific to the behavior of this module

- snapcast.discover-local = allow discovery of local services as well. false by default.

- stream.rules = <rules>: match rules, use create-stream actions. See Protocol Simple for module properties.

### stream.rules matches

- snapcast.ip: the IP address of the snapcast server

- snapcast.port: the port of the snapcast server

- snapcast.ifindex: the interface index where the snapcast announcement was received.

- snapcast.ifname: the interface name where the snapcast announcement was received.

- snapcast.name: the name of the snapcast server

- snapcast.hostname: the hostname of the snapcast server

- snapcast.domain: the domain of the snapcast server

### stream.rules create-stream
In addition to all the properties that can be passed to Protocol Simple, you can also set:

- snapcast.stream-name: The name of the stream on a snapcast server.

- node.name: The name of the sink that is created on the sender.

## EXAMPLE CONFIGURATION

```
# ~/.config/pipewire/pipewire.conf.d/my-snapcast-discover.conf
context.modules = [
{   name = libpipewire-module-snapcast-discover

    args = {

        stream.rules = [

            {   matches = [

                    {    snapcast.ip = "~.*"

                         #snapcast.port = 1000

                         #snapcast.ifindex = 1

                         #snapcast.ifname = eth0

                         #snapcast.name = ""

                         #snapcast.hostname = ""

                         #snapcast.domain = ""

                    }

                ]

                actions = {

                    create-stream = {

                        #audio.rate = 44100

                        #audio.format = S16LE   # S16LE, S24_32LE, S32LE

                        #audio.channels = 2

                        #audio.position = [ FL FR ]

                        #

                        # The stream name as is appears on the snapcast

                        # server:

                        #snapcast.stream-name = "PipeWire"

                        #

                        # The name of the sink on the sender:

                        #node.name = "Snapcast Sink"

                        #

                        #capture = true

                        #server.address = [ "tcp:4711" ]

                        #capture.props = {

                            #target.object = ""

                            #node.latency = 2048/48000

                            #media.class = "Audio/Sink"

                        #}

                    }

                }

            }

        ]

    }
}
]
```

## SEE ALSO
Protocol Simple


libpipewire-module-spa-device

title: libpipewire-module-spa-device(7)

summary: SPA Device

text:
# libpipewire-module-spa-device(7)

## NAME
libpipewire-module-spa-device - SPA Device

## DESCRIPTION
Load and manage an SPA device.


libpipewire-module-spa-device-factory

summary: SPA Device factory

text:
# libpipewire-module-spa-device-factory(7)

## NAME
libpipewire-module-spa-device-factory - SPA Device factory

## DESCRIPTION
Provide a factory to create SPA devices.


libpipewire-module-spa-node

title: libpipewire-module-spa-node(7)

summary: SPA Node

text:
# libpipewire-module-spa-node(7)

## NAME
libpipewire-module-spa-node - SPA Node

## DESCRIPTION
Load and manage an SPA node.


libpipewire-module-spa-node-factory

title: libpipewire-module-spa-node-factory(7)

summary: SPA Node factory

text:
# libpipewire-module-spa-node-factory(7)

## NAME
libpipewire-module-spa-node-factory - SPA Node factory

## DESCRIPTION
Provide a factory to create SPA nodes.


libpipewire-module-vban-recv

title: libpipewire-module-vban-recv(7)

summary: VBAN receiver

text:
# libpipewire-module-vban-recv(7)

## NAME
libpipewire-module-vban-recv - VBAN receiver

## DESCRIPTION
The vban-recv module creates a PipeWire source that receives audio and midi VBAN packets.

The receive will listen on a specific port (6980) and create a stream for each VBAN stream received on the port.

## MODULE NAME
libpipewire-module-vban-recv

## MODULE OPTIONS
Options specific to the behavior of this module

- local.ifname = <str>: interface name to use

- source.ip = <str>: the source ip address to listen on, default 127.0.0.1

- source.port = <int>: the source port to listen on, default 6980

- node.always-process = <bool>: true to receive even when not running

- sess.latency.msec = <str>: target network latency in milliseconds, default 100

- stream.props = {}: properties to be passed to all the stream

- stream.rules = <rules>: match rules, use create-stream actions.

### stream.rules matches

- vban.ip: the IP address of the VBAN sender

- vban.port: the port of the VBAN sender

- sess.name: the name of the VBAN stream

### stream.rules create-stream
In addition to all the properties that can be passed to a stream, you can also set:

•

sess.latency.msec = <str>: target network latency in milliseconds, default 100

## GENERAL OPTIONS
Options with well-known behavior:

- remote.name

- audio.layout

- audio.position

- media.name

- media.class

- node.name

- node.description

- node.group

- node.latency

- node.virtual

## EXAMPLE CONFIGURATION

```
# ~/.config/pipewire/pipewire.conf.d/my-vban-recv.conf
context.modules = [
{   name = libpipewire-module-vban-recv

    args = {

        #local.ifname = eth0

        #source.ip = 127.0.0.1

        #source.port = 6980

        sess.latency.msec = 100

        #node.always-process = false

        #audio.position = [ FL FR ]

        stream.props = {

           #media.class = "Audio/Source"

           #node.name = "vban-receiver"

        }

        stream.rules = [

            {   matches = [

                    {    sess.name = "~.*"

                         #sess.media = "audio" | "midi"

                         #vban.ip = ""

                         #vban.port = 1000

                         #audio.channels = 2

                         #audio.format = "U8" | "S16LE" | "S24LE" | "S32LE" | "F32LE" | "F64LE"

                         #audio.rate = 44100

                    }

                ]

                actions = {

                    create-stream = {

                        stream.props = {

                            #sess.latency.msec = 100

                            #target.object = ""

                            #audio.position = [ FL FR ]

                            #media.class = "Audio/Source"

                            #node.name = "vban-receiver"

                        }

                    }

                }

            }

        ]

    }
}
]
```

Since

0.3.76


libpipewire-module-vban-send

title: libpipewire-module-vban-send(7)

summary: VBAN sender

text:
# libpipewire-module-vban-send(7)

## NAME
libpipewire-module-vban-send - VBAN sender

## DESCRIPTION
The vban-send module creates a PipeWire sink that sends audio and midi VBAN packets.

## MODULE NAME
libpipewire-module-vban-send

## MODULE OPTIONS
Options specific to the behavior of this module

- source.ip =<str>: source IP address, default "0.0.0.0"

- destination.ip =<str>: destination IP address, default "127.0.0.1"

- destination.port =<int>: destination port, default 6980

- local.ifname = <str>: interface name to use

- net.mtu = <int>: MTU to use, default 1500

- net.ttl = <int>: TTL to use, default 1

- net.loop = <bool>: loopback multicast, default false

- sess.min-ptime = <int>: minimum packet time in milliseconds, default 2

- sess.max-ptime = <int>: maximum packet time in milliseconds, default 20

- sess.name = <str>: a session name

- sess.media = <string>: the media type audio|midi, default audio

- stream.props = {}: properties to be passed to the stream

## GENERAL OPTIONS
Options with well-known behavior:

- remote.name

- audio.format

- audio.rate

- audio.channels

- audio.layout

- audio.position

- node.name

- node.description

- media.name

- node.group

- node.latency

- node.virtual

- media.class

## EXAMPLE CONFIGURATION

```
 # ~/.config/pipewire/pipewire.conf.d/my-vban-send.conf

 context.modules = [

 {   name = libpipewire-module-vban-send

     args = {

         #local.ifname = "eth0"

         #source.ip = "0.0.0.0"

         #destination.ip = "127.0.0.1"

         #destination.port = 6980

         #net.mtu = 1500

         #net.ttl = 1

         #net.loop = false

         #sess.min-ptime = 2

         #sess.max-ptime = 20

         #sess.name = "PipeWire VBAN stream"

         #sess.media = "audio"

         #audio.format = "S16LE"

         #audio.rate = 44100

         #audio.channels = 2

         #audio.position = [ FL FR ]

         stream.props = {

             node.name = "vban-sender"

         }

     }
}
]
```

Since

0.3.76


title: libpipewire-module-x11-bell(7)

summary: X11 Bell

text:
# libpipewire-module-x11-bell(7)

## NAME
libpipewire-module-x11-bell - X11 Bell

## DESCRIPTION
The x11-bell module intercept the X11 bell events and uses libcanberra to play a sound.

## MODULE NAME
libpipewire-module-x11-bell

## MODULE OPTIONS

- sink.name = <str>: node.name of the sink to connect to

- sample.name = <str>: the name of the sample to play, default 'bell-window-system'

- x11.display = <str>: the X11 display to use

- x11.xauthority = <str>: the X11 XAuthority string placed in XAUTHORITY env

## GENERAL OPTIONS
There are no general options for this module.

## EXAMPLE CONFIGURATION

```
context.modules = [

 {   name = libpipewire-module-x11-bell }

     args = {

         #sink.name = @DEFAULT_SINK@

         sample.name = "bell-window-system"

         #x11.display = ":1"

         #x11.xauthority = "test"
]
```


libpipewire-module-zeroconf-discover

title: libpipewire-module-zeroconf-discover(7)

summary: Zeroconf Discover

text:
# libpipewire-module-zeroconf-discover(7)

## NAME
libpipewire-module-zeroconf-discover - Zeroconf Discover

## DESCRIPTION
Use zeroconf to detect and load module-pulse-tunnel with the right parameters.

This will automatically create sinks and sources to stream audio to/from remote PulseAudio servers. It also works with module-protocol-pulse.

## MODULE NAME
libpipewire-module-zeroconf-discover

## MODULE OPTIONS

- pulse.discover-local = allow discovery of local services as well. false by default.

- pulse.latency: the latency to end-to-end latency in milliseconds to maintain (Default 200ms).

## EXAMPLE CONFIGURATION

```
# ~/.config/pipewire/pipewire.conf.d/my-zeroconf-discover.conf
context.modules = [
{   name = libpipewire-module-zeroconf-discover

    args = { }
}
]
```


libpipewire-modules

title: libpipewire-modules(7)

summary: PipeWire modules

text:
# libpipewire-modules(7)

## NAME
libpipewire-modules - PipeWire modules

## DESCRIPTION
A PipeWire module is effectively a PipeWire client running inside pipewire(1) which can host multiple modules. Usually modules are loaded when they are listed in the configuration files. For example the default configuration file loads several modules:

```
context.modules = [

    ...

    # The native communication protocol.

    {   name = libpipewire-module-protocol-native }

    # The profile module. Allows application to access profiler

    # and performance data. It provides an interface that is used

    # by pw-top and pw-profiler.

    {   name = libpipewire-module-profiler }

    # Allows applications to create metadata objects. It creates

    # a factory for Metadata objects.

    {   name = libpipewire-module-metadata }

    # Creates a factory for making devices that run in the

    # context of the PipeWire server.

    {   name = libpipewire-module-spa-device-factory }

    ...
]
```

## KNOWN MODULES

- libpipewire-module-access(7)

- libpipewire-module-adapter(7)

- libpipewire-module-avb(7)

- libpipewire-module-client-device(7)

- libpipewire-module-client-node(7)

- libpipewire-module-combine-stream(7)

- libpipewire-module-echo-cancel(7)

- libpipewire-module-example-filter(7)

- libpipewire-module-example-sink(7)

- libpipewire-module-example-source(7)

- libpipewire-module-fallback-sink(7)

- libpipewire-module-ffado-driver(7)

- libpipewire-module-filter-chain(7)

- libpipewire-module-jack-tunnel(7)

- libpipewire-module-jackdbus-detect(7)

- libpipewire-module-link-factory(7)

- libpipewire-module-loopback(7)

- libpipewire-module-metadata(7)

- libpipewire-module-netjack2-driver(7)

- libpipewire-module-netjack2-manager(7)

- libpipewire-module-parametric-equalizer(7)

- libpipewire-module-pipe-tunnel(7)

- libpipewire-module-portal(7)

- libpipewire-module-profiler(7)

- libpipewire-module-protocol-native(7)

- libpipewire-module-protocol-pulse(7)

- libpipewire-module-protocol-simple(7)

- libpipewire-module-pulse-tunnel(7)

- libpipewire-module-rt(7)

- libpipewire-module-raop-discover(7)

- libpipewire-module-raop-sink(7)

- libpipewire-module-rtp-sap(7)

- libpipewire-module-rtp-session(7)

- libpipewire-module-rtp-source(7)

- libpipewire-module-rtp-sink(7)

- libpipewire-module-spa-node(7)

- libpipewire-module-spa-node-factory(7)

- libpipewire-module-spa-device(7)

- libpipewire-module-spa-device-factory(7)

- libpipewire-module-snapcast-discover(7)

- libpipewire-module-vban-recv(7)

- libpipewire-module-vban-send(7)

- libpipewire-module-session-manager(7)

- libpipewire-module-zeroconf-discover(7)

- libpipewire-module-roc-source(7)

- libpipewire-module-roc-sink(7)

- libpipewire-module-x11-bell(7)

## AUTHORS
The PipeWire Developers <https://gitlab.freedesktop.org/pipewire/pipewire/issues>; PipeWire is available from <https://pipewire.org>

## SEE ALSO
pipewire(1), pipewire.conf(5)


pipewire-props

title: pipewire-props(7)

summary: PipeWire object property reference.

text:
# 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

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 as pw-cli(1) set-param command. The PARAM should be replaced with the name of the Param to set, ie. for example device.Param.Props = { ... } to set Props.

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 ID if applicable

device.product.name # string

product name 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

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 artist

media.copyright

User readable stream copyright information

media.software

User readable stream generator software information

media.language

Stream language in POSIX format. Ex: en_GB

media.filename

File name for the stream

media.icon

Icon for the media, a base64 blob with PNG image data

media.icon-name

An XDG icon name for the media. Ex: audio-x-mp3

media.comment

Extra stream comment

media.date

Date of the media

media.format

User readable stream format information

object.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 of 0 unforces 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.

A RATE of 0 means to force the rate in node.rate denominator.

node.always-process = false

When the node is active, it will always be joined with a driver node, even when nothing is linked to the node. Setting this property to true also implies node.want-driver = true.

This is the default for JACK nodes, that always need their process callback called.

node.want-driver = true

The node wants to be linked to a driver so that it can start processing. This is the default for streams and filters since 0.3.51. Nodes that are not linked to anything will still be set to the idle state, unless node.always-process is set to true.

node.pause-on-idle = false

node.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. It is possible to immediately pause a node when idle with this property.

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

Add the node to a specific loop name or loop class. By default the node is added to the data.rt loop 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 a node.name or an object.serial.

node.target = <node.name|object.id>

Where this node should be linked to. This can be a node.name or an object.id of a node. This property is deprecated, the target.object property should be used instead, which uses the more unique object.serial as 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 to true, 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. Value 0 means 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.

audio.rate = RATE

Forces a samplerate on the node.

audio.channels = INTEGER

The number of audio channels to use. Must be a value between 1 and 64.

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 as pw-cli(1) set-param command. The PARAM should be replaced with the name of the Param to set, ie. for example node.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.

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.

Below is an explanation of the options that can be tuned in the sample converter.

resample.quality = 4

The quality of the resampler. from 0 to 14, the default is 4.

The quality of a resampler depends on multiple factors:

1.

Anti-Aliasing, how well are unwanted frequencies filtered out. Poor anti-aliasing will make the original inaudible frequencies audible as distortion and noise.

2.

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.0 being the Nyquist frequency (frequency/2).

3.

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.

4.

Stopband attenuation. How well the unwanted frequencies are filtered out. This is usually measured in dB. 96dB is below audible on CD quality audio, 150dB is below the precision of floating point values.

5.

CPU usage. Better anti-aliasing needs longer filters and is therefore more CPU intensive.

6.

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 128 on a 48Khz signal has 1.3ms ((128/2)/48000) of latency.

7.

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 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:

- Tune the cutoff frequency. Increase the cutoff to preserve more high frequencies at the expense of more aliasing.

- Tune the transition band. Reduce the transition band to better filter out the frequencies around the cutoff frequency and get less aliasing at the expense of more ringing, CPU and Latency. This can be done by increasing the number of taps.

- Tune the stopband attenuation. Increase the attenuation to reduce aliasing at the expense of a wider transition band. This can only be done on the kaiser window, the exp and blackman window have 150dB and 96dB attenuation respecively.

resample.disable = false

Disable the resampler entirely. The node will only be able to negotiate with the graph when the samplerates are compatible.

resample.window = exp

The resampler window function to use. By default an exponential window function is used that gives a good balance between complexitiy and quality.

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

The resampler cutoff frequency. This is a value between 0.0 and 1.0. A value of 0.0 will use a predefined value based on the resampler quality.

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

The resampler number of taps. A value of 0 will use a predefined value based on the resampler quality or other window function parameters.

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 A parameter for the exponential window function. A value of 0.0 will use a predefined value based on the quality when the exp window 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 of 0.0 will use a predefined value based on the quality when 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. A default value of 0.0 will use a predefined value based on the quality.

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

The kaiser window transition bandwidth parameter. A default value of 0.0 will use a predefined value based on the quality.

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

The kaiser window alpha parameter. A default value of 0.0 will calculate an alpha value based on the stopband-attenuation and transition-bandwidth parameters.

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.

### 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

Disables the channel mixer completely. The stream will only be able to link to compatible sources/sinks with the exact same channel layout.

channelmix.min-volume = 0.0

channelmix.max-volume = 10.0

Gives the min and max volume values allowed. Any volume that is set will be clamped to these values.

channelmix.normalize = false

Makes sure that during such mixing & resampling original 0 dB level is preserved, so nothing sounds wildly quieter/louder.

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

Completely disable volume or mute changes. Defaults to false.

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 is 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 (see channelmix.fc-cutoff).

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

3 methods are provided to produce the rear channels in a surround sound:

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

Apply a lowpass filter to the low frequency effects. The value is expressed in Hz. Typical subwoofers have a cutoff at around 150 and 200. The default value of 0 disables the feature.

channelmix.fc-cutoff = 12000

Apply 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

Apply a delay in milliseconds when up-mixing the rear channels. This improves specialization of the sound. A typical delay of 12 milliseconds 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 will apply a 90 degree phase shift to the rear channels to improve specialization. Taps needs to be between 15 and 255 with more accurate results (and more CPU consumption) for higher values.

This is only active when the psd up-mix method is used.

dither.noise = 0

This option will add N bits of random data to the signal. When no dither.method is specified, the random data will flip between [-(1<<(N-1)), 0] every 1024 samples. With a dither.method, the dither noise is amplified with 1<<(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 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

Optional dithering can be done on the quantized output signal.

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 = ""

Make the stream to also write the raw samples to a WAV file for debugging purposes.

### Other Parameters
These control low-level technical features:

clock.quantum-limit

See pipewire.conf(5)

resample.peaks = false # boolean

Instead of actually resampling, produce peak amplitude values as output. This is used for volume monitoring, where it is set as a property of the "recording" stream.

resample.prefill = false # boolean

Prefill resampler buffers with silence. This affects the initial samples produced by the resampler.

adapter.auto-port-config = null # JSON

If specified, configure the ports of the node when it is created, instead of leaving that to the session manager to do. This is useful (only) for minimal configurations without a session manager.

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 = true # boolean

Use ALSA Card Profiles (ACP) for device configuration. This autodetects available ALSA devices and configures port and hardware mixers.

alsa.use-ucm # boolean

Enable or disable UCM for all devices. Default: unset.

alsa.udev.expose-busy # boolean

Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some of the PCMs are in use by other applications but the other free PCMs should still be exposed.

### Device properties
api.alsa.path # string

ALSA device path as can be used in snd_pcm_open() and snd_ctl_open().

api.alsa.use-ucm = true # boolean

When ACP is enabled and a UCM configuration is available for a device, by default it is used instead of the ACP profiles. This option allows you to disable this and use the ACP profiles instead.

This option does nothing if alsa.use-acp is set to false.

api.alsa.soft-mixer = false # boolean

Setting this option to true will disable the hardware mixer for volume control and mute. All volume handling will then use software volume and mute, leaving the hardware mixer untouched. This can be interesting to work around bugs in the mixer detection or decibel reporting. The hardware mixer will still be used to mute unused audio paths in the device. Use api.alsa.disable-mixer-path to also disable mixer path selection.

api.alsa.disable-mixer-path = false # boolean

Setting this option to true will disable the hardware mixer path selection. The hardware mixer path is the configuration of the mixer depending on the jacks that are inserted in the card. If this is disabled, you will have to manually enable and disable mixer controls but it can be used to work around bugs in the mixer. The hardware mixer will still be used for volume and mute. Use api.alsa.soft-mixer to also disable hardware volume and mute.

api.alsa.ignore-dB = false # boolean

Setting this option to true will ignore the decibel setting configured by the driver. Use this when the driver reports wrong settings.

device.profile-set # string

This option can be used to select a custom ACP profile-set name for the device. This can be configured in UDev rules, but it can also be specified here. The default is to use "default.conf" unless there is a matching udev rule.

device.profile # string

The initial active profile name. The default is to start from the "Off" profile and then let session manager select 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, as it handles this task instead. This can be enabled in custom configurations without the session manager handling this.

api.acp.auto-port = true # boolean

Automatically select the highest priority port that is available ("port" is a PulseAudio/ACP term, the equivalent of a "Route" in PipeWire). The session manager usually disables this, as it handles this task instead. This can be enabled in custom configurations without the session manager handling this.

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 will be used but with this setting this can be reduced, which can make it possible to use other samplerates on some devices.

api.alsa.split-enable # boolean

For UCM devices with split PCMs, don't split to multiple PCMs using alsa-lib plugins, but instead add api.alsa.split properties to emitted nodes with PCM splitting information.

api.acp.disable-pro-audio = false # boolean

Disable the "Pro Audio" profile for this device.

api.acp.use-eld-channels = false # boolean

Use the channel count and mapping the connected HDMI device provides via ELD information.

### Node properties
audio.channels # integer

The number of audio channels to open the device with. Defaults depends on the profile of the device.

audio.rate # integer

The audio rate to open the device with. Default is 0, which means to open the device with a rate as close to the graph rate as possible.

audio.format # string

The audio format to open the device in. By default this is "UNKNOWN", which will open the device in the best possible bits (32/24/16/8..). You can force a format like S16_LE or S32_LE.

audio.position # JSON array of strings

The audio position of the channels in the device. This is 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. 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

The period size to open the device in. By default this is 0, which will open 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 is 0, which means to use as many as possible.

api.alsa.headroom # integer

The amount of extra space to keep in the ringbuffer. The default is 0. Higher values can be configured when the device read and write pointers are not accurately reported.

api.alsa.start-delay = 0 # integer

Some devices need some time before they can report accurate hardware pointer positions. In those cases, an extra start delay can be added to compensate for this startup delay. This sets the startup delay in samples.

api.alsa.disable-mmap = false # boolean

Disable mmap operation of the device and use the ALSA read/write API instead. Default is false, mmap is preferred.

api.alsa.disable-batch # boolean

Ignore the ALSA batch flag. If the batch flag is set, ALSA will need an extra period to update the read/write pointers. Ignore this flag from ALSA can reduce the latency. Default is false.

api.alsa.use-chmap # boolean

Use the driver provided channel map. Default is true when using UCM, false otherwise because many driver don't report this correctly.

api.alsa.multi-rate # boolean

Allow devices from the same card to be opened in multiple sample rates. Default is true. Some older drivers did not properly advertise the capabilities of the device and only really supported opening the device in one rate.

api.alsa.htimestamp = false # boolean

Use ALSA htimestamps in scheduling, instead of the system clock. Some ALSA drivers produce bad timestamps, so this is not enabled by default and will be disabled at runtime if it looks like the ALSA timestamps are bad.

api.alsa.htimestamp.max-errors # integer

Specify the number of consecutive errors before htimestamp is disabled. Setting this to 0 makes htimestamp never get disabled.

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 is expected it works 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.

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 is expected it works on the hardware.

latency.internal.rate # integer

Static set the device systemic latency, in samples at playback rate.

latency.internal.ns # integer

Static set the device systemic latency, in nanoseconds.

api.alsa.path # string

UNDOCUMENTED

api.alsa.pcm.card # integer

Card index to open. Usually determined from api.alsa.path.

api.alsa.open.ucm # boolean

Open 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

api.alsa.split.parent # boolean

PCM is UCM SplitPCM parent PCM, to be opened with SplitPCM set.

api.alsa.split.position # JSON

(SPA JSON list) If present, this is a virtual device corresponding to a subset of channels in an underlying PCM, listed in this property. Informative property.

api.alsa.split.hw-position # JSON

(SPA JSON list) Channel map of the underlying split PCM. Informative property.

api.alsa.dsd-lsb = false # boolean

Use LSB bit order for DSD audio output.

## ALSA MIDI PROPERTIES

### Node properties
For ALSA MIDI in Wireplumber, MIDI bridge node properties are configured in the monitor properties.

api.alsa.seq.ump = true # boolean

Use MIDI 2.0 if possible.

api.alsa.seq.min-pool = 500 # integer

UNDOCUMENTED

api.alsa.seq.max-pool = 2000 # integer

UNDOCUMENTED

clock.name = "clock.system.monotonic" # string

Clock to follow.

api.alsa.path = "default" # string

Sequencer device to use.

api.alsa.disable-longname = true # boolean

If card long name should not be passed to MIDI port.

## 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

Enabled roles.

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

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.

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

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 workaround some headset timeout disconnection when the HFP HF is used by another application than telephony one, e.g. a conference application/website. This prevent to send 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 fo 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. 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

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 the server.

bluez5.bap-server-capabilities.sink.supported-contexts # integer

Supported sink contexts PACS bitmask of the 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 the server.

bluez5.bap-server-capabilities.source.supported-contexts # integer

Supported source contexts PACS bitmask of the 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.

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

BAP QoS latency that needs to be applied for vendor defined preset This property is experimental. Default: as QoS preset.

bluez5.bap.delay = 40000 # integer

BAP QoS delay that needs to be applied for vendor defined preset This property is experimental. Default: as per QoS preset.

bluez5.framing = false # boolean

BAP QoS framing that needs to be applied for vendor defined preset This property is experimental. Default: as per QoS preset.

bluez5.bap.force-target-latency = "balanced" # string

BAP QoS target latency profile forced for QoS configuration selection. If not set or set to "balanced", both low-latency and high-reliability QoS configuration table are used. This property is experimental. Available: low-latency, high-reliability, balanced

### Node properties
bluez5.media-source-role # string

Media source role for Bluetooth clients connecting to this instance. Available values:

- playback: playing stream to speakers

- input: appear as source node.

bluez5.decode-buffer.latency # integer

Applies on media source nodes and defines the target amount of samples to be buffered on the output of the decoder. Default: 0, which means it is automatically determined.

node.latency-offset-msec # string

Applies only for BLE MIDI nodes. Latency adjustment to apply on the node. Larger values add a constant latency, but reduces timing jitter caused by Bluetooth transport.

bluez5.debug.iso-mono = false # boolean

Debugging option for forcing ISO sinks send identical packets out for all streams.

## 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

Key Names in the API documentation for a full list.

## LINK PROPERTIES
Link properties are usually not directly configurable via PipeWire configuration files, as they are determined by applications creating them.

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, 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

Only the properties pipewire.* are safe to use for security purposes such as identifying applications and their capabilities, as clients can set and change other properties freely.

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

Client pid, set by protocol.

Note that for PulseAudio applications, this is the PID of the pipewire-pulse process.

See also

Key Names in the API documentation for a full list.

## 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

- alsa.use-ucm

- api.alsa.disable-longname

- api.alsa.path

- api.alsa.seq.max-pool

- api.alsa.seq.min-pool

- api.alsa.seq.ump

- 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.bap-server-capabilities.channels

- bluez5.bap-server-capabilities.durations

- bluez5.bap-server-capabilities.framelen_max

- bluez5.bap-server-capabilities.framelen_min

- bluez5.bap-server-capabilities.max_frames

- bluez5.bap-server-capabilities.rates

- bluez5.bap-server-capabilities.sink.contexts

- bluez5.bap-server-capabilities.sink.delay-max

- bluez5.bap-server-capabilities.sink.delay-min

- bluez5.bap-server-capabilities.sink.locations

- bluez5.bap-server-capabilities.sink.preferred-delay-max

- bluez5.bap-server-capabilities.sink.preferred-delay-min

- bluez5.bap-server-capabilities.sink.supported-contexts

- bluez5.bap-server-capabilities.source.contexts

- bluez5.bap-server-capabilities.source.delay-max

- bluez5.bap-server-capabilities.source.delay-min

- bluez5.bap-server-capabilities.source.locations

- bluez5.bap-server-capabilities.source.preferred-delay-max

- bluez5.bap-server-capabilities.source.preferred-delay-min

- bluez5.bap-server-capabilities.source.supported-contexts

- bluez5.bap-server-gmap-features

- bluez5.bap-server-tmap-features

- bluez5.bcast_source.config

- bluez5.codecs

- bluez5.default.channels

- bluez5.default.rate

- bluez5.disable-dummy-call

- bluez5.dummy-avrcp

- bluez5.enable-hw-volume

- bluez5.enable-msbc

- bluez5.enable-sbc-xq

- bluez5.hfphsp-backend

- bluez5.hfphsp-backend-native-modem

- bluez5.hfphsp-backend-native-pts

- bluez5.hw-offload-datapath

- bluez5.hw-offload-sco

- bluez5.roles

- clock.name

### Device properties

- api.acp.auto-port

- api.acp.auto-profile

- api.acp.disable-pro-audio

- api.acp.pro-channels

- api.acp.probe-rate

- api.acp.use-eld-channels

- api.alsa.disable-mixer-path

- api.alsa.ignore-dB

- api.alsa.path

- api.alsa.soft-mixer

- api.alsa.split-enable

- api.alsa.split.parent

- 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.bap.delay

- bluez5.bap.force-target-latency

- bluez5.bap.latency

- bluez5.bap.preset

- bluez5.bap.rtn

- bluez5.framing

- 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-ctl.NAME

- api.alsa.bind-ctls

- api.alsa.disable-batch

- api.alsa.disable-mmap

- api.alsa.disable-tsched

- api.alsa.dll-bandwidth-max

- api.alsa.dsd-lsb

- api.alsa.headroom

- api.alsa.htimestamp

- api.alsa.htimestamp.max-errors

- api.alsa.multi-rate

- api.alsa.open.ucm

- api.alsa.path

- api.alsa.pcm.card

- api.alsa.period-num

- api.alsa.period-size

- api.alsa.split.hw-position

- api.alsa.split.position

- api.alsa.start-delay

- api.alsa.use-chmap

- audio.allowed-rates

- audio.channels

- audio.format

- audio.layout

- audio.position

- audio.rate

- bluez5.debug.iso-mono

- bluez5.decode-buffer.latency

- 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-fallback

- node.dont-move

- node.dont-reconnect

- node.exclusive

- node.force-quantum

- node.force-rate

- node.latency

- node.latency-offset-msec

- node.link-group

- node.lock-quantum

- node.lock-rate

- node.loop.class

- node.loop.name

- node.name

- node.nick

- 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.cutoff

- resample.disable

- resample.n-taps

- resample.param.blackman.alpha

- resample.param.exp.A

- resample.param.kaiser.alpha

- resample.param.kaiser.stopband-attenuation

- resample.param.kaiser.transition-bandwidth

- resample.peaks

- resample.prefill

- resample.quality

- resample.window

- session.suspend-timeout-seconds

- state.restore-props

- 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
pipewire.conf(5)


pipewire-pulse-module-alsa-sink

title: pipewire-pulse-module-alsa-sink(7)

summary: ALSA Sink

text:
# pipewire-pulse-module-alsa-sink(7)

## NAME
pipewire-pulse-module-alsa-sink - ALSA Sink

## MODULE NAME
module-alsa-sink

## MODULE OPTIONS

- name: name of the sink, to be prefixed

- sink_name: name for the sink

- sink_properties: properties for the sink

- namereg_fail: when false attempt to synthesise new sink_name if it is already taken

- device: ALSA device

- device_id: ALSA card index

- format: sample format

- rate: sample rate

- alternate_rate: alternate sample rate

- channels: number of channels

- channel_map: channel map

- fragments: number of fragments

- fragment_size: fragment size

- mmap: enable memory mapping?

- tsched: enable system timer based scheduling mode?

- tsched_buffer_size: buffer size when using timer based scheduling

- tsched_buffer_watermark: lower fill watermark

- control: name of mixer control, or name and index separated by a comma

- rewind_safeguard: number of bytes that cannot be rewound

- deferred_volume: Synchronize software and hardware volume changes to avoid momentary jumps?

- deferred_volume_safety_margin: usec adjustment depending on volume direction

- deferred_volume_extra_delay: usec adjustment to HW volume changes

- fixed_latency_range: disable latency range changes on underrun?


pipewire-pulse-module-alsa-source

title: pipewire-pulse-module-alsa-source(7)

summary: ALSA Source

text:
# pipewire-pulse-module-alsa-source(7)

## NAME
pipewire-pulse-module-alsa-source - ALSA Source

## MODULE NAME
module-alsa-source

## MODULE OPTIONS

- name: name of the source, to be prefixed

- source_name: name for the source

- source_properties: properties for the source

- namereg_fail: when false attempt to synthesise new source_name if it is already taken

- device: ALSA device

- device_id: ALSA card index

- format: sample format

- rate: sample rate

- alternate_rate: alternate sample rate

- channels: number of channels

- channel_map: channel map

- fragments: number of fragments

- fragment_size: fragment size

- mmap: enable memory mapping?

- tsched: enable system timer based scheduling mode?

- tsched_buffer_size: buffer size when using timer based scheduling

- tsched_buffer_watermark: lower fill watermark

- control: name of mixer control, or name and index separated by a comma

- rewind_safeguard: number of bytes that cannot be rewound

- deferred_volume: Synchronize software and hardware volume changes to avoid momentary jumps?

- deferred_volume_safety_margin: usec adjustment depending on volume direction

- deferred_volume_extra_delay: usec adjustment to HW volume changes

- fixed_latency_range: disable latency range changes on underrun?


pipewire-pulse-module-always-sink

title: pipewire-pulse-module-always-sink(7)

summary: Always Sink

text:
# pipewire-pulse-module-always-sink(7)

## NAME
pipewire-pulse-module-always-sink - Always Sink

## MODULE NAME
module-always-sink

## MODULE OPTIONS
•

sink_name: name of sink


pipewire-pulse-module-combine-sink

title: pipewire-pulse-module-combine-sink(7)

summary: Combine Sink

text:
# pipewire-pulse-module-combine-sink(7)

## NAME
pipewire-pulse-module-combine-sink - Combine Sink

## MODULE NAME
module-combine-sink

## MODULE OPTIONS

- sink_name: name of the sink

- sink_properties: properties for the sink

- sinks: sinks to combine

- rate: sample rate

- channels: number of channels

- channel_map: channel map

- remix: remix channels

- latency_compensate: bool

## SEE ALSO
libpipewire-module-combine-stream