Add support for transition duration in switchScene() (#178)

This commit is contained in:
WarmUpTill
2021-05-12 10:50:50 -07:00
committed by GitHub
parent 8b8e479098
commit 6bf122d0e8
6 changed files with 85 additions and 73 deletions

View File

@@ -533,9 +533,7 @@ void SwitcherData::Thread()
lock.unlock();
if (match) {
switchScene(scene, transition,
tansitionOverrideOverride,
adjustActiveTransitionType, verbose);
switchScene({scene, transition, 0});
}
writeSceneInfoToFile();
@@ -604,34 +602,32 @@ bool SwitcherData::checkForMatch(OBSWeakSource &scene,
return match;
}
void switchScene(OBSWeakSource &scene, OBSWeakSource &transition,
bool transitionOverrideOverride,
bool adjustActiveTransitionType, bool verbose)
void switchScene(sceneSwitchInfo sceneSwitch)
{
if (!scene && verbose) {
if (!sceneSwitch.scene && switcher->verbose) {
blog(LOG_INFO, "nothing to switch to");
return;
}
obs_source_t *source = obs_weak_source_get_source(scene);
obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene);
obs_source_t *currentSource = obs_frontend_get_current_scene();
if (source && source != currentSource) {
transitionData td;
setNextTransition(scene, currentSource, transition,
transitionOverrideOverride,
adjustActiveTransitionType, td);
transitionData currentTransitionData;
setNextTransition(sceneSwitch, currentSource,
currentTransitionData);
obs_frontend_set_current_scene(source);
if (transitionOverrideOverride) {
restoreTransitionOverride(source, td);
if (switcher->transitionOverrideOverride) {
restoreTransitionOverride(source,
currentTransitionData);
}
if (verbose) {
if (switcher->verbose) {
blog(LOG_INFO, "switched scene");
}
if (switcher->networkConfig.ServerEnabled) {
switcher->server.sendMessage(scene, transition);
switcher->server.sendMessage(sceneSwitch);
}
}
obs_source_release(currentSource);
@@ -725,7 +721,7 @@ void handleSceneChange(SwitcherData *s)
if (switcher->networkConfig.ServerEnabled &&
switcher->networkConfig.SendAll) {
switcher->server.sendMessage(ws, nullptr);
switcher->server.sendMessage({ws, nullptr, 0});
}
}

View File

@@ -287,17 +287,11 @@ bool isInFocus(const QString &executable);
* Sceneswitch helper
******************************************************************************/
void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
OBSWeakSource &transition,
bool transitionOverrideOverride,
bool adjustActiveTransitionType, transitionData &td);
void overwriteTransitionOverride(obs_weak_source_t *sceneWs,
obs_source_t *transition, int duration,
transitionData &td);
void setNextTransition(sceneSwitchInfo &ssi, obs_source_t *currentSource,
transitionData &td);
void overwriteTransitionOverride(sceneSwitchInfo ssi, transitionData &td);
void restoreTransitionOverride(obs_source_t *scene, transitionData td);
void switchScene(OBSWeakSource &scene, OBSWeakSource &transition,
bool transitionOverrideOverride,
bool adjustActiveTransitionType, bool verbose);
void switchScene(sceneSwitchInfo ssi);
/******************************************************************************
* Main SwitcherData

View File

@@ -22,6 +22,8 @@ using websocketpp::connection_hdl;
typedef websocketpp::server<websocketpp::config::asio> server;
typedef websocketpp::client<websocketpp::config::asio_client> client;
struct sceneSwitchInfo;
class NetworkConfig {
public:
NetworkConfig();
@@ -51,7 +53,7 @@ public:
virtual ~WSServer();
void start(quint16 port, bool lockToIPv4);
void stop();
void sendMessage(OBSWeakSource scene, OBSWeakSource transition);
void sendMessage(sceneSwitchInfo sceneSwitch);
QThreadPool *threadPool() { return &_threadPool; }
private:

View File

@@ -41,6 +41,13 @@ enum class AutoStartEvent {
RECORINDG_OR_STREAMING,
};
typedef struct sceneSwitchInfo {
OBSWeakSource scene;
OBSWeakSource transition;
int duration = 0;
} sceneSwitchInfo;
typedef struct transitionData {
std::string name = "";
int duration = 0;
@@ -64,7 +71,7 @@ struct SwitcherData {
bool verbose = false;
bool disableHints = false;
bool showFrame = false;
bool tansitionOverrideOverride = false;
bool transitionOverrideOverride = false;
bool adjustActiveTransitionType = true;
int interval = default_interval;

View File

@@ -23,6 +23,7 @@ Most of this code is based on https://github.com/Palakis/obs-websocket
#define SCENE_ENTRY "scene"
#define TRANSITION_ENTRY "transition"
#define TRANSITION_DURATION "duration"
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
@@ -191,17 +192,18 @@ void WSServer::stop()
blog(LOG_INFO, "server stopped successfully");
}
void WSServer::sendMessage(OBSWeakSource scene, OBSWeakSource transition)
void WSServer::sendMessage(sceneSwitchInfo sceneSwitch)
{
if (!scene) {
if (!sceneSwitch.scene) {
return;
}
OBSData data = obs_data_create();
obs_data_set_string(data, SCENE_ENTRY,
GetWeakSourceName(scene).c_str());
GetWeakSourceName(sceneSwitch.scene).c_str());
obs_data_set_string(data, TRANSITION_ENTRY,
GetWeakSourceName(transition).c_str());
GetWeakSourceName(sceneSwitch.transition).c_str());
obs_data_set_int(data, TRANSITION_DURATION, sceneSwitch.duration);
std::string message = obs_data_get_json(data);
obs_data_release(data);
@@ -245,13 +247,15 @@ std::string processMessage(std::string payload)
}
if (!obs_data_has_user_value(data, SCENE_ENTRY) ||
!obs_data_has_user_value(data, TRANSITION_ENTRY)) {
!obs_data_has_user_value(data, TRANSITION_ENTRY) ||
!obs_data_has_user_value(data, TRANSITION_DURATION)) {
return "missing request parameters";
}
std::string sceneName = obs_data_get_string(data, SCENE_ENTRY);
std::string transitionName =
obs_data_get_string(data, TRANSITION_ENTRY);
int duration = obs_data_get_int(data, TRANSITION_DURATION);
obs_data_release(data);
@@ -268,8 +272,7 @@ std::string processMessage(std::string payload)
"'";
}
switchScene(scene, transition, switcher->tansitionOverrideOverride,
switcher->adjustActiveTransitionType, switcher->verbose);
switchScene({scene, transition, duration});
return ret;
}

View File

@@ -189,7 +189,7 @@ void AdvSceneSwitcher::on_transitionOverridecheckBox_stateChanged(int state)
}
std::lock_guard<std::mutex> lock(switcher->m);
switcher->tansitionOverrideOverride = state;
switcher->transitionOverrideOverride = state;
}
void AdvSceneSwitcher::on_adjustActiveTransitionType_stateChanged(int state)
@@ -199,7 +199,7 @@ void AdvSceneSwitcher::on_adjustActiveTransitionType_stateChanged(int state)
}
// This option only makes sense if we are allowed to use transition overrides
if (!state && !switcher->tansitionOverrideOverride) {
if (!state && !switcher->transitionOverrideOverride) {
DisplayMessage(obs_module_text(
"AdvSceneSwitcher.transitionTab.transitionBehaviorSelectionError"));
ui->transitionOverridecheckBox->setChecked(true);
@@ -236,25 +236,22 @@ std::pair<obs_weak_source_t *, int> getNextTransition(obs_weak_source_t *scene1,
break;
}
}
obs_weak_source_addref(ws);
}
return std::make_pair(ws, duration);
}
void overwriteTransitionOverride(obs_weak_source_t *sceneWs,
obs_source_t *transition,
int nextTransitionDuration, transitionData &td)
void overwriteTransitionOverride(sceneSwitchInfo ssi, transitionData &td)
{
obs_source_t *scene = obs_weak_source_get_source(sceneWs);
obs_source_t *scene = obs_weak_source_get_source(ssi.scene);
obs_data_t *data = obs_source_get_private_settings(scene);
td.name = obs_data_get_string(data, "transition");
td.duration = obs_data_get_int(data, "transition_duration");
const char *name = obs_source_get_name(transition);
std::string name = GetWeakSourceName(ssi.transition);
obs_data_set_string(data, "transition", name);
obs_data_set_int(data, "transition_duration", nextTransitionDuration);
obs_data_set_string(data, "transition", name.c_str());
obs_data_set_int(data, "transition_duration", ssi.duration);
obs_data_release(data);
obs_source_release(scene);
@@ -270,41 +267,54 @@ void restoreTransitionOverride(obs_source_t *scene, transitionData td)
obs_data_release(data);
}
void setNextTransition(OBSWeakSource &targetScene, obs_source_t *currentSource,
OBSWeakSource &transition,
bool transitionOverrideOverride,
bool adjustActiveTransitionType, transitionData &td)
void setNextTransition(sceneSwitchInfo &sceneSwitch,
obs_source_t *currentSource, transitionData &td)
{
// Priority:
// 1. Transition tab
// 2. Individual switcher entry
// 3. Current transition settings
// Transition Tab
obs_weak_source_t *currentScene =
obs_source_get_weak_source(currentSource);
auto tinfo = getNextTransition(currentScene, targetScene);
auto tinfo = getNextTransition(currentScene, sceneSwitch.scene);
obs_weak_source_release(currentScene);
obs_weak_source_t *nextTransitionWs = tinfo.first;
OBSWeakSource nextTransition = tinfo.first;
int nextTransitionDuration = tinfo.second;
obs_source_t *nextTransition = nullptr;
if (nextTransitionWs) {
nextTransition = obs_weak_source_get_source(nextTransitionWs);
} else if (transition) {
nextTransition = obs_weak_source_get_source(transition);
// Individual switcher entry
if (!nextTransition) {
nextTransition = sceneSwitch.transition;
}
if (!nextTransitionDuration) {
nextTransitionDuration = sceneSwitch.duration;
}
if (nextTransition) {
if (adjustActiveTransitionType) {
obs_frontend_set_transition_duration(
nextTransitionDuration);
obs_frontend_set_current_transition(nextTransition);
}
if (transitionOverrideOverride) {
overwriteTransitionOverride(targetScene, nextTransition,
nextTransitionDuration, td);
}
// Current transition settings
if (!nextTransition) {
auto ct = obs_frontend_get_current_transition();
nextTransition = obs_source_get_weak_source(ct);
obs_weak_source_release(nextTransition);
obs_source_release(ct);
}
if (!nextTransitionDuration) {
nextTransitionDuration = obs_frontend_get_transition_duration();
}
obs_weak_source_release(nextTransitionWs);
obs_source_release(nextTransition);
if (switcher->adjustActiveTransitionType) {
obs_frontend_set_transition_duration(nextTransitionDuration);
auto t = obs_weak_source_get_source(nextTransition);
obs_frontend_set_current_transition(t);
obs_source_release(t);
}
if (switcher->transitionOverrideOverride) {
overwriteTransitionOverride({sceneSwitch.scene, nextTransition,
nextTransitionDuration},
td);
}
}
void SwitcherData::saveSceneTransitions(obs_data_t *obj)
@@ -334,7 +344,7 @@ void SwitcherData::saveSceneTransitions(obs_data_t *obj)
obs_data_array_release(defaultTransitionsArray);
obs_data_set_bool(obj, "tansitionOverrideOverride",
tansitionOverrideOverride);
transitionOverrideOverride);
obs_data_set_default_bool(obj, "adjustActiveTransitionType",
adjustActiveTransitionType);
obs_data_set_bool(obj, "adjustActiveTransitionType",
@@ -377,7 +387,7 @@ void SwitcherData::loadSceneTransitions(obs_data_t *obj)
}
obs_data_array_release(defaultTransitionsArray);
tansitionOverrideOverride =
transitionOverrideOverride =
obs_data_get_bool(obj, "tansitionOverrideOverride");
adjustActiveTransitionType =
obs_data_get_bool(obj, "adjustActiveTransitionType");
@@ -420,7 +430,7 @@ void AdvSceneSwitcher::setupTransitionsTab()
}
ui->transitionOverridecheckBox->setChecked(
switcher->tansitionOverrideOverride);
switcher->transitionOverrideOverride);
ui->adjustActiveTransitionType->setChecked(
switcher->adjustActiveTransitionType);