Fix #157: Add "Auto" ReplayGain mode to auto-choose between Track and Album

This commit is contained in:
Drew Weymouth
2023-11-15 08:14:31 -08:00
parent 5af55ac2dc
commit 87fc88e308
5 changed files with 60 additions and 5 deletions
+6 -2
View File
@@ -230,12 +230,16 @@ func (a *App) setupMPV() error {
} }
a.Player.SetAudioDevice(desiredDevice) a.Player.SetAudioDevice(desiredDevice)
rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack} rgainOpts := []string{ReplayGainNone, ReplayGainAlbum, ReplayGainTrack, ReplayGainAuto}
if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) { if !sharedutil.SliceContains(rgainOpts, a.Config.ReplayGain.Mode) {
a.Config.ReplayGain.Mode = ReplayGainNone 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{ a.Player.SetReplayGainOptions(player.ReplayGainOptions{
Mode: player.ReplayGainMode(a.Config.ReplayGain.Mode), Mode: mode,
PreventClipping: a.Config.ReplayGain.PreventClipping, PreventClipping: a.Config.ReplayGain.PreventClipping,
PreampGain: a.Config.ReplayGain.PreampGainDB, PreampGain: a.Config.ReplayGain.PreampGainDB,
}) })
+31 -1
View File
@@ -15,6 +15,7 @@ const (
ReplayGainNone = string(player.ReplayGainNone) ReplayGainNone = string(player.ReplayGainNone)
ReplayGainAlbum = string(player.ReplayGainAlbum) ReplayGainAlbum = string(player.ReplayGainAlbum)
ReplayGainTrack = string(player.ReplayGainTrack) ReplayGainTrack = string(player.ReplayGainTrack)
ReplayGainAuto = "Auto"
) )
type LoopMode int type LoopMode int
@@ -47,6 +48,7 @@ type PlaybackManager struct {
lastScrobbled *mediaprovider.Track lastScrobbled *mediaprovider.Track
scrobbleCfg *ScrobbleConfig scrobbleCfg *ScrobbleConfig
transcodeCfg *TranscodingConfig transcodeCfg *TranscodingConfig
replayGainCfg ReplayGainConfig
onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track) onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track)
onPlayTimeUpdate []func(float64, float64) 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 { if err := p.LoadAlbum(albumID, false, shuffle); err != nil {
return err return err
} }
if p.replayGainCfg.Mode == ReplayGainAuto {
p.SetReplayGainMode(player.ReplayGainAlbum)
}
if firstTrack <= 0 { if firstTrack <= 0 {
return p.player.PlayFromBeginning() 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 { if err := p.LoadPlaylist(playlistID, false, shuffle); err != nil {
return err return err
} }
if p.replayGainCfg.Mode == ReplayGainAuto {
p.SetReplayGainMode(player.ReplayGainTrack)
}
if firstTrack <= 0 { if firstTrack <= 0 {
return p.player.PlayFromBeginning() return p.player.PlayFromBeginning()
} }
@@ -221,6 +229,9 @@ func (p *PlaybackManager) PlayTrack(trackID string) error {
return err return err
} }
p.LoadTracks([]*mediaprovider.Track{tr}, false, false) p.LoadTracks([]*mediaprovider.Track{tr}, false, false)
if p.replayGainCfg.Mode == ReplayGainAuto {
p.SetReplayGainMode(player.ReplayGainTrack)
}
return p.PlayFromBeginning() return p.PlayFromBeginning()
} }
@@ -237,6 +248,9 @@ func (p *PlaybackManager) PlayRandomSongs(genreName string) {
log.Printf("error getting random songs: %s", err.Error()) log.Printf("error getting random songs: %s", err.Error())
} else { } else {
p.LoadTracks(songs, false, false) p.LoadTracks(songs, false, false)
if p.replayGainCfg.Mode == ReplayGainAuto {
p.SetReplayGainMode(player.ReplayGainTrack)
}
p.PlayFromBeginning() p.PlayFromBeginning()
} }
} }
@@ -246,6 +260,9 @@ func (p *PlaybackManager) PlaySimilarSongs(id string) {
log.Printf("error getting similar songs: %s", err.Error()) log.Printf("error getting similar songs: %s", err.Error())
} else { } else {
p.LoadTracks(songs, false, false) p.LoadTracks(songs, false, false)
if p.replayGainCfg.Mode == ReplayGainAuto {
p.SetReplayGainMode(player.ReplayGainTrack)
}
p.PlayFromBeginning() p.PlayFromBeginning()
} }
} }
@@ -317,13 +334,26 @@ func (p *PlaybackManager) StopAndClearPlayQueue() {
} }
func (p *PlaybackManager) SetReplayGainOptions(config ReplayGainConfig) { 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{ p.player.SetReplayGainOptions(player.ReplayGainOptions{
Mode: player.ReplayGainMode(config.Mode), Mode: mode,
PreventClipping: config.PreventClipping, PreventClipping: config.PreventClipping,
PreampGain: config.PreampGainDB, 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. // 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. // Useful for toggling UI elements, to change modes without knowing the current player mode.
func (p *PlaybackManager) SetNextLoopMode() error { func (p *PlaybackManager) SetNextLoopMode() error {
+1 -1
View File
@@ -98,7 +98,7 @@ func newAlbumPage(
a.tracklist.OnVisibleColumnsChanged = func(cols []string) { a.tracklist.OnVisibleColumnsChanged = func(cols []string) {
a.cfg.TracklistColumns = cols a.cfg.TracklistColumns = cols
} }
a.contr.ConnectTracklistActions(a.tracklist) a.contr.ConnectTracklistActionsWithReplayGainAlbum(a.tracklist)
a.container = container.NewBorder( a.container = container.NewBorder(
container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 15, PadBottom: 10}, a.header), container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 15, PadBottom: 10}, a.header),
+17
View File
@@ -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) { 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.OnAddToPlaylist = m.DoAddTracksToPlaylistWorkflow
tracklist.OnAddToQueue = func(tracks []*mediaprovider.Track) { tracklist.OnAddToQueue = func(tracks []*mediaprovider.Track) {
m.App.PlaybackManager.LoadTracks(tracks, true, false) m.App.PlaybackManager.LoadTracks(tracks, true, false)
} }
tracklist.OnPlayTrackAt = func(idx int) { tracklist.OnPlayTrackAt = func(idx int) {
m.App.PlaybackManager.LoadTracks(tracklist.GetTracks(), false, false) 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) m.App.PlaybackManager.PlayTrackAt(idx)
} }
tracklist.OnPlaySelection = func(tracks []*mediaprovider.Track, shuffle bool) { tracklist.OnPlaySelection = func(tracks []*mediaprovider.Track, shuffle bool) {
m.App.PlaybackManager.LoadTracks(tracks, false, shuffle) m.App.PlaybackManager.LoadTracks(tracks, false, shuffle)
if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto {
m.App.PlaybackManager.SetReplayGainMode(mode)
}
m.App.PlaybackManager.PlayFromBeginning() m.App.PlaybackManager.PlayFromBeginning()
} }
tracklist.OnSetFavorite = m.SetTrackFavorites tracklist.OnSetFavorite = m.SetTrackFavorites
@@ -208,6 +222,9 @@ func (m *Controller) GetArtistTracks(artistID string) []*mediaprovider.Track {
func (m *Controller) PlayArtistDiscography(artistID string, shuffle bool) { func (m *Controller) PlayArtistDiscography(artistID string, shuffle bool) {
m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), false, shuffle) 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() m.App.PlaybackManager.PlayFromBeginning()
} }
+5 -1
View File
@@ -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) { replayGainSelect.OnChanged = func(_ string) {
switch replayGainSelect.SelectedIndex() { switch replayGainSelect.SelectedIndex() {
case 0: case 0:
@@ -280,6 +280,8 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem {
s.config.ReplayGain.Mode = backend.ReplayGainAlbum s.config.ReplayGain.Mode = backend.ReplayGainAlbum
case 2: case 2:
s.config.ReplayGain.Mode = backend.ReplayGainTrack s.config.ReplayGain.Mode = backend.ReplayGainTrack
case 3:
s.config.ReplayGain.Mode = backend.ReplayGainAuto
} }
s.onReplayGainSettingsChanged() s.onReplayGainSettingsChanged()
} }
@@ -290,6 +292,8 @@ func (s *SettingsDialog) createPlaybackTab() *container.TabItem {
replayGainSelect.SetSelectedIndex(1) replayGainSelect.SetSelectedIndex(1)
case backend.ReplayGainTrack: case backend.ReplayGainTrack:
replayGainSelect.SetSelectedIndex(2) replayGainSelect.SetSelectedIndex(2)
case backend.ReplayGainAuto:
replayGainSelect.SetSelectedIndex(3)
default: default:
replayGainSelect.SetSelectedIndex(0) replayGainSelect.SetSelectedIndex(0)
} }