mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-28 21:05:26 -05:00
add 'previous scene' option for idle detection
This commit is contained in:
parent
299f7c00e0
commit
bbf7d4acf5
|
|
@ -64,6 +64,7 @@ SceneSwitcher::SceneSwitcher(QWidget* parent)
|
|||
}
|
||||
|
||||
ui->sceneRoundTripScenes2->addItem(PREVIOUS_SCENE_NAME);
|
||||
ui->idleScenes->addItem(PREVIOUS_SCENE_NAME);
|
||||
|
||||
obs_frontend_source_list* transitions = new obs_frontend_source_list();
|
||||
obs_frontend_get_transitions(transitions);
|
||||
|
|
@ -260,7 +261,8 @@ SceneSwitcher::SceneSwitcher(QWidget* parent)
|
|||
}
|
||||
|
||||
ui->idleCheckBox->setChecked(switcher->idleData.idleEnable);
|
||||
ui->idleScenes->setCurrentText(GetWeakSourceName(switcher->idleData.scene).c_str());
|
||||
ui->idleScenes->setCurrentText(
|
||||
switcher->idleData.usePreviousScene ? PREVIOUS_SCENE_NAME : GetWeakSourceName(switcher->idleData.scene).c_str());
|
||||
ui->idleTransitions->setCurrentText(GetWeakSourceName(switcher->idleData.transition).c_str());
|
||||
ui->idleSpinBox->setValue(switcher->idleData.time);
|
||||
|
||||
|
|
@ -450,7 +452,8 @@ static void SaveSceneSwitcher(obs_data_t* save_data, bool saving, void*)
|
|||
const char* sceneName2 = obs_source_get_name(source2);
|
||||
const char* transitionName = obs_source_get_name(transition);
|
||||
obs_data_set_string(array_obj, "sceneRoundTripScene1", sceneName1);
|
||||
obs_data_set_string(array_obj, "sceneRoundTripScene2", s.usePreviousScene ? PREVIOUS_SCENE_NAME : sceneName2);
|
||||
obs_data_set_string(array_obj, "sceneRoundTripScene2",
|
||||
s.usePreviousScene ? PREVIOUS_SCENE_NAME : sceneName2);
|
||||
obs_data_set_string(array_obj, "transition", transitionName);
|
||||
obs_data_set_int(array_obj, "sceneRoundTripDelay", s.delay / 1000); //delay stored in two separate values
|
||||
obs_data_set_int(array_obj, "sceneRoundTripDelayMs", s.delay % 1000); //to be compatible with older versions
|
||||
|
|
@ -617,7 +620,8 @@ static void SaveSceneSwitcher(obs_data_t* save_data, bool saving, void*)
|
|||
string idleSceneName = GetWeakSourceName(switcher->idleData.scene);
|
||||
string idleTransitionName = GetWeakSourceName(switcher->idleData.transition);
|
||||
obs_data_set_bool(obj, "idleEnable", switcher->idleData.idleEnable);
|
||||
obs_data_set_string(obj, "idleSceneName", idleSceneName.c_str());
|
||||
obs_data_set_string(obj, "idleSceneName",
|
||||
switcher->idleData.usePreviousScene ? PREVIOUS_SCENE_NAME : idleSceneName.c_str());
|
||||
obs_data_set_string(obj, "idleTransitionName", idleTransitionName.c_str());
|
||||
obs_data_set_int(obj, "idleTime", switcher->idleData.time);
|
||||
|
||||
|
|
@ -905,6 +909,7 @@ static void SaveSceneSwitcher(obs_data_t* save_data, bool saving, void*)
|
|||
switcher->idleData.idleEnable = obs_data_get_bool(obj, "idleEnable");
|
||||
obs_data_set_default_int(obj, "idleTime", DEFAULT_IDLE_TIME);
|
||||
switcher->idleData.time = obs_data_get_int(obj, "idleTime");
|
||||
switcher->idleData.usePreviousScene = (idleSceneName == PREVIOUS_SCENE_NAME);
|
||||
|
||||
obs_data_set_default_bool(obj, "readEnabled", false);
|
||||
switcher->fileIO.readEnabled = obs_data_get_bool(obj, "readEnabled");
|
||||
|
|
@ -1053,13 +1058,12 @@ void SwitcherData::Thread()
|
|||
{
|
||||
switchScene(scene, transition);
|
||||
}
|
||||
setPreviousScene();
|
||||
}
|
||||
endLoop:
|
||||
;
|
||||
}
|
||||
|
||||
void switchScene(OBSWeakSource scene, OBSWeakSource transition)
|
||||
void switchScene(OBSWeakSource& scene, OBSWeakSource& transition)
|
||||
{
|
||||
obs_source_t* source = obs_weak_source_get_source(scene);
|
||||
obs_source_t* currentSource = obs_frontend_get_current_scene();
|
||||
|
|
@ -1095,19 +1099,6 @@ void switchScene(OBSWeakSource scene, OBSWeakSource transition)
|
|||
obs_source_release(source);
|
||||
}
|
||||
|
||||
void SwitcherData::setPreviousScene()
|
||||
{
|
||||
obs_source_t* source = obs_frontend_get_current_scene();
|
||||
obs_weak_source_t* ws = obs_source_get_weak_source(source);
|
||||
obs_source_release(source);
|
||||
obs_weak_source_release(ws);
|
||||
if (!source)
|
||||
return;
|
||||
if (previousScene == ws)
|
||||
return;
|
||||
previousScene = ws;
|
||||
}
|
||||
|
||||
bool SwitcherData::sceneChangedDuringWait() {
|
||||
bool r = false;
|
||||
obs_source_t* currentSource = obs_frontend_get_current_scene();
|
||||
|
|
@ -1163,10 +1154,24 @@ static void OBSEvent(enum obs_frontend_event event, void* switcher)
|
|||
case OBS_FRONTEND_EVENT_SCENE_CHANGED:
|
||||
{
|
||||
SwitcherData* s = (SwitcherData*)switcher;
|
||||
//stop waiting if scene was manually changed
|
||||
lock_guard<mutex> lock(s->m);
|
||||
|
||||
//stop waiting if scene was manually changed
|
||||
if (s->sceneChangedDuringWait())
|
||||
s->cv.notify_one();
|
||||
|
||||
//set previous scene
|
||||
obs_source_t* source = obs_frontend_get_current_scene();
|
||||
obs_weak_source_t* ws = obs_source_get_weak_source(source);
|
||||
obs_source_release(source);
|
||||
obs_weak_source_release(ws);
|
||||
if (source && s->PreviousScene2 != ws)
|
||||
{
|
||||
s->previousScene = s->PreviousScene2;
|
||||
s->PreviousScene2 = ws;
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ struct obs_weak_source;
|
|||
typedef struct obs_weak_source obs_weak_source_t;
|
||||
|
||||
obs_weak_source_t* getNextTransition(obs_weak_source_t* scene1, obs_weak_source_t* scene2);
|
||||
void switchScene(OBSWeakSource scene, OBSWeakSource transition);
|
||||
void switchScene(OBSWeakSource& scene, OBSWeakSource& transition);
|
||||
|
||||
|
||||
/********************************************************************************
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ void SwitcherData::checkIdleSwitch(bool& match, OBSWeakSource& scene, OBSWeakSou
|
|||
|
||||
if (!ignoreIdle && secondsSinceLastInput() > idleData.time)
|
||||
{
|
||||
scene = idleData.scene;
|
||||
scene = (idleData.usePreviousScene) ? previousScene : idleData.scene;
|
||||
transition = idleData.transition;
|
||||
match = true;
|
||||
}
|
||||
|
|
@ -83,6 +83,7 @@ void SceneSwitcher::UpdateIdleDataTransition(const QString& name)
|
|||
|
||||
void SceneSwitcher::UpdateIdleDataScene(const QString& name)
|
||||
{
|
||||
switcher->idleData.usePreviousScene = (name == PREVIOUS_SCENE_NAME);
|
||||
obs_source_t* scene = obs_get_source_by_name(name.toUtf8().constData());
|
||||
obs_weak_source_t* ws = obs_source_get_weak_source(scene);
|
||||
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ struct IdleData
|
|||
int time = DEFAULT_IDLE_TIME;
|
||||
OBSWeakSource scene;
|
||||
OBSWeakSource transition;
|
||||
bool usePreviousScene;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
|
|
@ -224,6 +225,7 @@ struct SwitcherData
|
|||
|
||||
obs_source_t* waitScene = NULL; //scene during which wait started
|
||||
OBSWeakSource previousScene = NULL;
|
||||
OBSWeakSource PreviousScene2 = NULL;
|
||||
OBSWeakSource lastRandomScene;
|
||||
OBSWeakSource nonMatchingScene;
|
||||
NoMatch switchIfNotMatching = NO_SWITCH;
|
||||
|
|
@ -269,7 +271,6 @@ struct SwitcherData
|
|||
void Start();
|
||||
void Stop();
|
||||
|
||||
void setPreviousScene();
|
||||
bool sceneChangedDuringWait();
|
||||
bool prioFuncsValid();
|
||||
void writeSceneInfoToFile();
|
||||
|
|
@ -364,7 +365,7 @@ struct SwitcherData
|
|||
fileSwitches.erase(fileSwitches.begin() + i--);
|
||||
}
|
||||
|
||||
if (!WeakSourceValid(idleData.scene) || !WeakSourceValid(idleData.transition))
|
||||
if (!idleData.usePreviousScene && !WeakSourceValid(idleData.scene) || !WeakSourceValid(idleData.transition))
|
||||
{
|
||||
idleData.idleEnable = false;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user