From 577efcf237e5920e97d5a0eb184971bb0e5c8c20 Mon Sep 17 00:00:00 2001 From: Joseph DiGiovanni Date: Thu, 25 Jul 2024 22:18:22 -0400 Subject: [PATCH] Rewrite services --- hosts/common/gpu-screen-recorder.nix | 105 ++++++++++++++++----------- 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/hosts/common/gpu-screen-recorder.nix b/hosts/common/gpu-screen-recorder.nix index ebd736b..9b60f1c 100644 --- a/hosts/common/gpu-screen-recorder.nix +++ b/hosts/common/gpu-screen-recorder.nix @@ -13,11 +13,15 @@ let fi ''; - gsr-start-replay = pkgs.writeShellScriptBin "gsr-start-replay" '' + gsr-record = pkgs.writeShellScriptBin "gsr-start-recording" '' + systemctl --user start gpu-screen-recorder.service + ''; + + gsr-replay = pkgs.writeShellScriptBin "gsr-start-replay" '' systemctl --user start gsr-replay.service ''; - gsr-stop-replay = pkgs.writeShellScriptBin "gsr-stop-replay" '' + gsr-stop = pkgs.writeShellScriptBin "gsr-stop-replay" '' systemctl --user stop gsr-replay.service ''; @@ -26,8 +30,9 @@ in { environment.systemPackages = [ gsr-save-replay - gsr-start-replay - gsr-stop-replay + gsr-replay + gsr-record + gsr-stop ]; security.wrappers."gsr-kms-server" = { @@ -53,47 +58,61 @@ in extraGSettingsOverridePackages = with pkgs; [ gnome.gnome-settings-daemon ]; }; - systemd.user.services."gsr-replay" = { - after = [ "graphical-session.target" ]; - description = "GPU Screen Recorder replay service"; - enable = false; # Disabled by default to save resources - serviceConfig = { - Environment = [ - "AUDIO_CODEC=opus" - "CODEC=auto" - "CONTAINER=mkv" - "FRAMERATE=60" - "MAKEFOLDERS=no" - "QUALITY=very_high" - "REPLAYDURATION=300" - "WINDOW=screen" - ]; - ExecStart = pkgs.writeShellScript "start-gpu-screen-recorder-replay" '' - ${pkgs.gpu-screen-recorder}/bin/gpu-screen-recorder -a "$(${pkgs.pulseaudio}/bin/pactl get-default-sink).monitor" -a "$(${pkgs.pulseaudio}/bin/pactl get-default-source)" -ac "$AUDIO_CODEC" -c "$CONTAINER" -f "$FRAMERATE" -k "$CODEC" -mf "$MAKEFOLDERS" -o "${outputDir}" -q "$QUALITY" -r "$REPLAYDURATION" -v no -w "$WINDOW" $ADDITIONAL_ARGS - ''; - Restart = "on-failure"; - RestartSec = "5s"; - Type = "simple"; - }; - wantedBy = [ "graphical-session.target" ]; - }; + systemd.user.services = rec { + "gpu-screen-recorder" = { + after = [ "graphical-session.target" ]; + description = "GPU Screen Recorder service"; + serviceConfig = { + Environment = [ + "AUDIO_CODEC=opus" + "CODEC=auto" + "CONTAINER=mkv" + "FRAMERATE=60" + "MAKEFOLDERS=no" + "QUALITY=very_high" + "WINDOW=screen" + ]; + ExecStart = pkgs.writeShellScript "start-gpu-screen-recorder-replay" '' + #${pkgs.killall}/bin/killall gpu-screen-recorder - systemd.user.services."gsr-audio-device-changer" = { - after = [ "gsr-replay.service" ]; - description = "Restart GPU Screen Recorder replay service on audio device change"; - requires = [ "gsr-replay.service" ]; - serviceConfig = { - ExecStart = pkgs.writeShellScript "gsr-restart-on-audio-device-change" '' - ${pkgs.pulseaudio}/bin/pactl subscribe | while read -r event; do - if [[ $event == *"Event 'change' on server"* ]]; then - systemctl --user restart gsr-replay.service + if [ -n "$REPLAYDURATION" ]; then + REPLAYARG="-r $REPLAYDURATION" + else + REPLAYARG="" fi - done - ''; - Restart = "always"; - RestartSec = "5s"; - Type = "simple"; + + ${pkgs.gpu-screen-recorder}/bin/gpu-screen-recorder $REPLAYARG -a "$(${pkgs.pulseaudio}/bin/pactl get-default-sink).monitor" -a "$(${pkgs.pulseaudio}/bin/pactl get-default-source)" -ac "$AUDIO_CODEC" -c "$CONTAINER" -f "$FRAMERATE" -k "$CODEC" -mf "$MAKEFOLDERS" -o "${outputDir}" -q "$QUALITY" -v no -w "$WINDOW" $ADDITIONAL_ARGS + ''; + Restart = "on-failure"; + RestartSec = "5s"; + Type = "simple"; + }; + }; + + "gsr-replay" = gpu-screen-recorder // { + description = "GPU Screen Recorder replay service"; + serviceConfig = gpu-screen-recorder.serviceConfig // { + Environment = gpu-screen-recorder.serviceConfig.Environment ++ [ "REPLAYDURATION=300" ]; + }; + }; + + "gsr-replay-change-audio" = { + after = [ "gsr-replay.service" ]; + description = "Restart GPU Screen Recorder replay service on audio device change"; + requires = [ "gsr-replay.service" ]; + serviceConfig = { + ExecStart = pkgs.writeShellScript "gsr-restart-on-audio-device-change" '' + ${pkgs.pulseaudio}/bin/pactl subscribe | while read -r event; do + if [[ $event == *"Event 'change' on server"* ]]; then + systemctl --user restart gsr-replay.service + fi + done + ''; + Restart = "on-failure"; + RestartSec = "5s"; + Type = "simple"; + }; + wantedBy = [ "gsr-replay.service" ]; }; - wantedBy = [ "gsr-replay.service" ]; }; }