mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-01-17 02:38:33 -05:00
libobs, frontend: Signal transition_stop for cancelled transitions
This commit is contained in:
@@ -1568,6 +1568,7 @@ private slots:
|
||||
void RenameTransition(OBSSource transition);
|
||||
|
||||
void TransitionClicked();
|
||||
void TransitionStarted();
|
||||
void TransitionStopped();
|
||||
void TransitionFullyStopped();
|
||||
void TriggerQuickTransition(int id);
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user