From 2ce0b35921be892c987c7dbb5fc90db38f15f0a6 Mon Sep 17 00:00:00 2001 From: WarmUpTill Date: Sat, 15 May 2021 18:37:31 +0200 Subject: [PATCH] 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; }