Add option to set transition duration (#171)

This commit is contained in:
WarmUpTill 2021-04-30 15:20:25 -07:00 committed by GitHub
parent 427ed34a1b
commit 041a9e7f19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 50 additions and 15 deletions

View File

@ -61,7 +61,7 @@ AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError="Mindestens eine
AdvSceneSwitcher.transitionTab.transitionForAToB="Szenenübergänge für automatisierte Szenenwechsel von Szene A zu Szene B"
AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body><p>Diese Einstellungen beeinflussen <span style=\"font-style:italic;\">nur</span> vom Szenenwechsler ausgelöste Szenenübergänge - Siehe <a href=\"https://obsproject.com/forum/resources/transition-table.1174/\"><span style=\" text-decoration: underline; color:#268bd2;\">Transition Table</span></a> um auch manuelle Szenenübergänge zu konfigurieren.<br/>Einstellungen auf diesem Tab haben Vorrang, vor denen welche auf den übrigen Tabs konfiguriert wurden.<br/><br/>Klicke auf das Plus Symbol, um einen neuen Eintrag hinzuzufügen.</p></body></html>"
AdvSceneSwitcher.transitionTab.defaultTransition="Ändere den Szenenübergang wenn eine Szene aktiv ist"
AdvSceneSwitcher.transitionTab.entry="Wechsle von {{scenes}} zu {{scenes2}} mit {{transitions}}"
AdvSceneSwitcher.transitionTab.entry="Wechsle von {{scenes}} zu {{scenes2}} mit {{transitions}} mit einer Dauer von {{duration}}"
AdvSceneSwitcher.transitionTab.defaultTransitionEntry="Wenn {{scenes}} aktiv ist ändere den Szenenübergang zu {{transitions}}"
AdvSceneSwitcher.transitionTab.defaultTransitionsHelp="Klicke auf das Plus Symbol, um einen neuen Eintrag hinzuzufügen."
AdvSceneSwitcher.transitionTab.defaultTransition.delay="Wechsle Szenenübergang {{defTransitionDelay}} nach Szenenwechsel."

View File

@ -61,7 +61,7 @@ AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError="At least one op
AdvSceneSwitcher.transitionTab.transitionForAToB="Use transition for automated scene switch from scene A to scene B"
AdvSceneSwitcher.transitionTab.transitionsHelp="<html><head/><body><p>These settings <span style=\"font-style:italic;\">only</span> affect transitions caused by the scene switcher - Check out <a href=\"https://obsproject.com/forum/resources/transition-table.1174/\"><span style=\" text-decoration: underline; color:#268bd2;\">Transition Table</span></a> if you want to configure this for manual scene changes.<br/>Settings defined here take priority over transition settings configured elsewhere in the scene switcher.<br/><br/>Click the plus symbol below to add a new entry.</p></body></html>"
AdvSceneSwitcher.transitionTab.defaultTransition="Change transition if scene is active"
AdvSceneSwitcher.transitionTab.entry="Switch from {{scenes}} to {{scenes2}} using {{transitions}}"
AdvSceneSwitcher.transitionTab.entry="Switch from {{scenes}} to {{scenes2}} using {{transitions}} with a duration of {{duration}}"
AdvSceneSwitcher.transitionTab.defaultTransitionEntry="When scene {{scenes}} is active change default scene transition to {{transitions}}"
AdvSceneSwitcher.transitionTab.defaultTransitionsHelp="Click on the plus symbol to add an entry."
AdvSceneSwitcher.transitionTab.defaultTransition.delay="Switch transition {{defTransitionDelay}} after scene change."

View File

@ -291,7 +291,8 @@ void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
bool transitionOverrideOverride,
bool adjustActiveTransitionType, transitionData &td);
void overwriteTransitionOverride(obs_weak_source_t *sceneWs,
obs_source_t *transition, transitionData &td);
obs_source_t *transition, int duration,
transitionData &td);
void restoreTransitionOverride(obs_source_t *scene, transitionData td);
void switchScene(OBSWeakSource &scene, OBSWeakSource &transition,
bool transitionOverrideOverride,

View File

@ -1,8 +1,11 @@
#pragma once
#include <QDoubleSpinBox>
#include "switch-generic.hpp"
struct SceneTransition : SceneSwitcherEntry {
OBSWeakSource scene2 = nullptr;
double duration = 0.;
const char *getType() { return "transition"; }
bool initialized();
@ -10,8 +13,10 @@ struct SceneTransition : SceneSwitcherEntry {
inline SceneTransition(){};
inline SceneTransition(OBSWeakSource scene_, OBSWeakSource scene2_,
OBSWeakSource transition_)
: SceneSwitcherEntry(scene_, transition_), scene2(scene2_)
OBSWeakSource transition_, double duration_)
: SceneSwitcherEntry(scene_, transition_),
scene2(scene2_),
duration(duration_)
{
}
};
@ -45,9 +50,11 @@ public:
private slots:
void Scene2Changed(const QString &text);
void DurationChanged(double dur);
private:
QComboBox *scenes2;
QDoubleSpinBox *duration;
SceneTransition *switchData;
};

View File

