{ den, modules, ... }: { modules.obs = settings: { homeManager = { pkgs, lib, config, ... }: { programs = { obs-studio = { enable = true; package = ( pkgs.obs-studio.override { cudaSupport = true; } ); plugins = with pkgs.obs-studio-plugins; [ obs-pipewire-audio-capture obs-vkcapture ]; }; }; systemd.user.services = let audio-set = lib.mkIf settings.audio { pw-discordaudio-virtual-device = { Unit = { Description = "OBS daemon"; After = [ "hyprland-session.target" ]; }; Install = { WantedBy = [ "default.target" ]; }; Service = { ExecStart = "${pkgs.writeShellScript "discord_audio_virt_device" '' pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=DiscordSink' -n DiscordSink ''}"; Restart = "on-failure"; RestartSec = "5s"; }; }; pw-gameaudio-virtual-device = { Unit = { Description = "OBS daemon"; After = [ "hyprland-session.target" ]; }; Install = { WantedBy = [ "default.target" ]; }; Service = { ExecStart = "${pkgs.writeShellScript "game_audio_virt_device" '' pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=GameAudioSink' -n GameAudioSink ''}"; Restart = "on-failure"; RestartSec = "5s"; }; }; }; in lib.mergeAttrsList [ audio-set ]; wayland.windowManager.hyprland.settings = { exec-once = [ "${config.programs.obs-studio.finalPackage}/bin/obs --startreplaybuffer" ]; }; }; }; }