package nbtool.gui.logviews.sound.whistle; import java.nio.ByteBuffer; import java.nio.ByteOrder; import nbtool.data.log.Block; import nbtool.util.Debug; public class FloatBuffer extends Buffer<Float> { float[][] data; float max; public Float index(int channel, int frame) { if (channel < data.length && frame < data[0].length) { return data[channel][frame]; } else { throw new RuntimeException(String.format("OOB: channel:%d frame:%d", channel, frame)); } } @Override public Float get(int i, int c) { return data[c][i]; } public Float max() { return max; } public FloatBuffer(Block fb, int chan, int frm) { this.channels = chan; this.frames = frm; data = new float[channels][frames]; parse(fb); } @Override public void parse(Block fromBlock) { Debug.info("found %d expected %d\n", fromBlock.data.length, 4 * channels * frames); assert(fromBlock.data.length == 4 * channels * frames); ByteBuffer buf = ByteBuffer.wrap(fromBlock.data); buf.order(ByteOrder.LITTLE_ENDIAN); max = Float.NEGATIVE_INFINITY; for (int i = 0; i < channels; ++i) { for (int j = 0; j < frames; ++j) { float f = buf.getFloat(); data[i][j] = f; assert(f >= 0); if (f > max) max = f; } } } @Override public Block toBlock() { // TODO Auto-generated method stub return null; } // @Override // public void parse(_Log soundLog) { // this.frames = soundLog.sexprForContentItem(0).firstValueOf("frames").valueAsInt(); // this.channels = soundLog.sexprForContentItem(0).firstValueOf("channels").valueAsInt(); // String format = soundLog.sexprForContentItem(0).firstValueOf("format").value(); // // assert(format.equalsIgnoreCase("float")); // assert(soundLog.bytes.length == 4 * channels * frames); // }