diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index c8bede9e..6a51a494 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -195,7 +195,8 @@ AdvSceneSwitcher.sceneSequenceTab.help="Dieser Tab ermöglicht es automatisiert AdvSceneSwitcher.audioTab.title="Audio" AdvSceneSwitcher.audioTab.condition.above="über" AdvSceneSwitcher.audioTab.condition.below="unter" -AdvSceneSwitcher.audioTab.entry="Wenn die Lautstärke von {{audioSources}} {{condition}} {{volumeWidget}} ist für {{duration}} wechsle zu {{scenes}} mit {{transitions}}" +AdvSceneSwitcher.audioTab.ignoreInactiveSource="außer Audio Quelle ist inaktiv" +AdvSceneSwitcher.audioTab.entry="Wenn die Lautstärke von {{audioSources}} {{condition}} {{volumeWidget}} ist für {{duration}} wechsle zu {{scenes}} mit {{transitions}} {{ignoreInactiveSource}}" AdvSceneSwitcher.audioTab.multiMatchfallbackCondition="Wenn mehrere Einträge zutreffen ..." AdvSceneSwitcher.audioTab.multiMatchfallback="... für {{duration}} wechsle zu {{scenes}} mit {{transitions}}" AdvSceneSwitcher.audioTab.help="Dieser Tab ermöglicht es basierend auf der Lautstärke von Audioquellen Szenen zu wechseln.\nSo kann zum Beispiel automatisch zu einer Szene gewechselt werden, wenn die Lautstärke eines Mikrofons eine konfigurierte Schwelle überschreitet.\n\nKlicke auf das markierte Plus Symbol, um einen neuen Eintrag hinzuzufügen." diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 6fd2fdeb..a15cb2e4 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -195,7 +195,8 @@ AdvSceneSwitcher.sceneSequenceTab.help="This tab will allow you to automatically AdvSceneSwitcher.audioTab.title="Audio" AdvSceneSwitcher.audioTab.condition.above="above" AdvSceneSwitcher.audioTab.condition.below="below" -AdvSceneSwitcher.audioTab.entry="When the volume of {{audioSources}} is {{condition}} {{volumeWidget}} for {{duration}} switch to {{scenes}} using {{transitions}}" +AdvSceneSwitcher.audioTab.ignoreInactiveSource="unless source is inactive" +AdvSceneSwitcher.audioTab.entry="When the volume of {{audioSources}} is {{condition}} {{volumeWidget}} for {{duration}} switch to {{scenes}} using {{transitions}} {{ignoreInactiveSource}}" AdvSceneSwitcher.audioTab.multiMatchfallbackCondition="If multiple entries match ..." AdvSceneSwitcher.audioTab.multiMatchfallback="... for {{duration}} switch to {{scenes}} using {{transitions}}" AdvSceneSwitcher.audioTab.help="This tab will allow you to switch scenes based on the volume of sources.\nFor example, you could automatically switch to a different scene if the volume of your microphone reaches a certain threshold.\n\nClick on the highlighted plus symbol to continue." diff --git a/src/headers/switch-audio.hpp b/src/headers/switch-audio.hpp index 27360fa1..c881250f 100644 --- a/src/headers/switch-audio.hpp +++ b/src/headers/switch-audio.hpp @@ -18,6 +18,7 @@ struct AudioSwitch : virtual SceneSwitcherEntry { int volumeThreshold = 0; audioCondition condition = ABOVE; double duration = 0; + bool ignoreInactiveSource = true; unsigned int matchCount = 0; float peak = -1; obs_volmeter_t *volmeter = nullptr; @@ -69,12 +70,14 @@ private slots: void VolumeThresholdChanged(int vol); void ConditionChanged(int cond); void DurationChanged(double dur); + void IgnoreInactiveChanged(int state); private: QComboBox *audioSources; QComboBox *condition; QSpinBox *audioVolumeThreshold; QDoubleSpinBox *duration; + QCheckBox *ignoreInactiveSource; VolControl *volMeter; AudioSwitch *switchData; diff --git a/src/switch-audio.cpp b/src/switch-audio.cpp index 73c96235..f5177b26 100644 --- a/src/switch-audio.cpp +++ b/src/switch-audio.cpp @@ -125,9 +125,16 @@ void SwitcherData::checkAudioSwitch(bool &match, OBSWeakSource &scene, continue; } - obs_source_t *as = obs_weak_source_get_source(s.audioSource); - bool audioActive = obs_source_active(as); - obs_source_release(as); + if (s.ignoreInactiveSource) { + obs_source_t *as = + obs_weak_source_get_source(s.audioSource); + bool audioActive = obs_source_active(as); + obs_source_release(as); + + if (!audioActive) { + continue; + } + } // peak will have a value from -60 db to 0 db bool volumeThresholdreached = false; @@ -154,7 +161,7 @@ void SwitcherData::checkAudioSwitch(bool &match, OBSWeakSource &scene, 1000.0 >= s.duration; - if (volumeThresholdreached && durationReached && audioActive) { + if (volumeThresholdreached && durationReached) { if (match) { checkAudioSwitchFallback(scene, transition); fallbackChecked = true; @@ -301,6 +308,7 @@ void AudioSwitch::save(obs_data_t *obj) obs_data_set_int(obj, "volume", volumeThreshold); obs_data_set_int(obj, "condition", condition); obs_data_set_double(obj, "duration", duration); + obs_data_set_bool(obj, "ignoreInactiveSource", ignoreInactiveSource); } // To be removed in future version @@ -346,6 +354,7 @@ void AudioSwitch::load(obs_data_t *obj) volumeThreshold = obs_data_get_int(obj, "volume"); condition = (audioCondition)obs_data_get_int(obj, "condition"); duration = obs_data_get_double(obj, "duration"); + ignoreInactiveSource = obs_data_get_bool(obj, "ignoreInactiveSource"); volmeter = AddVolmeterToSource(this, audioSource); } @@ -453,6 +462,8 @@ AudioSwitchWidget::AudioSwitchWidget(QWidget *parent, AudioSwitch *s) condition = new QComboBox(); audioVolumeThreshold = new QSpinBox(); duration = new QDoubleSpinBox(); + ignoreInactiveSource = new QCheckBox(obs_module_text( + "AdvSceneSwitcher.audioTab.ignoreInactiveSource")); obs_source_t *source = nullptr; if (s) { @@ -482,6 +493,8 @@ AudioSwitchWidget::AudioSwitchWidget(QWidget *parent, AudioSwitch *s) QWidget::connect(audioSources, SIGNAL(currentTextChanged(const QString &)), this, SLOT(SourceChanged(const QString &))); + QWidget::connect(ignoreInactiveSource, SIGNAL(stateChanged(int)), this, + SLOT(IgnoreInactiveChanged(int))); AdvSceneSwitcher::populateAudioSelection(audioSources); populateConditionSelection(condition); @@ -492,6 +505,7 @@ AudioSwitchWidget::AudioSwitchWidget(QWidget *parent, AudioSwitch *s) audioVolumeThreshold->setValue(s->volumeThreshold); condition->setCurrentIndex(s->condition); duration->setValue(s->duration); + ignoreInactiveSource->setChecked(s->ignoreInactiveSource); } QHBoxLayout *switchLayout = new QHBoxLayout; @@ -500,6 +514,7 @@ AudioSwitchWidget::AudioSwitchWidget(QWidget *parent, AudioSwitch *s) {"{{volumeWidget}}", audioVolumeThreshold}, {"{{condition}}", condition}, {"{{duration}}", duration}, + {"{{ignoreInactiveSource}}", ignoreInactiveSource}, {"{{scenes}}", scenes}, {"{{transitions}}", transitions}}; placeWidgets(obs_module_text("AdvSceneSwitcher.audioTab.entry"), @@ -599,6 +614,16 @@ void AudioSwitchWidget::DurationChanged(double dur) switchData->duration = dur; } +void AudioSwitchWidget::IgnoreInactiveChanged(int state) +{ + if (loading || !switchData) { + return; + } + + std::lock_guard lock(switcher->m); + switchData->ignoreInactiveSource = state; +} + AudioSwitchFallbackWidget::AudioSwitchFallbackWidget(QWidget *parent, AudioSwitchFallback *s) : SwitchWidget(parent, s, true, true)