hook up seek for synced lyrics

This commit is contained in:
Drew Weymouth
2024-05-16 19:22:08 -07:00
parent d156bf02e0
commit e7b2b821f3
6 changed files with 26 additions and 15 deletions
+8 -8
View File
@@ -61,7 +61,7 @@ type playbackEngine struct {
// registered callbacks // registered callbacks
onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track) onSongChange []func(nowPlaying, justScrobbledIfAny *mediaprovider.Track)
onPlayTimeUpdate []func(float64, float64) onPlayTimeUpdate []func(float64, float64, bool)
onLoopModeChange []func(LoopMode) onLoopModeChange []func(LoopMode)
onVolumeChange []func(int) onVolumeChange []func(int)
onSeek []func() onSeek []func()
@@ -92,7 +92,7 @@ func NewPlaybackEngine(
} }
p.OnTrackChange(pm.handleOnTrackChange) p.OnTrackChange(pm.handleOnTrackChange)
p.OnSeek(func() { p.OnSeek(func() {
pm.doUpdateTimePos() pm.doUpdateTimePos(true)
pm.invokeNoArgCallbacks(pm.onSeek) pm.invokeNoArgCallbacks(pm.onSeek)
}) })
p.OnStopped(pm.handleOnStopped) p.OnStopped(pm.handleOnStopped)
@@ -239,7 +239,7 @@ func (p *playbackEngine) LoadTracks(tracks []*mediaprovider.Track, insertQueueMo
func (p *playbackEngine) StopAndClearPlayQueue() { func (p *playbackEngine) StopAndClearPlayQueue() {
changed := len(p.playQueue) > 0 changed := len(p.playQueue) > 0
p.player.Stop() p.player.Stop()
p.doUpdateTimePos() p.doUpdateTimePos(false)
p.playQueue = nil p.playQueue = nil
p.nowPlayingIdx = -1 p.nowPlayingIdx = -1
if changed { if changed {
@@ -399,7 +399,7 @@ func (p *playbackEngine) handleOnTrackChange() {
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()
p.doUpdateTimePos() p.doUpdateTimePos(false)
p.setNextTrackBasedOnLoopMode(false) p.setNextTrackBasedOnLoopMode(false)
} }
@@ -407,7 +407,7 @@ func (p *playbackEngine) handleOnStopped() {
p.playTimeStopwatch.Stop() p.playTimeStopwatch.Stop()
p.checkScrobble() p.checkScrobble()
p.stopPollTimePos() p.stopPollTimePos()
p.doUpdateTimePos() p.doUpdateTimePos(false)
p.invokeOnSongChangeCallbacks() p.invokeOnSongChangeCallbacks()
p.invokeNoArgCallbacks(p.onStopped) p.invokeNoArgCallbacks(p.onStopped)
p.wasStopped = true p.wasStopped = true
@@ -568,7 +568,7 @@ func (p *playbackEngine) startPollTimePos() {
pollingTick.Stop() pollingTick.Stop()
return return
case <-pollingTick.C: case <-pollingTick.C:
p.doUpdateTimePos() p.doUpdateTimePos(false)
} }
} }
}() }()
@@ -581,7 +581,7 @@ func (p *playbackEngine) stopPollTimePos() {
} }
} }
func (p *playbackEngine) doUpdateTimePos() { func (p *playbackEngine) doUpdateTimePos(seeked bool) {
if p.callbacksDisabled { if p.callbacksDisabled {
return return
} }
@@ -590,6 +590,6 @@ func (p *playbackEngine) doUpdateTimePos() {
p.latestTrackPosition = s.TimePos p.latestTrackPosition = s.TimePos
} }
for _, cb := range p.onPlayTimeUpdate { for _, cb := range p.onPlayTimeUpdate {
cb(s.TimePos, s.Duration) cb(s.TimePos, s.Duration, seeked)
} }
} }
+1 -1
View File
@@ -60,7 +60,7 @@ func (p *PlaybackManager) OnSongChange(cb func(nowPlaying *mediaprovider.Track,
} }
// Registers a callback that is notified whenever the play time should be updated. // Registers a callback that is notified whenever the play time should be updated.
func (p *PlaybackManager) OnPlayTimeUpdate(cb func(float64, float64)) { func (p *PlaybackManager) OnPlayTimeUpdate(cb func(curTime float64, totalTime float64, seeked bool)) {
p.engine.onPlayTimeUpdate = append(p.engine.onPlayTimeUpdate, cb) p.engine.onPlayTimeUpdate = append(p.engine.onPlayTimeUpdate, cb)
} }
+1 -1
View File
@@ -35,7 +35,7 @@ func NewBottomPanel(pm *backend.PlaybackManager, contr *controller.Controller) *
bp.ExtendBaseWidget(bp) bp.ExtendBaseWidget(bp)
pm.OnSongChange(bp.onSongChange) pm.OnSongChange(bp.onSongChange)
pm.OnPlayTimeUpdate(func(cur, total float64) { pm.OnPlayTimeUpdate(func(cur, total float64, _ bool) {
if !pm.IsSeeking() { if !pm.IsSeeking() {
bp.Controls.UpdatePlayTime(cur, total) bp.Controls.UpdatePlayTime(cur, total)
} }
+3 -3
View File
@@ -46,7 +46,7 @@ type CanShowNowPlaying interface {
} }
type CanShowPlayTime interface { type CanShowPlayTime interface {
OnPlayTimeUpdate(curTime, totalTime float64) OnPlayTimeUpdate(curTime, totalTime float64, seeked bool)
} }
type CanShowPlayQueue interface { type CanShowPlayQueue interface {
@@ -222,12 +222,12 @@ func (b *BrowsingPane) onSongChange(song, lastScrobbledIfAny *mediaprovider.Trac
} }
} }
func (b *BrowsingPane) onPlayTimeUpdate(cur, total float64) { func (b *BrowsingPane) onPlayTimeUpdate(cur, total float64, seeked bool) {
if b.curPage == nil { if b.curPage == nil {
return return
} }
if p, ok := b.curPage.(CanShowPlayTime); ok { if p, ok := b.curPage.(CanShowPlayTime); ok {
p.OnPlayTimeUpdate(cur, total) p.OnPlayTimeUpdate(cur, total, seeked)
} }
} }
+6 -2
View File
@@ -241,9 +241,13 @@ func (s *nowPlayingPageState) Restore() Page {
var _ CanShowPlayTime = (*NowPlayingPage)(nil) var _ CanShowPlayTime = (*NowPlayingPage)(nil)
func (a *NowPlayingPage) OnPlayTimeUpdate(curTime, _ float64) { func (a *NowPlayingPage) OnPlayTimeUpdate(curTime, _ float64, seeked bool) {
a.formatStatusLine() a.formatStatusLine()
a.lyricsViewer.UpdatePlayPos(curTime) if seeked {
a.lyricsViewer.OnSeeked(curTime)
} else {
a.lyricsViewer.UpdatePlayPos(curTime)
}
} }
var _ CanSelectAll = (*NowPlayingPage)(nil) var _ CanSelectAll = (*NowPlayingPage)(nil)
+7
View File
@@ -15,6 +15,7 @@ type LyricsViewer struct {
viewer *fynelyrics.LyricsViewer viewer *fynelyrics.LyricsViewer
lyrics *mediaprovider.Lyrics lyrics *mediaprovider.Lyrics
nextLyricLine int nextLyricLine int
lastPlayPos float64
container *fyne.Container container *fyne.Container
isEmpty bool isEmpty bool
@@ -61,6 +62,11 @@ func (l *LyricsViewer) UpdatePlayPos(timeSecs float64) {
if l.lyrics == nil || !l.lyrics.Synced { if l.lyrics == nil || !l.lyrics.Synced {
return return
} }
if timeSecs < l.lastPlayPos {
l.OnSeeked(timeSecs)
return
}
l.lastPlayPos = timeSecs
// advance if needed // advance if needed
if l.lyrics.Lines[l.nextLyricLine].Start <= timeSecs { if l.lyrics.Lines[l.nextLyricLine].Start <= timeSecs {
l.viewer.NextLine() l.viewer.NextLine()
@@ -71,6 +77,7 @@ func (l *LyricsViewer) UpdatePlayPos(timeSecs float64) {
} }
func (l *LyricsViewer) OnSeeked(timeSecs float64) { func (l *LyricsViewer) OnSeeked(timeSecs float64) {
l.lastPlayPos = timeSecs
if l.lyrics == nil || !l.lyrics.Synced { if l.lyrics == nil || !l.lyrics.Synced {
return return
} }