Actually implementing the auto replay gain mode

This commit is contained in:
emeric
2020-04-26 14:31:26 +02:00
parent e60effb168
commit dab89554b4
2 changed files with 34 additions and 9 deletions
+32 -7
View File
@@ -182,7 +182,7 @@ PlayQueue::updateRadioBtn()
}
Database::TrackList::pointer
PlayQueue::getTrackList()
PlayQueue::getTrackList() const
{
return Database::TrackList::getById(LmsApp->getDbSession(), _tracklistId);
}
@@ -242,7 +242,7 @@ PlayQueue::loadTrack(std::size_t pos, bool play)
trackId = track.id();
replayGain = getReplayGain(track);
replayGain = getReplayGain(pos, track);
if (!LmsApp->getUser()->isDemo())
LmsApp->getUser().modify()->setCurPlayingTrackPos(pos);
@@ -442,27 +442,52 @@ PlayQueue::enqueueRadioTrack()
}
std::optional<float>
PlayQueue::getReplayGain(const Database::Track::pointer& track) const
PlayQueue::getReplayGain(std::size_t pos, const Database::Track::pointer& track) const
{
const auto& settings {LmsApp->getMediaPlayer()->getSettings()};
if (!settings)
return std::nullopt;
std::optional<MediaPlayer::Gain> gain;
switch (settings->replayGain.mode)
{
case MediaPlayer::Settings::ReplayGain::Mode::None:
return std::nullopt;
break;
case MediaPlayer::Settings::ReplayGain::Mode::Track:
return track->getTrackReplayGain();
gain = track->getTrackReplayGain();
break;
case MediaPlayer::Settings::ReplayGain::Mode::Release:
return track->getReleaseReplayGain();
gain = track->getReleaseReplayGain();
break;
case MediaPlayer::Settings::ReplayGain::Mode::Auto:
return track->getTrackReplayGain();
{
const auto trackList {getTrackList()};
const auto prevEntry {pos > 0 ? trackList->getEntry(pos - 1) : Database::TrackListEntry::pointer {}};
const auto nextEntry {trackList->getEntry(pos + 1)};
const Database::Track::pointer prevTrack {prevEntry ? prevEntry->getTrack() : Database::Track::pointer {}};
const Database::Track::pointer nextTrack {nextEntry ? nextEntry->getTrack() : Database::Track::pointer {}};
if ((prevTrack && prevTrack->getRelease() && prevTrack->getRelease() == track->getRelease())
||
(nextTrack && nextTrack->getRelease() && nextTrack->getRelease() == track->getRelease()))
{
gain = track->getReleaseReplayGain();
}
else
{
gain = track->getTrackReplayGain();
}
break;
}
}
if (gain)
return *gain + settings->replayGain.preAmpGain;
return std::nullopt;
}
+2 -2
View File
@@ -60,7 +60,7 @@ class PlayQueue : public Wt::WTemplate
Wt::Signal<> trackUnselected;
private:
Wt::Dbo::ptr<Database::TrackList> getTrackList();
Wt::Dbo::ptr<Database::TrackList> getTrackList() const;
void clearTracks();
void enqueueTracks(const std::vector<Database::IdType>& trackIds);
@@ -77,7 +77,7 @@ class PlayQueue : public Wt::WTemplate
void addRadioTrackFromSimilarity(std::shared_ptr<Similarity::Finder> similarityFinder);
void addRadioTrackFromClusters();
std::optional<float> getReplayGain(const Wt::Dbo::ptr<Database::Track>& track) const;
std::optional<float> getReplayGain(std::size_t pos, const Wt::Dbo::ptr<Database::Track>& track) const;
bool _repeatAll {};
bool _radioMode {};