diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index b40b971..bb1c086 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -190,6 +190,15 @@ func (p *PlaybackManager) handleWaveformImageSongChange(item mediaprovider.Media } } } + + if item == nil || item.Metadata().Type != mediaprovider.MediaItemTypeTrack { + // set a zero waveform image when we're not playing anything + // or playing a media type we can't derive a waveform from (e.g. radio) + img := NewWaveformImage() + for _, cb := range p.onWaveformImgUpdate { + cb(img) + } + } } func (p *PlaybackManager) ScanRemotePlayers(ctx context.Context, fastScan bool) { diff --git a/backend/waveformimage.go b/backend/waveformimage.go index 4965771..fbfeac9 100644 --- a/backend/waveformimage.go +++ b/backend/waveformimage.go @@ -28,7 +28,16 @@ type WaveformImageGenerator struct { type WaveformImage = image.NRGBA func NewWaveformImage() *WaveformImage { - return image.NewNRGBA(image.Rect(0, 0, 1024, 48)) + img := image.NewNRGBA(image.Rect(0, 0, 1024, 48)) + centerTop := img.Rect.Dy() / 2 // 24 + centerBottom := centerTop - 1 // 23 + + // color in center line + for x := 0; x < img.Bounds().Dx(); x++ { + setPixel(img, x, centerTop, color.NRGBA{R: 255, G: 255, B: 255, A: 255}) + setPixel(img, x, centerBottom, color.NRGBA{R: 255, G: 255, B: 255, A: 255}) + } + return img } type WaveformImageJob struct { diff --git a/ui/widgets/waveformseekbar.go b/ui/widgets/waveformseekbar.go index 955285c..8e5dc29 100644 --- a/ui/widgets/waveformseekbar.go +++ b/ui/widgets/waveformseekbar.go @@ -32,6 +32,7 @@ func NewWaveformSeekbar() *WaveformSeekbar { w := &WaveformSeekbar{ img: &canvas.Image{ ScaleMode: canvas.ImageScaleFastest, + Image: backend.NewWaveformImage(), }, cursor: canvas.NewRectangle(color.Transparent), }