diff --git a/plugins/base/CMakeLists.txt b/plugins/base/CMakeLists.txt index 35e0697e..a6eebee8 100644 --- a/plugins/base/CMakeLists.txt +++ b/plugins/base/CMakeLists.txt @@ -166,6 +166,8 @@ target_sources( utils/scene-item-selection.hpp utils/scene-item-transform-helpers.cpp utils/scene-item-transform-helpers.hpp + utils/transition-helpers.cpp + utils/transition-helpers.hpp utils/source-properties-button.cpp utils/source-properties-button.hpp utils/source-settings-helpers.cpp diff --git a/plugins/base/macro-action-scene-switch.cpp b/plugins/base/macro-action-scene-switch.cpp index bc6b1c9b..f4d0aefd 100644 --- a/plugins/base/macro-action-scene-switch.cpp +++ b/plugins/base/macro-action-scene-switch.cpp @@ -4,6 +4,7 @@ #include "plugin-state-helpers.hpp" #include "scene-switch-helpers.hpp" #include "source-helpers.hpp" +#include "transition-helpers.hpp" #include @@ -68,14 +69,6 @@ static int getTransitionOverrideDuration(OBSWeakSource &scene) return duration; } -static bool isUsingFixedLengthTransition(const OBSWeakSource &transition) -{ - obs_source_t *source = obs_weak_source_get_source(transition); - bool ret = obs_transition_fixed(source); - obs_source_release(source); - return ret; -} - static OBSWeakSource getOverrideTransition(OBSWeakSource &scene) { OBSWeakSource transition; @@ -101,13 +94,13 @@ static int getExpectedTransitionDuration(OBSWeakSource &scene, auto overrideTransition = getOverrideTransition(scene); if (overrideTransition) { transition = overrideTransition; - if (!isUsingFixedLengthTransition(transition)) { + if (!IsFixedLengthTransition(transition)) { return getTransitionOverrideDuration(scene); } } } - if (isUsingFixedLengthTransition(transition)) { + if (IsFixedLengthTransition(transition)) { return -1; // no API is available to access the fixed duration } if (duration != 0) { @@ -503,7 +496,7 @@ shouldShowDurationInTransitionLayout(MacroActionSwitchScene::SceneType type, return true; } - if (isUsingFixedLengthTransition(transition.GetTransition())) { + if (IsFixedLengthTransition(transition.GetTransition())) { return false; } diff --git a/plugins/base/macro-action-transition.cpp b/plugins/base/macro-action-transition.cpp index 49cddd16..de8de695 100644 --- a/plugins/base/macro-action-transition.cpp +++ b/plugins/base/macro-action-transition.cpp @@ -1,5 +1,6 @@ #include "macro-action-transition.hpp" #include "layout-helpers.hpp" +#include "transition-helpers.hpp" #include @@ -75,26 +76,6 @@ static void obs_sceneitem_set_transition_duration(obs_sceneitem_t *item, } #endif -static void setSceneItemTransition(const OBSSceneItem &item, - const OBSSourceAutoRelease &transition, - bool show) -{ - OBSDataAutoRelease settings = obs_source_get_settings(transition); - if (!transition || !settings) { - // Set transition to "None" - obs_sceneitem_set_transition(item, show, nullptr); - return; - } - - // We cannot share the transition source between - // scene items without introducing strange graphical - // artifacts so we have to create new ones here - OBSSourceAutoRelease transitionSource = obs_source_create_private( - obs_source_get_id(transition), obs_source_get_name(transition), - settings); - obs_sceneitem_set_transition(item, show, transitionSource); -} - void MacroActionTransition::SetSourceTransition(bool show) { #if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(27, 0, 0) @@ -103,7 +84,7 @@ void MacroActionTransition::SetSourceTransition(bool show) const auto items = _source.GetSceneItems(_scene); for (const auto &item : items) { if (_setTransitionType) { - setSceneItemTransition(item, transition, show); + SetSceneItemTransition(item, transition, show); } if (_setDuration) { obs_sceneitem_set_transition_duration( diff --git a/plugins/base/utils/transition-helpers.cpp b/plugins/base/utils/transition-helpers.cpp new file mode 100644 index 00000000..2902b5f4 --- /dev/null +++ b/plugins/base/utils/transition-helpers.cpp @@ -0,0 +1,32 @@ +#include "transition-helpers.hpp" + +namespace advss { + +bool IsFixedLengthTransition(const OBSWeakSource &transition) +{ + OBSSourceAutoRelease source = obs_weak_source_get_source(transition); + return obs_transition_fixed(source); +} + +obs_source_t *SetSceneItemTransition(const OBSSceneItem &item, + const OBSSourceAutoRelease &transition, + bool show) +{ + OBSDataAutoRelease settings = obs_source_get_settings(transition); + if (!transition || !settings) { + // Set transition to "None" + obs_sceneitem_set_transition(item, show, nullptr); + return nullptr; + } + + // We cannot share the transition source between + // scene items without introducing strange graphical + // artifacts so we have to create new ones here + OBSSourceAutoRelease transitionSource = obs_source_create_private( + obs_source_get_id(transition), obs_source_get_name(transition), + settings); + obs_sceneitem_set_transition(item, show, transitionSource); + return transitionSource.Get(); +} + +} // namespace advss diff --git a/plugins/base/utils/transition-helpers.hpp b/plugins/base/utils/transition-helpers.hpp new file mode 100644 index 00000000..afd5b525 --- /dev/null +++ b/plugins/base/utils/transition-helpers.hpp @@ -0,0 +1,11 @@ +#pragma once +#include + +namespace advss { + +bool IsFixedLengthTransition(const OBSWeakSource &transition); +obs_source_t *SetSceneItemTransition(const OBSSceneItem &item, + const OBSSourceAutoRelease &transition, + bool show); + +} // namespace advss