diff --git a/src/eventhandler/EventHandler_Transitions.cpp b/src/eventhandler/EventHandler_Transitions.cpp index eefb3887..0f198f07 100644 --- a/src/eventhandler/EventHandler_Transitions.cpp +++ b/src/eventhandler/EventHandler_Transitions.cpp @@ -63,11 +63,37 @@ void EventHandler::HandleCurrentSceneTransitionDurationChanged() BroadcastEvent(EventSubscription::Transitions, "CurrentSceneTransitionDurationChanged", eventData); } +// The "Fade to Black" transition works funny in studio mode. +// In studio mode this first fades to black, essentially not showing a scene at all. +// Then upon a second fade to black, it actually moves to the correct scene, but the from scene is null. +void SetFromAndToScene(json &eventData, obs_source_t *transition) +{ + if (OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A)) { + eventData["fromScene"] = obs_source_get_name(sourceScene); + } + + if (OBSSourceAutoRelease destinationScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_B)) { + eventData["toScene"] = obs_source_get_name(destinationScene); + } +} + +// FIXME: OBS bug causes source B to be null for transition end but not video transition end. +// Needs to be fixed in obs itself +void SetToScene(json &eventData, obs_source_t *transition) +{ + if (OBSSourceAutoRelease sourceScene = obs_transition_get_source(transition, OBS_TRANSITION_SOURCE_A)) { + eventData["toScene"] = obs_source_get_name(sourceScene); + } +} + /** * A scene transition has started. * - * @dataField transitionName | String | Scene transition name - * @dataField transitionUuid | String | Scene transition UUID + * @dataField transitionName | String | Scene transition name + * @dataField transitionUuid | String | Scene transition UUID + * @dataField transitionDuration | Number | Transition duration in milliseconds + * @dataField toScene | String | Scene that we transitioned to, possibly missing when using "Fade to Black"in studio mode. + * @dataField fromScene | String | Scene that we transitioned away from, possibly missing when using "Fade to Black"in studio mode. * * @eventType SceneTransitionStarted * @eventSubscription Transitions @@ -88,6 +114,10 @@ void EventHandler::HandleSceneTransitionStarted(void *param, calldata_t *data) json eventData; eventData["transitionName"] = obs_source_get_name(source); eventData["transitionUuid"] = obs_source_get_uuid(source); + eventData["transitionDuration"] = obs_frontend_get_transition_duration(); + + SetFromAndToScene(eventData, source); + eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionStarted", eventData); } @@ -96,8 +126,10 @@ void EventHandler::HandleSceneTransitionStarted(void *param, calldata_t *data) * * Note: Does not appear to trigger when the transition is interrupted by the user. * - * @dataField transitionName | String | Scene transition name - * @dataField transitionUuid | String | Scene transition UUID + * @dataField transitionName | String | Scene transition name + * @dataField transitionUuid | String | Scene transition UUID + * @dataField transitionDuration | Number | Transition duration in milliseconds + * @dataField toScene | String | Scene that we transitioned to, possibly missing when using "Fade to Black"in studio mode. * * @eventType SceneTransitionEnded * @eventSubscription Transitions @@ -118,6 +150,10 @@ void EventHandler::HandleSceneTransitionEnded(void *param, calldata_t *data) json eventData; eventData["transitionName"] = obs_source_get_name(source); eventData["transitionUuid"] = obs_source_get_uuid(source); + eventData["transitionDuration"] = obs_frontend_get_transition_duration(); + + SetToScene(eventData, source); + eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionEnded", eventData); } @@ -129,8 +165,11 @@ void EventHandler::HandleSceneTransitionEnded(void *param, calldata_t *data) * * Note: Appears to be called by every transition, regardless of relevance. * - * @dataField transitionName | String | Scene transition name - * @dataField transitionUuid | String | Scene transition UUID + * @dataField transitionName | String | Scene transition name + * @dataField transitionUuid | String | Scene transition UUID + * @dataField transitionDuration | Number | Transition duration in milliseconds + * @dataField toScene | String | Scene that we transitioned to, possibly missing when using "Fade to Black"in studio mode. + * @dataField fromScene | String | Scene that we transitioned away from, possibly missing when using "Fade to Black"in studio mode. * * @eventType SceneTransitionVideoEnded * @eventSubscription Transitions @@ -151,5 +190,9 @@ void EventHandler::HandleSceneTransitionVideoEnded(void *param, calldata_t *data json eventData; eventData["transitionName"] = obs_source_get_name(source); eventData["transitionUuid"] = obs_source_get_uuid(source); + eventData["transitionDuration"] = obs_frontend_get_transition_duration(); + + SetFromAndToScene(eventData, source); + eventHandler->BroadcastEvent(EventSubscription::Transitions, "SceneTransitionVideoEnded", eventData); }