From 87fc88e308e2613fffb7e6283cd69f006af75989 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 15 Nov 2023 08:14:31 -0800 Subject: [PATCH] Fix #157: Add "Auto" ReplayGain mode to auto-choose between Track and Album --- backend/app.go | 8 ++++++-- backend/playbackmanager.go | 32 +++++++++++++++++++++++++++++++- ui/browsing/albumpage.go | 2 +- ui/controller/controller.go | 17 +++++++++++++++++ ui/dialogs/settingsdialog.go | 6 +++++- 5 files changed, 60 insertions(+), 5 deletions(-) diff --git a/backend/app.go b/backend/app.go index 384a2da..ebc3450 100644 --- a/backend/app.go +++ b/backend/app.go @@ -230,12 +230,16 @@ func (a *App) setupMPV() error { } a.Player.SetAudioDevice(desiredDevice) - rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack} + rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack, ReplayGainAuto} if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) { a.Config.ReplayGain.Mode = ReplayGainNone } + mode := player.ReplayGainMode(a.Config.ReplayGain.Mode) + if a.Config.ReplayGain.Mode == ReplayGainAuto { + mode = player.ReplayGainTrack + } a.Player.SetReplayGainOptions(player.ReplayGainOptions{ - Mode: player.ReplayGainMode(a.Config.ReplayGain.Mode), + Mode: mode, PreventClipping: a.Config.ReplayGain.PreventClipping, PreampGain: a.Config.ReplayGain.PreampGainDB, }) diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index a984f68..b3af65d 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -15,6 +15,7 @@ const ( ReplayGainNone = string(player.ReplayGainNone) ReplayGainAlbum = string(player.ReplayGainAlbum) ReplayGainTrack = string(player.ReplayGainTrack) + ReplayGainAuto = "Auto" ) type LoopMode int @@ -47,6 +48,7 @@ type PlaybackManager struct { lastScrobbled *mediaprovider.Track scrobbleCfg *ScrobbleConfig transcodeCfg *TranscodingConfig + replayGainCfg ReplayGainConfig onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track) onPlayTimeUpdate []func(float64, float64) @@ -199,6 +201,9 @@ func (p *PlaybackManager) PlayAlbum(albumID string, firstTrack int, shuffle bool if err := p.LoadAlbum(albumID, false, shuffle); err != nil { return err } + if p.replayGainCfg.Mode == ReplayGainAuto { + p.SetReplayGainMode(player.ReplayGainAlbum) + } if firstTrack <= 0 { return p.player.PlayFromBeginning() } @@ -209,6 +214,9 @@ func (p *PlaybackManager) PlayPlaylist(playlistID string, firstTrack int, shuffl if err := p.LoadPlaylist(playlistID, false, shuffle); err != nil { return err } + if p.replayGainCfg.Mode == ReplayGainAuto { + p.SetReplayGainMode(player.ReplayGainTrack) + } if firstTrack <= 0 { return p.player.PlayFromBeginning() } @@ -221,6 +229,9 @@ func (p *PlaybackManager) PlayTrack(trackID string) error { return err } p.LoadTracks([]*mediaprovider.Track{tr}, false, false) + if p.replayGainCfg.Mode == ReplayGainAuto { + p.SetReplayGainMode(player.ReplayGainTrack) + } return p.PlayFromBeginning() } @@ -237,6 +248,9 @@ func (p *PlaybackManager) PlayRandomSongs(genreName string) { log.Printf("error getting random songs: %s", err.Error()) } else { p.LoadTracks(songs, false, false) + if p.replayGainCfg.Mode == ReplayGainAuto { + p.SetReplayGainMode(player.ReplayGainTrack) + } p.PlayFromBeginning() } } @@ -246,6 +260,9 @@ func (p *PlaybackManager) PlaySimilarSongs(id string) { log.Printf("error getting similar songs: %s", err.Error()) } else { p.LoadTracks(songs, false, false) + if p.replayGainCfg.Mode == ReplayGainAuto { + p.SetReplayGainMode(player.ReplayGainTrack) + } p.PlayFromBeginning() } } @@ -317,13 +334,26 @@ func (p *PlaybackManager) StopAndClearPlayQueue() { } func (p *PlaybackManager) SetReplayGainOptions(config ReplayGainConfig) { + p.replayGainCfg = config + mode := player.ReplayGainMode(config.Mode) + if config.Mode == ReplayGainAuto { + mode = player.ReplayGainTrack + } p.player.SetReplayGainOptions(player.ReplayGainOptions{ - Mode: player.ReplayGainMode(config.Mode), + Mode: mode, PreventClipping: config.PreventClipping, PreampGain: config.PreampGainDB, }) } +func (p *PlaybackManager) SetReplayGainMode(mode player.ReplayGainMode) { + p.player.SetReplayGainOptions(player.ReplayGainOptions{ + PreventClipping: p.replayGainCfg.PreventClipping, + PreampGain: p.replayGainCfg.PreampGainDB, + Mode: mode, + }) +} + // Changes the loop mode of the player to the next one. // Useful for toggling UI elements, to change modes without knowing the current player mode. func (p *PlaybackManager) SetNextLoopMode() error { diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index 883aab8..f27e1a3 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -98,7 +98,7 @@ func newAlbumPage( a.tracklist.OnVisibleColumnsChanged = func(cols []string) { a.cfg.TracklistColumns = cols } - a.contr.ConnectTracklistActions(a.tracklist) + a.contr.ConnectTracklistActionsWithReplayGainAlbum(a.tracklist) a.container = container.NewBorder( container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 15, PadBottom: 10}, a.header), diff --git a/ui/controller/controller.go b/ui/controller/controller.go index 31e7684..c2adb4b 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -97,17 +97,31 @@ func (m *Controller) ShowPopUpImage(img image.Image) { )) } +func (m *Controller) ConnectTracklistActionsWithReplayGainAlbum(tracklist *widgets.Tracklist) { + m.connectTracklistActionsWithReplayGainMode(tracklist, player.ReplayGainAlbum) +} + func (m *Controller) ConnectTracklistActions(tracklist *widgets.Tracklist) { + m.connectTracklistActionsWithReplayGainMode(tracklist, player.ReplayGainTrack) +} + +func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widgets.Tracklist, mode player.ReplayGainMode) { tracklist.OnAddToPlaylist = m.DoAddTracksToPlaylistWorkflow tracklist.OnAddToQueue = func(tracks []*mediaprovider.Track) { m.App.PlaybackManager.LoadTracks(tracks, true, false) } tracklist.OnPlayTrackAt = func(idx int) { m.App.PlaybackManager.LoadTracks(tracklist.GetTracks(), false, false) + if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto { + m.App.PlaybackManager.SetReplayGainMode(mode) + } m.App.PlaybackManager.PlayTrackAt(idx) } tracklist.OnPlaySelection = func(tracks []*mediaprovider.Track, shuffle bool) { m.App.PlaybackManager.LoadTracks(tracks, false, shuffle) + if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto { + m.App.PlaybackManager.SetReplayGainMode(mode) + } m.App.PlaybackManager.PlayFromBeginning() } tracklist.OnSetFavorite = m.SetTrackFavorites @@ -208,6 +222,9 @@ func (m *Controller) GetArtistTracks(artistID string) []*mediaprovider.Track { func (m *Controller) PlayArtistDiscography(artistID string, shuffle bool) { m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), false, shuffle) + if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto { + m.App.PlaybackManager.SetReplayGainMode(player.ReplayGainAlbum) + } m.App.PlaybackManager.PlayFromBeginning() } diff --git a/ui/dialogs/settingsdialog.go b/ui/dialogs/settingsdialog.go index 5d3ad7e..ada8961 100644 --- a/ui/dialogs/settingsdialog.go +++ b/ui/dialogs/settingsdialog.go @@ -271,7 +271,7 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem { } } - replayGainSelect := widget.NewSelect([]string{"None", "Album", "Track"}, nil) + replayGainSelect := widget.NewSelect([]string{"None", "Album", "Track", "Auto"}, nil) replayGainSelect.OnChanged = func(_ string) { switch replayGainSelect.SelectedIndex() { case 0: @@ -280,6 +280,8 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem { s.config.ReplayGain.Mode = backend.ReplayGainAlbum case 2: s.config.ReplayGain.Mode = backend.ReplayGainTrack + case 3: + s.config.ReplayGain.Mode = backend.ReplayGainAuto } s.onReplayGainSettingsChanged() } @@ -290,6 +292,8 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem { replayGainSelect.SetSelectedIndex(1) case backend.ReplayGainTrack: replayGainSelect.SetSelectedIndex(2) + case backend.ReplayGainAuto: + replayGainSelect.SetSelectedIndex(3) default: replayGainSelect.SetSelectedIndex(0) }