diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index b58dcc6d..690aeb1e 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -354,7 +354,8 @@ void switchScene(const sceneSwitchInfo &sceneSwitch) } obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene); - obs_source_t *currentSource = obs_frontend_get_current_scene(); + obs_source_t *currentSource = + obs_weak_source_get_source(switcher->currentScene); if (source && source != currentSource) { transitionData currentTransitionData; @@ -473,15 +474,21 @@ void handleSceneChange() switcher->cv.notify_one(); } - // Set previous scene + // Set current and previous scene obs_source_t *source = obs_frontend_get_current_scene(); obs_weak_source_t *ws = obs_source_get_weak_source(source); + + if (ws && ws != switcher->currentScene) { + switcher->previousScene = switcher->currentScene; + switcher->currentScene = ws; + vblog(LOG_INFO, "current scene: %s", + GetWeakSourceName(switcher->currentScene).c_str()); + vblog(LOG_INFO, "previous scene: %s", + GetWeakSourceName(switcher->previousScene).c_str()); + } + obs_source_release(source); obs_weak_source_release(ws); - if (source && switcher->previousSceneHelper != ws) { - switcher->previousScene = switcher->previousSceneHelper; - switcher->previousSceneHelper = ws; - } switcher->checkTriggers(); switcher->checkDefaultSceneTransitions(); diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp index 08e8382c..c3bdd67f 100644 --- a/src/headers/switcher-data-structs.hpp +++ b/src/headers/switcher-data-structs.hpp @@ -78,8 +78,8 @@ struct SwitcherData { int interval = default_interval; obs_source_t *waitScene = nullptr; + OBSWeakSource currentScene = nullptr; OBSWeakSource previousScene = nullptr; - OBSWeakSource previousSceneHelper = nullptr; OBSWeakSource lastRandomScene; SceneGroup *lastRandomSceneGroup; OBSWeakSource nonMatchingScene; diff --git a/src/macro-condition-scene.cpp b/src/macro-condition-scene.cpp index 93ba8421..d63b340c 100644 --- a/src/macro-condition-scene.cpp +++ b/src/macro-condition-scene.cpp @@ -19,12 +19,7 @@ bool MacroConditionScene::CheckCondition() { bool sceneMatch = false; if (_type == SceneType::CURRENT) { - obs_source_t *rawScene = obs_frontend_get_current_scene(); - OBSWeakSource currentScene = - obs_source_get_weak_source(rawScene); - sceneMatch = currentScene == _scene; - obs_weak_source_release(currentScene); - obs_source_release(rawScene); + sceneMatch = switcher->currentScene == _scene; } else { sceneMatch = switcher->previousScene == _scene; } diff --git a/src/scene-trigger.cpp b/src/scene-trigger.cpp index 45dbe98d..59351e0c 100644 --- a/src/scene-trigger.cpp +++ b/src/scene-trigger.cpp @@ -298,9 +298,6 @@ void SwitcherData::checkTriggers() return; } - OBSSource source = obs_frontend_get_current_scene(); - OBSWeakSource currentScene = obs_source_get_weak_source(source); - for (auto &t : sceneTriggers) { if (stop && !isSwitcherStatusAction(t.triggerAction)) { continue; @@ -311,9 +308,6 @@ void SwitcherData::checkTriggers() t.performAction(); } } - - obs_source_release(source); - obs_weak_source_release(currentScene); } void SwitcherData::saveSceneTriggers(obs_data_t *obj) diff --git a/src/switch-file.cpp b/src/switch-file.cpp index 55f27d92..6aa66181 100644 --- a/src/switch-file.cpp +++ b/src/switch-file.cpp @@ -90,15 +90,12 @@ void SwitcherData::writeSceneInfoToFile() return; } - obs_source_t *currentSource = obs_frontend_get_current_scene(); - QFile file(QString::fromStdString(fileIO.writePath)); if (file.open(QIODevice::WriteOnly)) { - const char *msg = obs_source_get_name(currentSource); + const char *msg = GetWeakSourceName(currentScene).c_str(); file.write(msg, qstrlen(msg)); file.close(); } - obs_source_release(currentSource); } void SwitcherData::writeToStatusFile(const QString &msg) diff --git a/src/switch-pause.cpp b/src/switch-pause.cpp index 1318d665..0514f69f 100644 --- a/src/switch-pause.cpp +++ b/src/switch-pause.cpp @@ -150,7 +150,7 @@ void setPauseTarget(PauseTarget &target) bool checkPauseScene(obs_weak_source_t *currentScene, obs_weak_source_t *scene, PauseTarget &target) { - if (currentScene != scene) { + if (!currentScene || currentScene != scene) { return false; } @@ -175,12 +175,10 @@ bool SwitcherData::checkPause() resetPause(); - obs_source_t *currentSource = obs_frontend_get_current_scene(); - obs_weak_source_t *ws = obs_source_get_weak_source(currentSource); - for (PauseEntry &s : pauseEntries) { if (s.pauseType == PauseType::Scene) { - pauseAll = checkPauseScene(ws, s.scene, s.pauseTarget); + pauseAll = checkPauseScene(currentScene, s.scene, + s.pauseTarget); } else { pauseAll = checkPauseWindow(title, s.window, s.pauseTarget); @@ -189,10 +187,6 @@ bool SwitcherData::checkPause() break; } } - - obs_source_release(currentSource); - obs_weak_source_release(ws); - return pauseAll; } diff --git a/src/switch-screen-region.cpp b/src/switch-screen-region.cpp index ff1fc08b..7bf9f7c8 100644 --- a/src/switch-screen-region.cpp +++ b/src/switch-screen-region.cpp @@ -143,12 +143,7 @@ bool shouldIgnoreSceneSwitch(ScreenRegionSwitch &matchingRegion) return false; } - obs_source_t *currentScene = obs_frontend_get_current_scene(); - OBSWeakSource ws = obs_source_get_weak_source(currentScene); - obs_weak_source_release(ws); - obs_source_release(currentScene); - - return matchingRegion.excludeScene == ws; + return matchingRegion.excludeScene == switcher->currentScene; } bool SwitcherData::checkScreenRegionSwitch(OBSWeakSource &scene, diff --git a/src/switch-sequence.cpp b/src/switch-sequence.cpp index 51ca8361..2db310c1 100644 --- a/src/switch-sequence.cpp +++ b/src/switch-sequence.cpp @@ -194,9 +194,6 @@ bool SwitcherData::checkSceneSequence(OBSWeakSource &scene, return false; } - obs_source_t *currentSceneSource = obs_frontend_get_current_scene(); - obs_weak_source_t *currentScene = - obs_source_get_weak_source(currentSceneSource); bool match = false; for (SceneSequenceSwitch &s : sceneSequenceSwitches) { @@ -243,9 +240,6 @@ bool SwitcherData::checkSceneSequence(OBSWeakSource &scene, uninterruptibleSceneSequenceActive = false; } - obs_source_release(currentSceneSource); - obs_weak_source_release(currentScene); - return match; } diff --git a/src/switch-transitions.cpp b/src/switch-transitions.cpp index 4965e287..6f6bd024 100644 --- a/src/switch-transitions.cpp +++ b/src/switch-transitions.cpp @@ -158,10 +158,6 @@ void SwitcherData::checkDefaultSceneTransitions() return; } - obs_source_t *currentSceneSource = obs_frontend_get_current_scene(); - obs_weak_source_t *currentScene = - obs_source_get_weak_source(currentSceneSource); - for (auto &t : defaultSceneTransitions) { if (t.checkMatch(currentScene)) { if (verbose) { @@ -171,9 +167,6 @@ void SwitcherData::checkDefaultSceneTransitions() break; } } - - obs_weak_source_release(currentScene); - obs_source_release(currentSceneSource); } void AdvSceneSwitcher::on_transitionOverridecheckBox_stateChanged(int state)