diff --git a/src/engine/enginebase.cpp b/src/engine/enginebase.cpp index 189d9378e..8d128e271 100644 --- a/src/engine/enginebase.cpp +++ b/src/engine/enginebase.cpp @@ -46,7 +46,8 @@ Engine::Base::Base() device_(QVariant()), rg_enabled_(false), rg_mode_(0), - rg_preamp_(0), + rg_preamp_(0.0), + rg_fallbackgain_(0.0), rg_compression_(true), buffer_duration_nanosec_(BackendSettingsPage::kDefaultBufferDuration * kNsecPerMsec), buffer_low_watermark_(BackendSettingsPage::kDefaultBufferLowWatermark), @@ -115,7 +116,8 @@ void Engine::Base::ReloadSettings() { rg_enabled_ = s.value("rgenabled", false).toBool(); rg_mode_ = s.value("rgmode", 0).toInt(); - rg_preamp_ = s.value("rgpreamp", 0.0).toFloat(); + rg_preamp_ = s.value("rgpreamp", 0.0).toDouble(); + rg_fallbackgain_ = s.value("rgfallbackgain", 0.0).toDouble(); rg_compression_ = s.value("rgcompression", true).toBool(); fadeout_enabled_ = s.value("FadeoutEnabled", false).toBool(); diff --git a/src/engine/enginebase.h b/src/engine/enginebase.h index 7b45c4bd6..421d067b2 100644 --- a/src/engine/enginebase.h +++ b/src/engine/enginebase.h @@ -180,7 +180,8 @@ class Base : public QObject { // ReplayGain bool rg_enabled_; int rg_mode_; - float rg_preamp_; + double rg_preamp_; + double rg_fallbackgain_; bool rg_compression_; // Buffering diff --git a/src/engine/gstengine.cpp b/src/engine/gstengine.cpp index a9af1732b..d696f7ce8 100644 --- a/src/engine/gstengine.cpp +++ b/src/engine/gstengine.cpp @@ -812,7 +812,7 @@ std::shared_ptr GstEngine::CreatePipeline() { ret->set_volume_enabled(volume_control_); ret->set_stereo_balancer_enabled(stereo_balancer_enabled_); ret->set_equalizer_enabled(equalizer_enabled_); - ret->set_replaygain(rg_enabled_, rg_mode_, rg_preamp_, rg_compression_); + ret->set_replaygain(rg_enabled_, rg_mode_, rg_preamp_, rg_fallbackgain_, rg_compression_); ret->set_buffer_duration_nanosec(buffer_duration_nanosec_); ret->set_buffer_low_watermark(buffer_low_watermark_); ret->set_buffer_high_watermark(buffer_high_watermark_); diff --git a/src/engine/gstenginepipeline.cpp b/src/engine/gstenginepipeline.cpp index 0dcf3b275..c56f5a407 100644 --- a/src/engine/gstenginepipeline.cpp +++ b/src/engine/gstenginepipeline.cpp @@ -79,6 +79,7 @@ GstEnginePipeline::GstEnginePipeline(GstEngine *engine) eq_preamp_(0), rg_mode_(0), rg_preamp_(0.0), + rg_fallbackgain_(0.0), rg_compression_(true), buffer_duration_nanosec_(BackendSettingsPage::kDefaultBufferDuration * kNsecPerMsec), buffer_low_watermark_(BackendSettingsPage::kDefaultBufferLowWatermark), @@ -176,11 +177,12 @@ void GstEnginePipeline::set_equalizer_enabled(const bool enabled) { if (pipeline_) UpdateEqualizer(); } -void GstEnginePipeline::set_replaygain(const bool enabled, const int mode, const float preamp, const bool compression) { +void GstEnginePipeline::set_replaygain(const bool enabled, const int mode, const double preamp, const double fallbackgain, const bool compression) { rg_enabled_ = enabled; rg_mode_ = mode; rg_preamp_ = preamp; + rg_fallbackgain_ = fallbackgain; rg_compression_ = compression; } @@ -376,7 +378,8 @@ bool GstEnginePipeline::InitAudioBin() { eventprobe = rgconverter; // Set replaygain settings g_object_set(G_OBJECT(rgvolume), "album-mode", rg_mode_, nullptr); - g_object_set(G_OBJECT(rgvolume), "pre-amp", double(rg_preamp_), nullptr); + g_object_set(G_OBJECT(rgvolume), "pre-amp", rg_preamp_, nullptr); + g_object_set(G_OBJECT(rgvolume), "fallback-gain", rg_fallbackgain_, nullptr); g_object_set(G_OBJECT(rglimiter), "enabled", int(rg_compression_), nullptr); } } diff --git a/src/engine/gstenginepipeline.h b/src/engine/gstenginepipeline.h index 4f32ca16c..bc1ef045e 100644 --- a/src/engine/gstenginepipeline.h +++ b/src/engine/gstenginepipeline.h @@ -69,7 +69,7 @@ class GstEnginePipeline : public QObject { void set_volume_enabled(const bool enabled); void set_stereo_balancer_enabled(const bool enabled); void set_equalizer_enabled(const bool enabled); - void set_replaygain(const bool enabled, const int mode, const float preamp, const bool compression); + void set_replaygain(const bool enabled, const int mode, const double preamp, const double fallbackgain, const bool compression); void set_buffer_duration_nanosec(const qint64 duration_nanosec); void set_buffer_low_watermark(const double value); void set_buffer_high_watermark(const double value); @@ -205,7 +205,8 @@ class GstEnginePipeline : public QObject { // ReplayGain int rg_mode_; - float rg_preamp_; + double rg_preamp_; + double rg_fallbackgain_; bool rg_compression_; // Buffering diff --git a/src/settings/backendsettingspage.cpp b/src/settings/backendsettingspage.cpp index d5625d8e0..f3f269a34 100644 --- a/src/settings/backendsettingspage.cpp +++ b/src/settings/backendsettingspage.cpp @@ -69,8 +69,10 @@ BackendSettingsPage::BackendSettingsPage(SettingsDialog *dialog) : SettingsPage( #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) ui_->label_replaygainpreamp->setMinimumWidth(QFontMetrics(ui_->label_replaygainpreamp->font()).horizontalAdvance("-WW.W dB")); + ui_->label_replaygainfallbackgain->setMinimumWidth(QFontMetrics(ui_->label_replaygainfallbackgain->font()).horizontalAdvance("-WW.W dB")); #else ui_->label_replaygainpreamp->setMinimumWidth(QFontMetrics(ui_->label_replaygainpreamp->font()).width("-WW.W dB")); + ui_->label_replaygainfallbackgain->setMinimumWidth(QFontMetrics(ui_->label_replaygainfallbackgain->font()).width("-WW.W dB")); #endif } @@ -116,8 +118,9 @@ void BackendSettingsPage::Load() { ui_->checkbox_replaygain->setChecked(s.value("rgenabled", false).toBool()); ui_->combobox_replaygainmode->setCurrentIndex(s.value("rgmode", 0).toInt()); - ui_->stickslider_replaygainpreamp->setValue(static_cast(s.value("rgpreamp", 0.0).toDouble() * 10 + 150)); + ui_->stickyslider_replaygainpreamp->setValue(static_cast(s.value("rgpreamp", 0.0).toDouble() * 10 + 600)); ui_->checkbox_replaygaincompression->setChecked(s.value("rgcompression", true).toBool()); + ui_->stickyslider_replaygainfallbackgain->setValue(static_cast(s.value("rgfallbackgain", 0.0).toDouble() * 10 + 600)); #if defined(HAVE_ALSA) bool fade_default = false; @@ -173,7 +176,8 @@ void BackendSettingsPage::Load() { QObject::connect(ui_->radiobutton_alsa_hw, &QRadioButton::clicked, this, &BackendSettingsPage::radiobutton_alsa_hw_clicked); QObject::connect(ui_->radiobutton_alsa_plughw, &QRadioButton::clicked, this, &BackendSettingsPage::radiobutton_alsa_plughw_clicked); #endif - QObject::connect(ui_->stickslider_replaygainpreamp, &StickySlider::valueChanged, this, &BackendSettingsPage::RgPreampChanged); + QObject::connect(ui_->stickyslider_replaygainpreamp, &StickySlider::valueChanged, this, &BackendSettingsPage::RgPreampChanged); + QObject::connect(ui_->stickyslider_replaygainfallbackgain, &StickySlider::valueChanged, this, &BackendSettingsPage::RgFallbackGainChanged); QObject::connect(ui_->checkbox_fadeout_stop, &QCheckBox::toggled, this, &BackendSettingsPage::FadingOptionsChanged); QObject::connect(ui_->checkbox_fadeout_cross, &QCheckBox::toggled, this, &BackendSettingsPage::FadingOptionsChanged); QObject::connect(ui_->checkbox_fadeout_auto, &QCheckBox::toggled, this, &BackendSettingsPage::FadingOptionsChanged); @@ -181,7 +185,8 @@ void BackendSettingsPage::Load() { QObject::connect(ui_->button_buffer_defaults, &QPushButton::clicked, this, &BackendSettingsPage::BufferDefaults); FadingOptionsChanged(); - RgPreampChanged(ui_->stickslider_replaygainpreamp->value()); + RgPreampChanged(ui_->stickyslider_replaygainpreamp->value()); + RgFallbackGainChanged(ui_->stickyslider_replaygainfallbackgain->value()); Init(ui_->layout_backendsettingspage->parentWidget()); if (!QSettings().childGroups().contains(kSettingsGroup)) set_changed(); @@ -422,7 +427,8 @@ void BackendSettingsPage::Save() { s.setValue("rgenabled", ui_->checkbox_replaygain->isChecked()); s.setValue("rgmode", ui_->combobox_replaygainmode->currentIndex()); - s.setValue("rgpreamp", float(ui_->stickslider_replaygainpreamp->value()) / 10 - 15); + s.setValue("rgpreamp", double(ui_->stickyslider_replaygainpreamp->value()) / 10 - 60); + s.setValue("rgfallbackgain", double(ui_->stickyslider_replaygainfallbackgain->value()) / 10 - 60); s.setValue("rgcompression", ui_->checkbox_replaygaincompression->isChecked()); s.setValue("FadeoutEnabled", ui_->checkbox_fadeout_stop->isChecked()); @@ -570,12 +576,20 @@ void BackendSettingsPage::DeviceStringChanged() { void BackendSettingsPage::RgPreampChanged(const int value) { - float db = float(value) / 10 - 15; + double db = double(value) / 10 - 60; QString db_str = QString::asprintf("%+.1f dB", db); ui_->label_replaygainpreamp->setText(db_str); } +void BackendSettingsPage::RgFallbackGainChanged(const int value) { + + double db = double(value) / 10 - 60; + QString db_str = QString::asprintf("%+.1f dB", db); + ui_->label_replaygainfallbackgain->setText(db_str); + +} + #ifdef HAVE_ALSA void BackendSettingsPage::SwitchALSADevices(const alsa_plugin alsaplugin) { diff --git a/src/settings/backendsettingspage.h b/src/settings/backendsettingspage.h index f4cc7a9aa..42633d612 100644 --- a/src/settings/backendsettingspage.h +++ b/src/settings/backendsettingspage.h @@ -61,6 +61,7 @@ public: void DeviceSelectionChanged(const int index); void DeviceStringChanged(); void RgPreampChanged(const int value); + void RgFallbackGainChanged(const int value); void radiobutton_alsa_hw_clicked(const bool checked); void radiobutton_alsa_plughw_clicked(const bool checked); void FadingOptionsChanged(); diff --git a/src/settings/backendsettingspage.ui b/src/settings/backendsettingspage.ui index 0e15c1c3e..1250b0498 100644 --- a/src/settings/backendsettingspage.ui +++ b/src/settings/backendsettingspage.ui @@ -440,30 +440,63 @@ - + - 300 + 1200 - 150 + 600 Qt::Horizontal - 150 + 600 - + Apply compression to prevent clipping + + + + + + + + + 0 + + + 1200 + + + 600 + + + Qt::Horizontal + + + 600 + + + + + + + + + Fallback-gain + + + @@ -663,7 +696,8 @@ button_buffer_defaults checkbox_replaygain combobox_replaygainmode - stickslider_replaygainpreamp + stickyslider_replaygainpreamp + stickyslider_replaygainfallbackgain checkbox_replaygaincompression checkbox_fadeout_stop checkbox_fadeout_cross