diff --git a/player/player.go b/player/player.go index e9ad599..62f7091 100644 --- a/player/player.go +++ b/player/player.go @@ -58,12 +58,13 @@ type ReplayGainOptions struct { // Fallback gain intentionally omitted } -// The playback loop mode (LoopNone, LoopAll). +// The playback loop mode (LoopNone, LoopAll, LoopOne). type LoopMode int const ( LoopNone LoopMode = iota LoopAll + LoopOne ) // Information about a specific audio device. @@ -420,10 +421,23 @@ func (p *Player) SetLoopMode(mode LoopMode) error { if err := p.mpv.SetOptionString("loop-playlist", "no"); err != nil { return err } + if err := p.mpv.SetOptionString("loop-file", "no"); err != nil { + return err + } case LoopAll: if err := p.mpv.SetOptionString("loop-playlist", "inf"); err != nil { return err } + if err := p.mpv.SetOptionString("loop-file", "no"); err != nil { + return err + } + case LoopOne: + if err := p.mpv.SetOptionString("loop-playlist", "no"); err != nil { + return err + } + if err := p.mpv.SetOptionString("loop-file", "inf"); err != nil { + return err + } } p.loopMode = mode @@ -437,6 +451,8 @@ func (p *Player) SetNextLoopMode() error { case LoopNone: return p.SetLoopMode(LoopAll) case LoopAll: + return p.SetLoopMode(LoopOne) + case LoopOne: return p.SetLoopMode(LoopNone) default: return nil @@ -650,6 +666,8 @@ func (l LoopMode) String() string { return "no" case LoopAll: return "all" + case LoopOne: + return "one" } return "UNKNOWN_LOOP_MODE" } diff --git a/ui/widgets/auxcontrols.go b/ui/widgets/auxcontrols.go index b110a66..85eacc9 100644 --- a/ui/widgets/auxcontrols.go +++ b/ui/widgets/auxcontrols.go @@ -68,8 +68,13 @@ func (a *AuxControls) OnChangeLoopMode(f func()) { func (a *AuxControls) SetLoopMode(mode string) { if mode == "all" { a.loop.Importance = widget.HighImportance + a.loop.Icon = theme.MediaReplayIcon() + } else if mode == "one" { + a.loop.Importance = widget.HighImportance + a.loop.Icon = theme.MediaReplayIcon() // TODO: This icon must be changed to the "Repeat" one with a 1. } else { a.loop.Importance = widget.MediumImportance + a.loop.Icon = theme.MediaReplayIcon() } a.loop.Refresh() }