Optimizing a real-time C++17 terminal audio visualizer, what am I missing?
I've been building spectrum, a terminal audio visualizer that hooks into WASAPI and runs FFT analysis via FFTW3. Took heavy inspiration from Winamp's spectral analyzer for the peak physics and decay behavior.
Current pipeline:
\- 2400-sample Hann-windowed FFT with 95% window overlap (120-sample hop at 48kHz)
\- Producer-consumer architecture, mutex-guarded shared buffers between capture and render thread
\- AGC with rolling normalization + gamma contrast for dynamic range
\- Logarithmic frequency binning (20Hz–16kHz) with perceptual tilt
It runs at 60 FPS with <5% CPU.
What would you optimize next?
I'm hitting a point of diminishing returns (especially with the bar height logic, and what frequencies should and should not be displayed) and would love some architectural feedback.
Considering:
\- Lock-free ring buffer to replace the mutex
\- WASAPI exclusive mode for lower latency capture
GitHub: github.com/majockbim/spectrum
https://redd.it/1tmvr96
@r_cpp
Post #25276
16