package test.msgflow.mediamixer;
import java.io.Serializable;
import javax.media.mscontrol.MsControlException;
import javax.media.mscontrol.join.JoinEvent;
import javax.media.mscontrol.join.JoinEventListener;
import javax.media.mscontrol.join.Joinable;
import javax.media.mscontrol.join.JoinableStream;
import javax.media.mscontrol.mixer.MediaMixer;
import javax.media.mscontrol.networkconnection.NetworkConnection;
import org.apache.log4j.Logger;
import org.mobicents.javax.media.mscontrol.MediaSessionImpl;
import test.msgflow.MessageFlowHarness;
/**
*
* @author amit bhayani
*
*/
public class MediaMixerTest extends MessageFlowHarness implements Serializable {
private MGW mgw;
public MediaMixerTest() {
super();
logger = Logger.getLogger(MediaMixerTest.class);
}
public MediaMixerTest(String name) {
super(name);
logger = Logger.getLogger(MediaMixerTest.class);
}
public void setUp() {
try {
super.setUp();
mgw = new MGW(mgwProvider);
} catch (Exception ex) {
ex.printStackTrace();
fail("Unexpected Exception");
}
}
// TODO : Should repeat all test of NC?
public void testMediaMixerJoin() throws Exception {
final MediaSessionImpl myMediaSession = (MediaSessionImpl) msControlFactory.createMediaSession();
final NetworkConnection NC1 = myMediaSession.createNetworkConnection(NetworkConnection.BASIC);
final NetworkConnection NC2 = myMediaSession.createNetworkConnection(NetworkConnection.BASIC);
final NetworkConnection NC3 = myMediaSession.createNetworkConnection(NetworkConnection.BASIC);
final MediaMixer MX1 = myMediaSession.createMediaMixer(MediaMixer.AUDIO);
JoinEventListener statusEvtList = new JoinEventListener() {
int noOfJoins = 0;
public void onEvent(JoinEvent event) {
if (event.isSuccessful()) {
logger.info("testMediaMixerJoin successful ");
noOfJoins++;
if (noOfJoins == 3) {
logger.info("Join successful " + event);
testPassed = true;
}
} else {
logger.error("Join failed " + event);
fail("Join of NC1 and NC2 failed");
}
}
};
MX1.addListener(statusEvtList);
MX1.joinInitiate(Joinable.Direction.DUPLEX, NC1, this);
MX1.joinInitiate(Joinable.Direction.DUPLEX, NC2, this);
MX1.joinInitiate(Joinable.Direction.DUPLEX, NC3, this);
waitForMessage();
/*
* Test for COntainers
*/
// Get other container
Joinable[] otherContainer = MX1.getJoinees();
assertEquals(3, otherContainer.length);
// MX1 <---> Send / Recv <---> NC1
otherContainer = MX1.getJoinees(Joinable.Direction.SEND);
assertEquals(3, otherContainer.length);
// MX1 is joined to NC1 Container with direction SEND / RECV and NC1
// joinees is
// equal to MX1
assertEquals(MX1, (otherContainer[0].getJoinees(Joinable.Direction.RECV))[0]);
/*
* Test for Audio Stream
*/
// Joinable Stream is of type Audio only
JoinableStream stream = MX1.getJoinableStream(JoinableStream.StreamType.audio);
assertNotNull(stream);
assertNull(MX1.getJoinableStream(JoinableStream.StreamType.video));
// Joined to 3 other NC AudioStream
Joinable[] j = stream.getJoinees();
assertEquals(3, j.length);
// The stream from this MX and its joinees joinees will be same
JoinableStream streamOther = (JoinableStream) j[0];
Joinable[] j1 = streamOther.getJoinees();
assertEquals(j1[0], stream);
assertNotNull(streamOther.getJoinees(Joinable.Direction.RECV)[0]);
NetworkConnection NC4 = myMediaSession.createNetworkConnection(NetworkConnection.BASIC);
// NC1 is not joined to NC3. Trying to unjoin NC3 should raise exception
try {
MX1.unjoinInitiate(NC4, this);
fail("MX1 not connected to NC4");
} catch (MsControlException e) {
// expected
// e.printStackTrace();
}
assertTrue(this.getName() + " passed = " + testPassed, testPassed);
}
private class ContextImpl implements Serializable {
}
public void tearDown() {
this.mgw.checkState();
try {
super.tearDown();
} catch (Exception ex) {
}
}
}