diff --git a/frontend/widgets/OBSBasic.hpp b/frontend/widgets/OBSBasic.hpp index 07cd02ff1..8a3d84eab 100644 --- a/frontend/widgets/OBSBasic.hpp +++ b/frontend/widgets/OBSBasic.hpp @@ -1568,6 +1568,7 @@ private slots: void RenameTransition(OBSSource transition); void TransitionClicked(); + void TransitionStarted(); void TransitionStopped(); void TransitionFullyStopped(); void TriggerQuickTransition(int id); diff --git a/frontend/widgets/OBSBasic_StudioMode.cpp b/frontend/widgets/OBSBasic_StudioMode.cpp index c17f760a6..b65978a01 100644 --- a/frontend/widgets/OBSBasic_StudioMode.cpp +++ b/frontend/widgets/OBSBasic_StudioMode.cpp @@ -238,8 +238,6 @@ void OBSBasic::SetPreviewProgramMode(bool enabled) sizeObserver = new PreviewProgramSizeObserver(ui->preview, program, this); - ui->transitions->setEnabled(true); - OnEvent(OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED); blog(LOG_INFO, "Switched to Preview/Program mode"); diff --git a/frontend/widgets/OBSBasic_Transitions.cpp b/frontend/widgets/OBSBasic_Transitions.cpp index c682262ca..ed2a9c19b 100644 --- a/frontend/widgets/OBSBasic_Transitions.cpp +++ b/frontend/widgets/OBSBasic_Transitions.cpp @@ -127,6 +127,11 @@ void OBSBasic::RemoveQuickTransitionHotkey(QuickTransition *qt) void OBSBasic::InitTransition(obs_source_t *transition) { + auto onTransitionStart = [](void *data, calldata_t *) { + OBSBasic *window = (OBSBasic *)data; + QMetaObject::invokeMethod(window, "TransitionStarted", Qt::QueuedConnection); + }; + auto onTransitionStop = [](void *data, calldata_t *) { OBSBasic *window = (OBSBasic *)data; QMetaObject::invokeMethod(window, "TransitionStopped", Qt::QueuedConnection); @@ -138,6 +143,7 @@ void OBSBasic::InitTransition(obs_source_t *transition) }; signal_handler_t *handler = obs_source_get_signal_handler(transition); + signal_handler_connect(handler, "transition_start", onTransitionStart, this); signal_handler_connect(handler, "transition_video_stop", onTransitionStop, this); signal_handler_connect(handler, "transition_stop", onTransitionFullStop, this); } @@ -228,6 +234,11 @@ void OBSBasic::TransitionToScene(OBSScene scene, bool force) TransitionToScene(source, force); } +void OBSBasic::TransitionStarted() +{ + EnableTransitionWidgets(false); +} + void OBSBasic::TransitionStopped() { if (swapScenesMode) { @@ -362,8 +373,6 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool quickTransit enum obs_transition_mode mode = manual ? OBS_TRANSITION_MODE_MANUAL : OBS_TRANSITION_MODE_AUTO; - EnableTransitionWidgets(false); - bool success = obs_transition_start(transition, mode, duration, source); if (!success) @@ -763,7 +772,8 @@ void OBSBasic::TBarChanged(int value) tBarActive = true; } - obs_transition_set_manual_time(transition, (float)value / T_BAR_PRECISION_F); + float clampedValue = std::clamp((float)value / T_BAR_PRECISION_F, 0.01f, 0.99f); + obs_transition_set_manual_time(transition, clampedValue); OnEvent(OBS_FRONTEND_EVENT_TBAR_VALUE_CHANGED); } diff --git a/libobs/obs-source-transition.c b/libobs/obs-source-transition.c index 759c02456..d0ad0c871 100644 --- a/libobs/obs-source-transition.c +++ b/libobs/obs-source-transition.c @@ -353,6 +353,11 @@ bool obs_transition_start(obs_source_t *transition, enum obs_transition_mode mod transition->transition_manual_target = 0.0f; unlock_transition(transition); + if (active) { + obs_transition_set(transition, transition->transition_sources[1]); + active = false; + } + if (transition->info.transition_start) transition->info.transition_start(transition->context.data); @@ -388,9 +393,16 @@ void obs_transition_set_manual_torque(obs_source_t *transition, float torque, fl void obs_transition_set_manual_time(obs_source_t *transition, float t) { + enum obs_transition_mode mode; + lock_transition(transition); transition->transition_manual_target = t; + mode = transition->transition_mode; unlock_transition(transition); + + if (mode == OBS_TRANSITION_MODE_MANUAL && t == 0.0f) { + obs_transition_set(transition, transition->transition_sources[0]); + } } void obs_transition_set(obs_source_t *transition, obs_source_t *source) @@ -403,6 +415,10 @@ void obs_transition_set(obs_source_t *transition, obs_source_t *source) source = obs_source_get_ref(source); + if (transition_active(transition)) { + obs_source_dosignal(transition, "source_transition_stop", "transition_stop"); + } + lock_transition(transition); for (size_t i = 0; i < 2; i++) { s[i] = transition->transition_sources[i]; diff --git a/plugins/obs-transitions/transition-stinger.c b/plugins/obs-transitions/transition-stinger.c index 84e8dc4f2..fddeb9302 100644 --- a/plugins/obs-transitions/transition-stinger.c +++ b/plugins/obs-transitions/transition-stinger.c @@ -524,6 +524,7 @@ static bool stinger_audio_render(void *data, uint64_t *ts_out, struct obs_source static void stinger_transition_start(void *data) { struct stinger_info *s = data; + enum obs_media_state state; if (s->media_source) { calldata_t cd = {0}; @@ -531,7 +532,8 @@ static void stinger_transition_start(void *data) proc_handler_t *ph = obs_source_get_proc_handler(s->media_source); proc_handler_t *matte_ph = s->matte_source ? obs_source_get_proc_handler(s->matte_source) : NULL; - if (s->transitioning) { + state = obs_source_media_get_state(s->media_source); + if (s->transitioning || state == OBS_MEDIA_STATE_PLAYING) { proc_handler_call(ph, "restart", &cd); if (matte_ph) { proc_handler_call(matte_ph, "restart", &cd);