From bcf0a0b7fdd9da20832d13960b14e3525a109be9 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 27 Dec 2023 04:00:36 +0100 Subject: [PATCH] Move functionality to scene-switch-helpers --- src/advanced-scene-switcher.cpp | 17 ++--- src/switcher-data.hpp | 3 - src/utils/scene-switch-helpers.cpp | 110 +++++++++++++++++++++-------- src/utils/scene-switch-helpers.hpp | 27 +++++-- 4 files changed, 106 insertions(+), 51 deletions(-) diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 11e7b027..425ac12a 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -552,9 +552,6 @@ extern "C" void FreeSceneSwitcher() static void handleSceneChange() { - switcher->lastSceneChangeTime = - std::chrono::high_resolution_clock::now(); - // Stop waiting if scene was changed if (switcher->SceneChangedDuringWait()) { switcher->cv.notify_one(); @@ -626,13 +623,6 @@ static void setReplayBufferSaved() switcher->replayBufferSaved = true; } -static void setTranstionEnd() -{ - switcher->lastTransitionEndTime = - std::chrono::high_resolution_clock::now(); - switcher->macroTransitionCv.notify_all(); -} - static void setStreamStarting() { switcher->lastStreamStartingTime = @@ -645,6 +635,11 @@ static void setStreamStopping() std::chrono::high_resolution_clock::now(); } +static void handleTransitionEnd() +{ + GetMacroTransitionCV().notify_all(); +} + static void handleShutdown() { if (!switcher) { @@ -717,7 +712,7 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher) break; #endif case OBS_FRONTEND_EVENT_TRANSITION_STOPPED: - setTranstionEnd(); + handleTransitionEnd(); break; case OBS_FRONTEND_EVENT_STREAMING_STARTING: setStreamStarting(); diff --git a/src/switcher-data.hpp b/src/switcher-data.hpp index 18d41bb8..fa93e2bc 100644 --- a/src/switcher-data.hpp +++ b/src/switcher-data.hpp @@ -132,11 +132,8 @@ public: obs_source_t *waitScene = nullptr; OBSWeakSource currentScene = nullptr; OBSWeakSource previousScene = nullptr; - std::chrono::high_resolution_clock::time_point lastSceneChangeTime{}; - std::chrono::high_resolution_clock::time_point lastTransitionEndTime{}; std::chrono::high_resolution_clock::time_point lastStreamStartingTime{}; std::chrono::high_resolution_clock::time_point lastStreamStoppingTime{}; - std::chrono::high_resolution_clock::time_point lastMatchTime; /* --- Start of General tab section --- */ diff --git a/src/utils/scene-switch-helpers.cpp b/src/utils/scene-switch-helpers.cpp index 34e09af0..ba0bb44b 100644 --- a/src/utils/scene-switch-helpers.cpp +++ b/src/utils/scene-switch-helpers.cpp @@ -1,10 +1,36 @@ #include "scene-switch-helpers.hpp" -#include "switcher-data.hpp" +#include "log-helper.hpp" #include "obs-frontend-api.h" +#include "switcher-data.hpp" #include "utility.hpp" namespace advss { +static std::chrono::high_resolution_clock::time_point lastSceneChangeTime{}; +static std::chrono::high_resolution_clock::time_point lastTransitionEndTime{}; +static bool setupEventHandler(); +static bool eventHandlerIsSetup = setupEventHandler(); + +static bool setupEventHandler() +{ + static auto handleEvents = [](enum obs_frontend_event event, void *) { + switch (event) { + case OBS_FRONTEND_EVENT_SCENE_CHANGED: + lastSceneChangeTime = + std::chrono::high_resolution_clock::now(); + break; + case OBS_FRONTEND_EVENT_TRANSITION_STOPPED: + lastTransitionEndTime = + std::chrono::high_resolution_clock::now(); + break; + default: + break; + }; + }; + obs_frontend_add_event_callback(handleEvents, nullptr); + return true; +} + static std::pair getNextTransition(obs_weak_source_t *scene1, obs_weak_source_t *scene2) { @@ -35,10 +61,9 @@ void SetNextTransition(const SceneSwitchInfo &sceneSwitch, // 3. Current transition settings // Transition Tab - obs_weak_source_t *currentScene = + OBSWeakSourceAutoRelease currentScene = obs_source_get_weak_source(currentSource); auto tinfo = getNextTransition(currentScene, sceneSwitch.scene); - obs_weak_source_release(currentScene); OBSWeakSource nextTransition = tinfo.first; int nextTransitionDuration = tinfo.second; @@ -53,23 +78,23 @@ void SetNextTransition(const SceneSwitchInfo &sceneSwitch, // Current transition settings if (!nextTransition) { - auto ct = obs_frontend_get_current_transition(); - nextTransition = obs_source_get_weak_source(ct); + OBSSourceAutoRelease currentTransition = + obs_frontend_get_current_transition(); + nextTransition = obs_source_get_weak_source(currentTransition); obs_weak_source_release(nextTransition); - obs_source_release(ct); } if (!nextTransitionDuration) { nextTransitionDuration = obs_frontend_get_transition_duration(); } - if (switcher->adjustActiveTransitionType) { + if (ShouldModifyActiveTransition()) { obs_frontend_set_transition_duration(nextTransitionDuration); - auto t = obs_weak_source_get_source(nextTransition); - obs_frontend_set_current_transition(t); - obs_source_release(t); + OBSSourceAutoRelease transition = + obs_weak_source_get_source(nextTransition); + obs_frontend_set_current_transition(transition); } - if (switcher->transitionOverrideOverride) { + if (ShouldModifyTransitionOverrides()) { OverwriteTransitionOverride({sceneSwitch.scene, nextTransition, nextTransitionDuration}, td); @@ -78,8 +103,8 @@ void SetNextTransition(const SceneSwitchInfo &sceneSwitch, void OverwriteTransitionOverride(const SceneSwitchInfo &ssi, TransitionData &td) { - obs_source_t *scene = obs_weak_source_get_source(ssi.scene); - obs_data_t *data = obs_source_get_private_settings(scene); + OBSSourceAutoRelease scene = obs_weak_source_get_source(ssi.scene); + OBSDataAutoRelease data = obs_source_get_private_settings(scene); td.name = obs_data_get_string(data, "transition"); td.duration = obs_data_get_int(data, "transition_duration"); @@ -88,19 +113,13 @@ void OverwriteTransitionOverride(const SceneSwitchInfo &ssi, TransitionData &td) obs_data_set_string(data, "transition", name.c_str()); obs_data_set_int(data, "transition_duration", ssi.duration); - - obs_data_release(data); - obs_source_release(scene); } void RestoreTransitionOverride(obs_source_t *scene, const TransitionData &td) { - obs_data_t *data = obs_source_get_private_settings(scene); - + OBSDataAutoRelease data = obs_source_get_private_settings(scene); obs_data_set_string(data, "transition", td.name.c_str()); obs_data_set_int(data, "transition_duration", td.duration); - - obs_data_release(data); } void SwitchScene(const SceneSwitchInfo &sceneSwitch, bool force) @@ -110,36 +129,67 @@ void SwitchScene(const SceneSwitchInfo &sceneSwitch, bool force) return; } - obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene); - obs_source_t *currentSource = obs_frontend_get_current_scene(); + OBSSourceAutoRelease source = + obs_weak_source_get_source(sceneSwitch.scene); + OBSSourceAutoRelease currentSource = obs_frontend_get_current_scene(); if (source && (source != currentSource || force)) { TransitionData currentTransitionData; SetNextTransition(sceneSwitch, currentSource, currentTransitionData); obs_frontend_set_current_scene(source); - if (switcher->transitionOverrideOverride) { + if (ShouldModifyTransitionOverrides()) { RestoreTransitionOverride(source, currentTransitionData); } - if (switcher->verbose) { - blog(LOG_INFO, "switched scene"); - } + vblog(LOG_INFO, "switched scene"); if (switcher->networkConfig.ShouldSendSceneChange()) { switcher->server.sendMessage(sceneSwitch); } } - obs_source_release(currentSource); - obs_source_release(source); } void SwitchPreviewScene(const OBSWeakSource &ws) { - auto source = obs_weak_source_get_source(ws); + OBSSourceAutoRelease source = obs_weak_source_get_source(ws); obs_frontend_set_current_preview_scene(source); - obs_source_release(source); +} + +std::chrono::high_resolution_clock::time_point GetLastTransitionEndTime() +{ + return lastTransitionEndTime; +} + +std::chrono::high_resolution_clock::time_point GetLastSceneChangeTime() +{ + return lastSceneChangeTime; +} + +OBSWeakSource GetCurrentScene() +{ + return switcher->currentScene; +} + +OBSWeakSource GetPreviousScene() +{ + return switcher->previousScene; +} + +bool AnySceneTransitionStarted() +{ + return switcher->AnySceneTransitionStarted(); +} + +bool ShouldModifyTransitionOverrides() +{ + return switcher->transitionOverrideOverride; +} + +bool ShouldModifyActiveTransition() +{ + return switcher->adjustActiveTransitionType; } } // namespace advss diff --git a/src/utils/scene-switch-helpers.hpp b/src/utils/scene-switch-helpers.hpp index ecfc0b86..27f9f022 100644 --- a/src/utils/scene-switch-helpers.hpp +++ b/src/utils/scene-switch-helpers.hpp @@ -1,5 +1,6 @@ #pragma once #include +#include #include namespace advss { @@ -15,12 +16,24 @@ struct TransitionData { int duration = 0; }; -void SetNextTransition(const SceneSwitchInfo &ssi, obs_source_t *currentSource, - TransitionData &td); -void OverwriteTransitionOverride(const SceneSwitchInfo &ssi, - TransitionData &td); -void RestoreTransitionOverride(obs_source_t *scene, const TransitionData &td); -void SwitchScene(const SceneSwitchInfo &ssi, bool force = false); -void SwitchPreviewScene(const OBSWeakSource &ws); +void SwitchScene(const SceneSwitchInfo &, bool force = false); +void SwitchPreviewScene(const OBSWeakSource &scene); + +std::chrono::high_resolution_clock::time_point GetLastTransitionEndTime(); +std::chrono::high_resolution_clock::time_point GetLastSceneChangeTime(); + +OBSWeakSource GetCurrentScene(); +OBSWeakSource GetPreviousScene(); + +bool ShouldModifyTransitionOverrides(); +bool ShouldModifyActiveTransition(); +void OverwriteTransitionOverride(const SceneSwitchInfo &, TransitionData &); +void RestoreTransitionOverride(obs_source_t *scene, const TransitionData &); + +bool AnySceneTransitionStarted(); + +// TODO: Remove at some point +void SetNextTransition(const SceneSwitchInfo &, obs_source_t *currentSource, + TransitionData &); } // namespace advss