From 6a7f06769db45799e1193569e861f79846411186 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Tue, 18 Mar 2025 17:58:15 -0700 Subject: [PATCH] ensure casting playback stops when quitting app --- backend/app.go | 2 +- backend/playbackcommands.go | 16 ++++++++++++---- backend/playbackmanager.go | 7 +++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/backend/app.go b/backend/app.go index 6b233b8..d2486bb 100644 --- a/backend/app.go +++ b/backend/app.go @@ -463,7 +463,7 @@ func (a *App) Shutdown() { a.WinSMTC.Shutdown() } a.PlaybackManager.DisableCallbacks() - a.PlaybackManager.Stop() // will trigger scrobble check + a.PlaybackManager.Shutdown() // will trigger scrobble check a.cancel() a.LocalPlayer.Destroy() } diff --git a/backend/playbackcommands.go b/backend/playbackcommands.go index cb06459..2d40a1b 100644 --- a/backend/playbackcommands.go +++ b/backend/playbackcommands.go @@ -31,10 +31,11 @@ const ( ) type playbackCommand struct { - Type playbackCommandType - Arg any - Arg2 any - Arg3 any + Type playbackCommandType + Arg any + Arg2 any + Arg3 any + OnDone func() } // playbackCommandQueue is a queue to accumulate player commands from the UI @@ -65,6 +66,13 @@ func (c *playbackCommandQueue) Stop() { playbackCommand{Type: cmdStop}) } +func (c *playbackCommandQueue) StopAndWait() { + done := make(chan struct{}) + c.filterCommandsAndAdd([]playbackCommandType{cmdContinue, cmdPause, cmdStop}, + playbackCommand{Type: cmdStop, OnDone: func() { close(done) }}) + <-done +} + func (c *playbackCommandQueue) Continue() { c.filterCommandsAndAdd([]playbackCommandType{cmdContinue, cmdPause, cmdStop}, playbackCommand{Type: cmdContinue}) diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index b4bece3..bf24a9a 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -512,6 +512,10 @@ func (p *PlaybackManager) Stop() { p.cmdQueue.Stop() } +func (p *PlaybackManager) Shutdown() { + p.cmdQueue.StopAndWait() +} + func (p *PlaybackManager) Pause() { p.cmdQueue.Pause() } @@ -662,6 +666,9 @@ func (p *PlaybackManager) runCmdQueue(ctx context.Context) { mpv.ForceRestartPlayback() } } + if c.OnDone != nil { + c.OnDone() + } } } }