0
votes

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^^"

1

1 Answers

0
votes

After trying and trying, I finally done it... Just removed the thread and direct use the method, I don't whether it is a good programming practice or not but well any suggestion will be really appreciate...

private DataSink d = null;
private Processor processor = null;

while (...) {
   if (...) {

       //interrupt transmitA
       processor.stop();
       processor.close();
       processor.deallocate();
       processor = null;
       d.close();
       d = null;
       transmitA();

       } /*else if (...) {
                   //interrupt transmitB
                   processor.stop();
                   processor.close();
                   processor.deallocate();
                   processor = null;
                   d.close();
                   d = null;
                   transmitB.stop();
                 }*/                      
        }//notation end here