From 5c209c041227b5fc85e31998d6c68a687852c0f0 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 3 Dec 2025 07:08:56 -0800 Subject: [PATCH] Fix #775: quickly fade out mpv player on pause --- backend/player/mpv/player.go | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/backend/player/mpv/player.go b/backend/player/mpv/player.go index acf1dd7..d40c396 100644 --- a/backend/player/mpv/player.go +++ b/backend/player/mpv/player.go @@ -7,6 +7,7 @@ import ( "math" "strconv" "sync" + "time" "github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/backend/player" @@ -72,7 +73,8 @@ type Player struct { fileLoadedLock sync.Mutex fileLoadedSig *sync.Cond - bgCancel context.CancelFunc + fadePauseCancel context.CancelFunc + bgCancel context.CancelFunc } // Returns a new player. @@ -306,17 +308,37 @@ func (p *Player) Pause() error { if p.status.State != player.Playing { return nil } - err := p.setPaused(true) - if err == nil { - p.prePausedState = p.status.State - p.setState(player.Paused) - } - return err + p.prePausedState = p.status.State + p.setState(player.Paused) + + v := p.vol + ctx, cancel := context.WithCancel(context.Background()) + p.fadePauseCancel = cancel + go func() { + t := time.NewTicker(2 * time.Millisecond) + for c := 0; c < 100; c++ { + select { + case <-ctx.Done(): + return + case <-t.C: + p.mpv.SetProperty("volume", mpv.FORMAT_INT64, int64(v*(100-c)/100)) + } + } + t.Stop() + p.SetVolume(p.vol) + p.setPaused(true) + }() + return nil } // Continue playback and update the player state func (p *Player) Continue() error { if p.status.State == player.Paused { + if p.fadePauseCancel != nil { + p.fadePauseCancel() + p.fadePauseCancel = nil + p.SetVolume(p.vol) + } err := p.setPaused(false) if err == nil { p.setState(p.prePausedState)