diff --git a/backend/app.go b/backend/app.go index cd2e58c..a8d81b0 100644 --- a/backend/app.go +++ b/backend/app.go @@ -151,7 +151,8 @@ func (a *App) LoginToDefaultServer(string) error { } func (a *App) Shutdown() { - a.Player.Stop() + a.PlaybackManager.DisableCallbacks() + a.Player.Stop() // will trigger scrobble check a.Config.LocalPlayback.Volume = a.Player.GetVolume() a.cancel() a.Player.Destroy() diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index 1af7591..c2b4c14 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -27,6 +27,7 @@ type PlaybackManager struct { playTimeStopwatch util.Stopwatch curTrackTime float64 + callbacksDisabled bool playQueue []*subsonic.Child nowPlayingIdx int64 @@ -99,6 +100,12 @@ func (p *PlaybackManager) IsSeeking() bool { return p.player.IsSeeking() } +// Should only be called before quitting. +// Disables playback state callbacks being sent +func (p *PlaybackManager) DisableCallbacks() { + p.callbacksDisabled = true +} + // Gets the curently playing song, if any. func (p *PlaybackManager) NowPlaying() *subsonic.Child { if len(p.playQueue) == 0 || p.player.GetStatus().State == player.Stopped { @@ -310,6 +317,9 @@ func (p *PlaybackManager) sendNowPlayingScrobble() { } func (p *PlaybackManager) invokeOnSongChangeCallbacks() { + if p.callbacksDisabled { + return + } for _, cb := range p.onSongChange { cb(p.NowPlaying(), p.lastScrobbled) } @@ -337,6 +347,9 @@ func (p *PlaybackManager) startPollTimePos() { } func (p *PlaybackManager) doUpdateTimePos() { + if p.callbacksDisabled { + return + } s := p.player.GetStatus() for _, cb := range p.onPlayTimeUpdate { cb(s.TimePos, s.Duration)