package org.mobicents.media.server.impl.resource.audio;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import java.net.URL;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.mobicents.media.server.impl.clock.TimerImpl;
import org.mobicents.media.server.spi.NotificationListener;
import org.mobicents.media.server.spi.events.FailureEvent;
import org.mobicents.media.server.spi.events.NotifyEvent;
/**
*
* @author amit bhayani
*
*/
public class RecorderTest {
private TimerImpl timer;
private Semaphore semaphore;
private AudioPlayerImpl player;
private RecorderImpl recorder;
private boolean completed = false;
private boolean stopped = false;
private boolean failed = false;
@BeforeClass
public static void setUpClass() throws Exception {
}
@AfterClass
public static void tearDownClass() throws Exception {
}
@Before
public void setUp() {
failed = false;
stopped = false;
timer = new TimerImpl();
timer.start();
player = new AudioPlayerImpl("test", timer);
player.addListener(new PlayerListener());
recorder = new RecorderImpl("test");
recorder.addListener(new RecorderListener());
semaphore = new Semaphore(0);
}
@After
public void tearDown() {
timer.stop();
}
private void testRecording(String src, String dst) throws Exception {
URL url = RecorderTest.class.getClassLoader().getResource(src);
String path = url.getPath();
String recordDir = path.substring(0, path.lastIndexOf('/'));
recorder.setRecordDir(recordDir);
recorder.setRecordFile(dst);
player.setURL(url.toExternalForm());
player.connect(recorder);
recorder.start();
player.start();
semaphore.tryAcquire(60, TimeUnit.SECONDS);
assertTrue("It is expected that audio player finishes playback", completed);
completed = false;
recorder.stop();
player.stop();
//give a bit of time to complete recording
semaphore.tryAcquire(5, TimeUnit.SECONDS);
assertTrue("Player have to send STOPPED event", stopped);
assertFalse("Recorder failed", failed);
assertTrue("Recorder have to send COMPLETED event", completed);
}
@Test
public void test_Wav_L16_8000() throws Exception {
testRecording("org/mobicents/media/server/impl/fox-full.wav", "recorder-test/fox-full-recorded.wav");
}
@Test
public void test_8000_MONO_ALAW() throws Exception {
testRecording("org/mobicents/media/server/impl/addf8-Alaw-GW.wav", "addf8-Alaw-GW-recorded.wav");
}
@Test
public void test_8000_MONO_ULAW() throws Exception {
testRecording("org/mobicents/media/server/impl/8kulaw.wav", "8kulaw-recorded.wav");
}
@Test
public void test_SPEEX() throws Exception {
testRecording("org/mobicents/media/server/impl/sin8m.spx", "speex-recording.spx");
}
private class PlayerListener implements NotificationListener {
public void update(NotifyEvent event) {
switch(event.getEventID()) {
case NotifyEvent.COMPLETED :
completed = true;
semaphore.release();
break;
case NotifyEvent.START_FAILED :
case NotifyEvent.TX_FAILED :
failed = true;
semaphore.release();
break;
}
}
}
private class RecorderListener implements NotificationListener {
public void update(NotifyEvent event) {
switch (event.getEventID()) {
case NotifyEvent.STOPPED:
stopped = true;
break;
case NotifyEvent.START_FAILED :
case NotifyEvent.RX_FAILED :
failed = true;
semaphore.release();
((FailureEvent)event).getException().printStackTrace();
break;
case NotifyEvent.COMPLETED :
completed = true;
semaphore.release();
break;
}
}
}
}