package org.signalml.plugin.newartifact.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;
public class NewArtifactDataReader implements INewArtifactDataReader {
private final File sourceFile;
private final int channelCount;
private static final int BUFFER_SIZE = 8192;
public NewArtifactDataReader(File sourceFile,
int channelCount) {
this.sourceFile = sourceFile;
this.channelCount = channelCount;
}
public double[][] read() throws IOException {
byte rawBuffer[] = new byte[NewArtifactDataReader.BUFFER_SIZE];
ByteBuffer byteBuffer = ByteBuffer.wrap(rawBuffer);
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
FloatBuffer floatBuffer;
int j, readBytes;
LinkedList<Vector<Double>> dataVectors = new LinkedList<Vector<Double>>();
for (int i = 0; i < this.channelCount; ++i) {
dataVectors.add(new Vector<Double>(NewArtifactDataReader.BUFFER_SIZE));
}
InputStream stream = new FileInputStream(this.sourceFile);
try {
byteBuffer.clear();
Iterator<Vector<Double>> it = dataVectors.iterator();
while ((readBytes = stream.read(rawBuffer)) > 0) {
floatBuffer = byteBuffer.asFloatBuffer();
j = 0;
while (j < (readBytes >> 2)) {
if (!it.hasNext()) {
it = dataVectors.iterator();
}
it.next().add((double) floatBuffer.get(j));
j++;
}
byteBuffer.clear();
}
} finally {
stream.close();
}
double result[][] = new double[this.channelCount][];
Iterator<Vector<Double>> it = dataVectors.iterator();
j = 0;
while (it.hasNext()) {
Vector<Double> v = it.next();
double channel[] = result[j] = new double[v.size()];
for (int i = 0; i < channel.length; ++i) {
channel[i] = v.get(i);
}
j++;
}
return result;
}
@Override
public long getDataSize() throws IOException {
return this.sourceFile.length() / (4 * this.channelCount);
}
}