{ 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"; script = '' rmmod snd_usb_audio insmod /run/booted-system/kernel-modules/lib/modules/$(uname -r)/extra/snd-usb-audio.ko.xz ''; }; environment.etc = { "pipewire/pipewire.conf.d/10-network.conf".text = '' context.modules = [ { name = libpipewire-module-rtp-session args = { stream.props = { node.name = "rtp-source" } } } ] ''; "pipewire/pipewire.conf.d/surround.conf".text = '' 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/pipewire-pulse.conf.d/40-upmix.conf".text = upmixConfig; "pipewire/client-rt.conf.d/40-upmix.conf".text = upmixConfig; }; }; }