move LoopMode

This commit is contained in:
Drew Weymouth
2023-12-22 16:01:56 -08:00
parent d9eca8d807
commit de6ba5c120
4 changed files with 41 additions and 66 deletions
+9 -7
View File
@@ -208,11 +208,11 @@ func (m *MPRISHandler) PlaybackStatus() (types.PlaybackStatus, error) {
func (m *MPRISHandler) LoopStatus() (types.LoopStatus, error) { func (m *MPRISHandler) LoopStatus() (types.LoopStatus, error) {
switch m.pm.GetLoopMode() { switch m.pm.GetLoopMode() {
case player.LoopAll: case LoopAll:
return types.LoopStatusPlaylist, nil return types.LoopStatusPlaylist, nil
case player.LoopOne: case LoopOne:
return types.LoopStatusTrack, nil return types.LoopStatusTrack, nil
case player.LoopNone: case LoopNone:
return types.LoopStatusNone, nil return types.LoopStatusNone, nil
} }
return "", errors.New("unknown loop status") return "", errors.New("unknown loop status")
@@ -221,13 +221,15 @@ func (m *MPRISHandler) LoopStatus() (types.LoopStatus, error) {
func (m *MPRISHandler) SetLoopStatus(status types.LoopStatus) error { func (m *MPRISHandler) SetLoopStatus(status types.LoopStatus) error {
switch status { switch status {
case types.LoopStatusPlaylist: case types.LoopStatusPlaylist:
return m.pm.SetLoopMode(player.LoopAll) m.pm.SetLoopMode(LoopAll)
case types.LoopStatusTrack: case types.LoopStatusTrack:
return m.pm.SetLoopMode(player.LoopOne) m.pm.SetLoopMode(LoopOne)
case types.LoopStatusNone: case types.LoopStatusNone:
return m.pm.SetLoopMode(player.LoopNone) m.pm.SetLoopMode(LoopNone)
default:
return errors.New("unknown loop status")
} }
return errors.New("unknown loop status") return nil
} }
func (m *MPRISHandler) Rate() (float64, error) { func (m *MPRISHandler) Rate() (float64, error) {
+27 -33
View File
@@ -19,9 +19,17 @@ var (
ReplayGainAuto = "Auto" ReplayGainAuto = "Auto"
) )
// A high-level Subsonic-aware playback backend. // The playback loop mode (LoopNone, LoopAll, LoopOne).
// Manages loading tracks into the Player queue, type LoopMode int
// sending callbacks on play time updates and track changes.
const (
LoopNone LoopMode = iota
LoopAll
LoopOne
)
// A high-level MediaProvider-aware playback engine, serves as an
// intermediary between the frontend and various Player backends.
type PlaybackManager struct { type PlaybackManager struct {
ctx context.Context ctx context.Context
cancelPollPos context.CancelFunc cancelPollPos context.CancelFunc
@@ -35,6 +43,7 @@ type PlaybackManager struct {
playQueue []*mediaprovider.Track playQueue []*mediaprovider.Track
nowPlayingIdx int nowPlayingIdx int
loopMode LoopMode
// to pass to onSongChange listeners; clear once listeners have been called // to pass to onSongChange listeners; clear once listeners have been called
lastScrobbled *mediaprovider.Track lastScrobbled *mediaprovider.Track
@@ -45,7 +54,7 @@ type PlaybackManager struct {
// registered callbacks // registered callbacks
onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track) onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track)
onPlayTimeUpdate []func(float64, float64) onPlayTimeUpdate []func(float64, float64)
onLoopModeChange []func(player.LoopMode) onLoopModeChange []func(LoopMode)
onVolumeChange []func(int) onVolumeChange []func(int)
onSeek []func() onSeek []func()
onPaused []func() onPaused []func()
@@ -157,7 +166,7 @@ func (p *PlaybackManager) OnPlayTimeUpdate(cb func(float64, float64)) {
} }
// Registers a callback that is notified whenever the loop mode changes. // Registers a callback that is notified whenever the loop mode changes.
func (p *PlaybackManager) OnLoopModeChange(cb func(player.LoopMode)) { func (p *PlaybackManager) OnLoopModeChange(cb func(LoopMode)) {
p.onLoopModeChange = append(p.onLoopModeChange, cb) p.onLoopModeChange = append(p.onLoopModeChange, cb)
} }
@@ -406,44 +415,29 @@ func (p *PlaybackManager) SetReplayGainMode(mode player.ReplayGainMode) {
// 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() {
var err error switch p.loopMode {
switch p.GetLoopMode() { case LoopNone:
case player.LoopNone: p.SetLoopMode(LoopAll)
err = p.SetLoopMode(player.LoopAll) case LoopAll:
case player.LoopAll: p.SetLoopMode(LoopOne)
err = p.SetLoopMode(player.LoopOne) case LoopOne:
case player.LoopOne: p.SetLoopMode(LoopNone)
err = p.SetLoopMode(player.LoopNone)
default:
return nil
}
if err != nil {
return err
} }
//for _, cb := range p.onLoopModeChange {
// cb(p.player.GetLoopMode())
//}
return nil
} }
func (p *PlaybackManager) SetLoopMode(loopMode player.LoopMode) error { func (p *PlaybackManager) SetLoopMode(loopMode LoopMode) {
//if err := p.player.SetLoopMode(player.LoopMode(loopMode)); err != nil { p.loopMode = loopMode
// return err // TODO: update next track if needed
//}
for _, cb := range p.onLoopModeChange { for _, cb := range p.onLoopModeChange {
cb(loopMode) cb(loopMode)
} }
return nil
} }
func (p *PlaybackManager) GetLoopMode() player.LoopMode { func (p *PlaybackManager) GetLoopMode() LoopMode {
return 0 return p.loopMode
//return p.player.GetLoopMode()
} }
func (p *PlaybackManager) PlayerStatus() player.Status { func (p *PlaybackManager) PlayerStatus() player.Status {
-21
View File
@@ -57,15 +57,6 @@ type Status struct {
PlaylistPos int PlaylistPos int
} }
// The playback loop mode (LoopNone, LoopAll, LoopOne).
type LoopMode int
const (
LoopNone LoopMode = iota
LoopAll
LoopOne
)
type ReplayGainMode int type ReplayGainMode int
const ( const (
@@ -92,15 +83,3 @@ func (r ReplayGainMode) String() string {
return "no" return "no"
} }
} }
func (l LoopMode) String() string {
switch l {
case LoopNone:
return "no"
case LoopAll:
return "all"
case LoopOne:
return "one"
}
return "UNKNOWN_LOOP_MODE"
}
+5 -5
View File
@@ -7,7 +7,7 @@ import (
"fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/dweymouth/supersonic/player" "github.com/dweymouth/supersonic/backend"
myTheme "github.com/dweymouth/supersonic/ui/theme" myTheme "github.com/dweymouth/supersonic/ui/theme"
"github.com/dweymouth/supersonic/ui/util" "github.com/dweymouth/supersonic/ui/util"
) )
@@ -67,15 +67,15 @@ func (a *AuxControls) OnChangeLoopMode(f func()) {
a.loop.OnTapped = f a.loop.OnTapped = f
} }
func (a *AuxControls) SetLoopMode(mode player.LoopMode) { func (a *AuxControls) SetLoopMode(mode backend.LoopMode) {
switch mode { switch mode {
case player.LoopAll: case backend.LoopAll:
a.loop.Importance = widget.HighImportance a.loop.Importance = widget.HighImportance
a.loop.Icon = myTheme.RepeatIcon a.loop.Icon = myTheme.RepeatIcon
case player.LoopOne: case backend.LoopOne:
a.loop.Importance = widget.HighImportance a.loop.Importance = widget.HighImportance
a.loop.Icon = myTheme.RepeatOneIcon a.loop.Icon = myTheme.RepeatOneIcon
case player.LoopNone: case backend.LoopNone:
a.loop.Importance = widget.MediumImportance a.loop.Importance = widget.MediumImportance
a.loop.Icon = myTheme.RepeatIcon a.loop.Icon = myTheme.RepeatIcon
} }