19

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?

S. M. Shahinul Islam
  • 2,780
  • 4
  • 36
  • 68
  • You might want to fix the indentation of your code. You can see what it looks like. Fixing it will make it at least more readable. – Bart Feb 19 '12 at 06:37
  • @Bart: I have improved some formtting, actually why you are saying my code is unreadable? Give me specific suggesion on improved formatting. Thanks – S. M. Shahinul Islam Feb 19 '12 at 07:59
  • 1
    @Alvi_1987 Let see if you have more luck now. – Aristos Feb 19 '12 at 18:54
  • 1
    @Alvi_1987 I have fixed your indentation for you. Have a look at the difference to see what I was talking about. What this revealed is that you also have an extra two lines at the end of your second block of code, for which there is no matching left brace at the top. Should those lines be there? Is there something missing at the top? – Bart Feb 19 '12 at 19:48
  • @Bart - I have added the missing lines. – S. M. Shahinul Islam Feb 19 '12 at 20:36
  • @Alvi_1987 did you check on the code that I focus on if you find the problem ? – Aristos Feb 24 '12 at 12:54
  • @Aristos:I m working on it, but still no luck, If I get anything to get fixed I will notify. Thanks for the attention. – S. M. Shahinul Islam Feb 24 '12 at 21:01

1 Answers1

2

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);
    }
B770
  • 1,272
  • 3
  • 17
  • 34
Aristos
  • 66,005
  • 16
  • 114
  • 150
  • Just for the reference for that q/a, there was a question on meta about that question, I add some bounty at that time and place that answer trying to help. Here is the meta question: http://meta.stackexchange.com/questions/122809/why-are-my-questions-remaining-unanswered-for-a-long-time – Aristos Jul 06 '13 at 18:04