From 5d74d5d03e4da8858978bfbfd8d6070997288ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= <stephane.lepin@gmail.com> Date: Fri, 30 Aug 2019 13:36:45 +0200 Subject: [PATCH] WSEvents(OnTransitionBegin): refactor event code --- src/Utils.cpp | 20 ++++++++++++++++++++ src/Utils.h | 2 ++ src/WSEvents.cpp | 28 ++++++++++------------------ 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index 670585a6..59d6c67d 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -362,6 +362,26 @@ QSpinBox* Utils::GetTransitionDurationControl() { return window->findChild<QSpinBox*>("transitionDuration"); } +int Utils::GetTransitionDuration(obs_source_t* transition) { + if (!transition || obs_source_get_type(transition) != OBS_SOURCE_TYPE_TRANSITION) { + return -1; + } + + OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition); + OBSDataAutoRelease destinationSettings = obs_source_get_private_settings(destinationScene); + + // Detect if transition is the global transition or a transition override. + // Fetching the duration is different depending on the case. + obs_data_item_t* transitionDurationItem = obs_data_item_byname(destinationSettings, "transition_duration"); + int duration = ( + transitionDurationItem + ? obs_data_item_get_int(transitionDurationItem) + : obs_frontend_get_transition_duration() + ); + + return duration; +} + bool Utils::SetTransitionByName(QString transitionName) { OBSSourceAutoRelease transition = GetTransitionFromName(transitionName); diff --git a/src/Utils.h b/src/Utils.h index d832157b..8e2d410d 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -54,6 +54,8 @@ class Utils { // TODO contribute a proper frontend API method for this to OBS and remove this hack static QSpinBox* GetTransitionDurationControl(); + static int GetTransitionDuration(obs_source_t* transition); + static bool SetTransitionByName(QString transitionName); static QString OBSVersionString(); diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 74decf82..32b4ecce 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -847,33 +847,25 @@ void WSEvents::OnTransitionBegin(void* param, calldata_t* data) { auto instance = reinterpret_cast<WSEvents*>(param); OBSSource transition = calldata_get_pointer<obs_source_t>(data, "source"); - if (!transition) return; + if (!transition) { + return; + } - // Detect if transition is the global transition or a transition override. - // Fetching the duration is different depending on the case. - OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A); - OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition); - OBSDataAutoRelease destinationSettings = obs_source_get_private_settings(destinationScene); - int duration = -1; - if (obs_data_has_default_value(destinationSettings, "transition_duration") || - obs_data_has_user_value(destinationSettings, "transition_duration")) - { - duration = obs_data_get_int(destinationSettings, "transition_duration"); - } else { - duration = obs_frontend_get_transition_duration(); + int duration = Utils::GetTransitionDuration(transition); + if (duration < 0) { + blog(LOG_WARNING, "OnTransitionBegin: duration is negative !"); } OBSDataAutoRelease fields = obs_data_create(); obs_data_set_string(fields, "name", obs_source_get_name(transition)); - if (duration >= 0) { - obs_data_set_int(fields, "duration", duration); - } else { - blog(LOG_WARNING, "OnTransitionBegin: duration is negative !"); - } + obs_data_set_int(fields, "duration", duration); + OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A); if (sourceScene) { obs_data_set_string(fields, "from-scene", obs_source_get_name(sourceScene)); } + + OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition); if (destinationScene) { obs_data_set_string(fields, "to-scene", obs_source_get_name(destinationScene)); }