ReplayGain: added a dedicated preamp gain for tracks that do not have RG info. ref #38

This commit is contained in:
emeric
2020-04-26 14:57:33 +02:00
parent dab89554b4
commit a2b85f7e6b
6 changed files with 46 additions and 8 deletions
+2 -1
View File
@@ -169,7 +169,8 @@
<message id="Lms.Settings.replaygain-mode.auto">Auto</message> <message id="Lms.Settings.replaygain-mode.auto">Auto</message>
<message id="Lms.Settings.replaygain-mode.track">Track</message> <message id="Lms.Settings.replaygain-mode.track">Track</message>
<message id="Lms.Settings.replaygain-mode.release">Album</message> <message id="Lms.Settings.replaygain-mode.release">Album</message>
<message id="Lms.Settings.replaygain-preamp">Replay gain preAmp</message> <message id="Lms.Settings.replaygain-preamp">ReplayGain preamp</message>
<message id="Lms.Settings.replaygain-preamp-no-rg-info">ReplayGain preamp (if no info)</message>
<message id="Lms.Settings.subsonic-artist-list-mode">Artist list mode</message> <message id="Lms.Settings.subsonic-artist-list-mode">Artist list mode</message>
<message id="Lms.Settings.subsonic-artist-list-mode.all-artists">All artists</message> <message id="Lms.Settings.subsonic-artist-list-mode.all-artists">All artists</message>
<message id="Lms.Settings.subsonic-artist-list-mode.release-artists">Album artists</message> <message id="Lms.Settings.subsonic-artist-list-mode.release-artists">Album artists</message>
+13 -1
View File
@@ -5,7 +5,7 @@
<message id="Lms.Settings.template"> <message id="Lms.Settings.template">
<div class="row"> <div class="row">
<div class="col-lg-6"> <div class="col-lg-8">
<legend>${tr:Lms.Settings.appearance}</legend> <legend>${tr:Lms.Settings.appearance}</legend>
<div class="form-horizontal"> <div class="form-horizontal">
<div class="form-group"> <div class="form-group">
@@ -74,6 +74,18 @@
${replaygain-preamp-info class="help-block"} ${replaygain-preamp-info class="help-block"}
</div> </div>
</div> </div>
<div class="form-group">
<label class="col-lg-3 control-label" for="${id:replaygain-preamp-no-rg-info}">
${tr:Lms.Settings.replaygain-preamp-no-rg-info}
</label>
<div class="col-lg-9">
<div class="input-group">
${replaygain-preamp-no-rg-info}
<span class="input-group-addon">dB</span>
</div>
${replaygain-preamp-no-rg-info-info class="help-block"}
</div>
</div>
</div> </div>
${<if-has-subsonic-api>} ${<if-has-subsonic-api>}
<legend>${tr:Lms.Settings.subsonic-api}</legend> <legend>${tr:Lms.Settings.subsonic-api}</legend>
+2
View File
@@ -59,6 +59,7 @@ static std::string settingsToJSString(const MediaPlayer::Settings& settings)
Json::Object replayGain; Json::Object replayGain;
replayGain["mode"] = static_cast<int>(settings.replayGain.mode); replayGain["mode"] = static_cast<int>(settings.replayGain.mode);
replayGain["preAmpGain"] = settings.replayGain.preAmpGain; replayGain["preAmpGain"] = settings.replayGain.preAmpGain;
replayGain["preAmpGainIfNoInfo"] = settings.replayGain.preAmpGainIfNoInfo;
res["replayGain"] = std::move(replayGain); res["replayGain"] = std::move(replayGain);
} }
@@ -180,6 +181,7 @@ static MediaPlayer::Settings settingsfromJSString(const std::string& strSettings
const Json::Object replayGain {replayGainValue}; const Json::Object replayGain {replayGainValue};
settings.replayGain.mode = replayGainModeFromString(replayGain.get("mode").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultMode); settings.replayGain.mode = replayGainModeFromString(replayGain.get("mode").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultMode);
settings.replayGain.preAmpGain = replayGainPreAmpGainFromString(replayGain.get("preAmpGain").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain); settings.replayGain.preAmpGain = replayGainPreAmpGainFromString(replayGain.get("preAmpGain").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain);
settings.replayGain.preAmpGainIfNoInfo = replayGainPreAmpGainFromString(replayGain.get("preAmpGainIfNoInfo").toString().orIfNull("")).value_or(Settings::ReplayGain::defaultPreAmpGain);
} }
} }
+3 -2
View File
@@ -73,8 +73,9 @@ class MediaPlayer : public Wt::WTemplate
static inline constexpr Gain minPreAmpGain {-15}; static inline constexpr Gain minPreAmpGain {-15};
static inline constexpr Gain maxPreAmpGain {15}; static inline constexpr Gain maxPreAmpGain {15};
Mode mode; Mode mode {defaultMode};
Gain preAmpGain; Gain preAmpGain {defaultPreAmpGain};
Gain preAmpGainIfNoInfo {defaultPreAmpGain};
}; };
Transcode transcode; Transcode transcode;
+6 -2
View File
@@ -453,7 +453,7 @@ PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track)
switch (settings->replayGain.mode) switch (settings->replayGain.mode)
{ {
case MediaPlayer::Settings::ReplayGain::Mode::None: case MediaPlayer::Settings::ReplayGain::Mode::None:
break; return std::nullopt;
case MediaPlayer::Settings::ReplayGain::Mode::Track: case MediaPlayer::Settings::ReplayGain::Mode::Track:
gain = track->getTrackReplayGain(); gain = track->getTrackReplayGain();
@@ -461,6 +461,8 @@ PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track)
case MediaPlayer::Settings::ReplayGain::Mode::Release: case MediaPlayer::Settings::ReplayGain::Mode::Release:
gain = track->getReleaseReplayGain(); gain = track->getReleaseReplayGain();
if (!gain)
gain = track->getTrackReplayGain();
break; break;
case MediaPlayer::Settings::ReplayGain::Mode::Auto: case MediaPlayer::Settings::ReplayGain::Mode::Auto:
@@ -476,6 +478,8 @@ PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track)
(nextTrack && nextTrack->getRelease() && nextTrack->getRelease() == track->getRelease())) (nextTrack && nextTrack->getRelease() && nextTrack->getRelease() == track->getRelease()))
{ {
gain = track->getReleaseReplayGain(); gain = track->getReleaseReplayGain();
if (!gain)
gain = track->getTrackReplayGain();
} }
else else
{ {
@@ -488,7 +492,7 @@ PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track)
if (gain) if (gain)
return *gain + settings->replayGain.preAmpGain; return *gain + settings->replayGain.preAmpGain;
return std::nullopt; return settings->replayGain.preAmpGainIfNoInfo;
} }
} // namespace UserInterface } // namespace UserInterface
+20 -2
View File
@@ -55,6 +55,7 @@ class SettingsModel : public Wt::WFormModel
static inline const Field TranscodeBitrateField {"transcode-bitrate"}; static inline const Field TranscodeBitrateField {"transcode-bitrate"};
static inline const Field ReplayGainModeField {"replaygain-mode"}; static inline const Field ReplayGainModeField {"replaygain-mode"};
static inline const Field ReplayGainPreAmpGainField {"replaygain-preamp"}; static inline const Field ReplayGainPreAmpGainField {"replaygain-preamp"};
static inline const Field ReplayGainPreAmpGainIfNoInfoField {"replaygain-preamp-no-rg-info"};
static inline const Field SubsonicArtistListModeField {"subsonic-artist-list-mode"}; static inline const Field SubsonicArtistListModeField {"subsonic-artist-list-mode"};
static inline const Field SubsonicTranscodeEnableField {"subsonic-transcode-enable"}; static inline const Field SubsonicTranscodeEnableField {"subsonic-transcode-enable"};
static inline const Field SubsonicTranscodeFormatField {"subsonic-transcode-format"}; static inline const Field SubsonicTranscodeFormatField {"subsonic-transcode-format"};
@@ -77,6 +78,7 @@ class SettingsModel : public Wt::WFormModel
addField(TranscodeFormatField); addField(TranscodeFormatField);
addField(ReplayGainModeField); addField(ReplayGainModeField);
addField(ReplayGainPreAmpGainField); addField(ReplayGainPreAmpGainField);
addField(ReplayGainPreAmpGainIfNoInfoField);
addField(SubsonicTranscodeEnableField); addField(SubsonicTranscodeEnableField);
addField(SubsonicTranscodeBitrateField); addField(SubsonicTranscodeBitrateField);
addField(SubsonicTranscodeFormatField); addField(SubsonicTranscodeFormatField);
@@ -91,11 +93,16 @@ class SettingsModel : public Wt::WFormModel
setValidator(TranscodeBitrateField, createMandatoryValidator()); setValidator(TranscodeBitrateField, createMandatoryValidator());
setValidator(TranscodeFormatField, createMandatoryValidator()); setValidator(TranscodeFormatField, createMandatoryValidator());
setValidator(ReplayGainModeField, createMandatoryValidator()); setValidator(ReplayGainModeField, createMandatoryValidator());
auto createPreAmpValidator = []
{ {
auto preampGainValidator {std::make_unique<Wt::WDoubleValidator>()}; auto preampGainValidator {std::make_unique<Wt::WDoubleValidator>()};
preampGainValidator->setRange(MediaPlayer::Settings::ReplayGain::minPreAmpGain, MediaPlayer::Settings::ReplayGain::maxPreAmpGain); preampGainValidator->setRange(MediaPlayer::Settings::ReplayGain::minPreAmpGain, MediaPlayer::Settings::ReplayGain::maxPreAmpGain);
setValidator(ReplayGainPreAmpGainField, std::move(preampGainValidator)); return preampGainValidator;
} };
setValidator(ReplayGainPreAmpGainField, createPreAmpValidator());
setValidator(ReplayGainPreAmpGainIfNoInfoField, createPreAmpValidator());
setValidator(SubsonicTranscodeBitrateField, createMandatoryValidator()); setValidator(SubsonicTranscodeBitrateField, createMandatoryValidator());
setValidator(SubsonicTranscodeFormatField, createMandatoryValidator()); setValidator(SubsonicTranscodeFormatField, createMandatoryValidator());
@@ -147,6 +154,7 @@ class SettingsModel : public Wt::WFormModel
settings.replayGain.mode = _replayGainModeModel->getValue(*replayGainModeRow); settings.replayGain.mode = _replayGainModeModel->getValue(*replayGainModeRow);
settings.replayGain.preAmpGain = Wt::asNumber(value(ReplayGainPreAmpGainField)); settings.replayGain.preAmpGain = Wt::asNumber(value(ReplayGainPreAmpGainField));
settings.replayGain.preAmpGainIfNoInfo = Wt::asNumber(value(ReplayGainPreAmpGainIfNoInfoField));
LmsApp->getMediaPlayer()->setSettings(settings); LmsApp->getMediaPlayer()->setSettings(settings);
} }
@@ -202,6 +210,7 @@ class SettingsModel : public Wt::WFormModel
setValue(ReplayGainModeField, _replayGainModeModel->getString(*replayGainModeRow)); setValue(ReplayGainModeField, _replayGainModeModel->getString(*replayGainModeRow));
setValue(ReplayGainPreAmpGainField, settings.replayGain.preAmpGain); setValue(ReplayGainPreAmpGainField, settings.replayGain.preAmpGain);
setValue(ReplayGainPreAmpGainIfNoInfoField, settings.replayGain.preAmpGainIfNoInfo);
} }
setValue(SubsonicTranscodeEnableField, LmsApp->getUser()->getSubsonicTranscodeEnable()); setValue(SubsonicTranscodeEnableField, LmsApp->getUser()->getSubsonicTranscodeEnable());
@@ -434,15 +443,24 @@ SettingsView::refreshView()
replayGainPreampGain->setRange(MediaPlayer::Settings::ReplayGain::minPreAmpGain, MediaPlayer::Settings::ReplayGain::maxPreAmpGain); replayGainPreampGain->setRange(MediaPlayer::Settings::ReplayGain::minPreAmpGain, MediaPlayer::Settings::ReplayGain::maxPreAmpGain);
t->setFormWidget(SettingsModel::ReplayGainPreAmpGainField, std::move(replayGainPreampGain)); t->setFormWidget(SettingsModel::ReplayGainPreAmpGainField, std::move(replayGainPreampGain));
// Replay gain preampGain if no info
auto replayGainPreampGainIfNoInfo {std::make_unique<Wt::WDoubleSpinBox>()};
replayGainPreampGainIfNoInfo->setRange(MediaPlayer::Settings::ReplayGain::minPreAmpGain, MediaPlayer::Settings::ReplayGain::maxPreAmpGain);
t->setFormWidget(SettingsModel::ReplayGainPreAmpGainIfNoInfoField, std::move(replayGainPreampGainIfNoInfo));
replayGainModeRaw->activated().connect([=](int row) replayGainModeRaw->activated().connect([=](int row)
{ {
const bool enable {model->getReplayGainModeModel()->getValue(row) != MediaPlayer::Settings::ReplayGain::Mode::None}; const bool enable {model->getReplayGainModeModel()->getValue(row) != MediaPlayer::Settings::ReplayGain::Mode::None};
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainField, !enable); model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainField, !enable);
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainIfNoInfoField, !enable);
t->updateModel(model.get()); t->updateModel(model.get());
t->updateView(model.get()); t->updateView(model.get());
}); });
if (LmsApp->getMediaPlayer()->getSettings()->replayGain.mode == MediaPlayer::Settings::ReplayGain::Mode::None) if (LmsApp->getMediaPlayer()->getSettings()->replayGain.mode == MediaPlayer::Settings::ReplayGain::Mode::None)
{
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainField, true); model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainField, true);
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainIfNoInfoField, true);
}
} }
// Subsonic // Subsonic