{ den, modules, ... }: { modules.obs = settings: { homeManager = { pkgs, 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 = pkgs.lib.mkIf settings.virtual_audio_devices { pw-discordaudio-virtual-device = { Install = { WantedBy = [ "hyprland-session.target" ]; }; Service = { ExecStart = "${pkgs.writeShellScript "discord_audio_virt_device" '' #!/run/current-system/sw/bin/bash pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=DiscordSink' -n DiscordSink ''}"; }; }; pw-gameaudio-virtual-device = { Install = { WantedBy = [ "hyprland-session.target" ]; }; Service = { ExecStart = "${pkgs.writeShellScript "game_audio_virt_device" '' #!/run/current-system/sw/bin/bash pw-loopback -m '[ FL FR]' --capture-props='media.class=Audio/Sink node.name=GameAudioSink' -n GameAudioSink ''}"; }; }; } // pkgs.lib.mkIf settings.autostart { obs-autostart = { Unit = { Description = "OBS daemon"; After = [ "hyprland-session.target" ]; }; Install = { WantedBy = [ "default.target" ]; }; Service = { # wait for hyprland to start ExecStart = "${config.programs.obs-studio.finalPackage}/bin/obs --startreplaybuffer"; Restart = "on-failure"; RestartSec = "5s"; }; }; }; }; }; }