diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index 1d1530e6..c4640c90 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -533,9 +533,7 @@ void SwitcherData::Thread() lock.unlock(); if (match) { - switchScene(scene, transition, - tansitionOverrideOverride, - adjustActiveTransitionType, verbose); + switchScene({scene, transition, 0}); } writeSceneInfoToFile(); @@ -604,34 +602,32 @@ bool SwitcherData::checkForMatch(OBSWeakSource &scene, return match; } -void switchScene(OBSWeakSource &scene, OBSWeakSource &transition, - bool transitionOverrideOverride, - bool adjustActiveTransitionType, bool verbose) +void switchScene(sceneSwitchInfo sceneSwitch) { - if (!scene && verbose) { + if (!sceneSwitch.scene && switcher->verbose) { blog(LOG_INFO, "nothing to switch to"); return; } - obs_source_t *source = obs_weak_source_get_source(scene); + obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene); obs_source_t *currentSource = obs_frontend_get_current_scene(); if (source && source != currentSource) { - transitionData td; - setNextTransition(scene, currentSource, transition, - transitionOverrideOverride, - adjustActiveTransitionType, td); + transitionData currentTransitionData; + setNextTransition(sceneSwitch, currentSource, + currentTransitionData); obs_frontend_set_current_scene(source); - if (transitionOverrideOverride) { - restoreTransitionOverride(source, td); + if (switcher->transitionOverrideOverride) { + restoreTransitionOverride(source, + currentTransitionData); } - if (verbose) { + if (switcher->verbose) { blog(LOG_INFO, "switched scene"); } if (switcher->networkConfig.ServerEnabled) { - switcher->server.sendMessage(scene, transition); + switcher->server.sendMessage(sceneSwitch); } } obs_source_release(currentSource); @@ -725,7 +721,7 @@ void handleSceneChange(SwitcherData *s) if (switcher->networkConfig.ServerEnabled && switcher->networkConfig.SendAll) { - switcher->server.sendMessage(ws, nullptr); + switcher->server.sendMessage({ws, nullptr, 0}); } } diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp index c6b8ba03..e1a0dc5e 100644 --- a/src/headers/advanced-scene-switcher.hpp +++ b/src/headers/advanced-scene-switcher.hpp @@ -287,17 +287,11 @@ bool isInFocus(const QString &executable); * Sceneswitch helper ******************************************************************************/ -void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource, - OBSWeakSource &transition, - bool transitionOverrideOverride, - bool adjustActiveTransitionType, transitionData &td); -void overwriteTransitionOverride(obs_weak_source_t *sceneWs, - obs_source_t *transition, int duration, - transitionData &td); +void setNextTransition(sceneSwitchInfo &ssi, obs_source_t *currentSource, + transitionData &td); +void overwriteTransitionOverride(sceneSwitchInfo ssi, transitionData &td); void restoreTransitionOverride(obs_source_t *scene, transitionData td); -void switchScene(OBSWeakSource &scene, OBSWeakSource &transition, - bool transitionOverrideOverride, - bool adjustActiveTransitionType, bool verbose); +void switchScene(sceneSwitchInfo ssi); /****************************************************************************** * Main SwitcherData diff --git a/src/headers/switch-network.hpp b/src/headers/switch-network.hpp index 82c5ee52..4e52061f 100644 --- a/src/headers/switch-network.hpp +++ b/src/headers/switch-network.hpp @@ -22,6 +22,8 @@ using websocketpp::connection_hdl; typedef websocketpp::server server; typedef websocketpp::client client; +struct sceneSwitchInfo; + class NetworkConfig { public: NetworkConfig(); @@ -51,7 +53,7 @@ public: virtual ~WSServer(); void start(quint16 port, bool lockToIPv4); void stop(); - void sendMessage(OBSWeakSource scene, OBSWeakSource transition); + void sendMessage(sceneSwitchInfo sceneSwitch); QThreadPool *threadPool() { return &_threadPool; } private: diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index b46b21c7..6c5e833e 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -41,6 +41,13 @@ 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; @@ -64,7 +71,7 @@ struct SwitcherData { bool verbose = false; bool disableHints = false; bool showFrame = false; - bool tansitionOverrideOverride = false; + bool transitionOverrideOverride = false; bool adjustActiveTransitionType = true; int interval = default_interval; diff --git a/src/switch-network.cpp b/src/switch-network.cpp index 17dc3f76..865e4bf0 100644 --- a/src/switch-network.cpp +++ b/src/switch-network.cpp @@ -23,6 +23,7 @@ Most of this code is based on https://github.com/Palakis/obs-websocket #define SCENE_ENTRY "scene" #define TRANSITION_ENTRY "transition" +#define TRANSITION_DURATION "duration" using websocketpp::lib::placeholders::_1; using websocketpp::lib::placeholders::_2; @@ -191,17 +192,18 @@ void WSServer::stop() blog(LOG_INFO, "server stopped successfully"); } -void WSServer::sendMessage(OBSWeakSource scene, OBSWeakSource transition) +void WSServer::sendMessage(sceneSwitchInfo sceneSwitch) { - if (!scene) { + if (!sceneSwitch.scene) { return; } OBSData data = obs_data_create(); obs_data_set_string(data, SCENE_ENTRY, - GetWeakSourceName(scene).c_str()); + GetWeakSourceName(sceneSwitch.scene).c_str()); obs_data_set_string(data, TRANSITION_ENTRY, - GetWeakSourceName(transition).c_str()); + GetWeakSourceName(sceneSwitch.transition).c_str()); + obs_data_set_int(data, TRANSITION_DURATION, sceneSwitch.duration); std::string message = obs_data_get_json(data); obs_data_release(data); @@ -245,13 +247,15 @@ std::string processMessage(std::string payload) } if (!obs_data_has_user_value(data, SCENE_ENTRY) || - !obs_data_has_user_value(data, TRANSITION_ENTRY)) { + !obs_data_has_user_value(data, TRANSITION_ENTRY) || + !obs_data_has_user_value(data, TRANSITION_DURATION)) { return "missing request parameters"; } std::string sceneName = obs_data_get_string(data, SCENE_ENTRY); std::string transitionName = obs_data_get_string(data, TRANSITION_ENTRY); + int duration = obs_data_get_int(data, TRANSITION_DURATION); obs_data_release(data); @@ -268,8 +272,7 @@ std::string processMessage(std::string payload) "'"; } - switchScene(scene, transition, switcher->tansitionOverrideOverride, - switcher->adjustActiveTransitionType, switcher->verbose); + switchScene({scene, transition, duration}); return ret; } diff --git a/src/switch-transitions.cpp b/src/switch-transitions.cpp index 449778ef..494804de 100644 --- a/src/switch-transitions.cpp +++ b/src/switch-transitions.cpp @@ -189,7 +189,7 @@ void AdvSceneSwitcher::on_transitionOverridecheckBox_stateChanged(int state) } std::lock_guard lock(switcher->m); - switcher->tansitionOverrideOverride = state; + switcher->transitionOverrideOverride = state; } void AdvSceneSwitcher::on_adjustActiveTransitionType_stateChanged(int state) @@ -199,7 +199,7 @@ void AdvSceneSwitcher::on_adjustActiveTransitionType_stateChanged(int state) } // This option only makes sense if we are allowed to use transition overrides - if (!state && !switcher->tansitionOverrideOverride) { + if (!state && !switcher->transitionOverrideOverride) { DisplayMessage(obs_module_text( "AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError")); ui->transitionOverridecheckBox->setChecked(true); @@ -236,25 +236,22 @@ std::pair getNextTransition(obs_weak_source_t *scene1, break; } } - obs_weak_source_addref(ws); } return std::make_pair(ws, duration); } -void overwriteTransitionOverride(obs_weak_source_t *sceneWs, - obs_source_t *transition, - int nextTransitionDuration, transitionData &td) +void overwriteTransitionOverride(sceneSwitchInfo ssi, transitionData &td) { - obs_source_t *scene = obs_weak_source_get_source(sceneWs); + 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"); - const char *name = obs_source_get_name(transition); + std::string name = GetWeakSourceName(ssi.transition); - obs_data_set_string(data, "transition", name); - obs_data_set_int(data, "transition_duration", nextTransitionDuration); + 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); @@ -270,41 +267,54 @@ void restoreTransitionOverride(obs_source_t *scene, transitionData td) obs_data_release(data); } -void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource, - OBSWeakSource &transition, - bool transitionOverrideOverride, - bool adjustActiveTransitionType, transitionData &td) +void setNextTransition(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, targetScene); + auto tinfo = getNextTransition(currentScene, sceneSwitch.scene); obs_weak_source_release(currentScene); - obs_weak_source_t *nextTransitionWs = tinfo.first; + OBSWeakSource nextTransition = tinfo.first; int nextTransitionDuration = tinfo.second; - obs_source_t *nextTransition = nullptr; - if (nextTransitionWs) { - nextTransition = obs_weak_source_get_source(nextTransitionWs); - } else if (transition) { - nextTransition = obs_weak_source_get_source(transition); + // Individual switcher entry + if (!nextTransition) { + nextTransition = sceneSwitch.transition; + } + if (!nextTransitionDuration) { + nextTransitionDuration = sceneSwitch.duration; } - if (nextTransition) { - if (adjustActiveTransitionType) { - obs_frontend_set_transition_duration( - nextTransitionDuration); - obs_frontend_set_current_transition(nextTransition); - } - - if (transitionOverrideOverride) { - overwriteTransitionOverride(targetScene, nextTransition, - nextTransitionDuration, td); - } + // 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(); } - obs_weak_source_release(nextTransitionWs); - obs_source_release(nextTransition); + 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) @@ -334,7 +344,7 @@ void SwitcherData::saveSceneTransitions(obs_data_t *obj) obs_data_array_release(defaultTransitionsArray); obs_data_set_bool(obj, "tansitionOverrideOverride", - tansitionOverrideOverride); + transitionOverrideOverride); obs_data_set_default_bool(obj, "adjustActiveTransitionType", adjustActiveTransitionType); obs_data_set_bool(obj, "adjustActiveTransitionType", @@ -377,7 +387,7 @@ void SwitcherData::loadSceneTransitions(obs_data_t *obj) } obs_data_array_release(defaultTransitionsArray); - tansitionOverrideOverride = + transitionOverrideOverride = obs_data_get_bool(obj, "tansitionOverrideOverride"); adjustActiveTransitionType = obs_data_get_bool(obj, "adjustActiveTransitionType"); @@ -420,7 +430,7 @@ void AdvSceneSwitcher::setupTransitionsTab() } ui->transitionOverridecheckBox->setChecked( - switcher->tansitionOverrideOverride); + switcher->transitionOverrideOverride); ui->adjustActiveTransitionType->setChecked( switcher->adjustActiveTransitionType);