From e462d7f420c3ba4aecaf6d5999bfcd769069c708 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 1 Aug 2020 16:06:16 +0200 Subject: [PATCH] fix sequence not stopping when manually switching scene --- src/advanced-scene-switcher.cpp | 40 ++++++++++++++++----------------- src/scene-round-trip.cpp | 1 + 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp index ed121908..8b9aadba 100644 --- a/src/advanced-scene-switcher.cpp +++ b/src/advanced-scene-switcher.cpp @@ -303,7 +303,6 @@ bool SwitcherData::sceneChangedDuringWait() obs_source_release(currentSource); if (waitScene && currentSource != waitScene) r = true; - waitScene = NULL; return r; } @@ -338,32 +337,33 @@ extern "C" void FreeSceneSwitcher() switcher = nullptr; } +void handleSceneChange(SwitcherData *s) +{ + std::lock_guard lock(s->m); + //stop waiting if scene was manually changed + if (s->sceneChangedDuringWait()) + s->cv.notify_one(); + + //set previous scene + obs_source_t *source = obs_frontend_get_current_scene(); + obs_weak_source_t *ws = obs_source_get_weak_source(source); + obs_source_release(source); + obs_weak_source_release(ws); + if (source && s->PreviousScene2 != ws) { + s->previousScene = s->PreviousScene2; + s->PreviousScene2 = ws; + } +} + static void OBSEvent(enum obs_frontend_event event, void *switcher) { switch (event) { case OBS_FRONTEND_EVENT_EXIT: FreeSceneSwitcher(); break; - - case OBS_FRONTEND_EVENT_SCENE_CHANGED: { - SwitcherData *s = (SwitcherData *)switcher; - std::lock_guard lock(s->m); - //stop waiting if scene was manually changed - if (s->sceneChangedDuringWait()) - s->cv.notify_one(); - - //set previous scene - obs_source_t *source = obs_frontend_get_current_scene(); - obs_weak_source_t *ws = obs_source_get_weak_source(source); - obs_source_release(source); - obs_weak_source_release(ws); - if (source && s->PreviousScene2 != ws) { - s->previousScene = s->PreviousScene2; - s->PreviousScene2 = ws; - } - + case OBS_FRONTEND_EVENT_SCENE_CHANGED: + handleSceneChange((SwitcherData *)switcher); break; - } default: break; } diff --git a/src/scene-round-trip.cpp b/src/scene-round-trip.cpp index cfa86c9b..17e72cda 100644 --- a/src/scene-round-trip.cpp +++ b/src/scene-round-trip.cpp @@ -204,6 +204,7 @@ void SwitcherData::checkSceneRoundTrip(bool &match, OBSWeakSource &scene, cv.wait_for(lock, std::chrono::milliseconds(dur)); + waitScene = nullptr; } obs_source_t *currentSource2 = obs_frontend_get_current_scene();