فهرست منبع

libobs, frontend: Signal transition_stop for cancelled transitions

Warchamp7 1 ماه پیش
والد
کامیت
e6b52f2e9b

+ 1 - 0
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);

+ 0 - 2
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");

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

+ 16 - 0
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];

+ 3 - 1
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);