diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp index e66747e55..5f04abeb3 100644 --- a/frontend/widgets/OBSBasic.hpp +++ b/frontend/widgets/OBSBasic.hpp @@ -495,7 +495,7 @@ private: obs_hotkey_pair_id streamingHotkeys, recordingHotkeys, pauseHotkeys, replayBufHotkeys, vcamHotkeys, togglePreviewHotkeys, contextBarHotkeys; - obs_hotkey_id forceStreamingStopHotkey, splitFileHotkey, addChapterHotkey; + obs_hotkey_id forceStreamingStopHotkey, splitFileHotkey, addChapterHotkey, saveReplayBufferHotkey; void InitHotkeys(); void CreateHotkeys(); diff --git a/frontend/widgets/OBSBasic_Hotkeys.cpp b/frontend/widgets/OBSBasic_Hotkeys.cpp index 4cd37abe4..c04f2745c 100644 --- a/frontend/widgets/OBSBasic_Hotkeys.cpp +++ b/frontend/widgets/OBSBasic_Hotkeys.cpp @@ -210,6 +210,30 @@ void OBSBasic::CreateHotkeys() this, this); LoadHotkeyPair(replayBufHotkeys, "OBSBasic.StartReplayBuffer", "OBSBasic.StopReplayBuffer"); + auto replayBufferCallback = [](void *data, obs_hotkey_id, obs_hotkey_t *, bool pressed) { + OBSBasic *basic = static_cast(data); + if (basic->outputHandler->ReplayBufferActive() && pressed) { + blog(LOG_INFO, "Saving replay buffer due to hotkey"); + basic->ReplayBufferSave(); + } + }; + + saveReplayBufferHotkey = obs_hotkey_register_frontend("OBSBasic.SaveReplayBuffer", Str("Basic.Main.SaveReplay"), + replayBufferCallback, this); + + bool hasSaveReplayHotkey = config_has_user_value(activeConfiguration, "Hotkeys", "OBSBasic.SaveReplayBuffer"); + if (hasSaveReplayHotkey) { + LoadHotkey(saveReplayBufferHotkey, "OBSBasic.SaveReplayBuffer"); + } else { + OBSDataArrayAutoRelease array = obs_data_get_array(LoadHotkeyData("ReplayBuffer"), "ReplayBuffer.Save"); + obs_hotkey_load(saveReplayBufferHotkey, array); + + OBSDataAutoRelease newData = obs_data_create(); + obs_data_set_array(newData, "bindings", array); + config_set_string(activeConfiguration, "Hotkeys", "OBSBasic.SaveReplayBuffer", + obs_data_get_json(newData)); + } + if (vcamEnabled) { vcamHotkeys = obs_hotkey_pair_register_frontend( "OBSBasic.StartVirtualCam", Str("Basic.Main.StartVirtualCam"), "OBSBasic.StopVirtualCam", diff --git a/plugins/obs-ffmpeg/data/locale/en-US.ini b/plugins/obs-ffmpeg/data/locale/en-US.ini index 2331d1e49..d74426cab 100644 --- a/plugins/obs-ffmpeg/data/locale/en-US.ini +++ b/plugins/obs-ffmpeg/data/locale/en-US.ini @@ -100,7 +100,6 @@ MediaFileFilter.AudioFiles="Audio Files" MediaFileFilter.AllFiles="All Files" ReplayBuffer="Replay Buffer" -ReplayBuffer.Save="Save Replay" HelperProcessFailed="Unable to start the recording helper process. Check that OBS files have not been blocked or removed by any 3rd party antivirus / security software." UnableToWritePath="Unable to write to %1. Make sure you're using a recording path which your user account is allowed to write to and that there is sufficient disk space." diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c index 069ccb35c..e9a6454fe 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c @@ -914,20 +914,16 @@ static const char *replay_buffer_getname(void *type) return obs_module_text("ReplayBuffer"); } -static void replay_buffer_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hotkey, bool pressed) +static void save_replay_proc(void *data, calldata_t *cd) { - UNUSED_PARAMETER(id); - UNUSED_PARAMETER(hotkey); - - if (!pressed) - return; + UNUSED_PARAMETER(cd); struct ffmpeg_muxer *stream = data; if (os_atomic_load_bool(&stream->active)) { obs_encoder_t *vencoder = obs_output_get_video_encoder(stream->output); if (obs_encoder_paused(vencoder)) { - info("Could not save buffer because encoders paused"); + info("Could not save buffer because the encoder is paused"); return; } @@ -935,12 +931,6 @@ static void replay_buffer_hotkey(void *data, obs_hotkey_id id, obs_hotkey_t *hot } } -static void save_replay_proc(void *data, calldata_t *cd) -{ - replay_buffer_hotkey(data, 0, NULL, true); - UNUSED_PARAMETER(cd); -} - static void get_last_replay(void *data, calldata_t *cd) { struct ffmpeg_muxer *stream = data; @@ -954,9 +944,6 @@ static void *replay_buffer_create(obs_data_t *settings, obs_output_t *output) struct ffmpeg_muxer *stream = bzalloc(sizeof(*stream)); stream->output = output; - stream->hotkey = obs_hotkey_register_output(output, "ReplayBuffer.Save", obs_module_text("ReplayBuffer.Save"), - replay_buffer_hotkey, stream); - proc_handler_t *ph = obs_output_get_proc_handler(output); proc_handler_add(ph, "void save()", save_replay_proc, stream); proc_handler_add(ph, "void get_last_replay(out string path)", get_last_replay, stream); @@ -970,9 +957,6 @@ static void *replay_buffer_create(obs_data_t *settings, obs_output_t *output) static void replay_buffer_destroy(void *data) { - struct ffmpeg_muxer *stream = data; - if (stream->hotkey) - obs_hotkey_unregister(stream->hotkey); ffmpeg_mux_destroy(data); }