]> sjero.net Git - linphone/blobdiff - coreapi/linphonecore.c
AAC-EL: fix SDP/fmtp content according to new recommendation from Fraunhofer
[linphone] / coreapi / linphonecore.c
index 2bb9fab32b8c4c2e7840bb6e2a534189ab981e0b..12c8880b65a4068547ffacd35a07c984b4ab8304 100644 (file)
@@ -116,6 +116,7 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro
        cl->from=from;
        cl->to=to;
        cl->status=LinphoneCallAborted; /*default status*/
+       cl->quality=-1;
        return cl;
 }
 
@@ -406,10 +407,24 @@ const LinphoneAddress *linphone_core_get_current_call_remote_address(struct _Lin
        return linphone_call_get_remote_address(call);
 }
 
+void linphone_core_set_log_handler(OrtpLogFunc logfunc) {
+       ortp_set_log_handler(logfunc);
+}
+
+void linphone_core_set_log_file(FILE *file) {
+       if (file == NULL) file = stdout;
+       ortp_set_log_file(file);
+}
+
+void linphone_core_set_log_level(OrtpLogLevel loglevel) {
+       ortp_set_log_level_mask(loglevel);
+}
+
 /**
  * Enable logs in supplied FILE*.
  *
  * @ingroup misc
+ * @deprecated Use #linphone_core_set_log_file and #linphone_core_set_log_level instead.
  *
  * @param file a C FILE* where to fprintf logs. If null stdout is used.
  *
@@ -424,6 +439,7 @@ void linphone_core_enable_logs(FILE *file){
  * Enable logs through the user's supplied log callback.
  *
  * @ingroup misc
+ * @deprecated Use #linphone_core_set_log_handler and #linphone_core_set_log_level instead.
  *
  * @param logfunc The address of a OrtpLogFunc callback whose protoype is
  *               typedef void (*OrtpLogFunc)(OrtpLogLevel lev, const char *fmt, va_list args);
@@ -438,6 +454,7 @@ void linphone_core_enable_logs_with_cb(OrtpLogFunc logfunc){
  * Entirely disable logging.
  *
  * @ingroup misc
+ * @deprecated Use #linphone_core_set_log_level instead.
 **/
 void linphone_core_disable_logs(){
        ortp_set_log_level_mask(ORTP_ERROR|ORTP_FATAL);
@@ -463,7 +480,7 @@ static void net_config_read (LinphoneCore *lc)
        linphone_core_set_firewall_policy(lc,tmp);
        tmp=lp_config_get_int(lc->config,"net","nat_sdp_only",0);
        lc->net_conf.nat_sdp_only=tmp;
-       tmp=lp_config_get_int(lc->config,"net","mtu",0);
+       tmp=lp_config_get_int(lc->config,"net","mtu",1300);
        linphone_core_set_mtu(lc,tmp);
        tmp=lp_config_get_int(lc->config,"net","download_ptime",0);
        linphone_core_set_download_ptime(lc,tmp);
@@ -581,9 +598,6 @@ static void sip_config_read(LinphoneCore *lc)
        int ipv6;
        int random_port;
 
-       tmp=lp_config_get_int(lc->config,"sip","use_info",0);
-       linphone_core_set_use_info_for_dtmf(lc,tmp);
-
        if (lp_config_get_int(lc->config,"sip","use_session_timers",0)==1){
                sal_use_session_timers(lc->sal,200);
        }
@@ -593,9 +607,6 @@ static void sip_config_read(LinphoneCore *lc)
        sal_reuse_authorization(lc->sal, lp_config_get_int(lc->config,"sip","reuse_authorization",0));
        sal_expire_old_registration_contacts(lc->sal,lp_config_get_int(lc->config,"sip","expire_old_registration_contacts",0));
 
-       tmp=lp_config_get_int(lc->config,"sip","use_rfc2833",1);
-       linphone_core_set_use_rfc2833_for_dtmf(lc,tmp);
-
        ipv6=lp_config_get_int(lc->config,"sip","use_ipv6",-1);
        if (ipv6==-1){
                ipv6=0;
@@ -751,6 +762,7 @@ static void rtp_config_read(LinphoneCore *lc)
        linphone_core_enable_audio_adaptive_jittcomp(lc, adaptive_jitt_comp_enabled);
        adaptive_jitt_comp_enabled = lp_config_get_int(lc->config, "rtp", "video_adaptive_jitt_comp_enabled", TRUE);
        linphone_core_enable_video_adaptive_jittcomp(lc, adaptive_jitt_comp_enabled);
+       lc->rtp_conf.disable_upnp = lp_config_get_int(lc->config, "rtp", "disable_upnp", FALSE);
 }
 
 static PayloadType * find_payload(RtpProfile *prof, const char *mime_type, int clock_rate, int channels, const char *recv_fmtp){
@@ -1193,18 +1205,18 @@ void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const
 }
 static void misc_config_read (LinphoneCore *lc) {
        LpConfig *config=lc->config;
-    lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",15);
-    lc->max_calls=lp_config_get_int(config,"misc","max_calls",NB_MAX_CALLS);
+       lc->max_call_logs=lp_config_get_int(config,"misc","history_max_size",15);
+       lc->max_calls=lp_config_get_int(config,"misc","max_calls",NB_MAX_CALLS);
 }
 
 
 
 
-static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, const char *config_path,
-    const char *factory_config_path, void * userdata)
+static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, LpConfig *config, void * userdata)
 {
        ms_message("Initializing LinphoneCore %s", linphone_core_get_version());
        memset (lc, 0, sizeof (LinphoneCore));
+       lc->config=config;
        lc->data=userdata;
        lc->ringstream_autorelease=TRUE;
 
@@ -1273,6 +1285,8 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
        linphone_core_assign_payload_type(lc,&payload_type_silk_wb,-1,NULL);
        linphone_core_assign_payload_type(lc,&payload_type_silk_swb,-1,NULL);
        linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no");
+       linphone_core_assign_payload_type(lc,&payload_type_aaceld_22k,-1,"config=F8EE2000; constantDuration=512;  indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5");
+       linphone_core_assign_payload_type(lc,&payload_type_aaceld_44k,-1,"config=F8E82000; constantDuration=512;  indexDeltaLength=3; indexLength=3; mode=AAC-hbr; profile-level-id=76; sizeLength=13; streamType=5");
        linphone_core_handle_static_payloads(lc);
        
        ms_init();
@@ -1281,10 +1295,6 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
        lc->msevq=ms_event_queue_new();
        ms_set_global_event_queue(lc->msevq);
 
-       lc->config=lp_config_new(config_path);
-       if (factory_config_path)
-               lp_config_read_file(lc->config,factory_config_path);
-
        lc->sal=sal_init();
        sal_set_user_pointer(lc->sal,lc);
        sal_set_callbacks(lc->sal,&linphone_sal_callbacks);
@@ -1330,13 +1340,19 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta
  *        It is OPTIONAL, use NULL if unneeded.
  * @param userdata an opaque user pointer that can be retrieved at any time (for example in
  *        callbacks) using linphone_core_get_user_data().
- *
+ * @see linphone_core_new_with_config
 **/
 LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable,
                                                const char *config_path, const char *factory_config_path, void * userdata)
 {
-       LinphoneCore *core=ms_new(LinphoneCore,1);
-       linphone_core_init(core,vtable,config_path, factory_config_path, userdata);
+       LpConfig *config = lp_config_new_with_factory(config_path, factory_config_path);
+       return linphone_core_new_with_config(vtable, config, userdata);
+}
+
+LinphoneCore *linphone_core_new_with_config(const LinphoneCoreVTable *vtable, struct _LpConfig *config, void *userdata)
+{
+       LinphoneCore *core = ms_new(LinphoneCore, 1);
+       linphone_core_init(core, vtable, config, userdata);
        return core;
 }
 
