From 0b8078f3bf51e24d1cccce2b525caa7361c5dd3c Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Fri, 28 Apr 2023 23:33:05 +0200 Subject: [PATCH] Move scene switch related functions to separate files --- CMakeLists.txt | 2 + src/advanced-scene-switcher.cpp | 42 +----- src/advanced-scene-switcher.hpp | 11 -- src/legacy/switch-network.cpp | 7 +- src/legacy/switch-network.hpp | 4 +- src/legacy/switch-transitions.cpp | 98 ------------- src/macro-core/macro-action-scene-switch.cpp | 3 +- src/switcher-data-structs.hpp | 13 -- src/utils/scene-switch-helpers.cpp | 145 +++++++++++++++++++ src/utils/scene-switch-helpers.hpp | 26 ++++ 10 files changed, 183 insertions(+), 168 deletions(-) create mode 100644 src/utils/scene-switch-helpers.cpp create mode 100644 src/utils/scene-switch-helpers.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e4def3b6..6cf0df14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -271,6 +271,8 @@ target_sources( src/utils/scene-item-selection.hpp src/utils/scene-selection.cpp src/utils/scene-selection.hpp + src/utils/scene-switch-helpers.cpp + src/utils/scene-switch-helpers.hpp src/utils/screenshot-helper.cpp src/utils/screenshot-helper.hpp src/utils/section.cpp diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index de7eba67..96d8aea1 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -10,6 +10,7 @@ #include "advanced-scene-switcher.hpp" #include "status-control.hpp" +#include "scene-switch-helpers.hpp" #include "curl-helper.hpp" #include "utility.hpp" #include "version.h" @@ -250,7 +251,7 @@ void SwitcherData::Thread() if (macroMatch) { runMacros(); } else { - switchScene({scene, transition, 0}); + SwitchScene({scene, transition, 0}); } } @@ -374,45 +375,6 @@ bool SwitcherData::checkForMatch(OBSWeakSource &scene, return match; } -void switchScene(const sceneSwitchInfo &sceneSwitch, bool force) -{ - if (!sceneSwitch.scene && switcher->verbose) { - blog(LOG_INFO, "nothing to switch to"); - return; - } - - obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene); - obs_source_t *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) { - restoreTransitionOverride(source, - currentTransitionData); - } - - if (switcher->verbose) { - blog(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); - obs_frontend_set_current_preview_scene(source); - obs_source_release(source); -} - static void ResetMacros() { for (auto &m : switcher->macros) { diff --git a/src/advanced-scene-switcher.hpp b/src/advanced-scene-switcher.hpp index 688489b2..8d054459 100644 --- a/src/advanced-scene-switcher.hpp +++ b/src/advanced-scene-switcher.hpp @@ -382,17 +382,6 @@ public slots: void OpenSettingsWindow(); -/****************************************************************************** - * Sceneswitch helper - ******************************************************************************/ -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); - /****************************************************************************** * Settings helper ******************************************************************************/ diff --git a/src/legacy/switch-network.cpp b/src/legacy/switch-network.cpp index f1dd5de1..69a393a9 100644 --- a/src/legacy/switch-network.cpp +++ b/src/legacy/switch-network.cpp @@ -7,6 +7,7 @@ Most of this code is based on https://github.com/Palakis/obs-websocket #include #include "advanced-scene-switcher.hpp" +#include "scene-switch-helpers.hpp" #include "utility.hpp" namespace advss { @@ -222,7 +223,7 @@ void WSServer::stop() blog(LOG_INFO, "server stopped successfully"); } -void WSServer::sendMessage(sceneSwitchInfo sceneSwitch, bool preview) +void WSServer::sendMessage(SceneSwitchInfo sceneSwitch, bool preview) { if (!sceneSwitch.scene) { return; @@ -306,9 +307,9 @@ std::string processMessage(std::string payload) "'"; } if (preview) { - switchPreviewScene(scene); + SwitchPreviewScene(scene); } else { - switchScene({scene, transition, duration}); + SwitchScene({scene, transition, duration}); } return ret; } diff --git a/src/legacy/switch-network.hpp b/src/legacy/switch-network.hpp index f47fa60b..dd9881bf 100644 --- a/src/legacy/switch-network.hpp +++ b/src/legacy/switch-network.hpp @@ -25,7 +25,7 @@ using websocketpp::connection_hdl; typedef websocketpp::server server; typedef websocketpp::client client; -struct sceneSwitchInfo; +struct SceneSwitchInfo; class NetworkConfig { public: @@ -62,7 +62,7 @@ public: virtual ~WSServer(); void start(quint16 port, bool lockToIPv4); void stop(); - void sendMessage(sceneSwitchInfo sceneSwitch, bool preview = false); + void sendMessage(SceneSwitchInfo sceneSwitch, bool preview = false); QThreadPool *threadPool() { return &_threadPool; } private: diff --git a/src/legacy/switch-transitions.cpp b/src/legacy/switch-transitions.cpp index 43115e44..dfbf7bab 100644 --- a/src/legacy/switch-transitions.cpp +++ b/src/legacy/switch-transitions.cpp @@ -181,104 +181,6 @@ void AdvSceneSwitcher::DefTransitionDelayValueChanged(int value) DefaultSceneTransition::delay = value; } -std::pair getNextTransition(obs_weak_source_t *scene1, - obs_weak_source_t *scene2) -{ - obs_weak_source_t *ws = nullptr; - int duration = 0; - if (scene1 && scene2) { - for (SceneTransition &t : switcher->sceneTransitions) { - if (!t.initialized()) { - continue; - } - - if (t.scene == scene1 && t.scene2 == scene2) { - ws = t.transition; - duration = t.duration * 1000; - break; - } - } - } - return std::make_pair(ws, duration); -} - -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); - - td.name = obs_data_get_string(data, "transition"); - td.duration = obs_data_get_int(data, "transition_duration"); - - std::string name = GetWeakSourceName(ssi.transition); - - 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); - - obs_data_set_string(data, "transition", td.name.c_str()); - obs_data_set_int(data, "transition_duration", td.duration); - - obs_data_release(data); -} - -void setNextTransition(const sceneSwitchInfo &sceneSwitch, - obs_source_t *currentSource, transitionData &td) -{ - // Priority: - // 1. Transition tab - // 2. Individual switcher entry - // 3. Current transition settings - - // Transition Tab - obs_weak_source_t *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; - - // Individual switcher entry - if (!nextTransition) { - nextTransition = sceneSwitch.transition; - } - if (!nextTransitionDuration) { - nextTransitionDuration = sceneSwitch.duration; - } - - // Current transition settings - if (!nextTransition) { - auto ct = obs_frontend_get_current_transition(); - nextTransition = obs_source_get_weak_source(ct); - obs_weak_source_release(nextTransition); - obs_source_release(ct); - } - if (!nextTransitionDuration) { - nextTransitionDuration = obs_frontend_get_transition_duration(); - } - - if (switcher->adjustActiveTransitionType) { - obs_frontend_set_transition_duration(nextTransitionDuration); - auto t = obs_weak_source_get_source(nextTransition); - obs_frontend_set_current_transition(t); - obs_source_release(t); - } - - if (switcher->transitionOverrideOverride) { - overwriteTransitionOverride({sceneSwitch.scene, nextTransition, - nextTransitionDuration}, - td); - } -} - void SwitcherData::saveSceneTransitions(obs_data_t *obj) { obs_data_array_t *sceneTransitionsArray = obs_data_array_create(); diff --git a/src/macro-core/macro-action-scene-switch.cpp b/src/macro-core/macro-action-scene-switch.cpp index bbe7e085..94fc6909 100644 --- a/src/macro-core/macro-action-scene-switch.cpp +++ b/src/macro-core/macro-action-scene-switch.cpp @@ -1,5 +1,6 @@ #include "macro-action-scene-switch.hpp" #include "advanced-scene-switcher.hpp" +#include "scene-switch-helpers.hpp" #include "utility.hpp" namespace advss { @@ -123,7 +124,7 @@ bool MacroActionSwitchScene::PerformAction() { auto scene = _scene.GetScene(); auto transition = _transition.GetTransition(); - switchScene({scene, transition, (int)(_duration.Milliseconds())}, + SwitchScene({scene, transition, (int)(_duration.Milliseconds())}, obs_frontend_preview_program_mode_active()); if (_blockUntilTransitionDone && scene) { return WaitForTransition(scene, transition); diff --git a/src/switcher-data-structs.hpp b/src/switcher-data-structs.hpp index eaa5e0b6..594dfa02 100644 --- a/src/switcher-data-structs.hpp +++ b/src/switcher-data-structs.hpp @@ -61,19 +61,6 @@ enum class AutoStartEvent { RECORINDG_OR_STREAMING, }; -typedef struct sceneSwitchInfo { - OBSWeakSource scene; - OBSWeakSource transition; - int duration = 0; - -} sceneSwitchInfo; - -typedef struct transitionData { - std::string name = ""; - int duration = 0; - -} transitionData; - class Item; class SwitcherThread; diff --git a/src/utils/scene-switch-helpers.cpp b/src/utils/scene-switch-helpers.cpp new file mode 100644 index 00000000..bac78592 --- /dev/null +++ b/src/utils/scene-switch-helpers.cpp @@ -0,0 +1,145 @@ +#include "scene-switch-helpers.hpp" +#include "switcher-data-structs.hpp" +#include "obs-frontend-api.h" +#include "utility.hpp" + +namespace advss { + +static std::pair +getNextTransition(obs_weak_source_t *scene1, obs_weak_source_t *scene2) +{ + obs_weak_source_t *ws = nullptr; + int duration = 0; + if (scene1 && scene2) { + for (SceneTransition &t : switcher->sceneTransitions) { + if (!t.initialized()) { + continue; + } + + if (t.scene == scene1 && t.scene2 == scene2) { + ws = t.transition; + duration = t.duration * 1000; + break; + } + } + } + return std::make_pair(ws, duration); +} + +void SetNextTransition(const SceneSwitchInfo &sceneSwitch, + obs_source_t *currentSource, TransitionData &td) +{ + // Priority: + // 1. Transition tab + // 2. Individual switcher entry + // 3. Current transition settings + + // Transition Tab + obs_weak_source_t *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; + + // Individual switcher entry + if (!nextTransition) { + nextTransition = sceneSwitch.transition; + } + if (!nextTransitionDuration) { + nextTransitionDuration = sceneSwitch.duration; + } + + // Current transition settings + if (!nextTransition) { + auto ct = obs_frontend_get_current_transition(); + nextTransition = obs_source_get_weak_source(ct); + obs_weak_source_release(nextTransition); + obs_source_release(ct); + } + if (!nextTransitionDuration) { + nextTransitionDuration = obs_frontend_get_transition_duration(); + } + + if (switcher->adjustActiveTransitionType) { + obs_frontend_set_transition_duration(nextTransitionDuration); + auto t = obs_weak_source_get_source(nextTransition); + obs_frontend_set_current_transition(t); + obs_source_release(t); + } + + if (switcher->transitionOverrideOverride) { + OverwriteTransitionOverride({sceneSwitch.scene, nextTransition, + nextTransitionDuration}, + td); + } +} + +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); + + td.name = obs_data_get_string(data, "transition"); + td.duration = obs_data_get_int(data, "transition_duration"); + + std::string name = GetWeakSourceName(ssi.transition); + + 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); + + 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) +{ + if (!sceneSwitch.scene) { + vblog(LOG_INFO, "nothing to switch to"); + return; + } + + obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene); + obs_source_t *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) { + RestoreTransitionOverride(source, + currentTransitionData); + } + + if (switcher->verbose) { + blog(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); + obs_frontend_set_current_preview_scene(source); + obs_source_release(source); +} + +} // namespace advss diff --git a/src/utils/scene-switch-helpers.hpp b/src/utils/scene-switch-helpers.hpp new file mode 100644 index 00000000..ecfc0b86 --- /dev/null +++ b/src/utils/scene-switch-helpers.hpp @@ -0,0 +1,26 @@ +#pragma once +#include +#include + +namespace advss { + +struct SceneSwitchInfo { + OBSWeakSource scene; + OBSWeakSource transition; + int duration = 0; +}; + +struct TransitionData { + std::string name = ""; + 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); + +} // namespace advss