From 9aa0b31bff611de86b42e4e5763aa63ed5b3370e Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 20 Feb 2021 18:08:35 +0100 Subject: [PATCH] Add scene trigger to unmute source (#124) --- data/locale/de-DE.ini | 3 ++- data/locale/en-US.ini | 1 + src/headers/scene-trigger.hpp | 1 + src/scene-trigger.cpp | 29 +++++++++++++++++++++-------- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 59460efe..7fb64c43 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -232,7 +232,8 @@ AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopStreaming="Streamen stop AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startStreaming="Streamen starten" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startReplayBuffer="Replay Buffer starten" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopReplayBuffer="Replay Buffer stoppen" -AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource="Quelle stumm schalten" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource="Audio Quelle stumm schalten" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource="Audio Quelle aktiv schalten" 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 58bd1538..f6806ffe 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -233,6 +233,7 @@ AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startStreaming="start stream AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.startReplayBuffer="start replay buffer" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopReplayBuffer="stop replay buffer" AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource="mute source" +AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource="unmute source" 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 9e213b5a..7c053da6 100644 --- a/src/headers/scene-trigger.hpp +++ b/src/headers/scene-trigger.hpp @@ -23,6 +23,7 @@ enum class sceneTriggerAction { STOP_REPLAY_BUFFER, MUTE_SOURCE, + UNMUTE_SOURCE, }; struct SceneTrigger : SceneSwitcherEntry { diff --git a/src/scene-trigger.cpp b/src/scene-trigger.cpp index 7c917407..072c8ef8 100644 --- a/src/scene-trigger.cpp +++ b/src/scene-trigger.cpp @@ -133,6 +133,9 @@ void SceneTrigger::logMatch() case sceneTriggerAction::MUTE_SOURCE: actionName = "MUTE (" + GetWeakSourceName(audioSource) + ")"; break; + case sceneTriggerAction::UNMUTE_SOURCE: + actionName = "UNMUTE (" + GetWeakSourceName(audioSource) + ")"; + break; default: actionName = "UNKOWN"; break; @@ -176,21 +179,20 @@ void frontEndActionThread(sceneTriggerAction action, double delay) case sceneTriggerAction::STOP_REPLAY_BUFFER: obs_frontend_replay_buffer_stop(); break; - case sceneTriggerAction::MUTE_SOURCE: - obs_frontend_replay_buffer_stop(); - break; default: + blog(LOG_WARNING, "ignoring unexpected frontend action '%d'", + action); break; } } -void muteThread(OBSWeakSource source, double delay) +void muteThread(OBSWeakSource source, double delay, bool mute) { long long mil = delay * 1000; std::this_thread::sleep_for(std::chrono::milliseconds(mil)); auto s = obs_weak_source_get_source(source); - obs_source_set_muted(s, true); + obs_source_set_muted(s, mute); obs_source_release(s); } @@ -206,6 +208,12 @@ bool isFrontendAction(sceneTriggerAction triggerAction) triggerAction == sceneTriggerAction::STOP_REPLAY_BUFFER; } +bool isAudioAction(sceneTriggerAction t) +{ + return t == sceneTriggerAction::MUTE_SOURCE || + t == sceneTriggerAction::UNMUTE_SOURCE; +} + void SceneTrigger::performAction() { if (triggerAction == sceneTriggerAction::NONE) { @@ -216,8 +224,11 @@ void SceneTrigger::performAction() if (isFrontendAction(triggerAction)) { t = std::thread(frontEndActionThread, triggerAction, duration); + } else if (isAudioAction(triggerAction)) { + bool mute = triggerAction == sceneTriggerAction::MUTE_SOURCE; + t = std::thread(muteThread, audioSource, duration, mute); } else { - t = std::thread(muteThread, audioSource, duration); + blog(LOG_WARNING, "ignoring unkown action '%d'", triggerAction); } t.detach(); @@ -467,6 +478,8 @@ inline void populateActions(QComboBox *list) "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.stopReplayBuffer")); list->addItem(obs_module_text( "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.muteSource")); + list->addItem(obs_module_text( + "AdvSceneSwitcher.sceneTriggerTab.sceneTriggerAction.unmuteSource")); } SceneTriggerWidget::SceneTriggerWidget(QWidget *parent, SceneTrigger *s) @@ -503,7 +516,7 @@ SceneTriggerWidget::SceneTriggerWidget(QWidget *parent, SceneTrigger *s) audioSources->setCurrentText( GetWeakSourceName(s->audioSource).c_str()); - if (s->triggerAction == sceneTriggerAction::MUTE_SOURCE) { + if (isAudioAction(s->triggerAction)) { audioSources->show(); } else { audioSources->hide(); @@ -568,7 +581,7 @@ void SceneTriggerWidget::TriggerActionChanged(int index) static_cast(index); } - if (switchData->triggerAction == sceneTriggerAction::MUTE_SOURCE) { + if (isAudioAction(switchData->triggerAction)) { audioSources->show(); } else { audioSources->hide();