From 3d51602690bcaca8f81c6a1b342dcead91258650 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Mon, 12 Oct 2020 16:55:01 -0700 Subject: [PATCH] UI: Fix replay buffer frontend event not triggering The frontend API event OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED was not being triggered when hotkeys were used because it was only set to trigger when the replay buffer button was clicked, not when a hotkey was used. This fixes it so that the frontend event sends a signal to the frontend so that hotkeys will actually work. --- UI/window-basic-main-outputs.cpp | 9 +++++++++ UI/window-basic-main-outputs.hpp | 1 + UI/window-basic-main.cpp | 4 ++++ UI/window-basic-main.hpp | 1 + plugins/obs-ffmpeg/obs-ffmpeg-mux.c | 9 +++++++++ 5 files changed, 24 insertions(+) diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 6892db1cc..5054feb5e 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -140,6 +140,13 @@ static void OBSReplayBufferStopping(void *data, calldata_t *params) UNUSED_PARAMETER(params); } +static void OBSReplayBufferSaved(void *data, calldata_t *) +{ + BasicOutputHandler *output = static_cast(data); + QMetaObject::invokeMethod(output->main, "ReplayBufferSaved", + Qt::QueuedConnection); +} + static void OBSStartVirtualCam(void *data, calldata_t *params) { BasicOutputHandler *output = static_cast(data); @@ -437,6 +444,8 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_) replayBufferStopping.Connect(signal, "stopping", OBSReplayBufferStopping, this); + replayBufferSaved.Connect(signal, "saved", + OBSReplayBufferSaved, this); } fileOutput = obs_output_create( diff --git a/UI/window-basic-main-outputs.hpp b/UI/window-basic-main-outputs.hpp index 5f9f0bd86..e928de42c 100644 --- a/UI/window-basic-main-outputs.hpp +++ b/UI/window-basic-main-outputs.hpp @@ -33,6 +33,7 @@ struct BasicOutputHandler { OBSSignal streamStopping; OBSSignal recordStopping; OBSSignal replayBufferStopping; + OBSSignal replayBufferSaved; inline BasicOutputHandler(OBSBasic *main_); diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 142d64641..c425287f1 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -6141,6 +6141,10 @@ void OBSBasic::ReplayBufferSave() obs_output_get_proc_handler(outputHandler->replayBuffer); proc_handler_call(ph, "save", &cd); calldata_free(&cd); +} + +void OBSBasic::ReplayBufferSaved() +{ if (api) api->on_event(OBS_FRONTEND_EVENT_REPLAY_BUFFER_SAVED); } diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index 0d8cdc49b..3af7ef058 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -573,6 +573,7 @@ public slots: void ReplayBufferStart(); void ReplayBufferSave(); + void ReplayBufferSaved(); void ReplayBufferStopping(); void ReplayBufferStop(int code); diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c index 7107c4ef1..23ba21d81 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c @@ -646,6 +646,12 @@ static void replay_buffer_hotkey(void *data, obs_hotkey_id id, return; } + calldata_t cd = {0}; + + signal_handler_t *sh = + obs_output_get_signal_handler(stream->output); + signal_handler_signal(sh, "saved", &cd); + stream->save_ts = os_gettime_ns() / 1000LL; } } @@ -679,6 +685,9 @@ static void *replay_buffer_create(obs_data_t *settings, obs_output_t *output) proc_handler_add(ph, "void get_last_replay(out string path)", get_last_replay, stream); + signal_handler_t *sh = obs_output_get_signal_handler(output); + signal_handler_add(sh, "void saved()"); + return stream; }