From 3abeb936b3fd1c3163f7a7fb189edbc45d8b7b3d Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 15 May 2021 00:40:43 +0200 Subject: [PATCH 1/4] Fix random order of various macro entries --- src/headers/macro.hpp | 4 ++-- src/macro-action-audio.cpp | 2 +- src/macro-action-recording.cpp | 2 +- src/macro-action-replay-buffer.cpp | 2 +- src/macro-action-streaming.cpp | 2 +- src/macro-action-wait.cpp | 2 +- src/macro-condition-audio.cpp | 2 +- src/macro-condition-media.cpp | 25 ++++++++++++------------- src/macro-condition-plugin-state.cpp | 7 +++---- src/macro-condition-recording.cpp | 2 +- src/macro-condition-scene.cpp | 2 +- src/macro-condition-streaming.cpp | 2 +- src/macro-condition-video.cpp | 2 +- src/macro.cpp | 2 +- 14 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/headers/macro.hpp b/src/headers/macro.hpp index ebd23b3a..bdc586e2 100644 --- a/src/headers/macro.hpp +++ b/src/headers/macro.hpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include @@ -42,7 +42,7 @@ public: LogicType GetLogicType() { return _logic; } void SetLogicType(LogicType logic) { _logic = logic; } - static const std::unordered_map logicTypes; + static const std::map logicTypes; private: LogicType _logic; diff --git a/src/macro-action-audio.cpp b/src/macro-action-audio.cpp index 9d7d2b53..8614e842 100644 --- a/src/macro-action-audio.cpp +++ b/src/macro-action-audio.cpp @@ -9,7 +9,7 @@ bool MacroActionAudio::_registered = MacroActionFactory::Register( {MacroActionAudio::Create, MacroActionAudioEdit::Create, "AdvSceneSwitcher.action.audio"}); -const static std::unordered_map actionTypes = { +const static std::map actionTypes = { {AudioAction::MUTE, "AdvSceneSwitcher.action.audio.type.mute"}, {AudioAction::UNMUTE, "AdvSceneSwitcher.action.audio.type.unmute"}, }; diff --git a/src/macro-action-recording.cpp b/src/macro-action-recording.cpp index 9aaccf6a..9c79ee8b 100644 --- a/src/macro-action-recording.cpp +++ b/src/macro-action-recording.cpp @@ -9,7 +9,7 @@ bool MacroActionRecord::_registered = MacroActionFactory::Register( {MacroActionRecord::Create, MacroActionRecordEdit::Create, "AdvSceneSwitcher.action.recording"}); -const static std::unordered_map actionTypes = { +const static std::map actionTypes = { {RecordAction::STOP, "AdvSceneSwitcher.action.recording.type.stop"}, {RecordAction::START, "AdvSceneSwitcher.action.recording.type.start"}, {RecordAction::PAUSE, "AdvSceneSwitcher.action.recording.type.pause"}, diff --git a/src/macro-action-replay-buffer.cpp b/src/macro-action-replay-buffer.cpp index d028c90a..942f4156 100644 --- a/src/macro-action-replay-buffer.cpp +++ b/src/macro-action-replay-buffer.cpp @@ -9,7 +9,7 @@ bool MacroActionReplayBuffer::_registered = MacroActionFactory::Register( {MacroActionReplayBuffer::Create, MacroActionReplayBufferEdit::Create, "AdvSceneSwitcher.action.replay"}); -const static std::unordered_map actionTypes = { +const static std::map actionTypes = { {ReplayBufferAction::STOP, "AdvSceneSwitcher.action.replay.type.stop"}, {ReplayBufferAction::START, "AdvSceneSwitcher.action.replay.type.start"}, diff --git a/src/macro-action-streaming.cpp b/src/macro-action-streaming.cpp index e1617ad5..09b689de 100644 --- a/src/macro-action-streaming.cpp +++ b/src/macro-action-streaming.cpp @@ -9,7 +9,7 @@ bool MacroActionStream::_registered = MacroActionFactory::Register( {MacroActionStream::Create, MacroActionStreamEdit::Create, "AdvSceneSwitcher.action.streaming"}); -const static std::unordered_map actionTypes = { +const static std::map actionTypes = { {StreamAction::STOP, "AdvSceneSwitcher.action.streaming.type.stop"}, {StreamAction::START, "AdvSceneSwitcher.action.streaming.type.start"}, }; diff --git a/src/macro-action-wait.cpp b/src/macro-action-wait.cpp index 536cd238..f30914d2 100644 --- a/src/macro-action-wait.cpp +++ b/src/macro-action-wait.cpp @@ -11,7 +11,7 @@ bool MacroActionWait::_registered = MacroActionFactory::Register( {MacroActionWait::Create, MacroActionWaitEdit::Create, "AdvSceneSwitcher.action.wait"}); -static std::unordered_map waitTypes = { +static std::map waitTypes = { {WaitType::FIXED, "AdvSceneSwitcher.action.wait.type.fixed"}, {WaitType::RANDOM, "AdvSceneSwitcher.action.wait.type.random"}, }; diff --git a/src/macro-condition-audio.cpp b/src/macro-condition-audio.cpp index d1251ceb..c25f7b96 100644 --- a/src/macro-condition-audio.cpp +++ b/src/macro-condition-audio.cpp @@ -10,7 +10,7 @@ bool MacroConditionAudio::_registered = MacroConditionFactory::Register( {MacroConditionAudio::Create, MacroConditionAudioEdit::Create, "AdvSceneSwitcher.condition.audio"}); -static std::unordered_map audioConditionTypes = { +static std::map audioConditionTypes = { {AudioCondition::ABOVE, "AdvSceneSwitcher.ondition.audio.state.above"}, {AudioCondition::BELOW, "AdvSceneSwitcher.ondition.audio.state.below"}, }; diff --git a/src/macro-condition-media.cpp b/src/macro-condition-media.cpp index fbcf44e4..828718d5 100644 --- a/src/macro-condition-media.cpp +++ b/src/macro-condition-media.cpp @@ -10,21 +10,20 @@ bool MacroConditionMedia::_registered = MacroConditionFactory::Register( {MacroConditionMedia::Create, MacroConditionMediaEdit::Create, "AdvSceneSwitcher.condition.media"}); -static std::unordered_map - mediaTimeRestrictions = { - {MediaTimeRestriction::TIME_RESTRICTION_NONE, - "AdvSceneSwitcher.mediaTab.timeRestriction.none"}, - {MediaTimeRestriction::TIME_RESTRICTION_SHORTER, - "AdvSceneSwitcher.mediaTab.timeRestriction.shorter"}, - {MediaTimeRestriction::TIME_RESTRICTION_LONGER, - "AdvSceneSwitcher.mediaTab.timeRestriction.longer"}, - {MediaTimeRestriction::TIME_RESTRICTION_REMAINING_SHORTER, - "AdvSceneSwitcher.mediaTab.timeRestriction.remainShorter"}, - {MediaTimeRestriction::TIME_RESTRICTION_REMAINING_LONGER, - "AdvSceneSwitcher.mediaTab.timeRestriction.remainLonger"}, +static std::map mediaTimeRestrictions = { + {MediaTimeRestriction::TIME_RESTRICTION_NONE, + "AdvSceneSwitcher.mediaTab.timeRestriction.none"}, + {MediaTimeRestriction::TIME_RESTRICTION_SHORTER, + "AdvSceneSwitcher.mediaTab.timeRestriction.shorter"}, + {MediaTimeRestriction::TIME_RESTRICTION_LONGER, + "AdvSceneSwitcher.mediaTab.timeRestriction.longer"}, + {MediaTimeRestriction::TIME_RESTRICTION_REMAINING_SHORTER, + "AdvSceneSwitcher.mediaTab.timeRestriction.remainShorter"}, + {MediaTimeRestriction::TIME_RESTRICTION_REMAINING_LONGER, + "AdvSceneSwitcher.mediaTab.timeRestriction.remainLonger"}, }; -static std::unordered_map mediaStates = { +static std::map mediaStates = { {MediaState::OBS_MEDIA_STATE_NONE, "AdvSceneSwitcher.mediaTab.states.none"}, {MediaState::OBS_MEDIA_STATE_PLAYING, diff --git a/src/macro-condition-plugin-state.cpp b/src/macro-condition-plugin-state.cpp index fc660116..ac69b8da 100644 --- a/src/macro-condition-plugin-state.cpp +++ b/src/macro-condition-plugin-state.cpp @@ -11,10 +11,9 @@ bool MacroConditionPluginState::_registered = MacroConditionFactory::Register( MacroConditionPluginStateEdit::Create, "AdvSceneSwitcher.condition.pluginState"}); -static std::unordered_map - pluginStateConditionTypes = { - {PluginStateCondition::SCENESWITCHED, - "AdvSceneSwitcher.condition.pluginState.state.sceneSwitched"}, +static std::map pluginStateConditionTypes = { + {PluginStateCondition::SCENESWITCHED, + "AdvSceneSwitcher.condition.pluginState.state.sceneSwitched"}, }; bool MacroConditionPluginState::CheckCondition() diff --git a/src/macro-condition-recording.cpp b/src/macro-condition-recording.cpp index f18ef38b..cd23f5ce 100644 --- a/src/macro-condition-recording.cpp +++ b/src/macro-condition-recording.cpp @@ -10,7 +10,7 @@ bool MacroConditionRecord::_registered = MacroConditionFactory::Register( {MacroConditionRecord::Create, MacroConditionRecordEdit::Create, "AdvSceneSwitcher.condition.record"}); -static std::unordered_map recordStates = { +static std::map recordStates = { {RecordState::STOP, "AdvSceneSwitcher.condition.record.state.stop"}, {RecordState::PAUSE, "AdvSceneSwitcher.condition.record.state.pause"}, {RecordState::START, "AdvSceneSwitcher.condition.record.state.start"}, diff --git a/src/macro-condition-scene.cpp b/src/macro-condition-scene.cpp index 4e19f8fa..095bb26d 100644 --- a/src/macro-condition-scene.cpp +++ b/src/macro-condition-scene.cpp @@ -10,7 +10,7 @@ bool MacroConditionScene::_registered = MacroConditionFactory::Register( {MacroConditionScene::Create, MacroConditionSceneEdit::Create, "AdvSceneSwitcher.condition.scene"}); -static std::unordered_map sceneTypes = { +static std::map sceneTypes = { {SceneType::CURRENT, "AdvSceneSwitcher.condition.scene.type.current"}, {SceneType::PREVIOUS, "AdvSceneSwitcher.condition.scene.type.previous"}, }; diff --git a/src/macro-condition-streaming.cpp b/src/macro-condition-streaming.cpp index e31116c2..3ccfed81 100644 --- a/src/macro-condition-streaming.cpp +++ b/src/macro-condition-streaming.cpp @@ -10,7 +10,7 @@ bool MacroConditionStream::_registered = MacroConditionFactory::Register( {MacroConditionStream::Create, MacroConditionStreamEdit::Create, "AdvSceneSwitcher.condition.stream"}); -static std::unordered_map streamStates = { +static std::map streamStates = { {StreamState::STOP, "AdvSceneSwitcher.condition.stream.state.stop"}, {StreamState::START, "AdvSceneSwitcher.condition.stream.state.start"}, }; diff --git a/src/macro-condition-video.cpp b/src/macro-condition-video.cpp index 9fa76aae..fa4b40a6 100644 --- a/src/macro-condition-video.cpp +++ b/src/macro-condition-video.cpp @@ -15,7 +15,7 @@ bool MacroConditionVideo::_registered = MacroConditionFactory::Register( {MacroConditionVideo::Create, MacroConditionVideoEdit::Create, "AdvSceneSwitcher.condition.video"}); -static std::unordered_map conditionTypes = { +static std::map conditionTypes = { {VideoCondition::MATCH, "AdvSceneSwitcher.condition.video.condition.match"}, {VideoCondition::DIFFER, diff --git a/src/macro.cpp b/src/macro.cpp index a333f14f..e0dda440 100644 --- a/src/macro.cpp +++ b/src/macro.cpp @@ -4,7 +4,7 @@ #include "headers/macro-condition-edit.hpp" #include "headers/macro-action-switch-scene.hpp" -const std::unordered_map MacroCondition::logicTypes = { +const std::map MacroCondition::logicTypes = { {LogicType::NONE, {"AdvSceneSwitcher.logic.none"}}, {LogicType::AND, {"AdvSceneSwitcher.logic.and"}}, {LogicType::OR, {"AdvSceneSwitcher.logic.or"}}, From c44b0a2ac2ba27027f7a1ff9d01f534cd76841f3 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 15 May 2021 17:47:17 +0200 Subject: [PATCH 2/4] Remove unused verbose parameter --- src/switch-pause.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/switch-pause.cpp b/src/switch-pause.cpp index 507caed0..723a9f03 100644 --- a/src/switch-pause.cpp +++ b/src/switch-pause.cpp @@ -90,7 +90,7 @@ void resetPause() VideoSwitch::pause = false; } -void setPauseTarget(PauseTarget &target, bool &verbose) +void setPauseTarget(PauseTarget &target) { switch (target) { case PauseTarget::All: @@ -148,23 +148,23 @@ void setPauseTarget(PauseTarget &target, bool &verbose) } bool checkPauseScene(obs_weak_source_t *currentScene, obs_weak_source_t *scene, - PauseTarget &target, bool &verbose) + PauseTarget &target) { if (currentScene != scene) { return false; } - setPauseTarget(target, verbose); + setPauseTarget(target); return (target == PauseTarget::All); } bool checkPauseWindow(std::string ¤tTitle, std::string &title, - PauseTarget &target, bool &verbose) + PauseTarget &target) { if (currentTitle != title) { return false; } - setPauseTarget(target, verbose); + setPauseTarget(target); return (target == PauseTarget::All); } @@ -182,11 +182,10 @@ bool SwitcherData::checkPause() for (PauseEntry &s : pauseEntries) { if (s.pauseType == PauseType::Scene) { - pauseAll = checkPauseScene(ws, s.scene, s.pauseTarget, - verbose); + pauseAll = checkPauseScene(ws, s.scene, s.pauseTarget); } else { pauseAll = checkPauseWindow(title, s.window, - s.pauseTarget, verbose); + s.pauseTarget); } if (pauseAll) { break; From 33d2def12620cd178d61e284027531c9021b6784 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 15 May 2021 17:50:26 +0200 Subject: [PATCH 3/4] Explicitly cast enum class to int --- src/macro-action-audio.cpp | 3 ++- src/macro-action-recording.cpp | 2 +- src/macro-action-replay-buffer.cpp | 2 +- src/macro-action-streaming.cpp | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/macro-action-audio.cpp b/src/macro-action-audio.cpp index 8614e842..2f588a04 100644 --- a/src/macro-action-audio.cpp +++ b/src/macro-action-audio.cpp @@ -39,7 +39,8 @@ void MacroActionAudio::LogAction() it->second.c_str(), GetWeakSourceName(_audioSource).c_str()); } else { - blog(LOG_WARNING, "ignored unknown audio action %d", _action); + blog(LOG_WARNING, "ignored unknown audio action %d", + static_cast(_action)); } } diff --git a/src/macro-action-recording.cpp b/src/macro-action-recording.cpp index 9c79ee8b..e479b899 100644 --- a/src/macro-action-recording.cpp +++ b/src/macro-action-recording.cpp @@ -55,7 +55,7 @@ void MacroActionRecord::LogAction() vblog(LOG_INFO, "performed action \"%s\"", it->second.c_str()); } else { blog(LOG_WARNING, "ignored unknown recording action %d", - _action); + static_cast(_action)); } } diff --git a/src/macro-action-replay-buffer.cpp b/src/macro-action-replay-buffer.cpp index 942f4156..0785bbed 100644 --- a/src/macro-action-replay-buffer.cpp +++ b/src/macro-action-replay-buffer.cpp @@ -52,7 +52,7 @@ void MacroActionReplayBuffer::LogAction() vblog(LOG_INFO, "performed action \"%s\"", it->second.c_str()); } else { blog(LOG_WARNING, "ignored unknown replay buffer action %d", - _action); + static_cast(_action)); } } diff --git a/src/macro-action-streaming.cpp b/src/macro-action-streaming.cpp index 09b689de..56dc0c97 100644 --- a/src/macro-action-streaming.cpp +++ b/src/macro-action-streaming.cpp @@ -43,7 +43,7 @@ void MacroActionStream::LogAction() vblog(LOG_INFO, "performed action \"%s\"", it->second.c_str()); } else { blog(LOG_WARNING, "ignored unknown streaming action %d", - _action); + static_cast(_action)); } } From 2ce0b35921be892c987c7dbb5fc90db38f15f0a6 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 15 May 2021 18:37:31 +0200 Subject: [PATCH 4/4] Add volume to control to audio action --- data/locale/en-US.ini | 4 +- src/headers/macro-action-audio.hpp | 7 +++- src/macro-action-audio.cpp | 59 +++++++++++++++++++++++++++++- 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 9524bfaa..6bf74f3a 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -134,7 +134,9 @@ AdvSceneSwitcher.action.wait.entry.random="Wait for {{waitType}} duration from { AdvSceneSwitcher.action.audio="Audio" AdvSceneSwitcher.action.audio.type.mute="Mute" AdvSceneSwitcher.action.audio.type.unmute="Unmute" -AdvSceneSwitcher.action.audio.entry="{{actions}} {{audioSources}}" +AdvSceneSwitcher.action.audio.type.sourceVolume="Set source volume" +AdvSceneSwitcher.action.audio.type.masterVolume="Set master volume" +AdvSceneSwitcher.action.audio.entry="{{actions}} {{audioSources}} {{volume}}" AdvSceneSwitcher.action.recording="Recording" AdvSceneSwitcher.action.recording.type.stop="Stop recording" AdvSceneSwitcher.action.recording.type.start="Start recording" diff --git a/src/headers/macro-action-audio.hpp b/src/headers/macro-action-audio.hpp index 4049e868..7f4d60b1 100644 --- a/src/headers/macro-action-audio.hpp +++ b/src/headers/macro-action-audio.hpp @@ -1,10 +1,12 @@ #pragma once -#include +#include #include "macro-action-edit.hpp" enum class AudioAction { MUTE, UNMUTE, + SOURCE_VOLUME, + MASTER_VOLUME, }; class MacroActionAudio : public MacroAction { @@ -21,6 +23,7 @@ public: OBSWeakSource _audioSource; AudioAction _action = AudioAction::MUTE; + int _volume = 0; private: static bool _registered; @@ -46,10 +49,12 @@ public: private slots: void SourceChanged(const QString &text); void ActionChanged(int value); + void VolumeChanged(int value); protected: QComboBox *_audioSources; QComboBox *_actions; + QSpinBox *_volumePercent; std::shared_ptr _entryData; private: diff --git a/src/macro-action-audio.cpp b/src/macro-action-audio.cpp index 2f588a04..a5473845 100644 --- a/src/macro-action-audio.cpp +++ b/src/macro-action-audio.cpp @@ -12,6 +12,10 @@ bool MacroActionAudio::_registered = MacroActionFactory::Register( const static std::map actionTypes = { {AudioAction::MUTE, "AdvSceneSwitcher.action.audio.type.mute"}, {AudioAction::UNMUTE, "AdvSceneSwitcher.action.audio.type.unmute"}, + {AudioAction::SOURCE_VOLUME, + "AdvSceneSwitcher.action.audio.type.sourceVolume"}, + {AudioAction::MASTER_VOLUME, + "AdvSceneSwitcher.action.audio.type.masterVolume"}, }; bool MacroActionAudio::PerformAction() @@ -24,6 +28,12 @@ bool MacroActionAudio::PerformAction() case AudioAction::UNMUTE: obs_source_set_muted(s, false); break; + case AudioAction::SOURCE_VOLUME: + obs_source_set_volume(s, (float)_volume / 100.0f); + break; + case AudioAction::MASTER_VOLUME: + obs_set_master_volume((float)_volume / 100.0f); + break; default: break; } @@ -35,9 +45,10 @@ void MacroActionAudio::LogAction() { auto it = actionTypes.find(_action); if (it != actionTypes.end()) { - vblog(LOG_INFO, "performed action \"%s\" for source \"%s\"", + vblog(LOG_INFO, + "performed action \"%s\" for source \"%s\" with volume %d", it->second.c_str(), - GetWeakSourceName(_audioSource).c_str()); + GetWeakSourceName(_audioSource).c_str(), _volume); } else { blog(LOG_WARNING, "ignored unknown audio action %d", static_cast(_action)); @@ -50,6 +61,7 @@ bool MacroActionAudio::Save(obs_data_t *obj) obs_data_set_string(obj, "audioSource", GetWeakSourceName(_audioSource).c_str()); obs_data_set_int(obj, "action", static_cast(_action)); + obs_data_set_int(obj, "volume", _volume); return true; } @@ -59,6 +71,7 @@ bool MacroActionAudio::Load(obs_data_t *obj) const char *audioSourceName = obs_data_get_string(obj, "audioSource"); _audioSource = GetWeakSourceByName(audioSourceName); _action = static_cast(obs_data_get_int(obj, "action")); + _volume = obs_data_get_int(obj, "volume"); return true; } @@ -75,6 +88,10 @@ MacroActionAudioEdit::MacroActionAudioEdit( { _audioSources = new QComboBox(); _actions = new QComboBox(); + _volumePercent = new QSpinBox(); + _volumePercent->setMinimum(0); + _volumePercent->setMaximum(2000); + _volumePercent->setSuffix("%"); populateActionSelection(_actions); AdvSceneSwitcher::populateAudioSelection(_audioSources); @@ -84,11 +101,14 @@ MacroActionAudioEdit::MacroActionAudioEdit( QWidget::connect(_audioSources, SIGNAL(currentTextChanged(const QString &)), this, SLOT(SourceChanged(const QString &))); + QWidget::connect(_volumePercent, SIGNAL(valueChanged(int)), this, + SLOT(VolumeChanged(int))); QHBoxLayout *mainLayout = new QHBoxLayout; std::unordered_map widgetPlaceholders = { {"{{audioSources}}", _audioSources}, {"{{actions}}", _actions}, + {"{{volume}}", _volumePercent}, }; placeWidgets(obs_module_text("AdvSceneSwitcher.action.audio.entry"), mainLayout, widgetPlaceholders); @@ -99,6 +119,17 @@ MacroActionAudioEdit::MacroActionAudioEdit( _loading = false; } +bool hasVolumeControl(AudioAction action) +{ + return action == AudioAction::SOURCE_VOLUME || + action == AudioAction::MASTER_VOLUME; +} + +bool hasSourceControl(AudioAction action) +{ + return action != AudioAction::MASTER_VOLUME; +} + void MacroActionAudioEdit::UpdateEntryData() { if (!_entryData) { @@ -108,6 +139,19 @@ void MacroActionAudioEdit::UpdateEntryData() _audioSources->setCurrentText( GetWeakSourceName(_entryData->_audioSource).c_str()); _actions->setCurrentIndex(static_cast(_entryData->_action)); + _volumePercent->setValue(_entryData->_volume); + + if (hasVolumeControl(_entryData->_action)) { + _volumePercent->show(); + } else { + _volumePercent->hide(); + } + + if (hasSourceControl(_entryData->_action)) { + _audioSources->show(); + } else { + _audioSources->hide(); + } } void MacroActionAudioEdit::SourceChanged(const QString &text) @@ -128,4 +172,15 @@ void MacroActionAudioEdit::ActionChanged(int value) std::lock_guard lock(switcher->m); _entryData->_action = static_cast(value); + UpdateEntryData(); +} + +void MacroActionAudioEdit::VolumeChanged(int value) +{ + if (_loading || !_entryData) { + return; + } + + std::lock_guard lock(switcher->m); + _entryData->_volume = value; }