Add option to use db value as input for audio action

This commit is contained in:
WarmUpTill
2023-12-29 20:49:53 +01:00
committed by WarmUpTill
parent 2da8a25ffd
commit 38423341c2
8 changed files with 85 additions and 17 deletions

View File

@@ -414,7 +414,6 @@ AdvSceneSwitcher.action.audio.fade.duration="{{fade}}Blende {{fadeTypes}} {{dura
AdvSceneSwitcher.action.audio.fade.rate="{{fade}}Blende {{fadeTypes}} {{rate}}pro Sekunde."
AdvSceneSwitcher.action.audio.fade.wait="Warten, bis die Blende abgeschlossen ist."
AdvSceneSwitcher.action.audio.fade.abort="Abbruch einer bereits aktiven Blende."
AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.recording="Aufnahme"
AdvSceneSwitcher.action.recording.type.stop="Aufnahme stoppen"
AdvSceneSwitcher.action.recording.type.start="Aufnahme starten"

View File

@@ -586,7 +586,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}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{volumeDB}}{{percentDBToggle}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.recording="Recording"
AdvSceneSwitcher.action.recording.type.stop="Stop recording"
AdvSceneSwitcher.action.recording.type.start="Start recording"

View File

@@ -339,7 +339,6 @@ AdvSceneSwitcher.action.audio.fade.duration="{{fade}}Fade {{fadeTypes}} {{durati
AdvSceneSwitcher.action.audio.fade.rate="{{fade}}Fade {{fadeTypes}} {{rate}}por segundo."
AdvSceneSwitcher.action.audio.fade.wait="Espere a que se complete el desvanecimiento".
AdvSceneSwitcher.action.audio.fade.abort="Cancelar atenuación ya activa."
AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.recording="Grabando"
AdvSceneSwitcher.action.recording.type.stop="Detener grabación"
AdvSceneSwitcher.action.recording.type.start="Iniciar grabación"

View File

@@ -127,7 +127,6 @@ AdvSceneSwitcher.action.audio.type.mute="Замьютить"
AdvSceneSwitcher.action.audio.type.unmute="Размьютить"
AdvSceneSwitcher.action.audio.type.sourceVolume="Установить громкость источника"
AdvSceneSwitcher.action.audio.type.masterVolume="Установить главную громкость"
AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.recording="Запись"
AdvSceneSwitcher.action.recording.type.stop="Остановить запись"
AdvSceneSwitcher.action.recording.type.start="Начать запись"

View File

@@ -270,7 +270,6 @@ AdvSceneSwitcher.action.audio.type.mute="Sessiz"
AdvSceneSwitcher.action.audio.type.unmute="Ses açmak"
AdvSceneSwitcher.action.audio.type.sourceVolume="Kaynak ses seviyesini ayarla"
AdvSceneSwitcher.action.audio.type.masterVolume="Ana ses seviyesini ayarla"
AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.recording="Kayıt"
AdvSceneSwitcher.action.recording.type.stop="Kayıt Durdur"
AdvSceneSwitcher.action.recording.type.start="Kayıt Başlat"

View File

@@ -469,7 +469,6 @@ AdvSceneSwitcher.action.audio.fade.duration="{{fade}}淡出 {{fadeTypes}} {{dura
AdvSceneSwitcher.action.audio.fade.rate="{{fade}}淡出 {{fadeTypes}} {{rate}}每秒."
AdvSceneSwitcher.action.audio.fade.wait="等待淡入淡出完成."
AdvSceneSwitcher.action.audio.fade.abort="中止已处于活动状态的淡入淡出."
AdvSceneSwitcher.action.audio.entry="{{actions}}{{audioSources}}{{volume}}{{syncOffset}}{{monitorTypes}}"
AdvSceneSwitcher.action.recording="录制"
AdvSceneSwitcher.action.recording.type.stop="停止录制"
AdvSceneSwitcher.action.recording.type.start="开始录制"

View File

@@ -2,6 +2,8 @@
#include "macro.hpp"
#include "utility.hpp"
#include <cmath>
namespace advss {
constexpr int64_t nsPerMs = 1000000;
@@ -49,6 +51,11 @@ static std::unordered_map<std::string, FadeInfo> audioFades;
constexpr auto fadeInterval = std::chrono::milliseconds(100);
constexpr float minFade = 0.000001f;
static float decibelToPercent(float db)
{
return pow(10, (db / 20));
}
// For backwards compatibility
#if LIBOBS_API_VER >= MAKE_SEMANTIC_VERSION(29, 0, 0)
static float get_master_volume()
@@ -103,6 +110,11 @@ std::atomic_int *MacroActionAudio::GetFadeIdPtr()
return &masterAudioFade.id;
}
float MacroActionAudio::GetVolume()
{
return _useDb ? decibelToPercent(_volumeDB) : (float)_volume / 100.0f;
}
void MacroActionAudio::SetVolume(float vol)
{
if (_action == Action::SOURCE_VOLUME) {
@@ -114,7 +126,7 @@ void MacroActionAudio::SetVolume(float vol)
}
}
float MacroActionAudio::GetVolume()
float MacroActionAudio::GetCurrentVolume()
{
float curVol;
if (_action == Action::SOURCE_VOLUME) {
@@ -132,8 +144,8 @@ float MacroActionAudio::GetVolume()
void MacroActionAudio::FadeVolume()
{
float vol = (float)_volume / 100.0f;
float curVol = GetVolume();
float vol = GetVolume();
float curVol = GetCurrentVolume();
bool volIncrease = curVol <= vol;
float volDiff = (volIncrease) ? vol - curVol : curVol - vol;
int nrSteps = 0;
@@ -211,7 +223,7 @@ bool MacroActionAudio::PerformAction()
if (_fade) {
StartFade();
} else {
SetVolume((float)_volume / 100.0f);
SetVolume(GetVolume());
}
break;
case Action::SYNC_OFFSET:
@@ -234,10 +246,11 @@ void MacroActionAudio::LogAction() const
{
auto it = actionTypes.find(_action);
if (it != actionTypes.end()) {
auto &[_, action] = *it;
vblog(LOG_INFO,
"performed action \"%s\" for source \"%s\" with volume %d with fade %d %f",
it->second.c_str(), _audioSource.ToString(true).c_str(),
_volume.GetValue(), _fade, _duration.Seconds());
"performed action \"%s\" for source \"%s\" with volume %f with fade %d %f",
action.c_str(), _audioSource.ToString(true).c_str(),
GetVolume(), _fade, _duration.Seconds());
} else {
blog(LOG_WARNING, "ignored unknown audio action %d",
static_cast<int>(_action));
@@ -259,7 +272,9 @@ bool MacroActionAudio::Save(obs_data_t *obj) const
obs_data_set_int(obj, "fadeType", static_cast<int>(_fadeType));
obs_data_set_bool(obj, "wait", _wait);
obs_data_set_bool(obj, "abortActiveFade", _abortActiveFade);
obs_data_set_int(obj, "version", 1);
obs_data_set_bool(obj, "useDb", _useDb);
_volumeDB.Save(obj, "volumeDB");
obs_data_set_int(obj, "version", 2);
return true;
}
@@ -299,6 +314,15 @@ bool MacroActionAudio::Load(obs_data_t *obj)
} else {
_abortActiveFade = false;
}
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");
}
return true;
}
@@ -322,7 +346,7 @@ static inline void populateActionSelection(QComboBox *list)
static inline void populateFadeTypeSelection(QComboBox *list)
{
for (auto entry : fadeTypes) {
for (const auto &entry : fadeTypes) {
list->addItem(obs_module_text(entry.second.c_str()));
}
}
@@ -340,6 +364,8 @@ MacroActionAudioEdit::MacroActionAudioEdit(
obs_module_text(
"AdvSceneSwitcher.action.audio.balance.description"))),
_volumePercent(new VariableSpinBox),
_volumeDB(new VariableDoubleSpinBox),
_percentDBToggle(new QPushButton),
_fade(new QCheckBox),
_duration(new DurationSelection(parent, false)),
_rate(new VariableDoubleSpinBox),
@@ -358,6 +384,11 @@ MacroActionAudioEdit::MacroActionAudioEdit(
_volumePercent->setMaximum(2000);
_volumePercent->setSuffix("%");
_volumeDB->setMinimum(-60);
_volumeDB->setMaximum(0);
_volumeDB->setSuffix("db");
_volumeDB->specialValueText("-inf");
_rate->setMinimum(0.01);
_rate->setMaximum(999.);
_rate->setSuffix("%");
@@ -388,6 +419,12 @@ MacroActionAudioEdit::MacroActionAudioEdit(
_volumePercent,
SIGNAL(NumberVariableChanged(const NumberVariable<int> &)),
this, SLOT(VolumeChanged(const NumberVariable<int> &)));
QWidget::connect(
_volumeDB,
SIGNAL(NumberVariableChanged(const NumberVariable<double> &)),
this, SLOT(VolumeDBChanged(const NumberVariable<double> &)));
QWidget::connect(_percentDBToggle, SIGNAL(clicked()), this,
SLOT(PercentDBClicked()));
QWidget::connect(_fade, SIGNAL(stateChanged(int)), this,
SLOT(FadeChanged(int)));
QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)),
@@ -410,6 +447,8 @@ MacroActionAudioEdit::MacroActionAudioEdit(
{"{{monitorTypes}}", _monitorTypes},
{"{{balance}}", _balance},
{"{{volume}}", _volumePercent},
{"{{volumeDB}}", _volumeDB},
{"{{percentDBToggle}}", _percentDBToggle},
{"{{fade}}", _fade},
{"{{duration}}", _duration},
{"{{rate}}", _rate},
@@ -448,7 +487,12 @@ static bool hasVolumeControl(MacroActionAudio::Action action)
void MacroActionAudioEdit::SetWidgetVisibility()
{
_volumePercent->setVisible(hasVolumeControl(_entryData->_action));
_volumePercent->setVisible(hasVolumeControl(_entryData->_action) &&
!_entryData->_useDb);
_volumeDB->setVisible(hasVolumeControl(_entryData->_action) &&
_entryData->_useDb);
_percentDBToggle->setText(_entryData->_useDb ? "db" : "%");
_percentDBToggle->setVisible(hasVolumeControl(_entryData->_action));
_sources->setVisible(_entryData->_action !=
MacroActionAudio::Action::MASTER_VOLUME);
_syncOffset->setVisible(_entryData->_action ==
@@ -519,6 +563,7 @@ void MacroActionAudioEdit::UpdateEntryData()
_monitorTypes->setCurrentIndex(_entryData->_monitorType);
_balance->SetDoubleValue(_entryData->_balance);
_volumePercent->SetValue(_entryData->_volume);
_volumeDB->SetValue(_entryData->_volumeDB);
_fade->setChecked(_entryData->_fade);
_duration->SetDuration(_entryData->_duration);
_rate->SetValue(_entryData->_rate);
@@ -582,6 +627,27 @@ void MacroActionAudioEdit::BalanceChanged(const NumberVariable<double> &value)
_entryData->_balance = value;
}
void MacroActionAudioEdit::VolumeDBChanged(const NumberVariable<double> &value)
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_volumeDB = value;
}
void MacroActionAudioEdit::PercentDBClicked()
{
if (_loading || !_entryData) {
return;
}
auto lock = LockContext();
_entryData->_useDb = !_entryData->_useDb;
SetWidgetVisibility();
}
void MacroActionAudioEdit::VolumeChanged(const NumberVariable<int> &value)
{
if (_loading || !_entryData) {

View File

@@ -47,7 +47,9 @@ public:
NumberVariable<int> _syncOffset = 0;
obs_monitoring_type _monitorType = OBS_MONITORING_TYPE_NONE;
NumberVariable<double> _balance = 0.5;
bool _useDb = false;
NumberVariable<int> _volume = 0;
NumberVariable<double> _volumeDB = 0.0;
bool _fade = false;
Duration _duration;
NumberVariable<double> _rate = 100.;
@@ -58,10 +60,11 @@ private:
void StartFade();
void FadeVolume();
void SetVolume(float vol);
float GetVolume();
float GetCurrentVolume();
void SetFadeActive(bool value);
bool FadeActive();
std::atomic_int *GetFadeIdPtr();
float GetVolume();
static bool _registered;
static const std::string id;
@@ -90,6 +93,8 @@ private slots:
void MonitorTypeChanged(int value);
void BalanceChanged(const NumberVariable<double> &value);
void VolumeChanged(const NumberVariable<int> &value);
void VolumeDBChanged(const NumberVariable<double> &value);
void PercentDBClicked();
void FadeChanged(int value);
void DurationChanged(const Duration &seconds);
void RateChanged(const NumberVariable<double> &value);
@@ -107,6 +112,8 @@ protected:
QComboBox *_monitorTypes;
SliderSpinBox *_balance;
VariableSpinBox *_volumePercent;
VariableDoubleSpinBox *_volumeDB;
QPushButton *_percentDBToggle;
QCheckBox *_fade;
DurationSelection *_duration;
VariableDoubleSpinBox *_rate;