fix regression- crashing on Repeat One when nothing playing
This commit is contained in:
@@ -44,6 +44,7 @@ type PlaybackManager struct {
|
|||||||
|
|
||||||
playQueue []*mediaprovider.Track
|
playQueue []*mediaprovider.Track
|
||||||
nowPlayingIdx int
|
nowPlayingIdx int
|
||||||
|
wasStopped bool // true iff player was stopped before handleOnTrackChange invocation
|
||||||
loopMode LoopMode
|
loopMode LoopMode
|
||||||
|
|
||||||
// to pass to onSongChange listeners; clear once listeners have been called
|
// to pass to onSongChange listeners; clear once listeners have been called
|
||||||
@@ -80,6 +81,7 @@ func NewPlaybackManager(
|
|||||||
scrobbleCfg: scrobbleCfg,
|
scrobbleCfg: scrobbleCfg,
|
||||||
transcodeCfg: transcodeCfg,
|
transcodeCfg: transcodeCfg,
|
||||||
nowPlayingIdx: -1,
|
nowPlayingIdx: -1,
|
||||||
|
wasStopped: true,
|
||||||
}
|
}
|
||||||
p.OnTrackChange(pm.handleOnTrackChange)
|
p.OnTrackChange(pm.handleOnTrackChange)
|
||||||
p.OnSeek(func() {
|
p.OnSeek(func() {
|
||||||
@@ -421,7 +423,9 @@ func (p *PlaybackManager) SetNextLoopMode() {
|
|||||||
|
|
||||||
func (p *PlaybackManager) SetLoopMode(loopMode LoopMode) {
|
func (p *PlaybackManager) SetLoopMode(loopMode LoopMode) {
|
||||||
p.loopMode = loopMode
|
p.loopMode = loopMode
|
||||||
p.setNextTrackBasedOnLoopMode(true)
|
if p.nowPlayingIdx >= 0 {
|
||||||
|
p.setNextTrackBasedOnLoopMode(true)
|
||||||
|
}
|
||||||
|
|
||||||
for _, cb := range p.onLoopModeChange {
|
for _, cb := range p.onLoopModeChange {
|
||||||
cb(loopMode)
|
cb(loopMode)
|
||||||
@@ -513,12 +517,13 @@ func (p *PlaybackManager) handleOnTrackChange() {
|
|||||||
if p.player.GetStatus().State == player.Playing {
|
if p.player.GetStatus().State == player.Playing {
|
||||||
p.playTimeStopwatch.Start()
|
p.playTimeStopwatch.Start()
|
||||||
}
|
}
|
||||||
if p.loopMode != LoopOne {
|
if p.wasStopped || p.loopMode != LoopOne {
|
||||||
p.nowPlayingIdx++
|
p.nowPlayingIdx++
|
||||||
if p.loopMode == LoopAll && p.nowPlayingIdx == len(p.playQueue) {
|
if p.loopMode == LoopAll && p.nowPlayingIdx == len(p.playQueue) {
|
||||||
p.nowPlayingIdx = 0 // wrapped around
|
p.nowPlayingIdx = 0 // wrapped around
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
p.wasStopped = false
|
||||||
p.curTrackTime = float64(p.playQueue[p.nowPlayingIdx].Duration)
|
p.curTrackTime = float64(p.playQueue[p.nowPlayingIdx].Duration)
|
||||||
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()
|
||||||
@@ -533,6 +538,7 @@ func (p *PlaybackManager) handleOnStopped() {
|
|||||||
p.doUpdateTimePos()
|
p.doUpdateTimePos()
|
||||||
p.invokeOnSongChangeCallbacks()
|
p.invokeOnSongChangeCallbacks()
|
||||||
p.invokeNoArgCallbacks(p.onStopped)
|
p.invokeNoArgCallbacks(p.onStopped)
|
||||||
|
p.wasStopped = true
|
||||||
p.nowPlayingIdx = -1
|
p.nowPlayingIdx = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user