diff --git a/modules/steamdeck/sound.nix b/modules/steamdeck/sound.nix index 3ea14bfc..aaca8a27 100644 --- a/modules/steamdeck/sound.nix +++ b/modules/steamdeck/sound.nix @@ -12,6 +12,11 @@ let # remove more specific upstream symlink so Valve acp5x config is picked rm $out/share/alsa/ucm2/conf.d/acp5x/Valve-Jupiter-1.conf ''; + + mkDspEtc = path: { + name = path; + value.source = "${pkgs.steamdeck-dsp}/share/${path}"; + }; in { options = { @@ -27,47 +32,31 @@ in }; }; - config = lib.mkIf (cfg.enableSoundSupport) (lib.mkMerge [ - { - hardware.pulseaudio.enable = lib.mkDefault false; + config = let + systemWide = config.services.pipewire.systemWide; - services.pipewire = { - enable = lib.mkDefault true; - pulse.enable = lib.mkDefault true; - alsa.enable = lib.mkDefault true; - }; + extraEnv = { + ALSA_CONFIG_UCM2 = "${alsa-ucm-conf'}/share/alsa/ucm2"; + LV2_PATH = "${pkgs.steamdeck-dsp}/lib/lv2"; + }; + in lib.mkIf cfg.enableSoundSupport { + hardware.pulseaudio.enable = false; + + services.pipewire = { + enable = true; + pulse.enable = true; + alsa.enable = true; + wireplumber.package = pkgs.wireplumber-jovian; + }; - environment.variables.ALSA_CONFIG_UCM2 = "${alsa-ucm-conf'}/share/alsa/ucm2"; - } + environment.etc = builtins.listToAttrs (map mkDspEtc pkgs.steamdeck-dsp.passthru.filesInstalledToEtc); - # Pulseaudio - (lib.mkIf (config.hardware.pulseaudio.enable) (let - systemWide = config.hardware.pulseaudio.systemWide; - in { - systemd.services.pulseaudio = lib.mkIf systemWide { - environment.ALSA_CONFIG_UCM2 = config.environment.variables.ALSA_CONFIG_UCM2; - }; - systemd.user.services.pulseaudio = lib.mkIf (!systemWide) { - environment.ALSA_CONFIG_UCM2 = config.environment.variables.ALSA_CONFIG_UCM2; - }; - })) + environment.variables = extraEnv; + + systemd.services.pipewire.environment = lib.mkIf systemWide extraEnv; + systemd.user.services.pipewire.environment = lib.mkIf (!systemWide) extraEnv; - # Pipewire - (lib.mkIf (config.services.pipewire.enable) (let - systemWide = config.services.pipewire.systemWide; - in { - systemd.services.pipewire = lib.mkIf systemWide { - environment.ALSA_CONFIG_UCM2 = config.environment.variables.ALSA_CONFIG_UCM2; - }; - systemd.user.services.pipewire = lib.mkIf (!systemWide) { - environment.ALSA_CONFIG_UCM2 = config.environment.variables.ALSA_CONFIG_UCM2; - }; - systemd.services.wireplumber = lib.mkIf systemWide { - environment.ALSA_CONFIG_UCM2 = config.environment.variables.ALSA_CONFIG_UCM2; - }; - systemd.user.services.wireplumber = lib.mkIf (!systemWide) { - environment.ALSA_CONFIG_UCM2 = config.environment.variables.ALSA_CONFIG_UCM2; - }; - })) - ]); + systemd.services.wireplumber.environment = lib.mkIf systemWide extraEnv; + systemd.user.services.wireplumber.environment = lib.mkIf (!systemWide) extraEnv; + }; } diff --git a/overlay.nix b/overlay.nix index 2be1df56..b4dac388 100644 --- a/overlay.nix +++ b/overlay.nix @@ -91,6 +91,10 @@ rec { }; }); + wireplumber-jovian = final.callPackage ./pkgs/wireplumber { + wireplumber' = super.wireplumber; + }; + sdgyrodsu = final.callPackage ./pkgs/sdgyrodsu { }; decky-loader = final.callPackage ./pkgs/decky-loader { }; diff --git a/pkgs/steamdeck-dsp/default.nix b/pkgs/steamdeck-dsp/default.nix index dd82bf98..850f7b34 100644 --- a/pkgs/steamdeck-dsp/default.nix +++ b/pkgs/steamdeck-dsp/default.nix @@ -44,12 +44,39 @@ stdenv.mkDerivation(finalAttrs: { postInstall = '' mv -vt $out $out/usr/* rmdir -v $out/usr + + >&2 echo "Checking configuration files" + + echo -e "${builtins.concatStringsSep "\n" finalAttrs.passthru.filesInstalledToEtc}" \ + | sort >etc.expected.txt + + for dir in wireplumber pipewire; do + find $out/share/$dir -type f -printf "$dir/%P\n" + done | sort >etc.actual.txt + + if ! cmp --silent etc.{expected,actual}.txt; then + >&2 echo "!! passthru.filesInstalledToEtc needs to be updated. The actual list of config files:" + cat etc.actual.txt + false + fi ''; # ¯\_(ツ)_/¯ # Leaky wrappers I guess. dontWrapQtApps = true; + passthru.filesInstalledToEtc = [ + "pipewire/pipewire.conf.d/filter-chain-sink.conf" + "pipewire/pipewire.conf.d/filter-chain.conf" + "pipewire/pipewire.conf.d/virtual-sink.conf" + "pipewire/pipewire.conf.d/virtual-source.conf" + "wireplumber/bluetooth.lua.d/60-bluez-jupiter.lua" + "wireplumber/main.lua.d/60-alsa-acp5x-config.lua" + "wireplumber/main.lua.d/60-alsa-card0-config.lua" + "wireplumber/main.lua.d/60-alsa-ps-controller-config.lua" + "wireplumber/scripts/open-alsa-acp-dsm-node.lua" + ]; + meta = { description = "Steamdeck Audio Processing"; # Actual license of all parts unclear. diff --git a/pkgs/wireplumber/default.nix b/pkgs/wireplumber/default.nix new file mode 100644 index 00000000..6566856b --- /dev/null +++ b/pkgs/wireplumber/default.nix @@ -0,0 +1,11 @@ +{ wireplumber', fetchFromGitHub }: +wireplumber'.overrideAttrs(_: rec { + version = "0.4.14-dev23"; + + src = fetchFromGitHub { + owner = "Jovian-Experiments"; + repo = "wireplumber"; + rev = "refs/tags/${version}"; + hash = "sha256-+z7BQlRu8XYxE5vEFCfentdrQNuCP0RnQHiPx8/Yfl8="; + }; +})