when changing loop mode, only call player.SetNext if needed

This commit is contained in:
Drew Weymouth
2023-12-22 17:22:40 -08:00
parent d089151f85
commit cfb8739a61
2 changed files with 26 additions and 10 deletions
+22 -10
View File
@@ -406,7 +406,7 @@ func (p *PlaybackManager) SetNextLoopMode() {
func (p *PlaybackManager) SetLoopMode(loopMode LoopMode) { func (p *PlaybackManager) SetLoopMode(loopMode LoopMode) {
p.loopMode = loopMode p.loopMode = loopMode
p.setNextTrackBasedOnLoopMode() p.setNextTrackBasedOnLoopMode(true)
for _, cb := range p.onLoopModeChange { for _, cb := range p.onLoopModeChange {
cb(loopMode) cb(loopMode)
@@ -508,7 +508,7 @@ func (p *PlaybackManager) handleOnTrackChange() {
p.sendNowPlayingScrobble() // Must come before invokeOnChangeCallbacks b/c track may immediately be scrobbled p.sendNowPlayingScrobble() // Must come before invokeOnChangeCallbacks b/c track may immediately be scrobbled
p.invokeOnSongChangeCallbacks() p.invokeOnSongChangeCallbacks()
p.doUpdateTimePos() p.doUpdateTimePos()
p.setNextTrackBasedOnLoopMode() p.setNextTrackBasedOnLoopMode(false)
} }
func (p *PlaybackManager) handleOnStopped() { func (p *PlaybackManager) handleOnStopped() {
@@ -521,18 +521,22 @@ func (p *PlaybackManager) handleOnStopped() {
p.nowPlayingIdx = -1 p.nowPlayingIdx = -1
} }
func (p *PlaybackManager) setNextTrackBasedOnLoopMode() { func (p *PlaybackManager) setNextTrackBasedOnLoopMode(onLoopModeChange bool) {
switch p.loopMode { switch p.loopMode {
case LoopNone: case LoopNone:
if p.nowPlayingIdx < len(p.playQueue)-1 { if p.nowPlayingIdx < len(p.playQueue)-1 {
p.setNextTrack(p.nowPlayingIdx + 1) p.setNextTrack(p.nowPlayingIdx + 1)
} else if onLoopModeChange {
// prev was LoopOne - need to erase next track
p.setNextTrack(-1)
} }
case LoopOne: case LoopOne:
p.setNextTrack(p.nowPlayingIdx) p.setNextTrack(p.nowPlayingIdx)
case LoopAll: case LoopAll:
if p.nowPlayingIdx >= len(p.playQueue)-1 { if p.nowPlayingIdx >= len(p.playQueue)-1 {
p.setNextTrack(0) p.setNextTrack(0)
} else { } else if !onLoopModeChange {
// if onloopmodechange, prev mode was LoopNone and next track is already set
p.setNextTrack(p.nowPlayingIdx + 1) p.setNextTrack(p.nowPlayingIdx + 1)
} }
} }
@@ -540,19 +544,27 @@ func (p *PlaybackManager) setNextTrackBasedOnLoopMode() {
func (p *PlaybackManager) setTrack(idx int, next bool) error { func (p *PlaybackManager) setTrack(idx int, next bool) error {
if urlP, ok := p.player.(player.URLPlayer); ok { if urlP, ok := p.player.(player.URLPlayer); ok {
url, err := p.sm.Server.GetStreamURL(p.playQueue[idx].ID, p.transcodeCfg.ForceRawFile) url := ""
if err != nil { if idx >= 0 {
return err var err error
url, err = p.sm.Server.GetStreamURL(p.playQueue[idx].ID, p.transcodeCfg.ForceRawFile)
if err != nil {
return err
}
} }
if next { if next {
return urlP.SetNextFile(url) return urlP.SetNextFile(url)
} }
return urlP.PlayFile(url) return urlP.PlayFile(url)
} else if trP, ok := p.player.(player.TrackPlayer); ok { } else if trP, ok := p.player.(player.TrackPlayer); ok {
if next { var track *mediaprovider.Track
return trP.SetNextTrack(p.playQueue[idx]) if idx >= 0 {
track = p.playQueue[idx]
} }
return trP.PlayTrack(p.playQueue[idx]) if next {
return trP.SetNextTrack(track)
}
return trP.PlayTrack(track)
} }
panic("Unsupported player type") panic("Unsupported player type")
} }
+4
View File
@@ -173,6 +173,10 @@ func (p *Player) SetNextFile(url string) error {
} }
p.lenPlaylist-- p.lenPlaylist--
} }
if url == "" {
return nil
}
err := p.mpv.Command([]string{"loadfile", url, "append"}) err := p.mpv.Command([]string{"loadfile", url, "append"})
if err == nil { if err == nil {
p.lenPlaylist++ p.lenPlaylist++