diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini
index cb36b762..f8be388e 100644
--- a/data/locale/de-DE.ini
+++ b/data/locale/de-DE.ini
@@ -6,19 +6,19 @@ AdvSceneSwitcher.generalTab.title="Allgemein"
AdvSceneSwitcher.generalTab.status="Status"
AdvSceneSwitcher.generalTab.status.hotkeytips="Hotkeys können in den OBS Einstellungen konfiguriert werden"
AdvSceneSwitcher.generalTab.status.currentStatus="Erweiterter Automatischer Szenenwechsler ist:"
-AdvSceneSwitcher.generalTab.status.onStartup="Beim Start:"
+AdvSceneSwitcher.generalTab.status.onStartup="Beim Start von OBS:"
AdvSceneSwitcher.generalTab.status.onStartup.asLastRun="Aktiviere den Szenenwechsler wenn er aktiv war"
AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Aktiviere den Szenenwechsler"
AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Aktiviere den Szenenwechsler nicht"
AdvSceneSwitcher.generalTab.status.start="Start"
AdvSceneSwitcher.generalTab.status.stop="Stop"
+AdvSceneSwitcher.generalTab.status.autoStart="Starte auotmatischen den Szenenwechsler beim:"
+AdvSceneSwitcher.generalTab.status.autoStart.never="Niemals"
+AdvSceneSwitcher.generalTab.status.autoStart.recording="Aufnehmen"
+AdvSceneSwitcher.generalTab.status.autoStart.streaming="Streamen"
+AdvSceneSwitcher.generalTab.status.autoStart.recordingAndStreaming="Aufnehmen oder Streamen"
AdvSceneSwitcher.generalTab.status.checkInterval="Teste Bedingungen alle"
AdvSceneSwitcher.generalTab.generalBehavior="Allgemeines Verhalten"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.recording="Aufnehmen"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.streaming="Streamen"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.recordingAndStreaming="Aufnehmen und Streamen"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart1="Starte"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart2=" auf Szene"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet="Wenn keine Bedingung erfüllt ist für "
AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip="Kann nur so genau sein wie das eingestellte Interval zum Testen der Bedingungen."
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.dontSwitch="Nicht wechseln"
@@ -27,8 +27,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo="Wechsle zu:"
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="Nach einem automatisierten Szenenwechsel wechsle nicht mehr für"
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="In diesem Zeitraum werden potentielle erfüllte Bedingungen ignoriert!"
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Ausführliches Logging"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStop1="Stoppe"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStop2="auf Szene"
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Deaktiviere UI Tipps"
AdvSceneSwitcher.generalTab.priority="Priorität"
AdvSceneSwitcher.generalTab.priority.description="Szenenwechselmethoden sortiert nach Priorität"
diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini
index 77644b5f..92f1deb0 100644
--- a/data/locale/en-US.ini
+++ b/data/locale/en-US.ini
@@ -6,19 +6,19 @@ AdvSceneSwitcher.generalTab.title="General"
AdvSceneSwitcher.generalTab.status="Status"
AdvSceneSwitcher.generalTab.status.hotkeytips="Hotkeys can be defined in the OBS settings"
AdvSceneSwitcher.generalTab.status.currentStatus="Advanced Scene Switcher is:"
-AdvSceneSwitcher.generalTab.status.onStartup="On startup:"
+AdvSceneSwitcher.generalTab.status.onStartup="On startup of OBS:"
AdvSceneSwitcher.generalTab.status.onStartup.asLastRun="Start the scene switcher if it was running"
AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="Always start the scene switcher"
AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="Do not start the scene switcher"
AdvSceneSwitcher.generalTab.status.start="Start"
AdvSceneSwitcher.generalTab.status.stop="Stop"
+AdvSceneSwitcher.generalTab.status.autoStart="Automatically start the scene switcher when:"
+AdvSceneSwitcher.generalTab.status.autoStart.never="Never"
+AdvSceneSwitcher.generalTab.status.autoStart.recording="Recording"
+AdvSceneSwitcher.generalTab.status.autoStart.streaming="Streaming"
+AdvSceneSwitcher.generalTab.status.autoStart.recordingAndStreaming="Recording or Streaming"
AdvSceneSwitcher.generalTab.status.checkInterval="Check switch conditions every"
AdvSceneSwitcher.generalTab.generalBehavior="General behavior"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.recording="Recording"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.streaming="Streaming"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.recordingAndStreaming="Recording and Streaming"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart1="Automatically start"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart2="on scene"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet="If no switch condition is met for"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip="Will only ever be as accurate as the configured check interval."
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.dontSwitch="Don't switch"
@@ -27,8 +27,6 @@ AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo="Switch to:"
AdvSceneSwitcher.generalTab.generalBehavior.cooldown="After a match do not switch scenes for"
AdvSceneSwitcher.generalTab.generalBehavior.cooldownHint="During this time potential matches will be ignored!"
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="Enable verbose logging"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStop1="Automatically stop"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStop2="on scene"
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="Disable UI hints"
AdvSceneSwitcher.generalTab.priority="Priority"
AdvSceneSwitcher.generalTab.priority.description="Switching methods priority (Highest priority is at the top)"
diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini
index 474f6241..13526a89 100644
--- a/data/locale/zh-CN.ini
+++ b/data/locale/zh-CN.ini
@@ -12,20 +12,17 @@ AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart="总是自动启动"
AdvSceneSwitcher.generalTab.status.onStartup.doNotStart="不要启动"
AdvSceneSwitcher.generalTab.status.start="启动"
AdvSceneSwitcher.generalTab.status.stop="停止"
+AdvSceneSwitcher.generalTab.status.autoStart.recording="录制"
+AdvSceneSwitcher.generalTab.status.autoStart.streaming="推流"
+AdvSceneSwitcher.generalTab.status.autoStart.recordingAndStreaming="录制和推流"
AdvSceneSwitcher.generalTab.status.checkInterval="检查切换条件时间间隔"
AdvSceneSwitcher.generalTab.generalBehavior="一般表现"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.recording="录制"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.streaming="推流"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart.recordingAndStreaming="录制和推流"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart1="自动开始"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStart2="当切换到场景时"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet="如果不符合任何切换条件"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMetDelayTooltip="时间精度最高只能达到配置的轮询间隔"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.dontSwitch="不切换"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchToRandom="切换到随机场景列表中任意随机场景"
AdvSceneSwitcher.generalTab.generalBehavior.onNoMet.switchTo="切换到"
AdvSceneSwitcher.generalTab.generalBehavior.verboseLogging="详细日志输出"
-AdvSceneSwitcher.generalTab.generalBehavior.automaticallyStop="当切换到场景时自动停止推流和录制"
AdvSceneSwitcher.generalTab.generalBehavior.disableUIHints="禁用UI提示"
AdvSceneSwitcher.generalTab.priority="优先级"
AdvSceneSwitcher.generalTab.priority.description="切换场景优先级 (最上方的项优先级最高)"
diff --git a/forms/advanced-scene-switcher.ui b/forms/advanced-scene-switcher.ui
index f5452759..a0f6b8db 100644
--- a/forms/advanced-scene-switcher.ui
+++ b/forms/advanced-scene-switcher.ui
@@ -57,34 +57,6 @@
-
-
-
-
-
- AdvSceneSwitcher.generalTab.status.hotkeytips
-
-
-
- -
-
-
- AdvSceneSwitcher.generalTab.status.currentStatus
-
-
-
- -
-
-
- AdvSceneSwitcher.generalTab.status.onStartup
-
-
-
- -
-
-
- AdvSceneSwitcher.generalTab.status.start
-
-
-
-
@@ -117,6 +89,13 @@
+ -
+
+
+ AdvSceneSwitcher.generalTab.status.start
+
+
+
-
-
@@ -141,6 +120,37 @@
+ -
+
+
+ AdvSceneSwitcher.generalTab.status.hotkeytips
+
+
+
+ -
+
+
+ AdvSceneSwitcher.generalTab.status.onStartup
+
+
+
+ -
+
+
+ AdvSceneSwitcher.generalTab.status.currentStatus
+
+
+
+ -
+
+
+ AdvSceneSwitcher.generalTab.status.autoStart
+
+
+
+ -
+
+
diff --git a/src/advanced-scene-switcher.cpp b/src/advanced-scene-switcher.cpp
index d0115100..d5054f5e 100644
--- a/src/advanced-scene-switcher.cpp
+++ b/src/advanced-scene-switcher.cpp
@@ -662,6 +662,20 @@ void resetLiveTime(SwitcherData *s)
s->liveTime = QDateTime();
}
+void checkAutoStartRecording(SwitcherData *s)
+{
+ if (s->autoStartEvent == AutoStartEvent::RECORDING ||
+ s->autoStartEvent == AutoStartEvent::RECORINDG_OR_STREAMING)
+ s->Start();
+}
+
+void checkAutoStartStreaming(SwitcherData *s)
+{
+ if (s->autoStartEvent == AutoStartEvent::STREAMING ||
+ s->autoStartEvent == AutoStartEvent::RECORINDG_OR_STREAMING)
+ s->Start();
+}
+
// Note to future self:
// be careful using switcher->m here as there is potential for deadlocks when using
// frontend functions such as obs_frontend_set_current_scene()
@@ -678,8 +692,12 @@ static void OBSEvent(enum obs_frontend_event event, void *switcher)
handleTransitionStop((SwitcherData *)switcher);
break;
case OBS_FRONTEND_EVENT_RECORDING_STARTED:
+ setLiveTime((SwitcherData *)switcher);
+ checkAutoStartRecording((SwitcherData *)switcher);
+ break;
case OBS_FRONTEND_EVENT_STREAMING_STARTED:
setLiveTime((SwitcherData *)switcher);
+ checkAutoStartStreaming((SwitcherData *)switcher);
break;
case OBS_FRONTEND_EVENT_RECORDING_STOPPED:
case OBS_FRONTEND_EVENT_STREAMING_STOPPED:
diff --git a/src/general.cpp b/src/general.cpp
index 0d3ffd97..f6cc1c77 100644
--- a/src/general.cpp
+++ b/src/general.cpp
@@ -75,6 +75,15 @@ void AdvSceneSwitcher::on_startupBehavior_currentIndexChanged(int index)
switcher->startupBehavior = (StartupBehavior)index;
}
+void AdvSceneSwitcher::on_autoStartEvent_currentIndexChanged(int index)
+{
+ if (loading)
+ return;
+
+ std::lock_guard lock(switcher->m);
+ switcher->autoStartEvent = static_cast(index);
+}
+
void AdvSceneSwitcher::on_noMatchSwitchScene_currentTextChanged(
const QString &text)
{
@@ -403,6 +412,9 @@ void SwitcherData::saveGeneralSettings(obs_data_t *obj)
obs_data_set_bool(obj, "active", !switcher->stop);
obs_data_set_int(obj, "startup_behavior", switcher->startupBehavior);
+ obs_data_set_int(obj, "autoStartEvent",
+ static_cast(switcher->autoStartEvent));
+
obs_data_set_bool(obj, "verbose", switcher->verbose);
obs_data_set_bool(obj, "disableHints", switcher->disableHints);
@@ -476,6 +488,9 @@ void SwitcherData::loadGeneralSettings(obs_data_t *obj)
if (switcher->startupBehavior == STOP)
switcher->stop = true;
+ switcher->autoStartEvent = static_cast(
+ obs_data_get_int(obj, "autoStartEvent"));
+
switcher->verbose = obs_data_get_bool(obj, "verbose");
switcher->disableHints = obs_data_get_bool(obj, "disableHints");
@@ -614,6 +629,28 @@ void SwitcherData::checkSwitchCooldown(bool &match)
blog(LOG_INFO, "cooldown active - ignoring match");
}
+void populateStartupBehavior(QComboBox *cb)
+{
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.onStartup.asLastRun"));
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart"));
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.onStartup.doNotStart"));
+}
+
+void populateAutoStartEventSelection(QComboBox *cb)
+{
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.autoStart.never"));
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.autoStart.recording"));
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.autoStart.streaming"));
+ cb->addItem(obs_module_text(
+ "AdvSceneSwitcher.generalTab.status.autoStart.recordingAndStreaming"));
+}
+
void AdvSceneSwitcher::setupGeneralTab()
{
populateSceneSelection(ui->noMatchSwitchScene, false);
@@ -701,15 +738,13 @@ void AdvSceneSwitcher::setupGeneralTab()
}
}
- ui->startupBehavior->addItem(obs_module_text(
- "AdvSceneSwitcher.generalTab.status.onStartup.asLastRun"));
- ui->startupBehavior->addItem(obs_module_text(
- "AdvSceneSwitcher.generalTab.status.onStartup.alwaysStart"));
- ui->startupBehavior->addItem(obs_module_text(
- "AdvSceneSwitcher.generalTab.status.onStartup.doNotStart"));
-
+ populateStartupBehavior(ui->startupBehavior);
ui->startupBehavior->setCurrentIndex(switcher->startupBehavior);
+ populateAutoStartEventSelection(ui->autoStartEvent);
+ ui->autoStartEvent->setCurrentIndex(
+ static_cast(switcher->autoStartEvent));
+
if (switcher->th && switcher->th->isRunning())
SetStarted();
else
diff --git a/src/headers/advanced-scene-switcher.hpp b/src/headers/advanced-scene-switcher.hpp
index a3176be3..d03b3544 100644
--- a/src/headers/advanced-scene-switcher.hpp
+++ b/src/headers/advanced-scene-switcher.hpp
@@ -100,6 +100,7 @@ public slots:
void on_noMatchDelay_valueChanged(double i);
void on_cooldownTime_valueChanged(double i);
void on_startupBehavior_currentIndexChanged(int index);
+ void on_autoStartEvent_currentIndexChanged(int index);
void on_noMatchSwitchScene_currentTextChanged(const QString &text);
void on_checkInterval_valueChanged(int value);
void on_toggleStartButton_clicked();
diff --git a/src/headers/switcher-data-structs.hpp b/src/headers/switcher-data-structs.hpp
index 7ff9cfc3..a07e0849 100644
--- a/src/headers/switcher-data-structs.hpp
+++ b/src/headers/switcher-data-structs.hpp
@@ -28,6 +28,13 @@ constexpr auto previous_scene_name = "Previous Scene";
typedef enum { NO_SWITCH = 0, SWITCH = 1, RANDOM_SWITCH = 2 } NoMatch;
typedef enum { PERSIST = 0, START = 1, STOP = 2 } StartupBehavior;
+enum class AutoStartEvent {
+ NEVER,
+ RECORDING,
+ STREAMING,
+ RECORINDG_OR_STREAMING,
+};
+
typedef struct transitionData {
std::string name = "";
int duration = 0;
@@ -64,6 +71,7 @@ struct SwitcherData {
double noMatchDelay;
double noMatchCount = 0;
StartupBehavior startupBehavior = PERSIST;
+ AutoStartEvent autoStartEvent = AutoStartEvent::NEVER;
double cooldown = 0.;
std::chrono::high_resolution_clock::time_point lastMatchTime;