@@ -231,8 +231,9 @@ type visEntry struct {
231231}
232232
233233type renderOnlyDriver struct {
234- spec VisAnalysisSpec
235- render func (* Visualizer , []float64 ) string
234+ spec VisAnalysisSpec
235+ render func (* Visualizer , []float64 ) string
236+ tickDuration time.Duration // 0 = use defaultDriverTickInterval
236237}
237238
238239func (d * renderOnlyDriver ) AnalysisSpec (* Visualizer ) VisAnalysisSpec {
@@ -247,7 +248,10 @@ func (d *renderOnlyDriver) Tick(v *Visualizer, ctx VisTickContext) {
247248 defaultDriverTick (v , ctx , d .spec )
248249}
249250
250- func (* renderOnlyDriver ) TickInterval (_ * Visualizer , ctx VisTickContext ) time.Duration {
251+ func (d * renderOnlyDriver ) TickInterval (_ * Visualizer , ctx VisTickContext ) time.Duration {
252+ if d .tickDuration > 0 && ctx .Playing && ! ctx .OverlayActive {
253+ return d .tickDuration
254+ }
251255 return defaultDriverTickInterval (ctx )
252256}
253257
@@ -275,6 +279,12 @@ func newRenderOnlyDriver(spec VisAnalysisSpec, render func(*Visualizer, []float6
275279 }
276280}
277281
282+ func newFastRenderOnlyDriver (spec VisAnalysisSpec , tick time.Duration , render func (* Visualizer , []float64 ) string ) func () visModeDriver {
283+ return func () visModeDriver {
284+ return & renderOnlyDriver {spec : NormalizeAnalysisSpec (spec ), render : render , tickDuration : tick }
285+ }
286+ }
287+
278288func newNoOpDriver () visModeDriver {
279289 return & noOpDriver {}
280290}
@@ -315,6 +325,7 @@ type Visualizer struct {
315325 Mode VisMode
316326 Rows int // display height in terminal rows (default 5)
317327 waveBuf []float64 // raw samples for wave mode
328+ waveYBuf []int // reusable y-position buffer for wave rendering
318329 frame uint64 // tick-driven animation clock
319330 sampleBuf []float64 // reusable buffer for reading audio tap samples
320331 drivers [VisCount ]visModeDriver
@@ -362,7 +373,7 @@ var visModes = [VisCount]visEntry{
362373 VisBricks : {"Bricks" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderBricks )},
363374 VisColumns : {"Columns" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderColumns )},
364375 VisClassicPeak : {"ClassicPeak" , newClassicPeakDriver },
365- VisWave : {"Wave" , newRenderOnlyDriver (spectrumAnalysisSpec (0 ), func (v * Visualizer , _ []float64 ) string { return v .renderWave () })},
376+ VisWave : {"Wave" , newFastRenderOnlyDriver (spectrumAnalysisSpec (0 ), TickWave , func (v * Visualizer , _ []float64 ) string { return v .renderWave () })},
366377 VisScatter : {"Scatter" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderScatter )},
367378 VisFlame : {"Flame" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderFlame )},
368379 VisRetro : {"Retro" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderRetro )},
@@ -373,8 +384,8 @@ var visModes = [VisCount]visEntry{
373384 VisFirework : {"Firework" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderFirework )},
374385 VisLogo : {"Logo" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderLogo )},
375386 VisTerrain : {"Terrain" , newTerrainDriver },
376- VisScope : {"Scope" , newRenderOnlyDriver (spectrumAnalysisSpec (0 ), func (v * Visualizer , _ []float64 ) string { return v .renderScope () })},
377- VisHeartbeat : {"Heartbeat" , newRenderOnlyDriver (spectrumAnalysisSpec (0 ), func (v * Visualizer , _ []float64 ) string { return v .renderHeartbeat () })},
387+ VisScope : {"Scope" , newFastRenderOnlyDriver (spectrumAnalysisSpec (0 ), TickWave , func (v * Visualizer , _ []float64 ) string { return v .renderScope () })},
388+ VisHeartbeat : {"Heartbeat" , newFastRenderOnlyDriver (spectrumAnalysisSpec (0 ), TickWave , func (v * Visualizer , _ []float64 ) string { return v .renderHeartbeat () })},
378389 VisButterfly : {"Butterfly" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderButterfly )},
379390 VisAscii : {"Ascii" , newRenderOnlyDriver (spectrumAnalysisSpec (DefaultSpectrumBands ), (* Visualizer ).renderAscii )},
380391 VisNone : {"None" , newNoOpDriver },
0 commit comments