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
View File
@@ -59,6 +59,7 @@ static std::string settingsToJSString(const MediaPlayer::Settings& settings)
Json::Object replayGain;
replayGain["mode"] = static_cast<int>(settings.replayGain.mode);
replayGain["preAmpGain"] = settings.replayGain.preAmpGain;
replayGain["preAmpGainIfNoInfo"] = settings.replayGain.preAmpGainIfNoInfo;
res["replayGain"] = std::move(replayGain);
}
@@ -180,6 +181,7 @@ static MediaPlayer::Settings settingsfromJSString(const std::string& strSettings
const Json::Object replayGain {replayGainValue};
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.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 maxPreAmpGain {15};
Mode mode;
Gain preAmpGain;
Mode mode {defaultMode};
Gain preAmpGain {defaultPreAmpGain};
Gain preAmpGainIfNoInfo {defaultPreAmpGain};
};
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)
{
case MediaPlayer::Settings::ReplayGain::Mode::None:
break;
return std::nullopt;
case MediaPlayer::Settings::ReplayGain::Mode::Track:
gain = track->getTrackReplayGain();
@@ -461,6 +461,8 @@ PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track)
case MediaPlayer::Settings::ReplayGain::Mode::Release:
gain = track->getReleaseReplayGain();
if (!gain)
gain = track->getTrackReplayGain();
break;
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()))
{
gain = track->getReleaseReplayGain();
if (!gain)
gain = track->getTrackReplayGain();
}
else
{
@@ -488,7 +492,7 @@ PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track)
if (gain)
return *gain + settings->replayGain.preAmpGain;
return std::nullopt;
return settings->replayGain.preAmpGainIfNoInfo;
}
} // 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 ReplayGainModeField {"replaygain-mode"};
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 SubsonicTranscodeEnableField {"subsonic-transcode-enable"};
static inline const Field SubsonicTranscodeFormatField {"subsonic-transcode-format"};
@@ -77,6 +78,7 @@ class SettingsModel : public Wt::WFormModel
addField(TranscodeFormatField);
addField(ReplayGainModeField);
addField(ReplayGainPreAmpGainField);
addField(ReplayGainPreAmpGainIfNoInfoField);
addField(SubsonicTranscodeEnableField);
addField(SubsonicTranscodeBitrateField);
addField(SubsonicTranscodeFormatField);
@@ -91,11 +93,16 @@ class SettingsModel : public Wt::WFormModel
setValidator(TranscodeBitrateField, createMandatoryValidator());
setValidator(TranscodeFormatField, createMandatoryValidator());
setValidator(ReplayGainModeField, createMandatoryValidator());
auto createPreAmpValidator = []
{
auto preampGainValidator {std::make_unique<Wt::WDoubleValidator>()};
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(SubsonicTranscodeFormatField, createMandatoryValidator());
@@ -147,6 +154,7 @@ class SettingsModel : public Wt::WFormModel
settings.replayGain.mode = _replayGainModeModel->getValue(*replayGainModeRow);
settings.replayGain.preAmpGain = Wt::asNumber(value(ReplayGainPreAmpGainField));
settings.replayGain.preAmpGainIfNoInfo = Wt::asNumber(value(ReplayGainPreAmpGainIfNoInfoField));
LmsApp->getMediaPlayer()->setSettings(settings);
}
@@ -202,6 +210,7 @@ class SettingsModel : public Wt::WFormModel
setValue(ReplayGainModeField, _replayGainModeModel->getString(*replayGainModeRow));
setValue(ReplayGainPreAmpGainField, settings.replayGain.preAmpGain);
setValue(ReplayGainPreAmpGainIfNoInfoField, settings.replayGain.preAmpGainIfNoInfo);
}
setValue(SubsonicTranscodeEnableField, LmsApp->getUser()->getSubsonicTranscodeEnable());
@@ -434,15 +443,24 @@ SettingsView::refreshView()
replayGainPreampGain->setRange(MediaPlayer::Settings::ReplayGain::minPreAmpGain, MediaPlayer::Settings::ReplayGain::maxPreAmpGain);
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)
{
const bool enable {model->getReplayGainModeModel()->getValue(row) != MediaPlayer::Settings::ReplayGain::Mode::None};
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainField, !enable);
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainIfNoInfoField, !enable);
t->updateModel(model.get());
t->updateView(model.get());
});
if (LmsApp->getMediaPlayer()->getSettings()->replayGain.mode == MediaPlayer::Settings::ReplayGain::Mode::None)
{
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainField, true);
model->setReadOnly(SettingsModel::SettingsModel::ReplayGainPreAmpGainIfNoInfoField, true);
}
}
// Subsonic