Skip to content

Commit e6b52f2

Browse files
Warchamp7RytoEX
authored andcommitted
libobs, frontend: Signal transition_stop for cancelled transitions
1 parent 2faf51a commit e6b52f2

File tree

5 files changed

+33
-6
lines changed

5 files changed

+33
-6
lines changed

frontend/widgets/OBSBasic.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1568,6 +1568,7 @@ private slots:
15681568
void RenameTransition(OBSSource transition);
15691569

15701570
void TransitionClicked();
1571+
void TransitionStarted();
15711572
void TransitionStopped();
15721573
void TransitionFullyStopped();
15731574
void TriggerQuickTransition(int id);

frontend/widgets/OBSBasic_StudioMode.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,6 @@ void OBSBasic::SetPreviewProgramMode(bool enabled)
238238

239239
sizeObserver = new PreviewProgramSizeObserver(ui->preview, program, this);
240240

241-
ui->transitions->setEnabled(true);
242-
243241
OnEvent(OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED);
244242

245243
blog(LOG_INFO, "Switched to Preview/Program mode");

frontend/widgets/OBSBasic_Transitions.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ void OBSBasic::RemoveQuickTransitionHotkey(QuickTransition *qt)
127127

128128
void OBSBasic::InitTransition(obs_source_t *transition)
129129
{
130+
auto onTransitionStart = [](void *data, calldata_t *) {
131+
OBSBasic *window = (OBSBasic *)data;
132+
QMetaObject::invokeMethod(window, "TransitionStarted", Qt::QueuedConnection);
133+
};
134+
130135
auto onTransitionStop = [](void *data, calldata_t *) {
131136
OBSBasic *window = (OBSBasic *)data;
132137
QMetaObject::invokeMethod(window, "TransitionStopped", Qt::QueuedConnection);
@@ -138,6 +143,7 @@ void OBSBasic::InitTransition(obs_source_t *transition)
138143
};
139144

140145
signal_handler_t *handler = obs_source_get_signal_handler(transition);
146+
signal_handler_connect(handler, "transition_start", onTransitionStart, this);
141147
signal_handler_connect(handler, "transition_video_stop", onTransitionStop, this);
142148
signal_handler_connect(handler, "transition_stop", onTransitionFullStop, this);
143149
}
@@ -228,6 +234,11 @@ void OBSBasic::TransitionToScene(OBSScene scene, bool force)
228234
TransitionToScene(source, force);
229235
}
230236

237+
void OBSBasic::TransitionStarted()
238+
{
239+
EnableTransitionWidgets(false);
240+
}
241+
231242
void OBSBasic::TransitionStopped()
232243
{
233244
if (swapScenesMode) {
@@ -362,8 +373,6 @@ void OBSBasic::TransitionToScene(OBSSource source, bool force, bool quickTransit
362373

363374
enum obs_transition_mode mode = manual ? OBS_TRANSITION_MODE_MANUAL : OBS_TRANSITION_MODE_AUTO;
364375

365-
EnableTransitionWidgets(false);
366-
367376
bool success = obs_transition_start(transition, mode, duration, source);
368377

369378
if (!success)
@@ -763,7 +772,8 @@ void OBSBasic::TBarChanged(int value)
763772
tBarActive = true;
764773
}
765774

766-
obs_transition_set_manual_time(transition, (float)value / T_BAR_PRECISION_F);
775+
float clampedValue = std::clamp<float>((float)value / T_BAR_PRECISION_F, 0.01f, 0.99f);
776+
obs_transition_set_manual_time(transition, clampedValue);
767777

768778
OnEvent(OBS_FRONTEND_EVENT_TBAR_VALUE_CHANGED);
769779
}

libobs/obs-source-transition.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,11 @@ bool obs_transition_start(obs_source_t *transition, enum obs_transition_mode mod
353353
transition->transition_manual_target = 0.0f;
354354
unlock_transition(transition);
355355

356+
if (active) {
357+
obs_transition_set(transition, transition->transition_sources[1]);
358+
active = false;
359+
}
360+
356361
if (transition->info.transition_start)
357362
transition->info.transition_start(transition->context.data);
358363

@@ -388,9 +393,16 @@ void obs_transition_set_manual_torque(obs_source_t *transition, float torque, fl
388393

389394
void obs_transition_set_manual_time(obs_source_t *transition, float t)
390395
{
396+
enum obs_transition_mode mode;
397+
391398
lock_transition(transition);
392399
transition->transition_manual_target = t;
400+
mode = transition->transition_mode;
393401
unlock_transition(transition);
402+
403+
if (mode == OBS_TRANSITION_MODE_MANUAL && t == 0.0f) {
404+
obs_transition_set(transition, transition->transition_sources[0]);
405+
}
394406
}
395407

396408
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)
403415

404416
source = obs_source_get_ref(source);
405417

418+
if (transition_active(transition)) {
419+
obs_source_dosignal(transition, "source_transition_stop", "transition_stop");
420+
}
421+
406422
lock_transition(transition);
407423
for (size_t i = 0; i < 2; i++) {
408424
s[i] = transition->transition_sources[i];

plugins/obs-transitions/transition-stinger.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,14 +524,16 @@ static bool stinger_audio_render(void *data, uint64_t *ts_out, struct obs_source
524524
static void stinger_transition_start(void *data)
525525
{
526526
struct stinger_info *s = data;
527+
enum obs_media_state state;
527528

528529
if (s->media_source) {
529530
calldata_t cd = {0};
530531

531532
proc_handler_t *ph = obs_source_get_proc_handler(s->media_source);
532533
proc_handler_t *matte_ph = s->matte_source ? obs_source_get_proc_handler(s->matte_source) : NULL;
533534

534-
if (s->transitioning) {
535+
state = obs_source_media_get_state(s->media_source);
536+
if (s->transitioning || state == OBS_MEDIA_STATE_PLAYING) {
535537
proc_handler_call(ph, "restart", &cd);
536538
if (matte_ph) {
537539
proc_handler_call(matte_ph, "restart", &cd);

0 commit comments

Comments
 (0)