Oldest frame index still readable
Frames pushed so far — the index the next pushed sample will have
Copy frames [startFrame, startFrame + out.length) into out. Frames
not yet pushed, or already evicted, read as zero.
Forget everything; the next pushed sample is frame 0 again
A ring buffer of the most recent samples, addressed by absolute frame index from the start of the stream, so a spectrum can be read "at frame N" as long as frame N is still within the ring.