package jass.generators;
import jass.engine.*;
import java.io.*;
/** Filter UG. One input only. Processes input through filter.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class FilterContainerStereo extends InOut {
// to store left and right buffers
private float[] ch1in,ch2in,ch1out,ch2out;
private void init() {
ch1in = new float[bufferSize/2];
ch2in = new float[bufferSize/2];
ch1out = new float[bufferSize/2];
ch2out = new float[bufferSize/2];
}
// split interleaved input buffer
private void split(float[] buf) {
for(int i=0;i<bufferSize/2;i++) {
ch1in[i] = buf[2*i];
ch2in[i] = buf[2*i+1];
}
}
// merge into interleaved outputbuffer
private void merge(float[] buf) {
for(int i=0;i<bufferSize/2;i++) {
buf[2*i]=ch1out[i];
buf[2*i+1]=ch2out[i];
}
}
/** Add source to Sink. Override to allow only one input.
@param s Source to add.
@return object representing Source in Sink (may be null).
*/
public Object addSource(Source s) throws SinkIsFullException {
if(sourceContainer.size() > 0) {
throw new SinkIsFullException();
} else {
sourceContainer.addElement(s);
}
return null;
}
/** Filter */
Filter filter1 = null, filter2=null;
/** SetFilter contained.
@param f Filter contained.
*/
public void setFilters(Filter f1,Filter f2) {
filter1 = f1;
filter2 = f2;
}
/** Create container around Filter.
@param srate sampling rate in Hertz.
@param bufferSize Buffer size used for real-time rendering.
@param f Filter contained.
*/
public FilterContainerStereo(float srate, int bufferSize, Filter f1, Filter f2) {
super(bufferSize);
setFilters(f1,f2);
init();
}
/** Compute the next buffer and store in member float[] buf.
*/
protected void computeBuffer() {
int offSet = 0;
split(srcBuffers[0]);
filter1.filter(ch1out,ch1in,bufferSize/2,offSet);
filter2.filter(ch2out,ch2in,bufferSize/2,offSet);
merge(this.buf);
}
}