libobs, frontend: Signal transition_stop for cancelled transitions

This commit is contained in:
Warchamp7
2025-12-08 19:24:04 -05:00
committed by Ryan Foster
parent 2faf51a7ed
commit e6b52f2e9b
5 changed files with 33 additions and 6 deletions

View File

@@ -1568,6 +1568,7 @@ private slots:
void RenameTransition(OBSSource transition);
void TransitionClicked();
void TransitionStarted();
void TransitionStopped();
void TransitionFullyStopped();
void TriggerQuickTransition(int id);

View File

@@ -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");

View File

@@ -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>((float)value / T_BAR_PRECISION_F, 0.01f, 0.99f);
obs_transition_set_manual_time(transition, clampedValue);
OnEvent(OBS_FRONTEND_EVENT_TBAR_VALUE_CHANGED);
}

View File

@@ -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];

View File

@@ -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);