Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why JMF is not working on Audio streaming with Mjsip?

I am using Mjsip to create a softphone. In the code there is three type option for audio straming.

  1. Using JMF (Java Media Framework)
  2. Using Java Audio
  3. Using RAT (Robust Audio Tool)

I am not using the RAT. Its value is been made false by myself. This is the code below to call JMF:

public JMFAudioLauncher(int local_port, String remote_addr, int remote_port, int direction, Log logger)
{  
    log=logger;
    localport=local_port;
    remoteport=remote_port;
    remoteaddr=remote_addr;
    // Patch for working with JMF with local streams
    if (remote_addr.startsWith("127."))
    {  
        printLog("Patch for JMF: replaced local destination address "+remote_addr+" with 255.255.255.255");
        remote_addr="255.255.255.255";
    }
    dir=direction;
    if (dir>=0) sender=new JMediaSender("audio",null,remote_addr,remote_port);
    if (dir<=0) receiver=new JMediaReceiver("audio",local_port,null);
}

/** Starts media application */
public boolean startMedia()
{  
    printLog("launching JMF-Audio...");
    String err1=null, err2=null;

    if (sender!=null) err1=sender.start();
    if (err1!=null) printLog("Error trying to send audio stream: "+err1);    

    if (receiver!=null) err2=receiver.start();
    if (err2!=null) printLog("Error trying to receive audio stream: "+err2);    

    return (err1==null && err2==null);      
}

/** Stops media application */
public boolean stopMedia()
{  
    String err1=null, err2=null;

    if (sender!=null) err1=sender.stop();      
    if (err1!=null) printLog("Error stopping audio sender: "+err1);    

    if (receiver!=null) err2=receiver.stop();      
    if (err2!=null) printLog("Error stopping audio receiver: "+err2);    

    return (err1==null && err2==null);      
}

But it is not being launched. I can still talk with my softphone. But in the log it shows...

UA: REGISTRATION
UA: Registration success: 200 OK
UA: INCOMING
UA: CONFIRMED/CALL
UA: Error trying to create the JMFAudioLauncher
AudioInput: TargetDataLine: com.sun.media.sound.DirectAudioDevice$DirectTDL@239525
AudioOutput: SourceDataLine: com.sun.media.sound.DirectAudioDevice$DirectSDL@f942c4
AudioLauncher: starting java audio..

But using JMF value is true for the user_agent_profile and the error generates from this code.

if (user_profile.audio && local_audio_port!=0 && remote_audio_port!=0)
     {  
         if (user_profile.use_rat)
         // create an audio_app and start it
         {  
            audio_app=new RATLauncher(user_profile.bin_rat,local_audio_port,remote_media_address,remote_audio_port,log);
         }
         else if (user_profile.use_jmf)
        {  
            // check if JMF is supported
            try
            {  
                Class myclass=Class.forName("local.ua.JMFAudioLauncher");
                Class[] parameter_types={ Class.forName("int"), Class.forName("java.lang.String"),Class.forName("int"), Class.forName("int"), Class.forName("org.zoolu.tools.Log") };
                Object[] parameters={ new Integer(local_audio_port), remote_media_address, new Integer(remote_audio_port), new Integer(dir), log };
                java.lang.reflect.Constructor constructor=myclass.getConstructor(parameter_types);
                audio_app=(MediaLauncher)constructor.newInstance(parameters);

            }
            catch (Exception e)
            {  
                printException(e,LogLevel.HIGH);
                printLog("Error trying to create the JMFAudioLauncher",LogLevel.HIGH);
            }
        }
        // else
        if (audio_app==null)
        {  
            // for testing..
            String audio_in=null;
            if (user_profile.send_tone) audio_in=JAudioLauncher.TONE;
            else if (user_profile.send_file!=null) audio_in=user_profile.send_file;
            String audio_out=null;
            if (user_profile.recv_file!=null) audio_out=user_profile.recv_file;        

            //audio_app=new JAudioLauncher(local_audio_port,remote_media_address,remote_audio_port,dir,log);
            audio_app=new JAudioLauncher(local_audio_port,remote_media_address,remote_audio_port,dir,audio_in,audio_out,user_profile.audio_sample_rate,user_profile.audio_sample_size,user_profile.audio_frame_size,log);
        }
        audio_app.startMedia();
    }

What can I do to enable JMF?

like image 701
S. M. Shahinul Islam Avatar asked Jan 28 '12 05:01

S. M. Shahinul Islam


1 Answers

Can you please take some time and find in which line the error is thrown on this part of code?

// check if JMF is supported
try{  
    Class myclass=Class.forName("local.ua.JMFAudioLauncher");
    Class[] parameter_types={ Class.forName("int"), Class.forName("java.lang.String"),Class.forName("int"), Class.forName("int"), Class.forName("org.zoolu.tools.Log") };
    Object[] parameters={ new Integer(local_audio_port), remote_media_address, new Integer(remote_audio_port), new Integer(dir), log };
    java.lang.reflect.Constructor constructor=myclass.getConstructor(parameter_types);
    audio_app=(MediaLauncher)constructor.newInstance(parameters);
    }
catch (Exception e){  
    printException(e,LogLevel.HIGH);
    printLog("Error trying to create the JMFAudioLauncher",LogLevel.HIGH);
    }
like image 113
Aristos Avatar answered Oct 14 '22 07:10

Aristos