package org.signalml.plugin.io; import java.beans.PropertyChangeListener; import java.io.InvalidClassException; import org.apache.log4j.Logger; import org.signalml.app.document.signal.SignalDocument; import org.signalml.domain.signal.samplesource.MultichannelSampleSource; import org.signalml.domain.signal.samplesource.OriginalMultichannelSampleSource; import org.signalml.domain.signal.samplesource.SignalMLCodecSampleSource; import org.signalml.plugin.export.signal.ChannelSamples; import org.signalml.plugin.export.signal.ExportedSignalDocument; import org.signalml.plugin.export.signal.SvarogAccessSignal; public class PluginSampleSourceAdapter implements MultichannelSampleSource { protected static final Logger logger = Logger.getLogger(PluginSampleSourceAdapter.class); private SvarogAccessSignal signalAccess; private ExportedSignalDocument signalDocument; private MultichannelSampleSource delegate; public PluginSampleSourceAdapter(SvarogAccessSignal signalAccess, ExportedSignalDocument signalDocument) { this.signalAccess = signalAccess; this.signalDocument = signalDocument; this.delegate = null; if (this.signalDocument instanceof SignalDocument) { OriginalMultichannelSampleSource source = ((SignalDocument) this.signalDocument).getSampleSource(); try { SignalMLCodecSampleSource codecSource = (SignalMLCodecSampleSource) source; this.delegate = new FastMultichannelSampleSource( codecSource.getReader()); } catch (ClassCastException e) { // do nothing } } } @Override public boolean isSamplingFrequencyCapable() { return this.delegate != null ? this.delegate .isSamplingFrequencyCapable() : true; } @Override public boolean isChannelCountCapable() { return this.delegate != null ? this.delegate.isChannelCountCapable() : true; } @Override public float getSamplingFrequency() { return this.delegate == null ? this.signalDocument .getSamplingFrequency() : this.delegate.getSamplingFrequency(); } @Override public int getChannelCount() { return this.delegate == null ? this.signalDocument.getChannelCount() : this.delegate.getChannelCount(); } @Override public int getSampleCount(int channel) { return this.delegate == null ? (int)(this.signalDocument .getMaxSignalLength() * this.signalDocument .getSamplingFrequency()) : this.delegate .getSampleCount(channel); } @Override public void getSamples(int channel, double[] target, int signalOffset, int count, int arrayOffset) { if (this.delegate == null) { ChannelSamples samples; try { samples = this.signalAccess.getRawSignalSamplesFromDocument( this.signalDocument, channel, signalOffset, count); } catch (InvalidClassException e) { logger.error("", e); return; } catch (IndexOutOfBoundsException e) { logger.error("", e); return; } System.arraycopy(samples.getSamples(), 0, target, arrayOffset, count); } else { this.delegate.getSamples(channel, target, signalOffset, count, arrayOffset); } } @Override public String getLabel(int channel) { return this.signalDocument.getSourceChannelLabels().get(channel); } @Override public int getDocumentChannelIndex(int channel) { return this.delegate == null ? -1 : this.delegate .getDocumentChannelIndex(channel); } @Override public void addPropertyChangeListener(PropertyChangeListener listener) { this.signalDocument.addPropertyChangeListener(listener); } @Override public void removePropertyChangeListener(PropertyChangeListener listener) { this.signalDocument.removePropertyChangeListener(listener); } @Override public void destroy() { if (this.delegate != null) { this.delegate.destroy(); } } }