{ config, lib, pkgs, ... }: let cfg = config.modules.hardware.presonus-studio; snd-usb-audio-module = pkgs.callPackage ./snd-usb-audio.nix { kernel = config.boot.kernelPackages.kernel; }; patched = snd-usb-audio-module.overrideAttrs (prev: { patches = [ ./0001-Update-device-ID-for-PreSonus-1824c.patch ]; }); upmixConfig = { "stream.properties" = { "channelmix.upmix" = true; "channelmix.upmix-method" = "psd"; }; }; in { options.modules.hardware.presonus-studio = { enable = lib.mkOption { default = false; example = true; }; }; config = lib.mkIf cfg.enable { boot.kernelModules = [ "snd-usb-audio" ]; boot.extraModulePackages = [ (patched) ]; # Workaround for mainline module loading instead of patched module systemd.services.reload-snd-usb-audio = { description = "Reload snd_usb_audio kernel module"; wantedBy = [ "sound.target" ]; serviceConfig.Type = "oneshot"; path = with pkgs; [ kmod ]; script = '' # Only reload if device hasn't been initialised if ! cat /proc/asound/card*/usbmixer | grep -q "Mute Main Out Switch"; then rmmod snd_usb_audio insmod /run/booted-system/kernel-modules/lib/modules/$(uname -r)/extra/snd-usb-audio.ko.xz fi ''; }; services.pipewire.extraConfig = { pipewire = { "10-network" = { "context.modules" = [ { "name" = "libpipewire-module-rtp-session"; "args" = { "stream.props" = { "node.name" = "rtp-source"; }; }; } ]; }; "surround" = { "context.modules" = [ { "name" = "libpipewire-module-loopback"; "args" = { "node.description" = "Genelec 4.1 Surround"; "capture.props" = { "node.name" = "Genelec_Speakers"; "media.class" = "Audio/Sink"; "audio.position" = [ "FL" "FR" "SL" "SR" "LFE" ]; }; "playback.props" = { "node.name" = "playback.Genelec_Speakers"; "audio.position" = [ "AUX0" "AUX1" "AUX3" "AUX4" "AUX5" ]; "target.object" = "alsa_output.usb-PreSonus_Studio_1824c_SC4E21110775-00.multichannel-output"; "stream.dont-remix" = true; "node.passive" = true; }; }; } ]; }; }; pipewire-pulse."40-upmix" = upmixConfig; client-rt."40-upmix" = upmixConfig; }; }; }