From 024557d49ea457b7d7472de3771eb94c6016ce4b Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Fri, 23 Dec 2022 14:55:47 -0800 Subject: [PATCH] update slider once per second always --- backend/playbackmanager.go | 24 +++++------------------- player/player.go | 2 +- ui/playercontrols.go | 5 ++--- ui/util.go | 7 +++++-- 4 files changed, 13 insertions(+), 25 deletions(-) diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index 471aaad..01c186f 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -32,9 +32,7 @@ func NewPlaybackManager(ctx context.Context, cli *subsonic.Client, p *player.Pla for _, cb := range pm.onSongChange { cb(pm.NowPlaying()) } - if pm.pollingTick != nil { - pm.pollingTick.Reset(pm.getPollSpeed()) - } + pm.doUpdateTimePos() }) p.OnSeek(func() { pm.doUpdateTimePos() @@ -106,25 +104,10 @@ func (p *PlaybackManager) PlayAlbum(albumID string) error { return p.player.PlayFromBeginning() } -// depending on the length of the current track, we need to poll -// faster or less fast to make track position scroll bar look smooth -func (p *PlaybackManager) getPollSpeed() time.Duration { - t := p.player.GetStatus().Duration - if t < 30 { - return 100 * time.Millisecond - } else if t < 90 { - return 150 * time.Millisecond - } else if t < 120 { - return 250 * time.Millisecond - } else { - return 333 * time.Millisecond - } -} - func (p *PlaybackManager) startPollTimePos() { ctx, cancel := context.WithCancel(p.ctx) p.cancelPollPos = cancel - p.pollingTick = time.NewTicker(p.getPollSpeed()) + p.pollingTick = time.NewTicker(250 * time.Millisecond) // TODO: fix occasional nil pointer dereference on app quit go func() { @@ -153,4 +136,7 @@ func (p *PlaybackManager) stopPollTimePos() { p.cancelPollPos() p.cancelPollPos = nil } + if p.pollingTick != nil { + p.pollingTick.Stop() + } } diff --git a/player/player.go b/player/player.go index 6125083..04f8066 100644 --- a/player/player.go +++ b/player/player.go @@ -375,7 +375,7 @@ func (p *Player) eventHandler(ctx context.Context) { case <-ctx.Done(): return default: - e := p.mpv.WaitEvent(0.2 /*timeout seconds*/) + e := p.mpv.WaitEvent(1 /*timeout seconds*/) if e.Event_Id != mpv.EVENT_NONE { //log.Printf("mpv event: %+v\n", e) } diff --git a/ui/playercontrols.go b/ui/playercontrols.go index cde90b1..ee20d09 100644 --- a/ui/playercontrols.go +++ b/ui/playercontrols.go @@ -148,9 +148,8 @@ func (pc *PlayerControls) doPlayTimeUpdate(curTime, totalTime float64) { pc.curTimeLabel.SetText(ct) updated = true } - if totalTime < 210 || updated { - // if current track is long, we only need to redraw the slider - // when the time label updates, to reduce screen redraws. + if updated { + // Only update slider once a second when time label changes pc.slider.SetValue(v) } } diff --git a/ui/util.go b/ui/util.go index 0906039..c9adcdc 100644 --- a/ui/util.go +++ b/ui/util.go @@ -1,13 +1,16 @@ package ui -import "fmt" +import ( + "fmt" + "math" +) func SecondsToTimeString(s float64) string { if s < 0 { s = 0 } min := int(s / 60) - sec := int(s - float64(min*60)) + sec := int(math.Round(s - float64(min*60))) return fmt.Sprintf("%2d:%02d", min, sec) }