@@ -1703,7 +1719,7 @@ void linphone_core_set_nortp_timeout(LinphoneCore *lc, int nortp_timeout){
 **/
 bool_t linphone_core_get_use_info_for_dtmf(LinphoneCore *lc)
 {
-       return lc->sip_conf.use_info;
+       return lp_config_get_int(lc->config, "sip", "use_info", 0);
 }
 
 /**
@@ -1713,7 +1729,9 @@ bool_t linphone_core_get_use_info_for_dtmf(LinphoneCore *lc)
 **/
 void linphone_core_set_use_info_for_dtmf(LinphoneCore *lc,bool_t use_info)
 {
-       lc->sip_conf.use_info=use_info;
+       if (linphone_core_ready(lc)) {
+               lp_config_set_int(lc->config, "sip", "use_info", use_info);
+       }
 }
 
 /**
@@ -1723,7 +1741,7 @@ void linphone_core_set_use_info_for_dtmf(LinphoneCore *lc,bool_t use_info)
 **/
 bool_t linphone_core_get_use_rfc2833_for_dtmf(LinphoneCore *lc)
 {
-       return lc->sip_conf.use_rfc2833;
+       return lp_config_get_int(lc->config, "sip", "use_rfc2833", 1);
 }
 
 /**
@@ -1733,7 +1751,9 @@ bool_t linphone_core_get_use_rfc2833_for_dtmf(LinphoneCore *lc)
 **/
 void linphone_core_set_use_rfc2833_for_dtmf(LinphoneCore *lc,bool_t use_rfc2833)
 {
-       lc->sip_conf.use_rfc2833=use_rfc2833;
+       if (linphone_core_ready(lc)) {
+               lp_config_set_int(lc->config, "sip", "use_rfc2833", use_rfc2833);
+       }
 }
 
 /**
@@ -2116,10 +2136,12 @@ void linphone_core_iterate(LinphoneCore *lc){
                if (call->state==LinphoneCallIncomingReceived){
                        ms_message("incoming call ringing for %i seconds",elapsed);
                        if (elapsed>lc->sip_conf.inc_timeout){
+                               LinphoneReason decline_reason;
                                ms_message("incoming call timeout (%i)",lc->sip_conf.inc_timeout);
+                               decline_reason=lc->current_call ? LinphoneReasonBusy : LinphoneReasonDeclined;
                                call->log->status=LinphoneCallMissed;
                                call->reason=LinphoneReasonNotAnswered;
-                               linphone_core_terminate_call(lc,call);
+                               linphone_core_decline_call(lc,call,decline_reason);
                        }
                }
                if (lc->sip_conf.in_call_timeout > 0 && elapsed>lc->sip_conf.in_call_timeout) {
@@ -2148,8 +2170,10 @@ void linphone_core_iterate(LinphoneCore *lc){
                lc->initial_subscribes_sent=TRUE;
        }
 
-       if (one_second_elapsed && lp_config_needs_commit(lc->config)){
-               lp_config_sync(lc->config);
+       if (one_second_elapsed) {
+               if (lp_config_needs_commit(lc->config)) {
+                       lp_config_sync(lc->config);
+               }
        }
 }
 
@@ -2753,7 +2777,7 @@ void linphone_core_notify_incoming_call(LinphoneCore *lc, LinphoneCall *call){
        }else{
                /* else play a tone within the context of the current call */
                call->ringing_beep=TRUE;
-               linphone_core_play_tone(lc);
+               linphone_core_play_named_tone(lc,LinphoneToneCallWaiting);
        }
 
        linphone_call_set_state(call,LinphoneCallIncomingReceived,"Incoming call");
