From 2a7aa432a9b4ab2fa2900ba91a69c39bd33d8491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Lepin?= Date: Sun, 15 Mar 2020 23:20:56 +0100 Subject: [PATCH] events(TransitionEnd): remove `from-scene` because it's not available in transition_stop --- src/Utils.cpp | 21 ++++++++++++++------- src/WSEvents.cpp | 2 +- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Utils.cpp b/src/Utils.cpp index 6e5f98db..cf0bcfb5 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -419,20 +419,27 @@ obs_data_t* Utils::GetTransitionData(obs_source_t* transition) { blog(LOG_WARNING, "GetTransitionData: duration is negative !"); } + OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A); + OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition); + obs_data_t* transitionData = obs_data_create(); obs_data_set_string(transitionData, "name", obs_source_get_name(transition)); obs_data_set_string(transitionData, "type", obs_source_get_id(transition)); obs_data_set_int(transitionData, "duration", duration); - OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A); - if (sourceScene) { + // When a transition starts and while it is running, SOURCE_A is the source scene + // and SOURCE_B is the destination scene. + // Before the transition_end event is triggered on a transition, the destination scene + // goes into SOURCE_A and SOURCE_B becomes null. This means that, in transition_stop + // we don't know what was the source scene + // TODO fix this in libobs + + bool isTransitionEndEvent = (sourceScene == destinationScene); + if (!isTransitionEndEvent) { obs_data_set_string(transitionData, "from-scene", obs_source_get_name(sourceScene)); } - - OBSSourceAutoRelease destinationScene = obs_transition_get_active_source(transition); - if (destinationScene) { - obs_data_set_string(transitionData, "to-scene", obs_source_get_name(destinationScene)); - } + + obs_data_set_string(transitionData, "to-scene", obs_source_get_name(destinationScene)); return transitionData; } diff --git a/src/WSEvents.cpp b/src/WSEvents.cpp index d964efdc..1bee974c 100644 --- a/src/WSEvents.cpp +++ b/src/WSEvents.cpp @@ -909,11 +909,11 @@ void WSEvents::OnTransitionBegin(void* param, calldata_t* data) { /** * A transition (other than "cut") has ended. +* Please note that the `from-scene` field is not available in TransitionEnd. * * @return {String} `name` Transition name. * @return {String} `type` Transition type. * @return {int} `duration` Transition duration (in milliseconds). -* @return {String} `from-scene` Source scene of the transition * @return {String} `to-scene` Destination scene of the transition * * @api events