From 03c9d930da8963b99fe4b39f4dd5d19e83a84355 Mon Sep 17 00:00:00 2001 From: Clayton Groeneveld Date: Sun, 28 Apr 2019 00:21:19 -0500 Subject: [PATCH] UI: Change volume to dB in adv audio properties --- UI/adv-audio-control.cpp | 32 +++++++++++++++++++++++--------- UI/adv-audio-control.hpp | 5 +++-- UI/data/locale/en-US.ini | 2 +- libobs/obs-audio-controls.c | 9 +++++++++ libobs/obs-audio-controls.h | 3 +++ 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/UI/adv-audio-control.cpp b/UI/adv-audio-control.cpp index 2cb47d9e4..db9750492 100644 --- a/UI/adv-audio-control.cpp +++ b/UI/adv-audio-control.cpp @@ -13,6 +13,9 @@ #define NSEC_PER_MSEC 1000000 #endif +#define MIN_DB -96.0 +#define MAX_DB 26.0 + OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) : source(source_) { @@ -29,7 +32,7 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) labelL = new QLabel(); labelR = new QLabel(); nameLabel = new QLabel(); - volume = new QSpinBox(); + volume = new QDoubleSpinBox(); forceMono = new QCheckBox(); balance = new BalanceSlider(); #if defined(_WIN32) || defined(__APPLE__) || HAVE_PULSEAUDIO @@ -71,9 +74,15 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) nameLabel->setText(QT_UTF8(sourceName)); nameLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); - volume->setMinimum(0); - volume->setMaximum(2000); - volume->setValue(int(vol * 100.0f)); + volume->setMinimum(MIN_DB - 0.1); + volume->setMaximum(MAX_DB); + volume->setSingleStep(0.1); + volume->setDecimals(1); + volume->setSuffix(" dB"); + volume->setValue(obs_mul_to_db(vol)); + + if (volume->value() < MIN_DB) + volume->setSpecialValueText("-inf dB"); forceMono->setChecked((flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0); @@ -147,8 +156,8 @@ OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *, obs_source_t *source_) mixerContainer->layout()->addWidget(mixer5); mixerContainer->layout()->addWidget(mixer6); - QWidget::connect(volume, SIGNAL(valueChanged(int)), - this, SLOT(volumeChanged(int))); + QWidget::connect(volume, SIGNAL(valueChanged(double)), + this, SLOT(volumeChanged(double))); QWidget::connect(forceMono, SIGNAL(clicked(bool)), this, SLOT(downmixMonoChanged(bool))); QWidget::connect(balance, SIGNAL(valueChanged(int)), @@ -259,7 +268,7 @@ void OBSAdvAudioCtrl::SourceFlagsChanged(uint32_t flags) void OBSAdvAudioCtrl::SourceVolumeChanged(float value) { volume->blockSignals(true); - volume->setValue(int(round(value * 100.0f))); + volume->setValue(obs_mul_to_db(value)); volume->blockSignals(false); } @@ -281,9 +290,14 @@ void OBSAdvAudioCtrl::SourceMixersChanged(uint32_t mixers) /* ------------------------------------------------------------------------- */ /* Qt control callbacks */ -void OBSAdvAudioCtrl::volumeChanged(int percentage) +void OBSAdvAudioCtrl::volumeChanged(double db) { - float val = float(percentage) / 100.0f; + if (db < MIN_DB) { + volume->setSpecialValueText("-inf dB"); + db = -INFINITY; + } + + float val = obs_db_to_mul(db); obs_source_set_volume(source, val); } diff --git a/UI/adv-audio-control.hpp b/UI/adv-audio-control.hpp index 80d248e83..05743a510 100644 --- a/UI/adv-audio-control.hpp +++ b/UI/adv-audio-control.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "balance-slider.hpp" class QGridLayout; @@ -22,7 +23,7 @@ private: QPointer balanceContainer; QPointer nameLabel; - QPointer volume; + QPointer volume; QPointer forceMono; QPointerbalance; QPointer labelL; @@ -59,7 +60,7 @@ public slots: void SourceSyncChanged(int64_t offset); void SourceMixersChanged(uint32_t mixers); - void volumeChanged(int percentage); + void volumeChanged(double db); void downmixMonoChanged(bool checked); void balanceChanged(int val); void syncOffsetChanged(int milliseconds); diff --git a/UI/data/locale/en-US.ini b/UI/data/locale/en-US.ini index 1c9672ae9..fce081d7e 100644 --- a/UI/data/locale/en-US.ini +++ b/UI/data/locale/en-US.ini @@ -824,7 +824,7 @@ Basic.Settings.Advanced.AutoRemux.MP4="(record as mkv)" # advanced audio properties Basic.AdvAudio="Advanced Audio Properties" Basic.AdvAudio.Name="Name" -Basic.AdvAudio.Volume="Volume (%)" +Basic.AdvAudio.Volume="Volume" Basic.AdvAudio.Mono="Downmix to Mono" Basic.AdvAudio.Balance="Balance" Basic.AdvAudio.SyncOffset="Sync Offset (ms)" diff --git a/libobs/obs-audio-controls.c b/libobs/obs-audio-controls.c index 0de00c7bd..280816557 100644 --- a/libobs/obs-audio-controls.c +++ b/libobs/obs-audio-controls.c @@ -932,3 +932,12 @@ void obs_volmeter_remove_callback(obs_volmeter_t *volmeter, pthread_mutex_unlock(&volmeter->callback_mutex); } +float obs_mul_to_db(float mul) +{ + return mul_to_db(mul); +} + +float obs_db_to_mul(float db) +{ + return db_to_mul(db); +} diff --git a/libobs/obs-audio-controls.h b/libobs/obs-audio-controls.h index 384d61872..c16b32b62 100644 --- a/libobs/obs-audio-controls.h +++ b/libobs/obs-audio-controls.h @@ -273,6 +273,9 @@ EXPORT void obs_volmeter_add_callback(obs_volmeter_t *volmeter, EXPORT void obs_volmeter_remove_callback(obs_volmeter_t *volmeter, obs_volmeter_updated_t callback, void *param); +EXPORT float obs_mul_to_db(float mul); +EXPORT float obs_db_to_mul(float db); + #ifdef __cplusplus } #endif