# WirePlumber daemon context configuration #

context.properties = {
  ## Properties to configure the PipeWire context and some modules

  # 1=error/critical/warning, 2=message, 3=info, 4=debug, 5=trace
  log.level = 2

  wireplumber.script-engine = lua-scripting
}

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.
  #
  api.alsa.*      = alsa/libspa-alsa
  api.bluez5.*    = bluez5/libspa-bluez5
  api.v4l2.*      = v4l2/libspa-v4l2
  api.libcamera.* = libcamera/libspa-libcamera
  audio.convert.* = audioconvert/libspa-audioconvert
  support.*       = support/libspa-support
}

context.modules = [
  #{   name = <module-name>
  #    [ args = { <key> = <value> ... } ]
  #    [ flags = [ [ ifexists ] [ nofail ] ]
  #}
  #
  # PipeWire modules to load.
  # If ifexists is given, the module is ignored when it is not found.
  # If nofail is given, module initialization failures are ignored.
  #

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

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

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

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

  # Provides factories to make session manager objects.
  { name = libpipewire-module-session-manager }

  { name = libpipewire-module-filter-chain
    args = {
          node.description = "Equalizer Sink"
          media.name       = "Equalizer Sink"
          filter.graph = {
              nodes = [
                  {
                      type  = builtin
                      name  = bass
                      label = bq_lowshelf
                      # the cut off freq of the bass filter can be adjusted here.
                      control = { "Freq" = 250.0 "Q" = 1.0 "Gain" = 0.0 }
                  }
                  {
                      type  = builtin
                      name  = treble
                      label = bq_peaking
                      # the cut off freq of the treble filter can be adjusted here.
                      control = { "Freq" = 6000.0 "Q" = 1.0 "Gain" = 0.0 }
                  }
              ]
              links = [
                  { output = "bass:Out" input = "treble:In" }
              ]
          }
          audio.channels = 2
          audio.position = [ FL FR ]
          capture.props = {
              node.name   = "eq-sink"
              media.class = Audio/Sink
              # select the endpoint to which the node is attached
              target.endpoint = "endpoint.multimedia"
              node.passive = true
          }
          playback.props = {
              node.name   = "eq-output-stream"
              node.passive = true
          }
      }
  }
]

wireplumber.components = [
  #{ name = <component-name>, type = <component-type> }
  #
  # WirePlumber components to load
  #

  # The lua scripting engine
  { name = libwireplumber-module-lua-scripting, type = module }

  # The lua configuration file(s)
  # Other components are loaded from there
  { name = host.lua, type = config/lua }
]