@@ -3304,8 +3328,7 @@ bool_t linphone_core_in_call(const LinphoneCore *lc){
  *
  * @ingroup call_control
 **/
-LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc)
-{
+LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc){
        return lc->current_call;
 }
 
@@ -3315,7 +3338,14 @@ LinphoneCall *linphone_core_get_current_call(const LinphoneCore *lc)
  *
  * @ingroup call_control
 **/
-int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call)
+int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call){
+       int err=_linphone_core_pause_call(lc,call);
+       if (err==0)  call->paused_by_app=TRUE;
+       return err;
+}
+
+/* Internal version that does not play tone indication*/
+int _linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call)
 {
        const char *subject=NULL;
 
@@ -3353,6 +3383,7 @@ int linphone_core_pause_call(LinphoneCore *lc, LinphoneCall *call)
                lc->vtable.display_status(lc,_("Pausing the current call..."));
        if (call->audiostream || call->videostream)
                linphone_call_stop_media_streams (call);
+       call->paused_by_app=FALSE;
        return 0;
 }
 
@@ -3366,7 +3397,7 @@ int linphone_core_pause_all_calls(LinphoneCore *lc){
                LinphoneCall *call=(LinphoneCall *)elem->data;
                LinphoneCallState cs=linphone_call_get_state(call);
                if (cs==LinphoneCallStreamsRunning || cs==LinphoneCallPausedByRemote){
-                       linphone_core_pause_call(lc,call);
+                       _linphone_core_pause_call(lc,call);
                }
        }
        return 0;