@ -219,10 +219,11 @@ void AdvSceneSwitcher::defTransitionDelayValueChanged(int value)
DefaultSceneTransition::delay = value;
}
obs_weak_source_t *getNextTransition(obs_weak_source_t *scene1,
obs_weak_source_t *scene2)
std::pair<obs_weak_source_t *, int> getNextTransition(obs_weak_source_t *scene1,
obs_weak_source_t *scene2)
{
obs_weak_source_t *ws = nullptr;
int duration = 0;
if (scene1 && scene2) {
for (SceneTransition &t : switcher->sceneTransitions) {
if (!t.initialized()) {
@ -231,16 +232,18 @@ obs_weak_source_t *getNextTransition(obs_weak_source_t *scene1,
if (t.scene == scene1 && t.scene2 == scene2) {
ws = t.transition;
duration = t.duration * 1000;
break;
}
}
obs_weak_source_addref(ws);
}
return ws;
return std::make_pair(ws, duration);
}
void overwriteTransitionOverride(obs_weak_source_t *sceneWs,
obs_source_t *transition, transitionData &td)
obs_source_t *transition,
int nextTransitionDuration, transitionData &td)
{
obs_source_t *scene = obs_weak_source_get_source(sceneWs);
obs_data_t *data = obs_source_get_private_settings(scene);
@ -249,10 +252,9 @@ void overwriteTransitionOverride(obs_weak_source_t *sceneWs,
td.duration = obs_data_get_int(data, "duration");
const char *name = obs_source_get_name(transition);
int duration = obs_frontend_get_transition_duration();
obs_data_set_string(data, "transition", name);
obs_data_set_int(data, "transition_duration", duration);
obs_data_set_int(data, "transition_duration", nextTransitionDuration);
obs_data_release(data);
obs_source_release(scene);
@ -275,10 +277,12 @@ void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
{
obs_weak_source_t *currentScene =
obs_source_get_weak_source(currentSource);
obs_weak_source_t *nextTransitionWs =
getNextTransition(currentScene, targetScene);
auto tinfo = getNextTransition(currentScene, targetScene);
obs_weak_source_release(currentScene);
obs_weak_source_t *nextTransitionWs = tinfo.first;
int nextTransitionDuration = tinfo.second;
obs_source_t *nextTransition = nullptr;
if (nextTransitionWs) {
nextTransition = obs_weak_source_get_source(nextTransitionWs);
@ -287,11 +291,13 @@ void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
}
if (nextTransition && adjustActiveTransitionType) {
obs_frontend_set_transition_duration(nextTransitionDuration);
obs_frontend_set_current_transition(nextTransition);
}
if (transitionOverrideOverride) {
overwriteTransitionOverride(targetScene, nextTransition, td);
overwriteTransitionOverride(targetScene, nextTransition,
nextTransitionDuration, td);
}
obs_weak_source_release(nextTransitionWs);
@ -317,6 +323,7 @@ void SwitcherData::saveSceneTransitions(obs_data_t *obj)
obs_data_set_string(array_obj, "Scene2", sceneName2);
obs_data_set_string(array_obj, "transition",
transitionName);
obs_data_set_double(array_obj, "duration", s.duration);
obs_data_array_push_back(sceneTransitionsArray,
array_obj);
}
@ -378,11 +385,12 @@ void SwitcherData::loadSceneTransitions(obs_data_t *obj)
const char *scene2 = obs_data_get_string(array_obj, "Scene2");
const char *transition =
obs_data_get_string(array_obj, "transition");
double duration = obs_data_get_double(array_obj, "duration");
switcher->sceneTransitions.emplace_back(
GetWeakSourceByName(scene1),
GetWeakSourceByName(scene2),
GetWeakTransitionByName(transition));
GetWeakTransitionByName(transition), duration);
obs_data_release(array_obj);
}
@ -492,20 +500,29 @@ TransitionSwitchWidget::TransitionSwitchWidget(QWidget *parent,
: SwitchWidget(parent, s, false, false, false)
{
scenes2 = new QComboBox();
duration = new QDoubleSpinBox();
duration->setMinimum(0.0);
duration->setMaximum(99.000000);
duration->setSuffix("s");
QWidget::connect(scenes2, SIGNAL(currentTextChanged(const QString &)),
this, SLOT(Scene2Changed(const QString &)));
QWidget::connect(duration, SIGNAL(valueChanged(double)), this,
SLOT(DurationChanged(double)));
AdvSceneSwitcher::populateSceneSelection(scenes2, false);
if (s) {
scenes2->setCurrentText(GetWeakSourceName(s->scene2).c_str());
duration->setValue(s->duration);
}
QHBoxLayout *mainLayout = new QHBoxLayout;
std::unordered_map<std::string, QWidget *> widgetPlaceholders = {
{"{{scenes}}", scenes},
{"{{scenes2}}", scenes2},
{"{{duration}}", duration},
{"{{transitions}}", transitions}};
placeWidgets(obs_module_text("AdvSceneSwitcher.transitionTab.entry"),
mainLayout, widgetPlaceholders);
@ -546,6 +563,16 @@ void TransitionSwitchWidget::Scene2Changed(const QString &text)
switchData->scene2 = GetWeakSourceByQString(text);
}
void TransitionSwitchWidget::DurationChanged(double dur)
{
if (loading || !switchData) {
return;
}
std::lock_guard<std::mutex> lock(switcher->m);
switchData->duration = dur;
}
DefTransitionSwitchWidget::DefTransitionSwitchWidget(QWidget *parent,
DefaultSceneTransition *s)
: SwitchWidget(parent, s, false, false, false)