diff --git a/src/lms/ui/PlayQueueView.cpp b/src/lms/ui/PlayQueueView.cpp index 29b1c37f..222d5299 100644 --- a/src/lms/ui/PlayQueueView.cpp +++ b/src/lms/ui/PlayQueueView.cpp @@ -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 -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 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; } diff --git a/src/lms/ui/PlayQueueView.hpp b/src/lms/ui/PlayQueueView.hpp index 5bb8c605..4e92c2fe 100644 --- a/src/lms/ui/PlayQueueView.hpp +++ b/src/lms/ui/PlayQueueView.hpp @@ -60,7 +60,7 @@ class PlayQueue : public Wt::WTemplate Wt::Signal<> trackUnselected; private: - Wt::Dbo::ptr getTrackList(); + Wt::Dbo::ptr getTrackList() const; void clearTracks(); void enqueueTracks(const std::vector& trackIds); @@ -77,7 +77,7 @@ class PlayQueue : public Wt::WTemplate void addRadioTrackFromSimilarity(std::shared_ptr similarityFinder); void addRadioTrackFromClusters(); - std::optional getReplayGain(const Wt::Dbo::ptr& track) const; + std::optional getReplayGain(std::size_t pos, const Wt::Dbo::ptr& track) const; bool _repeatAll {}; bool _radioMode {};