From f7b9795014ca1f976ef52f26312678ae70db0d25 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Mon, 3 Jan 2022 21:53:56 +0100 Subject: [PATCH] Add option to check if source is muted --- data/locale/en-US.ini | 6 ++-- src/headers/macro-condition-audio.hpp | 4 +++ src/macro-condition-audio.cpp | 48 ++++++++++++++++++++++----- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 73704bf2..c2e043e4 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -87,8 +87,10 @@ AdvSceneSwitcher.logic.not="If not" ; Macro Conditions AdvSceneSwitcher.condition.audio="Audio" -AdvSceneSwitcher.condition.audio.state.below="Below" -AdvSceneSwitcher.condition.audio.state.above="Above" +AdvSceneSwitcher.condition.audio.state.below="below" +AdvSceneSwitcher.condition.audio.state.above="above" +AdvSceneSwitcher.condition.audio.state.mute="muted" +AdvSceneSwitcher.condition.audio.state.unmute="unmuted" AdvSceneSwitcher.condition.audio.entry="Volume of {{audioSources}} is {{condition}} {{volume}}" AdvSceneSwitcher.condition.cursor="Cursor" AdvSceneSwitcher.condition.cursor.type.region="is in region" diff --git a/src/headers/macro-condition-audio.hpp b/src/headers/macro-condition-audio.hpp index e3b27369..bc7b6ce7 100644 --- a/src/headers/macro-condition-audio.hpp +++ b/src/headers/macro-condition-audio.hpp @@ -9,6 +9,8 @@ enum class AudioCondition { ABOVE, BELOW, + MUTE, + UNMUTE, }; class MacroConditionAudio : public MacroCondition { @@ -72,5 +74,7 @@ protected: std::shared_ptr _entryData; private: + void SetWidgetVisibility(); + bool _loading = true; }; diff --git a/src/macro-condition-audio.cpp b/src/macro-condition-audio.cpp index bf4f3025..fdcb6016 100644 --- a/src/macro-condition-audio.cpp +++ b/src/macro-condition-audio.cpp @@ -13,6 +13,9 @@ bool MacroConditionAudio::_registered = MacroConditionFactory::Register( static std::map audioConditionTypes = { {AudioCondition::ABOVE, "AdvSceneSwitcher.condition.audio.state.above"}, {AudioCondition::BELOW, "AdvSceneSwitcher.condition.audio.state.below"}, + {AudioCondition::MUTE, "AdvSceneSwitcher.condition.audio.state.mute"}, + {AudioCondition::UNMUTE, + "AdvSceneSwitcher.condition.audio.state.unmute"}, }; MacroConditionAudio::~MacroConditionAudio() @@ -23,19 +26,32 @@ MacroConditionAudio::~MacroConditionAudio() bool MacroConditionAudio::CheckCondition() { - // peak will have a value from -60 db to 0 db - bool volumeThresholdreached = false; - - if (_condition == AudioCondition::ABOVE) { - volumeThresholdreached = ((double)_peak + 60) * 1.7 > _volume; - } else { - volumeThresholdreached = ((double)_peak + 60) * 1.7 < _volume; + bool ret = false; + auto s = obs_weak_source_get_source(_audioSource); + switch (_condition) { + case AudioCondition::ABOVE: + // peak will have a value from -60 db to 0 db + ret = ((double)_peak + 60) * 1.7 > _volume; + break; + case AudioCondition::BELOW: + // peak will have a value from -60 db to 0 db + ret = ((double)_peak + 60) * 1.7 < _volume; + break; + case AudioCondition::MUTE: + ret = obs_source_muted(s); + break; + case AudioCondition::UNMUTE: + ret = !obs_source_muted(s); + break; + default: + break; } // Reset for next check _peak = -std::numeric_limits::infinity(); - return volumeThresholdreached; + obs_source_release(s); + return ret; } bool MacroConditionAudio::Save(obs_data_t *obj) @@ -189,6 +205,7 @@ void MacroConditionAudioEdit::SourceChanged(const QString &text) _entryData->_audioSource = GetWeakSourceByQString(text); _entryData->ResetVolmeter(); UpdateVolmeterSource(); + SetWidgetVisibility(); emit HeaderInfoChanged( QString::fromStdString(_entryData->GetShortDesc())); } @@ -211,6 +228,7 @@ void MacroConditionAudioEdit::ConditionChanged(int cond) std::lock_guard lock(switcher->m); _entryData->_condition = static_cast(cond); + SetWidgetVisibility(); } void MacroConditionAudioEdit::UpdateEntryData() @@ -224,4 +242,18 @@ void MacroConditionAudioEdit::UpdateEntryData() _volume->setValue(_entryData->_volume); _condition->setCurrentIndex(static_cast(_entryData->_condition)); UpdateVolmeterSource(); + SetWidgetVisibility(); +} + +void MacroConditionAudioEdit::SetWidgetVisibility() +{ + if (!_entryData) { + return; + } + + _volume->setVisible(_entryData->_condition == AudioCondition::ABOVE || + _entryData->_condition == AudioCondition::BELOW); + _volMeter->setVisible(_entryData->_condition == AudioCondition::ABOVE || + _entryData->_condition == AudioCondition::BELOW); + adjustSize(); }