package org.jcodec.audio; import org.jcodec.platform.Platform; import java.lang.IllegalArgumentException; import java.nio.FloatBuffer; /** * This class is part of JCodec ( www.jcodec.org ) This software is distributed * under FreeBSD License * * @author The JCodec project * */ public class FilterSocket { private FloatBuffer[] buffers; private long[] positions; private int[] delays; private AudioFilter[] filters; private int totalInputs; private int totalOutputs; public static FilterSocket createFilterSocket(AudioFilter... arguments) { FilterSocket fs = new FilterSocket(); fs.totalInputs = 0; fs.totalOutputs = 0; for (int i = 0; i < arguments.length; i++) { fs.totalInputs += arguments[i].getNInputs(); fs.totalOutputs += arguments[i].getNOutputs(); } fs.buffers = new FloatBuffer[fs.totalInputs]; fs.positions = new long[fs.totalInputs]; fs.delays = new int[fs.totalInputs]; for (int i = 0, b = 0; i < arguments.length; i++) { for (int j = 0; j < arguments[i].getNInputs(); j++, b++) { fs.delays[b] = arguments[i].getDelay(); } } fs.filters = arguments; return fs; } public void allocateBuffers(int bufferSize) { for (int i = 0; i < totalInputs; i++) { buffers[i] = FloatBuffer.allocate(bufferSize + delays[i] * 2); buffers[i].position(delays[i]); } } public static FilterSocket createFilterSocket2(AudioFilter filter, FloatBuffer[] buffers, long[] positions) { FilterSocket fs = new FilterSocket(); fs.filters = new AudioFilter[] { filter }; fs.buffers = buffers; fs.positions = positions; fs.delays = new int[] { filter.getDelay() }; fs.totalInputs = filter.getNInputs(); fs.totalOutputs = filter.getNOutputs(); return fs; } private FilterSocket() { } public void filter(FloatBuffer[] outputs) { if (outputs.length != totalOutputs) throw new IllegalArgumentException("Can not output to provided filter socket inputs != outputs (" + outputs.length + "!=" + totalOutputs + ")"); for (int i = 0, ii = 0, oi = 0; i < filters.length; ii += filters[i].getNInputs(), oi += filters[i] .getNOutputs(), i++) { filters[i].filter(Platform.copyOfRangeO(buffers, ii, filters[i].getNInputs() + ii), Platform.copyOfRangeL(positions, ii, filters[i].getNInputs() + ii), Platform.copyOfRangeO(outputs, oi, filters[i].getNOutputs() + oi)); } } FloatBuffer[] getBuffers() { return buffers; } public void rotate() { for (int i = 0; i < buffers.length; i++) { positions[i] += buffers[i].position(); Audio.rotate(buffers[i]); } } public void setBuffers(FloatBuffer[] ins, long[] pos) { if (ins.length != totalInputs) throw new IllegalArgumentException( "Number of input buffers provided is less then the number of filter inputs."); if (pos.length != totalInputs) throw new IllegalArgumentException( "Number of input buffer positions provided is less then the number of filter inputs."); buffers = ins; positions = pos; } public int getTotalInputs() { return totalInputs; } public int getTotalOutputs() { return totalOutputs; } AudioFilter[] getFilters() { return filters; } public long[] getPositions() { return positions; } }