# Client config file for PipeWire version "1.6.8" #
#
# Copy and edit this file in /etc/pipewire for system-wide changes
# or in ~/.config/pipewire for local changes.
#
# It is also possible to place a file with an updated section in
# /etc/pipewire/client.conf.d/ for system-wide changes or in
# ~/.config/pipewire/client.conf.d/ for local changes.
#

context.properties = {
    ## Configure properties in the system.
    #mem.warn-mlock  = false
    #mem.allow-mlock = true
    #mem.mlock-all   = false
    log.level        = 0

    #default.clock.quantum-limit = 8192
}

context.spa-libs = {
    #<factory-name regex> = <library-name>
    #
    # 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
    support.*       = support/libspa-support
    video.convert.* = videoconvert/libspa-videoconvert
}

context.modules = [
    #{ name = <module-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( ifexists ) ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # 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.
    #
    # Uses realtime scheduling to boost the audio thread priorities
    { name = libpipewire-module-rt
        args = {
            #rt.prio      = 83
            #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 ]
        condition = [ { module.rt = !false } ]
    }

    # The native communication protocol.
    { name = libpipewire-module-protocol-native }

    # 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
        condition = [ { module.client-node = !false } ]
    }

    # Allows creating devices that run in the context of the
    # client. Is used by the session manager.
    { name = libpipewire-module-client-device
        condition = [ { module.client-device = !false } ]
    }

    # Makes a factory for wrapping nodes in an adapter with a
    # converter and resampler.
    { name = libpipewire-module-adapter
        condition = [ { module.adapter = !false } ]
    }

    # Allows applications to create metadata objects. It creates
    # a factory for Metadata objects.
    { name = libpipewire-module-metadata
        condition = [ { module.metadata = !false } ]
    }

    # Provides factories to make session manager objects.
    { name = libpipewire-module-session-manager
        condition = [ { module.session-manager = !false } ]
    }
]

filter.properties = {
    #node.latency = 1024/48000
}

stream.properties = {
    #node.latency          = 1024/48000
    #node.autoconnect      = true
    #resample.quality      = 4
    #channelmix.normalize  = false
    #channelmix.mix-lfe    = true
    #channelmix.upmix      = true
    #channelmix.upmix-method = psd  # none, simple
    #channelmix.lfe-cutoff = 150
    #channelmix.fc-cutoff  = 12000
    #channelmix.rear-delay = 12.0
    #channelmix.stereo-widen = 0.0
    #channelmix.hilbert-taps = 0
    #dither.noise = 0
}

stream.rules = [
    {   matches = [
            {
                # all keys must match the value. ! negates. ~ starts regex.
                #application.name       = "pw-cat"
                #node.name 		= "~Google Chrome$"
            }
        ]
        actions = {
            update-props = {
                #node.latency = 512/48000
            }
        }
    }
]

alsa.properties = {
    #alsa.deny = false
    # ALSA params take a single value, an array [] of values
    # or a range { min=.. max=... }
    #alsa.access = [ MMAP_INTERLEAVED MMAP_NONINTERLEAVED RW_INTERLEAVED RW_NONINTERLEAVED ]
    #alsa.format = [ FLOAT S32 S24 S24_3 S16 U8 ]
    #alsa.rate = { min=1 max=384000 }		# or [ 44100 48000 .. ]
    #alsa.channels = { min=1 max=64 }		# or [ 2 4 6 .. ]
    #alsa.period-bytes = { min=128 max=2097152 } # or [ 128 256 1024 .. ]
    #alsa.buffer-bytes = { min=256 max=4194304 } # or [ 256 512 4096 .. ]

    #alsa.volume-method = cubic			# linear, cubic
}

# client specific properties
alsa.rules = [
    {   matches = [ { application.process.binary = "resolve" } ]
        actions = {
            update-props = {
		alsa.buffer-bytes = 131072
            }
        }
    }
]
