context.properties = { ## Configure properties in the system. #library.name.system = support/libspa-support #context.data-loop.library.name.system = support/libspa-support #support.dbus = true #link.max-buffers = 64 link.max-buffers = 16 # version < 3 clients can't handle more #mem.warn-mlock = false #mem.allow-mlock = true #mem.mlock-all = false #clock.power-of-two-quantum = true #log.level = 2 #cpu.zero.denormals = false core.daemon = true # listening for socket connections core.name = pipewire-0 # core name and socket name ## Properties for the DSP configuration. # default.clock.rate = 48000 default.clock.allowed-rates = [ 44100 48000 88200 96000, 176400 192000 352800 384000 705600 768000 ] default.clock.quantum = 1024 default.clock.min-quantum = 128 default.clock.max-quantum = 2048 #default.clock.quantum-limit = 8192 #default.video.width = 640 #default.video.height = 480 #default.video.rate.num = 25 #default.video.rate.denom = 1 # #settings.check-quantum = false #settings.check-rate = false # # These overrides are only applied when running in a vm. vm.overrides = { default.clock.min-quantum = 1024 } # keys checked below to disable module loading module.x11.bell = true # enables autoloading of access module, when disabled an alternative # access module needs to be loaded. module.access = true # enables autoloading of module-jackdbus-detect module.jackdbus-detect = true } context.spa-libs = { # = # # Used to find spa factory names. It maps an spa factory name # regular expression to a library name that should contain # that factory. # 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 #videotestsrc = videotestsrc/libspa-videotestsrc #audiotestsrc = audiotestsrc/libspa-audiotestsrc } context.modules = [ #{ name = # ( args = { = ... } ) # ( flags = [ ( ifexists ) ( nofail ) ] ) # ( condition = [ { = ... } ... ] ) #} # # Loads a module with the given parameters. # If ifexists is given, the module is ignored when it is not found. # If nofail is given, module initialization failures are ignored. # If condition is given, the module is loaded only when the context # properties all match the match rules. # # Uses realtime scheduling to boost the audio thread priorities. This uses # RTKit if the user doesn't have permission to use regular realtime # scheduling. You can also clamp utilisation values to improve scheduling # on embedded and heterogeneous systems, e.g. Arm big.LITTLE devices. { name = libpipewire-module-rt args = { nice.level = -11 #rt.prio = 88 #rt.time.soft = -1 #rt.time.hard = -1 #uclamp.min = 0 #uclamp.max = 1024 } flags = [ ifexists nofail ] } # The native communication protocol. { name = libpipewire-module-protocol-native args = { # List of server Unix sockets, and optionally permissions #sockets = [ { name = "pipewire-0" }, { name = "pipewire-0-manager" } ] } } # 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 } # Creates a factory for making nodes that run in the # context of the PipeWire server. { name = libpipewire-module-spa-node-factory } # Allows creating nodes that run in the context of the # client. Is used by all clients that want to provide # data to PipeWire. { name = libpipewire-module-client-node } # Allows creating devices that run in the context of the # client. Is used by the session manager. { name = libpipewire-module-client-device } # The portal module monitors the PID of the portal process # and tags connections with the same PID as portal # connections. { name = libpipewire-module-portal flags = [ ifexists nofail ] } # The access module can perform access checks and block # new clients. { name = libpipewire-module-access args = { # Socket-specific access permissions #access.socket = { pipewire-0 = "default", pipewire-0-manager = "unrestricted" } # Deprecated legacy mode (not socket-based), # for now enabled by default if access.socket is not specified #access.legacy = true } condition = [ { module.access = true } ] } # Makes a factory for wrapping nodes in an adapter with a # converter and resampler. { name = libpipewire-module-adapter } # Makes a factory for creating links between ports. { name = libpipewire-module-link-factory } # Provides factories to make session manager objects. { name = libpipewire-module-session-manager } # Use libcanberra to play X11 Bell { name = libpipewire-module-x11-bell args = { #sink.name = "" #sample.name = "bell-window-system" #x11.display = null #x11.xauthority = null } flags = [ ifexists nofail ] condition = [ { module.x11.bell = true } ] } { name = libpipewire-module-jackdbus-detect args = { #jack.library = libjack.so.0 #jack.server = null #jack.client-name = PipeWire #jack.connect = true #tunnel.mode = duplex # source|sink|duplex source.props = { #audio.channels = 2 #midi.ports = 1 #audio.position = [ FL FR ] # extra sink properties } sink.props = { #audio.channels = 2 #midi.ports = 1 #audio.position = [ FL FR ] # extra sink properties } } flags = [ ifexists nofail ] condition = [ { module.jackdbus-detect = true } ] } ] context.objects = [ #{ factory = # ( args = { = ... } ) # ( flags = [ ( nofail ) ] ) # ( condition = [ { = ... } ... ] ) #} # # Creates an object from a PipeWire factory with the given parameters. # If nofail is given, errors are ignored (and no object is created). # If condition is given, the object is created only when the context properties # all match the match rules. # #{ factory = spa-node-factory args = { factory.name = videotestsrc node.name = videotestsrc node.description = videotestsrc "Spa:Pod:Object:Param:Props:patternType" = 1 } } #{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] } #{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } } #{ factory = spa-node-factory args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } } #{ factory = adapter args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } } #{ factory = spa-node-factory args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } } # A default dummy driver. This handles nodes marked with the "node.always-driver" # property when no other driver is currently active. JACK clients need this. { factory = spa-node-factory args = { factory.name = support.node.driver node.name = Dummy-Driver node.group = pipewire.dummy priority.driver = 20000 #clock.id = monotonic # realtime | tai | monotonic-raw | boottime #clock.name = "clock.system.monotonic" } } { factory = spa-node-factory args = { factory.name = support.node.driver node.name = Freewheel-Driver priority.driver = 19000 node.group = pipewire.freewheel node.freewheel = true } } # This creates a new Source node. It will have input ports # that you can link, to provide audio for this source. #{ factory = adapter # args = { # factory.name = support.null-audio-sink # node.name = "my-mic" # node.description = "Microphone" # media.class = "Audio/Source/Virtual" # audio.position = "FL,FR" # } #} # This creates a single PCM source device for the given # alsa device path hw:0. You can change source to sink # to make a sink in the same way. #{ factory = adapter # args = { # factory.name = api.alsa.pcm.source # node.name = "alsa-source" # node.description = "PCM Source" # media.class = "Audio/Source" # api.alsa.path = "hw:0" # api.alsa.period-size = 1024 # api.alsa.headroom = 0 # api.alsa.disable-mmap = false # api.alsa.disable-batch = false # audio.format = "S16LE" # audio.rate = 48000 # audio.channels = 2 # audio.position = "FL,FR" # } #} # Use the metadata factory to create metadata and some default values. #{ factory = metadata # args = { # metadata.name = my-metadata # metadata.values = [ # { key = default.audio.sink value = { name = somesink } } # { key = default.audio.source value = { name = somesource } } # ] # } #} ] context.exec = [ #{ path = # ( args = "" ) # ( condition = [ { = ... } ... ] ) #} # # Execute the given program with arguments. # If condition is given, the program is executed only when the context # properties all match the match rules. # # You can optionally start the session manager here, # but it is better to start it as a systemd service. # Run the session manager with -h for options. # #{ path = "/nix/store/n5azqf4qgng00pzdw0xzg7dqjfvsfcgs-pipewire-0.3.85/bin/pipewire-media-session" args = "" # condition = [ { exec.session-manager = null } { exec.session-manager = true } ] } # # You can optionally start the pulseaudio-server here as well # but it is better to start it as a systemd service. # It can be interesting to start another daemon here that listens # on another address with the -a option (eg. -a tcp:4713). # #{ path = "/nix/store/n5azqf4qgng00pzdw0xzg7dqjfvsfcgs-pipewire-0.3.85/bin/pipewire" args = "-c pipewire-pulse.conf" # condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] } ]