package org.jcodec.audio;
import java.io.IOException;
import java.lang.IllegalArgumentException;
import java.lang.System;
import java.nio.FloatBuffer;
/**
* This class is part of JCodec ( www.jcodec.org ) This software is distributed
* under FreeBSD License
*
* A class with many audio helper functions
*
* @author The JCodec project
*
*/
public class Audio {
public static void transfer(AudioSource src, AudioSink sink) throws IOException {
filterTransfer(src, new DummyFilter(1), sink);
}
public static void filterTransfer(AudioSource src, AudioFilter filter, AudioSink sink) throws IOException {
if (filter.getNInputs() != 1)
throw new IllegalArgumentException("Audio filter has # inputs != 1");
if (filter.getNOutputs() != 1)
throw new IllegalArgumentException("Audio filter has # outputs != 1");
if (filter.getDelay() != 0)
throw new IllegalArgumentException("Audio filter has delay");
FloatBuffer[] ins = new FloatBuffer[] { FloatBuffer.allocate(4096) };
FloatBuffer[] outs = new FloatBuffer[] { FloatBuffer.allocate(8192) };
long[] pos = new long[1];
while (src.readFloat(ins[0]) != -1) {
ins[0].flip();
filter.filter(ins, pos, outs);
pos[0] += ins[0].position();
rotate(ins[0]);
outs[0].flip();
sink.writeFloat(outs[0]);
outs[0].clear();
}
}
public static void print(FloatBuffer buf) {
FloatBuffer dup = buf.duplicate();
while (dup.hasRemaining())
System.out.print(String.format("%.3f,", dup.get()));
System.out.println();
}
public static void rotate(FloatBuffer buf) {
int pos;
for (pos = 0; buf.hasRemaining(); pos++)
buf.put(pos, buf.get());
buf.position(pos);
buf.limit(buf.capacity());
}
public static class DummyFilter implements AudioFilter {
private int nInputs;
public DummyFilter(int nInputs) {
this.nInputs = nInputs;
}
@Override
public void filter(FloatBuffer[] _in, long[] inPos, FloatBuffer[] out) {
for (int i = 0; i < _in.length; i++) {
if (out[i].remaining() >= _in[i].remaining())
out[i].put(_in[i]);
else {
FloatBuffer duplicate = _in[i].duplicate();
duplicate.limit(_in[i].position() + out[i].remaining());
out[i].put(duplicate);
}
}
}
@Override
public int getDelay() {
return 0;
}
@Override
public int getNInputs() {
return nInputs;
}
@Override
public int getNOutputs() {
return nInputs;
}
}
}