create waveform seekbar widget; still more to do

This commit is contained in:
Drew Weymouth
2025-07-24 08:51:25 -07:00
parent ae7cb55c8c
commit 43f6d501c9
5 changed files with 140 additions and 29 deletions
+10 -25
View File
@@ -11,9 +11,6 @@ import (
"sync"
"time"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/theme"
"github.com/dweymouth/supersonic/backend/mediaprovider"
"github.com/dweymouth/supersonic/backend/player"
"github.com/dweymouth/supersonic/backend/player/dlna"
@@ -36,6 +33,8 @@ type PlaybackManager struct {
remotePlayers []RemotePlaybackDevice
currentRemotePlayer *RemotePlaybackDevice
onWaveformImgUpdate []func(*WaveformImage)
autoplay bool
lastPlayTime float64
@@ -91,34 +90,16 @@ func (p *PlaybackManager) addOnTrackChangeHook() {
// TODO: make more permanent
if p.cache != nil && item != nil {
go func() {
log.Println("begin generating waveform image")
if path := p.cache.PathForCachedFile(item.Metadata().ID); path != "" {
t := time.Now()
wd, err := GetWaveformDataForFile(context.Background(), path)
log.Printf("generate data took %0.3f milliseconds", float64(time.Since(t).Nanoseconds())/1000000)
if err != nil {
log.Println(err.Error())
} else {
log.Println("have waveform data")
im := NewWaveformImage()
var c color.Color
fyne.DoAndWait(func() {
c = fyne.CurrentApp().Settings().Theme().Color(
theme.ColorNamePrimary,
fyne.CurrentApp().Settings().ThemeVariant(),
)
})
log.Println("generating image...")
t := time.Now()
GenerateWaveformImage(wd, im, c)
log.Printf("generate image took %0.3f milliseconds", float64(time.Since(t).Nanoseconds())/1000000)
fyne.Do(func() {
w := fyne.CurrentApp().NewWindow("waveform")
w.SetPadded(false)
w.SetContent(canvas.NewImageFromImage(im))
w.Resize(fyne.NewSize(1024, 32))
w.Show()
})
GenerateWaveformImage(wd, im, color.White)
for _, cb := range p.onWaveformImgUpdate {
cb(im)
}
}
} else {
log.Println("no cached file for waveform image")
@@ -213,6 +194,10 @@ func (p *PlaybackManager) OnPlayerChange(cb func()) {
p.engine.onPlayerChange = append(p.engine.onPlayerChange, cb)
}
func (p *PlaybackManager) OnWaveformImgUpdate(cb func(*WaveformImage)) {
p.onWaveformImgUpdate = append(p.onWaveformImgUpdate, cb)
}
func (p *PlaybackManager) IsSeeking() bool {
return p.engine.IsSeeking()
}