From 5d74d5d03e4da8858978bfbfd8d6070997288ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 30 Aug 2019 13:36:45 +0200 Subject: [PATCH 1/3] 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("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(param); OBSSource transition = calldata_get_pointer(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)); } From bfd26493abc3da7138156ffbe1a25beea2f5d188 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 30 Aug 2019 13:41:08 +0200 Subject: [PATCH 2/3] Utils(GetTransitionDuration): return 0 if transition is a cut transition --- src/Utils.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Utils.cpp b/src/Utils.cpp index 59d6c67d..c08b5416 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -367,6 +367,12 @@ int Utils::GetTransitionDuration(obs_source_t* transition) { return -1; } + QString transitionKind = obs_source_get_id(transition); + if (transitionKind == "cut_transition") { + // If this is a Cut transition, return 0 + return 0; + } + OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition); OBSDataAutoRelease destinationSettings = obs_source_get_private_settings(destinationScene); From 5fe9314b74bd4cbf2fc54bf051d24f6095fcce9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Fri, 30 Aug 2019 13:41:50 +0200 Subject: [PATCH 3/3] WSEvents: remove unused transitionIsCut helper --- src/WSEvents.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index 32b4ecce..1638d8c1 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -29,17 +29,6 @@ #define STATUS_INTERVAL 2000 -bool transitionIsCut(obs_source_t* transition) { - if (!transition) - return false; - - if (obs_source_get_type(transition) == OBS_SOURCE_TYPE_TRANSITION - && QString(obs_source_get_id(transition)) == "cut_transition") { - return true; - } - return false; -} - const char* nsToTimestamp(uint64_t ns) { uint64_t ms = ns / (1000 * 1000); uint64_t secs = ms / 1000;