From a5f0eb8da8f4350a8367661cce90b741935f03be Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Wed, 3 Feb 2021 20:02:07 +0100 Subject: [PATCH] Add option to automatically start scene switcher on recording / streaming start (#112) --- data/locale/de-DE.ini | 14 +++--- data/locale/en-US.ini | 14 +++--- data/locale/zh-CN.ini | 9 ++-- forms/advanced-scene-switcher.ui | 66 ++++++++++++++----------- src/advanced-scene-switcher.cpp | 18 +++++++ src/general.cpp | 49 +++++++++++++++--- src/headers/advanced-scene-switcher.hpp | 1 + src/headers/switcher-data-structs.hpp | 8 +++ 8 files changed, 122 insertions(+), 57 deletions(-) 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;