diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 7fb64c43..edbdc335 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -234,6 +234,8 @@ AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startReplayBuffer="Replay Bu AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopReplayBuffer="Replay Buffer stoppen" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource="Audio Quelle stumm schalten" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource="Audio Quelle aktiv schalten" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startSwitcher="Szenenwechsler starten" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopSwitcher="Szenenwechsler stoppen" AdvSceneSwitcher.sceneTriggerTab.entry="Wenn {{scenes}} {{triggers}} {{actions}} {{audioSources}} nach {{duration}} " AdvSceneSwitcher.sceneTriggerTab.help="Dieser Tab ermöglicht es automatisiert Handlungen, wie etwa das Stoppen von einer Aufnahme oder des Streamens, bei einem Szenenwechsel auszuführen." diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index f6806ffe..e920df88 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -234,6 +234,8 @@ AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startReplayBuffer="start rep AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopReplayBuffer="stop replay buffer" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource="mute source" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource="unmute source" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startSwitcher="start the scene switcher" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopSwitcher="stop the scene switcher" AdvSceneSwitcher.sceneTriggerTab.entry="When {{scenes}} {{triggers}} {{actions}} {{audioSources}} after {{duration}}" AdvSceneSwitcher.sceneTriggerTab.help="This tab allows you to trigger actions on scene changes, like stopping recording or streaming." diff --git a/src/headers/scene-trigger.hpp b/src/headers/scene-trigger.hpp index 7c053da6..77512f10 100644 --- a/src/headers/scene-trigger.hpp +++ b/src/headers/scene-trigger.hpp @@ -24,6 +24,9 @@ enum class sceneTriggerAction { MUTE_SOURCE, UNMUTE_SOURCE, + + START_SWITCHER, + STOP_SWITCHER, }; struct SceneTrigger : SceneSwitcherEntry { diff --git a/src/scene-trigger.cpp b/src/scene-trigger.cpp index 072c8ef8..389a2ceb 100644 --- a/src/scene-trigger.cpp +++ b/src/scene-trigger.cpp @@ -136,6 +136,12 @@ void SceneTrigger::logMatch() case sceneTriggerAction::UNMUTE_SOURCE: actionName = "UNMUTE (" + GetWeakSourceName(audioSource) + ")"; break; + case sceneTriggerAction::START_SWITCHER: + actionName = "START SCENE SWITCHER"; + break; + case sceneTriggerAction::STOP_SWITCHER: + actionName = "STOP SCENE SWITCHER"; + break; default: actionName = "UNKOWN"; break; @@ -196,6 +202,18 @@ void muteThread(OBSWeakSource source, double delay, bool mute) obs_source_release(s); } +void statusThread(double delay, bool stop) +{ + long long mil = delay * 1000; + std::this_thread::sleep_for(std::chrono::milliseconds(mil)); + + if (stop) { + switcher->Stop(); + } else { + switcher->Start(); + } +} + bool isFrontendAction(sceneTriggerAction triggerAction) { return triggerAction == sceneTriggerAction::START_RECORDING || @@ -214,6 +232,12 @@ bool isAudioAction(sceneTriggerAction t) t == sceneTriggerAction::UNMUTE_SOURCE; } +bool isSwitcherStatusAction(sceneTriggerAction t) +{ + return t == sceneTriggerAction::START_SWITCHER || + t == sceneTriggerAction::STOP_SWITCHER; +} + void SceneTrigger::performAction() { if (triggerAction == sceneTriggerAction::NONE) { @@ -227,6 +251,9 @@ void SceneTrigger::performAction() } else if (isAudioAction(triggerAction)) { bool mute = triggerAction == sceneTriggerAction::MUTE_SOURCE; t = std::thread(muteThread, audioSource, duration, mute); + } else if (isSwitcherStatusAction(triggerAction)) { + bool stop = triggerAction == sceneTriggerAction::STOP_SWITCHER; + t = std::thread(statusThread, duration, stop); } else { blog(LOG_WARNING, "ignoring unkown action '%d'", triggerAction); } @@ -252,7 +279,7 @@ bool SceneTrigger::checkMatch(OBSWeakSource currentScene, void SwitcherData::checkTriggers() { - if (SceneTrigger::pause || stop) { + if (SceneTrigger::pause) { return; } @@ -260,6 +287,10 @@ void SwitcherData::checkTriggers() OBSWeakSource currentScene = obs_source_get_weak_source(source); for (auto &t : sceneTriggers) { + if (stop && !isSwitcherStatusAction(t.triggerAction)) { + continue; + } + if (t.checkMatch(currentScene, previousScene)) { t.logMatch(); t.performAction(); @@ -480,6 +511,10 @@ inline void populateActions(QComboBox *list) "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource")); list->addItem(obs_module_text( "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource")); + list->addItem(obs_module_text( + "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startSwitcher")); + list->addItem(obs_module_text( + "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopSwitcher")); } SceneTriggerWidget::SceneTriggerWidget(QWidget *parent, SceneTrigger *s)