mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-07-18 17:04:28 -05:00
Move functionality to scene-switch-helpers
This commit is contained in:
parent
dd78b03a28
commit
bcf0a0b7fd
|
|
@ -552,9 +552,6 @@ extern "C" void FreeSceneSwitcher()
|
|||
|
||||
static void handleSceneChange()
|
||||
{
|
||||
switcher->lastSceneChangeTime =
|
||||
std::chrono::high_resolution_clock::now();
|
||||
|
||||
// Stop waiting if scene was changed
|
||||
if (switcher->SceneChangedDuringWait()) {
|
||||
switcher->cv.notify_one();
|
||||
|
|
@ -626,13 +623,6 @@ static void setReplayBufferSaved()
|
|||
switcher->replayBufferSaved = true;
|
||||
}
|
||||
|
||||
static void setTranstionEnd()
|
||||
{
|
||||
switcher->lastTransitionEndTime =
|
||||
std::chrono::high_resolution_clock::now();
|
||||
switcher->macroTransitionCv.notify_all();
|
||||
}
|
||||
|
||||
static void setStreamStarting()
|
||||
{
|
||||
switcher->lastStreamStartingTime =
|
||||
|
|
@ -645,6 +635,11 @@ static void setStreamStopping()
|
|||
std::chrono::high_resolution_clock::now();
|
||||
}
|
||||
|
||||
static void handleTransitionEnd()
|
||||
{
|
||||
GetMacroTransitionCV().notify_all();
|
||||
}
|
||||
|
||||
static void handleShutdown()
|
||||
{
|
||||
if (!switcher) {
|
||||
|
|
@ -717,7 +712,7 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher)
|
|||
break;
|
||||
#endif
|
||||
case OBS_FRONTEND_EVENT_TRANSITION_STOPPED:
|
||||
setTranstionEnd();
|
||||
handleTransitionEnd();
|
||||
break;
|
||||
case OBS_FRONTEND_EVENT_STREAMING_STARTING:
|
||||
setStreamStarting();
|
||||
|
|
|
|||
|
|
@ -132,11 +132,8 @@ public:
|
|||
obs_source_t *waitScene = nullptr;
|
||||
OBSWeakSource currentScene = nullptr;
|
||||
OBSWeakSource previousScene = nullptr;
|
||||
std::chrono::high_resolution_clock::time_point lastSceneChangeTime{};
|
||||
std::chrono::high_resolution_clock::time_point lastTransitionEndTime{};
|
||||
std::chrono::high_resolution_clock::time_point lastStreamStartingTime{};
|
||||
std::chrono::high_resolution_clock::time_point lastStreamStoppingTime{};
|
||||
std::chrono::high_resolution_clock::time_point lastMatchTime;
|
||||
|
||||
/* --- Start of General tab section --- */
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,36 @@
|
|||
#include "scene-switch-helpers.hpp"
|
||||
#include "switcher-data.hpp"
|
||||
#include "log-helper.hpp"
|
||||
#include "obs-frontend-api.h"
|
||||
#include "switcher-data.hpp"
|
||||
#include "utility.hpp"
|
||||
|
||||
namespace advss {
|
||||
|
||||
static std::chrono::high_resolution_clock::time_point lastSceneChangeTime{};
|
||||
static std::chrono::high_resolution_clock::time_point lastTransitionEndTime{};
|
||||
static bool setupEventHandler();
|
||||
static bool eventHandlerIsSetup = setupEventHandler();
|
||||
|
||||
static bool setupEventHandler()
|
||||
{
|
||||
static auto handleEvents = [](enum obs_frontend_event event, void *) {
|
||||
switch (event) {
|
||||
case OBS_FRONTEND_EVENT_SCENE_CHANGED:
|
||||
lastSceneChangeTime =
|
||||
std::chrono::high_resolution_clock::now();
|
||||
break;
|
||||
case OBS_FRONTEND_EVENT_TRANSITION_STOPPED:
|
||||
lastTransitionEndTime =
|
||||
std::chrono::high_resolution_clock::now();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
};
|
||||
obs_frontend_add_event_callback(handleEvents, nullptr);
|
||||
return true;
|
||||
}
|
||||
|
||||
static std::pair<obs_weak_source_t *, int>
|
||||
getNextTransition(obs_weak_source_t *scene1, obs_weak_source_t *scene2)
|
||||
{
|
||||
|
|
@ -35,10 +61,9 @@ void SetNextTransition(const SceneSwitchInfo &sceneSwitch,
|
|||
// 3. Current transition settings
|
||||
|
||||
// Transition Tab
|
||||
obs_weak_source_t *currentScene =
|
||||
OBSWeakSourceAutoRelease currentScene =
|
||||
obs_source_get_weak_source(currentSource);
|
||||
auto tinfo = getNextTransition(currentScene, sceneSwitch.scene);
|
||||
obs_weak_source_release(currentScene);
|
||||
|
||||
OBSWeakSource nextTransition = tinfo.first;
|
||||
int nextTransitionDuration = tinfo.second;
|
||||
|
|
@ -53,23 +78,23 @@ void SetNextTransition(const SceneSwitchInfo &sceneSwitch,
|
|||
|
||||
// Current transition settings
|
||||
if (!nextTransition) {
|
||||
auto ct = obs_frontend_get_current_transition();
|
||||
nextTransition = obs_source_get_weak_source(ct);
|
||||
OBSSourceAutoRelease currentTransition =
|
||||
obs_frontend_get_current_transition();
|
||||
nextTransition = obs_source_get_weak_source(currentTransition);
|
||||
obs_weak_source_release(nextTransition);
|
||||
obs_source_release(ct);
|
||||
}
|
||||
if (!nextTransitionDuration) {
|
||||
nextTransitionDuration = obs_frontend_get_transition_duration();
|
||||
}
|
||||
|
||||
if (switcher->adjustActiveTransitionType) {
|
||||
if (ShouldModifyActiveTransition()) {
|
||||
obs_frontend_set_transition_duration(nextTransitionDuration);
|
||||
auto t = obs_weak_source_get_source(nextTransition);
|
||||
obs_frontend_set_current_transition(t);
|
||||
obs_source_release(t);
|
||||
OBSSourceAutoRelease transition =
|
||||
obs_weak_source_get_source(nextTransition);
|
||||
obs_frontend_set_current_transition(transition);
|
||||
}
|
||||
|
||||
if (switcher->transitionOverrideOverride) {
|
||||
if (ShouldModifyTransitionOverrides()) {
|
||||
OverwriteTransitionOverride({sceneSwitch.scene, nextTransition,
|
||||
nextTransitionDuration},
|
||||
td);
|
||||
|
|
@ -78,8 +103,8 @@ void SetNextTransition(const SceneSwitchInfo &sceneSwitch,
|
|||
|
||||
void OverwriteTransitionOverride(const SceneSwitchInfo &ssi, TransitionData &td)
|
||||
{
|
||||
obs_source_t *scene = obs_weak_source_get_source(ssi.scene);
|
||||
obs_data_t *data = obs_source_get_private_settings(scene);
|
||||
OBSSourceAutoRelease scene = obs_weak_source_get_source(ssi.scene);
|
||||
OBSDataAutoRelease data = obs_source_get_private_settings(scene);
|
||||
|
||||
td.name = obs_data_get_string(data, "transition");
|
||||
td.duration = obs_data_get_int(data, "transition_duration");
|
||||
|
|
@ -88,19 +113,13 @@ void OverwriteTransitionOverride(const SceneSwitchInfo &ssi, TransitionData &td)
|
|||
|
||||
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);
|
||||
}
|
||||
|
||||
void RestoreTransitionOverride(obs_source_t *scene, const TransitionData &td)
|
||||
{
|
||||
obs_data_t *data = obs_source_get_private_settings(scene);
|
||||
|
||||
OBSDataAutoRelease data = obs_source_get_private_settings(scene);
|
||||
obs_data_set_string(data, "transition", td.name.c_str());
|
||||
obs_data_set_int(data, "transition_duration", td.duration);
|
||||
|
||||
obs_data_release(data);
|
||||
}
|
||||
|
||||
void SwitchScene(const SceneSwitchInfo &sceneSwitch, bool force)
|
||||
|
|
@ -110,36 +129,67 @@ void SwitchScene(const SceneSwitchInfo &sceneSwitch, bool force)
|
|||
return;
|
||||
}
|
||||
|
||||
obs_source_t *source = obs_weak_source_get_source(sceneSwitch.scene);
|
||||
obs_source_t *currentSource = obs_frontend_get_current_scene();
|
||||
OBSSourceAutoRelease source =
|
||||
obs_weak_source_get_source(sceneSwitch.scene);
|
||||
OBSSourceAutoRelease currentSource = obs_frontend_get_current_scene();
|
||||
|
||||
if (source && (source != currentSource || force)) {
|
||||
TransitionData currentTransitionData;
|
||||
SetNextTransition(sceneSwitch, currentSource,
|
||||
currentTransitionData);
|
||||
obs_frontend_set_current_scene(source);
|
||||
if (switcher->transitionOverrideOverride) {
|
||||
if (ShouldModifyTransitionOverrides()) {
|
||||
RestoreTransitionOverride(source,
|
||||
currentTransitionData);
|
||||
}
|
||||
|
||||
if (switcher->verbose) {
|
||||
blog(LOG_INFO, "switched scene");
|
||||
}
|
||||
vblog(LOG_INFO, "switched scene");
|
||||
|
||||
if (switcher->networkConfig.ShouldSendSceneChange()) {
|
||||
switcher->server.sendMessage(sceneSwitch);
|
||||
}
|
||||
}
|
||||
obs_source_release(currentSource);
|
||||
obs_source_release(source);
|
||||
}
|
||||
|
||||
void SwitchPreviewScene(const OBSWeakSource &ws)
|
||||
{
|
||||
auto source = obs_weak_source_get_source(ws);
|
||||
OBSSourceAutoRelease source = obs_weak_source_get_source(ws);
|
||||
obs_frontend_set_current_preview_scene(source);
|
||||
obs_source_release(source);
|
||||
}
|
||||
|
||||
std::chrono::high_resolution_clock::time_point GetLastTransitionEndTime()
|
||||
{
|
||||
return lastTransitionEndTime;
|
||||
}
|
||||
|
||||
std::chrono::high_resolution_clock::time_point GetLastSceneChangeTime()
|
||||
{
|
||||
return lastSceneChangeTime;
|
||||
}
|
||||
|
||||
OBSWeakSource GetCurrentScene()
|
||||
{
|
||||
return switcher->currentScene;
|
||||
}
|
||||
|
||||
OBSWeakSource GetPreviousScene()
|
||||
{
|
||||
return switcher->previousScene;
|
||||
}
|
||||
|
||||
bool AnySceneTransitionStarted()
|
||||
{
|
||||
return switcher->AnySceneTransitionStarted();
|
||||
}
|
||||
|
||||
bool ShouldModifyTransitionOverrides()
|
||||
{
|
||||
return switcher->transitionOverrideOverride;
|
||||
}
|
||||
|
||||
bool ShouldModifyActiveTransition()
|
||||
{
|
||||
return switcher->adjustActiveTransitionType;
|
||||
}
|
||||
|
||||
} // namespace advss
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
#include <obs.hpp>
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
|
||||
namespace advss {
|
||||
|
|
@ -15,12 +16,24 @@ struct TransitionData {
|
|||
int duration = 0;
|
||||
};
|
||||
|
||||
void SetNextTransition(const SceneSwitchInfo &ssi, obs_source_t *currentSource,
|
||||
TransitionData &td);
|
||||
void OverwriteTransitionOverride(const SceneSwitchInfo &ssi,
|
||||
TransitionData &td);
|
||||
void RestoreTransitionOverride(obs_source_t *scene, const TransitionData &td);
|
||||
void SwitchScene(const SceneSwitchInfo &ssi, bool force = false);
|
||||
void SwitchPreviewScene(const OBSWeakSource &ws);
|
||||
void SwitchScene(const SceneSwitchInfo &, bool force = false);
|
||||
void SwitchPreviewScene(const OBSWeakSource &scene);
|
||||
|
||||
std::chrono::high_resolution_clock::time_point GetLastTransitionEndTime();
|
||||
std::chrono::high_resolution_clock::time_point GetLastSceneChangeTime();
|
||||
|
||||
OBSWeakSource GetCurrentScene();
|
||||
OBSWeakSource GetPreviousScene();
|
||||
|
||||
bool ShouldModifyTransitionOverrides();
|
||||
bool ShouldModifyActiveTransition();
|
||||
void OverwriteTransitionOverride(const SceneSwitchInfo &, TransitionData &);
|
||||
void RestoreTransitionOverride(obs_source_t *scene, const TransitionData &);
|
||||
|
||||
bool AnySceneTransitionStarted();
|
||||
|
||||
// TODO: Remove at some point
|
||||
void SetNextTransition(const SceneSwitchInfo &, obs_source_t *currentSource,
|
||||
TransitionData &);
|
||||
|
||||
} // namespace advss
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user