diff --git a/computational/configuration.nix b/computational/configuration.nix index 5fdc5c3..16bd89c 100644 --- a/computational/configuration.nix +++ b/computational/configuration.nix @@ -21,27 +21,42 @@ ''; # [AUDIO] - environment.etc."pipewire/media-session.d/alsa-monitor.con".text = '' - enabled = true + services.pipewire.wireplumber.extraConfig = { + "alsa-monitor.conf" = { + enabled = true; - rules = { - { - matches = [ - { - node.name = "alsa_output.usb-SMSL_SMSL_USB_AUDIO-00.analog-stereo" - } - ] - - actions = { - update-props = { - audio.format = "S32_LE" - } + rules = [ + { + matches = [ + { + "node.name" = "alsa_output.usb-SMSL_SMSL_USB_AUDIO-00.analog-stereo"; + } + ]; + actions = { + update-props = { + audio.format = "S32_LE"; + }; + }; } - }, - } - ''; + ]; + }; + }; - environment.etc."pipewire/pipewire.conf".text = builtins.readFile ./pipewire.conf; + services.pipewire.extraConfig.pipewire = { + "10-clock-rate" = { + "context.properties" = { + "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; + }; + }; + "11-upmix" = { + "stream.properties" = { + "channel.upmix" = true; + }; + }; + }; # [NETWORKING] diff --git a/computational/pipewire.conf b/computational/pipewire.conf deleted file mode 100644 index 3e9012e..0000000 --- a/computational/pipewire.conf +++ /dev/null @@ -1,308 +0,0 @@ -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 } ] } -]