package marytts.util.data;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import marytts.signalproc.process.InlineDataProcessor;
import marytts.util.data.audio.DDSAudioInputStream;
import org.junit.Test;
public class ProducingDoubleDataSourceTest {
private static AudioFormat getTestAudioFormat() {
float sampleRate = 16000; // 8000,11025,16000,22050,44100,48000
int sampleSizeInBits = 16; // 8,16
int channels = 1; // 1,2
boolean signed = true; // true,false
boolean bigEndian = false; // true,false
AudioFormat af = new AudioFormat(sampleRate, sampleSizeInBits, channels, signed, bigEndian);
return af;
}
@Test
public void canReadZeroDoubles() {
TestProducer producer = new TestProducer(0);
producer.start();
assertEquals(0, producer.available());
assertEquals(0, producer.getDataLength());
double[] data = producer.getAllData();
assertEquals(0, data.length);
}
@Test
public void canReadZeroFrames() throws IOException {
TestProducer producer = new TestProducer(0);
producer.start();
AudioInputStream ais = new DDSAudioInputStream(producer, getTestAudioFormat());
assertEquals(0, ais.getFrameLength());
}
@Test
public void canReadTenDoubles() {
int numDoubles = 10;
TestProducer producer = new TestProducer(numDoubles);
producer.start();
assertEquals(numDoubles, producer.getDataLength());
double[] data = producer.getAllData();
assertEquals(numDoubles, data.length);
}
@Test
public void canRead4000Doubles() {
int numDoubles = 4000;
TestProducer producer = new TestProducer(numDoubles);
producer.start();
assertEquals(numDoubles, producer.getDataLength());
double[] data = producer.getAllData();
assertEquals(numDoubles, data.length);
}
@Test
public void canReadTenFrames() throws Exception {
int numDoubles = 10;
TestProducer producer = new TestProducer(numDoubles);
producer.start();
AudioInputStream ais = new DDSAudioInputStream(producer, getTestAudioFormat());
assertEquals(numDoubles, ais.getFrameLength());
int bytesRead = ais.read(new byte[16000]);
assertEquals(2 * numDoubles, bytesRead);
}
@Test
public void canRead4000Frames() throws Exception {
int numDoubles = 4000;
TestProducer producer = new TestProducer(numDoubles);
producer.start();
AudioInputStream ais = new DDSAudioInputStream(producer, getTestAudioFormat());
assertEquals(numDoubles, ais.getFrameLength());
int bytesRead = ais.read(new byte[16000]);
assertEquals(2 * numDoubles, bytesRead);
}
@Test
public void willApplyInlineProcessor() {
InlineDataProcessor halver = new InlineDataProcessor() {
public void applyInline(double[] data, int off, int len) {
for (int i = off, max = off + len; i < max; i++) {
data[i] *= .5;
}
}
};
int numDoubles = 100;
TestProducer producer = new TestProducer(numDoubles, halver);
producer.start();
double[] result = producer.getAllData();
for (int i = 0; i < numDoubles; i++) {
assertEquals(producer.DUMMY * .5, result[i], 1.e-10);
}
}
private static class TestProducer extends ProducingDoubleDataSource {
double DUMMY = 0.23;
public TestProducer(int numToSend) {
super(numToSend);
}
public TestProducer(int numToSend, InlineDataProcessor dataProcessor) {
super(numToSend, dataProcessor);
}
public void run() {
long numToSend = getDataLength();
while (numToSend > 0) {
putOneDataPoint(DUMMY);
numToSend--;
}
putEndOfStream();
}
}
}