package net.astropenguin.loopdeck; import java.io.IOException; import java.util.function.BooleanSupplier; /** A bounded stereo prefix. After preparation, ownership passes to playback. */ final class PcmPrebuffer { interface Reader { int read(float[] buffer,int frames) throws IOException; } private final Reader reader; private final long limit; private final float[] prefix; private int filled, offset; private long consumed; PcmPrebuffer(Reader reader,int frames,long limit) { this.reader=reader; this.limit=limit; prefix=new float[Math.multiplyExact(frames,2)]; } void prepare(BooleanSupplier cancelled) throws IOException { float[] scratch=new float[4096]; while (filled