diff --git a/.cproject b/.cproject index 3ccb25959..82c15ae49 100644 --- a/.cproject +++ b/.cproject @@ -211,13 +211,14 @@ make - all + install true false true make + install true true diff --git a/coreapi/ec-calibrator.c b/coreapi/ec-calibrator.c index 4c8a37586..38b83f0d6 100644 --- a/coreapi/ec-calibrator.c +++ b/coreapi/ec-calibrator.c @@ -23,15 +23,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mediastreamer2/mstonedetector.h" #include "mediastreamer2/dtmfgen.h" - +#include "lpconfig.h" static void ecc_init_filters(EcCalibrator *ecc){ + unsigned int rate; ecc->ticker=ms_ticker_new(); ecc->sndread=ms_snd_card_create_reader(ecc->play_card); + ms_filter_call_method(ecc->sndread,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ecc->det=ms_filter_new(MS_TONE_DETECTOR_ID); + ms_filter_call_method(ecc->det,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ecc->rec=ms_filter_new(MS_FILE_REC_ID); ms_filter_link(ecc->sndread,0,ecc->det,0); @@ -39,14 +42,17 @@ static void ecc_init_filters(EcCalibrator *ecc){ ecc->play=ms_filter_new(MS_FILE_PLAYER_ID); ecc->gen=ms_filter_new(MS_DTMF_GEN_ID); + ms_filter_call_method(ecc->gen,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ecc->resampler=ms_filter_new(MS_RESAMPLE_ID); ecc->sndwrite=ms_snd_card_create_writer(ecc->capt_card); ms_filter_link(ecc->play,0,ecc->gen,0); ms_filter_link(ecc->gen,0,ecc->resampler,0); ms_filter_link(ecc->resampler,0,ecc->sndwrite,0); - unsigned int rate; + + ms_filter_call_method(ecc->sndwrite,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->sndwrite,MS_FILTER_GET_SAMPLE_RATE,&rate); + ms_filter_call_method(ecc->resampler,MS_FILTER_SET_SAMPLE_RATE,&ecc->rate); ms_filter_call_method(ecc->resampler,MS_FILTER_SET_OUTPUT_SAMPLE_RATE,&rate); ms_ticker_attach(ecc->ticker,ecc->play); @@ -149,9 +155,10 @@ static void * ecc_thread(void *p){ return NULL; } -EcCalibrator * ec_calibrator_new(MSSndCard *play_card, MSSndCard *capt_card, LinphoneEcCalibrationCallback cb, void *cb_data ){ +EcCalibrator * ec_calibrator_new(MSSndCard *play_card, MSSndCard *capt_card, unsigned int rate, LinphoneEcCalibrationCallback cb, void *cb_data ){ EcCalibrator *ecc=ms_new0(EcCalibrator,1); + ecc->rate=rate; ecc->cb=cb; ecc->cb_data=cb_data; ecc->capt_card=capt_card; @@ -174,6 +181,7 @@ int linphone_core_start_echo_calibration(LinphoneCore *lc, LinphoneEcCalibration ms_error("Echo calibration is still on going !"); return -1; } - lc->ecc=ec_calibrator_new(lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard,cb,cb_data); + unsigned int rate = lp_config_get_int(lc->config,"sound","echo_cancellation_rate",8000); + lc->ecc=ec_calibrator_new(lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard,rate,cb,cb_data); return 0; } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index be0cc7cad..4230a156b 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -228,19 +228,12 @@ LinphoneCall * linphone_call_new_incoming(LinphoneCore *lc, LinphoneAddress *fro */ static void linphone_call_set_terminated(LinphoneCall *call){ - LinphoneCallStatus status=LinphoneCallAborted; LinphoneCore *lc=call->core; linphone_core_update_allocated_audio_bandwidth(lc); - if (call->state==LinphoneCallEnd){ - if (call->reason==LinphoneReasonDeclined){ - status=LinphoneCallDeclined; - } - else status=LinphoneCallSuccess; - - } + call->owns_call_log=FALSE; - linphone_call_log_completed(call->log,call, status); + linphone_call_log_completed(call); if (call == lc->current_call){ @@ -320,8 +313,14 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const call->state=cstate; } if (cstate==LinphoneCallEnd || cstate==LinphoneCallError){ - linphone_call_set_terminated (call); + if (call->reason==LinphoneReasonDeclined){ + call->log->status=LinphoneCallDeclined; + } + linphone_call_set_terminated (call); } + if (cstate == LinphoneCallConnected) { + call->log->status=LinphoneCallSuccess; + } if (lc->vtable.call_state_changed) lc->vtable.call_state_changed(lc,call,cstate,message); @@ -1179,3 +1178,35 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse linphone_core_disconnected(call->core,call); } +void linphone_call_log_completed(LinphoneCall *call){ + LinphoneCore *lc=call->core; + + call->log->duration=time(NULL)-call->start_time; + + if (call->log->status==LinphoneCallMissed){ + char *info; + lc->missed_calls++; + info=ortp_strdup_printf(ngettext("You have missed %i call.", + "You have missed %i calls.", lc->missed_calls), + lc->missed_calls); + if (lc->vtable.display_status!=NULL) + lc->vtable.display_status(lc,info); + ms_free(info); + } + lc->call_logs=ms_list_prepend(lc->call_logs,(void *)call->log); + if (ms_list_size(lc->call_logs)>lc->max_call_logs){ + MSList *elem,*prevelem=NULL; + /*find the last element*/ + for(elem=lc->call_logs;elem!=NULL;elem=elem->next){ + prevelem=elem; + } + elem=prevelem; + linphone_call_log_destroy((LinphoneCallLog*)elem->data); + lc->call_logs=ms_list_remove_link(lc->call_logs,elem); + } + if (lc->vtable.call_log_updated!=NULL){ + lc->vtable.call_log_updated(lc,call->log); + } + call_logs_write_to_config_file(lc); +} + diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 43f662bb7..1b9647f37 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -97,10 +97,11 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *fro set_call_log_date(cl,&loctime); cl->from=from; cl->to=to; + cl->status=LinphoneCallAborted; /*default status*/ return cl; } -static void call_logs_write_to_config_file(LinphoneCore *lc){ +void call_logs_write_to_config_file(LinphoneCore *lc){ MSList *elem; char logsection[32]; int i; @@ -156,37 +157,6 @@ static void call_logs_read_from_config_file(LinphoneCore *lc){ } -void linphone_call_log_completed(LinphoneCallLog *calllog, LinphoneCall *call, LinphoneCallStatus status){ - LinphoneCore *lc=call->core; - - calllog->duration=time(NULL)-call->start_time; - - if (status==LinphoneCallMissed){ - char *info; - lc->missed_calls++; - info=ortp_strdup_printf(ngettext("You have missed %i call.", - "You have missed %i calls.", lc->missed_calls), - lc->missed_calls); - if (lc->vtable.display_status!=NULL) - lc->vtable.display_status(lc,info); - ms_free(info); - }else calllog->status=status; - lc->call_logs=ms_list_prepend(lc->call_logs,(void *)calllog); - if (ms_list_size(lc->call_logs)>lc->max_call_logs){ - MSList *elem,*prevelem=NULL; - /*find the last element*/ - for(elem=lc->call_logs;elem!=NULL;elem=elem->next){ - prevelem=elem; - } - elem=prevelem; - linphone_call_log_destroy((LinphoneCallLog*)elem->data); - lc->call_logs=ms_list_remove_link(lc->call_logs,elem); - } - if (lc->vtable.call_log_updated!=NULL){ - lc->vtable.call_log_updated(lc,calllog); - } - call_logs_write_to_config_file(lc); -} /** * @addtogroup call_logs @@ -494,6 +464,7 @@ static void sip_config_read(LinphoneCore *lc) } sal_use_rport(lc->sal,lp_config_get_int(lc->config,"sip","use_rport",1)); + sal_use_101(lc->sal,lp_config_get_int(lc->config,"sip","use_101",1)); tmp=lp_config_get_int(lc->config,"sip","use_rfc2833",0); linphone_core_set_use_rfc2833_for_dtmf(lc,tmp); @@ -914,6 +885,10 @@ void linphone_core_set_state(LinphoneCore *lc, LinphoneGlobalState gstate, const lc->vtable.global_state_changed(lc,gstate,message); } } +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); +} static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, const char *config_path, const char *factory_config_path, void * userdata) @@ -993,7 +968,7 @@ static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vta video_config_read(lc); //autoreplier_config_init(&lc->autoreplier_conf); lc->presence_mode=LinphoneStatusOnline; - lc->max_call_logs=15; + misc_config_read(lc); ui_config_read(lc); if (lc->vtable.display_status) lc->vtable.display_status(lc,_("Ready")); diff --git a/coreapi/private.h b/coreapi/private.h index c242f8e8a..4739c0c70 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -108,7 +108,7 @@ void linphone_call_set_state(LinphoneCall *call, LinphoneCallState cstate, const /* private: */ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, LinphoneAddress *local, LinphoneAddress * remote); -void linphone_call_log_completed(LinphoneCallLog *calllog, LinphoneCall *call, LinphoneCallStatus status); +void linphone_call_log_completed(LinphoneCall *call); void linphone_call_log_destroy(LinphoneCallLog *cl); void linphone_auth_info_write_config(struct _LpConfig *config, LinphoneAuthInfo *obj, int pos); @@ -472,6 +472,7 @@ struct _EcCalibrator{ int sent_count; int64_t acc; int delay; + unsigned int rate; LinphoneEcCalibratorStatus status; }; @@ -489,5 +490,5 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse #ifndef NB_MAX_CALLS #define NB_MAX_CALLS (10) #endif - +void call_logs_write_to_config_file(LinphoneCore *lc); #endif /* _PRIVATE_H */ diff --git a/coreapi/sal.h b/coreapi/sal.h index ecb140b71..a89b862c0 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -263,6 +263,7 @@ void sal_use_session_timers(Sal *ctx, int expires); void sal_use_double_registrations(Sal *ctx, bool_t enabled); void sal_use_one_matching_codec_policy(Sal *ctx, bool_t one_matching_codec); void sal_use_rport(Sal *ctx, bool_t use_rports); +void sal_use_101(Sal *ctx, bool_t use_101); int sal_iterate(Sal *sal); MSList * sal_get_pending_auths(Sal *sal); diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 34cfd44f5..a0622226c 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -274,6 +274,7 @@ Sal * sal_init(){ sal->keepalive_period=30; sal->double_reg=TRUE; sal->use_rports=TRUE; + sal->use_101=TRUE; return sal; } @@ -369,6 +370,9 @@ int sal_listen_port(Sal *ctx, const char *addr, int port, SalTransport tr, int i /*see if it looks like an IPv6 address*/ int use_rports = ctx->use_rports; // Copy char to int to avoid bad alignment eXosip_set_option(EXOSIP_OPT_USE_RPORT,&use_rports); + int dont_use_101 = !ctx->use_101; // Copy char to int to avoid bad alignment + eXosip_set_option(EXOSIP_OPT_DONT_SEND_101,&dont_use_101); + ipv6=strchr(addr,':')!=NULL; eXosip_enable_ipv6(ipv6); @@ -417,7 +421,9 @@ void sal_use_double_registrations(Sal *ctx, bool_t enabled){ void sal_use_rport(Sal *ctx, bool_t use_rports){ ctx->use_rports=use_rports; } - +void sal_use_101(Sal *ctx, bool_t use_101){ + ctx->use_101=use_101; +} static int extract_received_rport(osip_message_t *msg, const char **received, int *rportval){ osip_via_t *via=NULL; osip_generic_param_t *param=NULL; diff --git a/coreapi/sal_eXosip2.h b/coreapi/sal_eXosip2.h index 1f83a85eb..a050f5133 100644 --- a/coreapi/sal_eXosip2.h +++ b/coreapi/sal_eXosip2.h @@ -43,6 +43,7 @@ struct Sal{ bool_t one_matching_codec; bool_t double_reg; bool_t use_rports; + bool_t use_101; }; struct SalOp{ diff --git a/coreapi/test_ecc.c b/coreapi/test_ecc.c index 7553c2018..43ae0dcb2 100644 --- a/coreapi/test_ecc.c +++ b/coreapi/test_ecc.c @@ -27,10 +27,21 @@ static void calibration_finished(LinphoneCore *lc, LinphoneEcCalibratorStatus st if (status==LinphoneEcCalibratorDone) ms_message("Measured delay is %i",delay); } + +static char config_file[1024]; +void parse_args(int argc, char *argv[]){ + if (argc != 3 || strncmp("-c",argv[1], 2) || access(argv[2],F_OK)!=0) { + printf("Usage: test_ecc [-c config_file] where config_file will be written with the detected value\n"); + exit(-1); + } + strncpy(config_file,argv[2],1024); +} + int main(int argc, char *argv[]){ + if (argc>1) parse_args(argc,argv); int count=0; LinphoneCoreVTable vtable={0}; - LinphoneCore *lc=linphone_core_new(&vtable,NULL,NULL,NULL); + LinphoneCore *lc=linphone_core_new(&vtable,config_file,NULL,NULL); linphone_core_enable_logs(NULL); diff --git a/gtk/linphone.h b/gtk/linphone.h index f76f1b6a8..6cc443f25 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -34,6 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # define _(String) gettext (String) #else # define _(String) (String) +# define ngettext(singular,plural,number) ((number>1) ? (plural) : (singular) ) #endif #undef N_