pipewire.conf(5) File Formats Manual pipewire.conf(5) (NAME) pipewire.conf - PipeWire (DESCRIPTION) PipeWire (SYNOPSIS) $XDG_CONFIG_HOME/pipewire/pipewire.conf /etc/pipewire/pipewire.conf /usr/share/pipewire/pipewire.conf /usr/share/pipewire/pipewire.conf.d/ /etc/pipewire/pipewire.conf.d/ $XDG_CONFIG_HOME/pipewire/pipewire.conf.d/ (DESCRIPTION) (PipeWire) . . . (SYNOPSIS) . PIPEWIRE_CONFIG_DIR PIPEWIRE_CONFIG_PREFIX PIPEWIRE_CONFIG_NAME . PipeWire pipewire.conf . (DROP-IN CONFIGURATION FILES) *.conf pipewire.conf.d/ . (Dictionary) (Array) . (Drop-in) . pipewire.conf . (Example) ~/.config/pipewire/pipewire.conf.d/custom.conf default.clock.min- quantum pipewire.conf: # ~/.config/pipewire/pipewire.conf.d/custom.conf context.properties = { default.clock.min-quantum = 128 } (CONFIGURATION FILE FORMAT) JSON "SPA" . (Top-level) . (Dictionary) { } (Array) [ ] . KEY = VALUE . : context.properties = { # top-level dictionary section key1 = value # a simple value key2 = { key1 = value1 key2 = value2 } # a dictionary with two entries key3 = [ value1 value2 ] # an array with two entries key4 = [ { k = v1 } { k = v2 } ] # an array of dictionaries } context.modules = [ # top-level array section value1 value2 ] JSON "SPA" . JSON "SPA": o : = . o " . o , (whitespace) . o # () . (CONFIGURATION FILE SECTIONS) context.properties (Dictionary). PipeWire . context.spa-libs (Dictionary). (globs) spa . context.modules . name args flags . . context.objects . factory . context.exec . path args . (Session Manager) . . node.rules . (Node) . device.rules . (Device) . (CONTEXT PROPERTIES) PipeWire context.properties . clock.power-of-two-quantum = true . . context.data-loop.library.name.system (Data processing thread). (Realtime) EVL . loop.rt-prio = -1 . . -1 module-rt . 0 . loop.class = [ data.rt .. ] . . data.rt . context.num-data-loops = 1 . . 0 . -1 CPU . context.data-loops = [ ... ] . : # ~/.config/pipewire/pipewire.conf.d/custom.conf context.data-loops = [ { #library.name.system = support/libspa-support loop.rt-prio = -1 loop.class = [ data.rt .. ] thread.name = data-loop.0 thread.affinity = [ 0 1 ] } ... ] loop.rt-prio loop.class thread.name . thread.affinity CPU (Pin) . core.daemon = false PipeWire . . core.name . core.name = pipewire-0 PipeWire. PipeWire . cpu.zero.denormals = false (CPU) (denormals) . . cpu.vm.name = null . . default.clock.rate = 48000 min/max/default . . default.clock.allowed-rates = [ ] . (Idle) . . min/max/default . default.clock.min-quantum = 32 . default.clock.max-quantum = 8192 . default.clock.quantum = 1024 . default.clock.quantum-limit = 8192 . . default.clock.quantum-floor = 4 . . default.video.width . default.video.height . default.video.rate.num . default.video.rate.denom . library.name.system = support/libspa-support . link.max-buffers = 64 . . . log.level = 2 . mem.allow-mlock = true (mlock) . swap . mem.warn-mlock = false . mem.mlock-all = false . rlimit.nofile = 4096 (File descriptor) . -1 / . 1024 select() . select() . rlimit.*resource* = value . resource : as core cpu data fsize locks memlock msgqueue nice nofile nproc rss rtprio rttime sigpending stack. setrlimit . -1 . settings.check-quantum = false . settings.check-rate = false . support.dbus = true DBus. DBus . DBus . vm.overrides = { default.clock.min-quantum = 1024 } vm.overrides PipeWire context.properties . context.properties.rules . context.modules.allow-empty = false context.modules . true . . context.modules context.objects . SPA (SPA LIBRARIES) SPA (factory-name) . . context.spa-libs factory-name . (Wildcard) . factory-name . (Example) # ~/.config/pipewire/pipewire.conf.d/custom.conf context.spa-libs = { audio.convert.* = audioconvert/libspa-audioconvert avb.* = avb/libspa-avb api.alsa.* = alsa/libspa-alsa api.v4l2.* = v4l2/libspa-v4l2 api.libcamera.* = libcamera/libspa-libcamera api.bluez5.* = bluez5/libspa-bluez5 api.vulkan.* = vulkan/libspa-vulkan api.jack.* = jack/libspa-jack support.* = support/libspa-support video.convert.* = videoconvert/libspa-videoconvert } (MODULES) PipeWire . libpipewire-modules(7) . # ~/.config/pipewire/pipewire.conf.d/custom.conf context.modules = [ #{ name = MODULENAME # ( args = { KEY = VALUE ... } ) # ( flags = [ ( ifexists ) ( nofail ) ] ) # ( condition = [ { KEY = VALUE ... } ... ] ) #} # ] name . args = { } . flags = [ ] . ifexists nofail PipeWire . condition = [ ] matches (Match rule). . (CONTEXT OBJECTS) context.objects ( context.modules ). # ~/.config/pipewire/pipewire.conf.d/custom.conf context.objects = [ #{ factory = # ( args = { = ... } ) # ( flags = [ ( nofail ) ] ) # ( condition = [ { = ... } ... ] ) #} ] . factory . args = { } . flags = [ ] nofail PipeWire . condition = [ ] matches (Match rule). . (Example) (Dummy driver node) core.daemon true : # ~/.config/pipewire/pipewire.conf.d/custom.conf context.objects = [ { factory = spa-node-factory args = { factory.name = support.node.driver node.name = Dummy-Driver node.group = pipewire.dummy priority.driver = 20000 }, condition = [ { core.daemon = true } ] } ] (COMMAND EXECUTION) context.exec PipeWire . # ~/.config/pipewire/pipewire.conf.d/custom.conf context.exec = [ #{ path = # ( args = "" | [ ... ] ) # ( condition = [ { = ... } ... ] ) #} ] path . args . condition matches (Match rule). . (Example) pactl : # ~/.config/pipewire/pipewire.conf.d/custom.conf context.exec = [ { path = "pactl" args = "load-module module-always-sink" } ] (MATCH RULES) . ( ) . : = [ { matches = [ # # { # = # . ! . ~ . #application.process.binary = "teams" #application.name = "~speech-dispatcher.*" # null #pipewire.sec.flatpak = null } { # ... } ... ] actions = { = ... } } ] . JSON : matches actions. matches true actions true . matches JSON . - . - AND matches OR . actions JSON - true . update-props . matches (Regular expressions) . my_ : matches = [ { node.name = "~my_.*" } ] ~ . POSIX regex (7) . ! . my_ : matches = [ { node.name = "!~my_.*" } ] ! . my_node : matches = [ { node.name = "!my_node" } ] null ( ). : matches = [ { node.name = null } ] !null : matches = [ { node.name = "!null" } { node.name = !null # } ] "null" (Escape) . "null" : matches = [ { node.name = "null" } ] "null" : matches = [ { node.name = "!\"null\"" } { node.name = !"null" # } ] (CONTEXT PROPERTIES RULES) context.properties.rules . (VM) . cpu.vm.name VM . : # ~/.config/pipewire/pipewire.conf.d/custom.conf context.properties.rules = [ { matches = [ { cpu.vm.name = !null } ] actions = { update-props = { # . default.clock.min-quantum = 1024 } } } } (NODE RULES) node.rules . . node.rules update-props . node.rules : # ~/.config/pipewire/pipewire.conf.d/custom.conf node.rules = [ { matches = [ { # . ! . ~ . client.name = "jack_simple_client" } ] actions = { update-props = { node.force-quantum = 512 } } } ] node.force-quantum jack_simple_client 512 . (DEVICE RULES) device.rules . . device.rules update-props . device.rules : # ~/.config/pipewire/pipewire.conf.d/custom.conf device.rules = [ { matches = [ { # . ! . ~ . device.name = ""v4l2_device.pci-0000_00_14.0-usb-0_1.2_1.0 } ] actions = { update-props = { device.description = "My Webcam" } } } ] device.description device.name "My Webcam" . (AUTHORS) (The PipeWire Developers) . (SEE ALSO) pipewire(1), pw-mon(1), libpipewire-modules(7) pipewire-pulse.conf(5) pipewire-client.conf(5) PipeWire 1.6.8 pipewire.conf(5)