package org.signalml.plugin.io;
import java.beans.PropertyChangeListener;
import java.nio.DoubleBuffer;
import org.apache.log4j.Logger;
import org.signalml.codec.SignalMLCodecException;
import org.signalml.codec.SignalMLCodecReader;
import org.signalml.domain.signal.samplesource.MultichannelSampleSource;
public class FastMultichannelSampleSource implements MultichannelSampleSource {
protected static final Logger logger = Logger.getLogger(FastMultichannelSampleSource.class);
private static int BUFFER_SIZE = Math.max(1 << 20, Integer
.highestOneBit(Math.min((int) Runtime.getRuntime().maxMemory(),
Integer.MAX_VALUE) / 20));
private SignalMLCodecReader delegate;
private int offset;
private String names[];
public FastMultichannelSampleSource(SignalMLCodecReader codec) {
this.delegate = codec;
this.offset = -BUFFER_SIZE - 1;
this.names = null;
}
@Override
public int getChannelCount() {
try {
return this.delegate.get_number_of_channels();
} catch (SignalMLCodecException e) {
return -1;
}
}
@Override
public int getDocumentChannelIndex(int channel) {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getLabel(int channel) {
if (this.names == null) {
try {
this.names = this.delegate.get_channel_names();
} catch (SignalMLCodecException e) {
// do nothing
}
}
try {
return this.names == null ? null : this.names[channel];
} catch (ArrayIndexOutOfBoundsException e) {
return null;
}
}
@Override
public int getSampleCount(int channel) {
try {
return this.delegate.get_max_offset() + 1;
} catch (SignalMLCodecException ex) {
return 0;
}
}
@Override
public void getSamples(int channel, double[] target, int signalOffset,
int count, int arrayOffset) {
if (count <= 0)
return;
// XXX: check units, etc
DoubleBuffer buf = DoubleBuffer.wrap(target, arrayOffset, count);
try {
this.delegate.getSamples(buf, channel, signalOffset);
} catch(SignalMLCodecException e) {
/* nothing */
logger.error("", e);
}
}
@Override
public float getSamplingFrequency() {
try {
return this.delegate.get_sampling_frequency();
} catch (SignalMLCodecException e) {
return 128.0f;
}
}
@Override
public boolean isChannelCountCapable() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isSamplingFrequencyCapable() {
// TODO Auto-generated method stub
return false;
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
//do nothing
}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
//do nothing
}
@Override
public void destroy() {
this.delegate.close();
}
}