Good evening, I am implementing a JMF project which runs 2 rtp session on the same computer. The rtp session can be initialize and start, but how can I interrupt one of them. Instead of don't run 2 rtp session on the same computer, is there a way for JMF to interrupt/ hold a rtp session? There is some codes for the information.
The transmitA and transmitB is almost the same code which get the LINEAR sound from the local computer and convert them into GSM_RTP or ULAW_RTP, only the port for the transmit is not the same. Finally datasink for the mediaLocator to the other computer.
Thread transmitA = new Thread() {
public void run() {
transmitA();
}
};
Thread transmitB = new Thread() {
public void run() {
transmitB();
}
};
Condition to interrupt
transmitA.start();
trasmitB.start();
while (...) {
if (...) {
//interrupt transmitA
transmitA.interrupt();
transmitA.stop();
} /*else if (...) {
//interrupt transmitB
transmitB.interrupt();
transmitB.stop();
}*/
}//notation end here
Well, interrupt the threads is not the same as interrupt an rtp session. How to interrupt or just make one rtp session transmit to the other computer? Am I going to do something on the track? or processor?
transmitA()
public void transmitA(){
// First find a capture device that will capture linear audio
// data at 8bit 8Khz
AudioFormat format= new AudioFormat(AudioFormat.LINEAR,
8000,
8,
1);
Vector devices= CaptureDeviceManager.getDeviceList( format);
CaptureDeviceInfo di= null;
if (devices.size() > 0) {
di = (CaptureDeviceInfo) devices.elementAt( 0);
}
else {
// exit if we could not find the relevant capturedevice.
System.exit(-1);
}
// Create a processor for this capturedevice & exit if we
// cannot create it
Processor processor = null;
try {
processor = Manager.createProcessor(di.getLocator());
} catch (IOException e) {
System.exit(-1);
} catch (NoProcessorException e) {
System.exit(-1);
}
// configure the processor
processor.configure();
while (processor.getState() != Processor.Configured){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
processor.setContentDescriptor(
new ContentDescriptor( ContentDescriptor.RAW));
TrackControl track[] = processor.getTrackControls();
boolean encodingOk = false;
// Go through the tracks and try to program one of them to
// output gsm data.
for (int i = 0; i < track.length; i++) {
if (!encodingOk && track[i] instanceof FormatControl) {
if (((FormatControl)track[i]).
setFormat( new AudioFormat(AudioFormat.GSM_RTP,
8000,
8,
1)) == null) {
track[i].setEnabled(false);
}
else {
encodingOk = true;
}
} else {
// we could not set this track to gsm, so disable it
track[i].setEnabled(false);
}
}
// At this point, we have determined where we can send out
// gsm data or not.
// realize the processor
if (encodingOk) {
processor.realize();
while (processor.getState() != Processor.Realized){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// get the output datasource of the processor and exit
// if we fail
DataSource ds = null;
try {
ds = processor.getDataOutput();
} catch (NotRealizedError e) {
System.exit(-1);
}
// hand this datasource to manager for creating an RTP
// datasink our RTP datasink will multicast the audio
try {
String url= "rtp://192.168.1.3:22222/audio/16";
//String url= "rtp://224.0.0.1:22224/audio/16";
MediaLocator m = new MediaLocator(url);
DataSink d = Manager.createDataSink(ds, m);
d.open();
d.start();
processor.start();
} catch (Exception e) {
System.out.println("cannot find the receiver address!!!");
System.exit(-1);
}
}
}
Need some hints and guidelines, thanks in advanced^^"