{ 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 obs-vaapi #optional AMD hardware acceleration obs-gstreamer ]; }; }; 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"]; }; }; }; }