@@ -3381,7 +3412,11 @@ void linphone_core_preempt_sound_resources(LinphoneCore *lc){
        current_call=linphone_core_get_current_call(lc);
        if(current_call != NULL){
                ms_message("Pausing automatically the current call.");
-               linphone_core_pause_call(lc,current_call);
+               _linphone_core_pause_call(lc,current_call);
+       }
+       if (lc->ringstream){
+               ring_stop(lc->ringstream);
+               lc->ringstream=NULL;
        }
 }
 
@@ -4692,7 +4727,7 @@ int linphone_core_get_device_rotation(LinphoneCore *lc ) {
  *
 **/
 void linphone_core_set_device_rotation(LinphoneCore *lc, int rotation) {
-ms_message("%s : rotation=%d\n", __FUNCTION__, rotation);
+       ms_message("%s : rotation=%d\n", __FUNCTION__, rotation);
        lc->device_rotation = rotation;
 #ifdef VIDEO_ENABLED
        LinphoneCall *call=linphone_core_get_current_call(lc);
@@ -4892,23 +4927,44 @@ void linphone_core_play_dtmf(LinphoneCore *lc, char dtmf, int duration_ms){
        else ms_filter_call_method(f, MS_DTMF_GEN_START, &dtmf);
 }
 
-/**
- * @ingroup media_parameters
- * Plays a repeated tone to the local user until next further call to #linphone_core_stop_dtmf()
- * @param lc #LinphoneCore
-**/
-void linphone_core_play_tone(LinphoneCore *lc){
-       MSFilter *f=get_dtmf_gen(lc);
-       MSDtmfGenCustomTone def;
-       if (f==NULL){
-               ms_error("No dtmf generator at this time !");
-               return;
+void linphone_core_play_named_tone(LinphoneCore *lc, LinphoneToneID toneid){
+       if (linphone_core_tone_indications_enabled(lc)){
+               MSFilter *f=get_dtmf_gen(lc);
+               MSDtmfGenCustomTone def;
+               if (f==NULL){
+                       ms_error("No dtmf generator at this time !");
+                       return;
+               }
+               memset(&def,0,sizeof(def));
+               def.amplitude=1;
+               /*these are french tones, excepted the failed one, which is USA congestion tone (does not exist in France)*/
+               switch(toneid){
+                       case LinphoneToneCallOnHold:
+                       case LinphoneToneCallWaiting:
+                               def.duration=300;
+                               def.frequencies[0]=440;
+                               def.interval=2000;
+                       break;
+                       case LinphoneToneBusy:
+                               def.duration=500;
+                               def.frequencies[0]=440;
+                               def.interval=500;
+                               def.repeat_count=3;
+                       break;
+                       case LinphoneToneCallFailed:
+                               def.duration=250;
+                               def.frequencies[0]=480;
+                               def.frequencies[0]=620;
+                               def.interval=250;
+                               def.repeat_count=3;
+                               
+                       break;
+                       default:
+                               ms_warning("Unhandled tone id.");
+               }
+               if (def.duration>0)
+                       ms_filter_call_method(f, MS_DTMF_GEN_PLAY_CUSTOM,&def);
        }
-       def.duration=300;
-       def.frequency=500;
-       def.amplitude=1;
-       def.interval=2000;
-       ms_filter_call_method(f, MS_DTMF_GEN_PLAY_CUSTOM,&def);
 }
 
 /**
@@ -5050,8 +5106,6 @@ void sip_config_uninit(LinphoneCore *lc)
        lp_config_set_int(lc->config,"sip","inc_timeout",config->inc_timeout);
        lp_config_set_int(lc->config,"sip","in_call_timeout",config->in_call_timeout);
        lp_config_set_int(lc->config,"sip","delayed_timeout",config->delayed_timeout);
-       lp_config_set_int(lc->config,"sip","use_info",config->use_info);
-       lp_config_set_int(lc->config,"sip","use_rfc2833",config->use_rfc2833);
        lp_config_set_int(lc->config,"sip","use_ipv6",config->ipv6_enabled);
        lp_config_set_int(lc->config,"sip","register_only_when_network_is_up",config->register_only_when_network_is_up);
        lp_config_set_int(lc->config,"sip","register_only_when_upnp_is_ok",config->register_only_when_upnp_is_ok);