Fix #157: Add "Auto" ReplayGain mode to auto-choose between Track and Album
This commit is contained in:
+6
-2
@@ -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,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user