diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 34fc7e26..9863230b 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -655,6 +655,8 @@ AdvSceneSwitcher.action.audio.type.sourceVolume="Set source volume" AdvSceneSwitcher.action.audio.type.masterVolume="Set master volume" AdvSceneSwitcher.action.audio.type.syncOffset="Set sync offset" AdvSceneSwitcher.action.audio.type.monitor="Set audio monitoring" +AdvSceneSwitcher.action.audio.type.enableOnTrack="Enable on audio track" +AdvSceneSwitcher.action.audio.type.disableOnTrack="Disable on audio track" AdvSceneSwitcher.action.audio.type.balance="Set balance" AdvSceneSwitcher.action.audio.balance.description="Move the slider in the direction of the audio channel you want to focus on." AdvSceneSwitcher.action.audio.fade.type.duration="over a duration of" @@ -663,7 +665,7 @@ AdvSceneSwitcher.action.audio.fade.duration="{{fade}}Fade{{fadeTypes}}{{duration AdvSceneSwitcher.action.audio.fade.rate="{{fade}}Fade{{fadeTypes}}{{rate}}per second." AdvSceneSwitcher.action.audio.fade.wait="Wait for fade to complete." AdvSceneSwitcher.action.audio.fade.abort="Abort already active fade." -AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{volumeDB}}{{percentDBToggle}}{{syncOffset}}{{monitorTypes}}" +AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{volumeDB}}{{percentDBToggle}}{{syncOffset}}{{monitorTypes}}{{track}}" AdvSceneSwitcher.action.recording="Recording" AdvSceneSwitcher.action.recording.type.stop="Stop recording" AdvSceneSwitcher.action.recording.type.start="Start recording" diff --git a/plugins/base/macro-action-audio.cpp b/plugins/base/macro-action-audio.cpp index 274937cc..ef0cf36a 100644 --- a/plugins/base/macro-action-audio.cpp +++ b/plugins/base/macro-action-audio.cpp @@ -29,6 +29,10 @@ static const std::map actionTypes = { "AdvSceneSwitcher.action.audio.type.monitor"}, {MacroActionAudio::Action::BALANCE, "AdvSceneSwitcher.action.audio.type.balance"}, + {MacroActionAudio::Action::ENABLE_ON_TRACK, + "AdvSceneSwitcher.action.audio.type.enableOnTrack"}, + {MacroActionAudio::Action::DISABLE_ON_TRACK, + "AdvSceneSwitcher.action.audio.type.disableOnTrack"}, }; static const std::map fadeTypes = { @@ -205,6 +209,28 @@ void MacroActionAudio::StartFade() const } } +static void setMixerEnable(obs_source_t *source, const int mixerIdx, + const bool enable) +{ + if (mixerIdx < 0) { + blog(LOG_INFO, "refusing to %s mixer id %d for %s", + enable ? "enable" : "disable", mixerIdx, + obs_source_get_name(source)); + return; + } + + uint32_t mixers = obs_source_get_audio_mixers(source); + uint32_t new_mixers = mixers; + + if (enable) { + new_mixers |= (1 << mixerIdx); + } else { + new_mixers &= ~(1 << mixerIdx); + } + + obs_source_set_audio_mixers(source, new_mixers); +} + bool MacroActionAudio::PerformAction() { auto s = obs_weak_source_get_source(_audioSource.GetSource()); @@ -232,6 +258,12 @@ bool MacroActionAudio::PerformAction() case Action::BALANCE: obs_source_set_balance_value(s, _balance); break; + case Action::ENABLE_ON_TRACK: + setMixerEnable(s, _track - 1, true); + break; + case Action::DISABLE_ON_TRACK: + setMixerEnable(s, _track - 1, false); + break; default: break; } @@ -263,6 +295,7 @@ bool MacroActionAudio::Save(obs_data_t *obj) const obs_data_set_int(obj, "monitor", _monitorType); _syncOffset.Save(obj, "syncOffset"); _balance.Save(obj, "balance"); + _track.Save(obj, "track"); _volume.Save(obj, "volume"); _rate.Save(obj, "rate"); obs_data_set_bool(obj, "fade", _fade); @@ -271,7 +304,7 @@ bool MacroActionAudio::Save(obs_data_t *obj) const obs_data_set_bool(obj, "abortActiveFade", _abortActiveFade); obs_data_set_bool(obj, "useDb", _useDb); _volumeDB.Save(obj, "volumeDB"); - obs_data_set_int(obj, "version", 2); + obs_data_set_int(obj, "version", 3); return true; } @@ -312,13 +345,18 @@ bool MacroActionAudio::Load(obs_data_t *obj) _abortActiveFade = false; } - if (obs_data_get_int(obj, "version") != 2) { + if (obs_data_get_int(obj, "version") < 2) { _useDb = false; _volumeDB = 0.0; } else { _useDb = obs_data_get_bool(obj, "useDb"); _volumeDB.Load(obj, "volumeDB"); } + if (obs_data_get_int(obj, "version") < 3) { + _track = 1; + } else { + _track.Load(obj, "track"); + } return true; } @@ -381,6 +419,7 @@ MacroActionAudioEdit::MacroActionAudioEdit( 0., 1., "", obs_module_text( "AdvSceneSwitcher.action.audio.balance.description"))), + _track(new VariableSpinBox), _volumePercent(new VariableSpinBox), _volumeDB(new VariableDoubleSpinBox), _percentDBToggle(new QPushButton), @@ -398,6 +437,9 @@ MacroActionAudioEdit::MacroActionAudioEdit( _syncOffset->setMaximum(20000); _syncOffset->setSuffix("ms"); + _track->setMinimum(1); + _track->setMaximum(32); + _volumePercent->setMinimum(0); _volumePercent->setMaximum(2000); _volumePercent->setSuffix("%"); @@ -433,6 +475,10 @@ MacroActionAudioEdit::MacroActionAudioEdit( this, SLOT(BalanceChanged(const NumberVariable &))); QWidget::connect(_monitorTypes, SIGNAL(currentIndexChanged(int)), this, SLOT(MonitorTypeChanged(int))); + QWidget::connect( + _track, + SIGNAL(NumberVariableChanged(const NumberVariable &)), + this, SLOT(TrackChanged(const NumberVariable &))); QWidget::connect( _volumePercent, SIGNAL(NumberVariableChanged(const NumberVariable &)), @@ -464,6 +510,7 @@ MacroActionAudioEdit::MacroActionAudioEdit( {"{{syncOffset}}", _syncOffset}, {"{{monitorTypes}}", _monitorTypes}, {"{{balance}}", _balance}, + {"{{track}}", _track}, {"{{volume}}", _volumePercent}, {"{{volumeDB}}", _volumeDB}, {"{{percentDBToggle}}", _percentDBToggle}, @@ -519,6 +566,10 @@ void MacroActionAudioEdit::SetWidgetVisibility() MacroActionAudio::Action::MONITOR); _balance->setVisible(_entryData->_action == MacroActionAudio::Action::BALANCE); + _track->setVisible(_entryData->_action == + MacroActionAudio::Action::ENABLE_ON_TRACK || + _entryData->_action == + MacroActionAudio::Action::DISABLE_ON_TRACK); _fadeTypeLayout->removeWidget(_fade); _fadeTypeLayout->removeWidget(_fadeTypes); @@ -583,6 +634,7 @@ void MacroActionAudioEdit::UpdateEntryData() _syncOffset->SetValue(_entryData->_syncOffset); _monitorTypes->setCurrentIndex(_entryData->_monitorType); _balance->SetDoubleValue(_entryData->_balance); + _track->SetValue(_entryData->_track); _volumePercent->SetValue(_entryData->_volume); _volumeDB->SetValue(_entryData->_volumeDB); _fade->setChecked(_entryData->_fade); @@ -648,6 +700,16 @@ void MacroActionAudioEdit::BalanceChanged(const NumberVariable &value) _entryData->_balance = value; } +void MacroActionAudioEdit::TrackChanged(const NumberVariable &value) +{ + if (_loading || !_entryData) { + return; + } + + auto lock = LockContext(); + _entryData->_track = value; +} + void MacroActionAudioEdit::VolumeDBChanged(const NumberVariable &value) { if (_loading || !_entryData) { diff --git a/plugins/base/macro-action-audio.hpp b/plugins/base/macro-action-audio.hpp index 4ae74dca..6d45b3a5 100644 --- a/plugins/base/macro-action-audio.hpp +++ b/plugins/base/macro-action-audio.hpp @@ -34,6 +34,8 @@ public: SYNC_OFFSET, MONITOR, BALANCE, + ENABLE_ON_TRACK, + DISABLE_ON_TRACK, }; enum class FadeType { @@ -46,6 +48,7 @@ public: IntVariable _syncOffset = 0; obs_monitoring_type _monitorType = OBS_MONITORING_TYPE_NONE; DoubleVariable _balance = 0.5; + IntVariable _track = 1; bool _useDb = false; IntVariable _volume = 0; DoubleVariable _volumeDB = 0.0; @@ -91,6 +94,7 @@ private slots: void SyncOffsetChanged(const NumberVariable &value); void MonitorTypeChanged(int value); void BalanceChanged(const NumberVariable &value); + void TrackChanged(const NumberVariable &value); void VolumeChanged(const NumberVariable &value); void VolumeDBChanged(const NumberVariable &value); void PercentDBClicked(); @@ -110,6 +114,7 @@ protected: VariableSpinBox *_syncOffset; QComboBox *_monitorTypes; SliderSpinBox *_balance; + VariableSpinBox *_track; VariableSpinBox *_volumePercent; VariableDoubleSpinBox *_volumeDB; QPushButton *_percentDBToggle;