From f6d765bc22972a44e7a80f39d36a4efc2847df0a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 26 Aug 2010 12:10:12 +0200 Subject: [PATCH] implements playing of dtmfs outside of any call --- console/commands.c | 1 + coreapi/callbacks.c | 10 ++++++++ coreapi/linphonecore.c | 52 +++++++++++++++++++++++++++++++++++++++++- coreapi/linphonecore.h | 3 +++ coreapi/private.h | 1 + gtk-glade/main.c | 8 +++---- mediastreamer2 | 2 +- 7 files changed, 71 insertions(+), 6 deletions(-) diff --git a/console/commands.c b/console/commands.c index 9efc054e7..2fd9b5401 100644 --- a/console/commands.c +++ b/console/commands.c @@ -296,6 +296,7 @@ linphonec_parse_command_line(LinphoneCore *lc, char *cl) while ( isdigit(*cl) || *cl == '#' || *cl == '*' ) { linphone_core_send_dtmf(lc, *cl); + linphone_core_play_dtmf (lc,*cl,100); ms_sleep(1); // be nice ++cl; } diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 6d0cd8b8f..aad80a60d 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -97,6 +97,11 @@ static void call_received(SalOp *h){ /* play the ring if this is the only call*/ if (lc->sound_conf.ring_sndcard!=NULL && ms_list_size(lc->calls)==1){ + if (lc->ringstream && lc->dmfs_playing_start_time!=0){ + ring_stop(lc->ringstream); + lc->ringstream=NULL; + lc->dmfs_playing_start_time=0; + } if(lc->ringstream==NULL){ MSSndCard *ringcard=lc->sound_conf.lsd_card ?lc->sound_conf.lsd_card : lc->sound_conf.ring_sndcard; ms_message("Starting local ring..."); @@ -129,6 +134,11 @@ static void call_ringing(SalOp *h){ md=sal_call_get_final_media_description(h); if (md==NULL){ + if (lc->ringstream && lc->dmfs_playing_start_time!=0){ + ring_stop(lc->ringstream); + lc->ringstream=NULL; + lc->dmfs_playing_start_time=0; + } if (lc->ringstream!=NULL) return; /*already ringing !*/ if (lc->sound_conf.play_sndcard!=NULL){ MSSndCard *ringcard=lc->sound_conf.lsd_card ? lc->sound_conf.lsd_card : lc->sound_conf.play_sndcard; diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index cede342dc..5f388860b 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "mediastreamer2/mseventqueue.h" #include "mediastreamer2/msvolume.h" #include "mediastreamer2/msequalizer.h" +#include "mediastreamer2/dtmfgen.h" #ifdef INET6 #ifndef WIN32 @@ -1641,6 +1642,13 @@ void linphone_core_iterate(LinphoneCore *lc){ lc_callback_obj_invoke(&lc->preview_finished_cb,lc); } + if (lc->ringstream && lc->dmfs_playing_start_time!=0 + && (curtime-lc->dmfs_playing_start_time)>5){ + ring_stop(lc->ringstream); + lc->ringstream=NULL; + lc->dmfs_playing_start_time=0; + } + sal_iterate(lc->sal); ms_event_queue_pump(lc->msevq); if (lc->auto_net_state_mon) monitor_network_state(lc,curtime); @@ -1671,7 +1679,7 @@ void linphone_core_iterate(LinphoneCore *lc){ call = linphone_core_get_current_call(lc); if(call) { - if (one_second_elapsed) + if (call->state==LinphoneCallStreamsRunning && one_second_elapsed) { RtpSession *as=NULL,*vs=NULL; lc->prevtime=curtime; @@ -3284,6 +3292,48 @@ void linphone_core_set_record_file(LinphoneCore *lc, const char *file){ } } +static MSFilter *get_dtmf_gen(LinphoneCore *lc){ + LinphoneCall *call=linphone_core_get_current_call (lc); + if (call){ + AudioStream *stream=call->audiostream; + if (stream){ + return stream->dtmfgen; + } + } + if (lc->ringstream==NULL){ + MSSndCard *ringcard=lc->sound_conf.lsd_card ?lc->sound_conf.lsd_card : lc->sound_conf.ring_sndcard; + lc->ringstream=ring_start(NULL,0,ringcard); + lc->dmfs_playing_start_time=time(NULL); + }else{ + if (lc->dmfs_playing_start_time!=0) + lc->dmfs_playing_start_time=time(NULL); + } + return lc->ringstream->gendtmf; +} + +/** + * Plays a dtmf to the local user. +**/ +void linphone_core_play_dtmf(LinphoneCore *lc, char dtmf, int duration_ms){ + MSFilter *f=get_dtmf_gen(lc); + if (f==NULL){ + ms_error("No dtmf generator at this time !"); + return; + } + if (duration_ms>0) + ms_filter_call_method(f, MS_DTMF_GEN_PLAY, &dtmf); + else ms_filter_call_method(f, MS_DTMF_GEN_START, &dtmf); +} + +/** + * Stops playing a dtmf started by linphone_core_play_dtmf(). +**/ +void linphone_core_stop_dtmf(LinphoneCore *lc){ + MSFilter *f=get_dtmf_gen(lc); + ms_filter_call_method_noarg (f, MS_DTMF_GEN_STOP); +} + + /** * Retrieves the user pointer that was given to linphone_core_new() * diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index d0c680d92..e67da5209 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -769,6 +769,9 @@ void linphone_core_use_files(LinphoneCore *lc, bool_t yesno); void linphone_core_set_play_file(LinphoneCore *lc, const char *file); void linphone_core_set_record_file(LinphoneCore *lc, const char *file); +void linphone_core_play_dtmf(LinphoneCore *lc, char dtmf, int duration_ms); +void linphone_core_stop_dtmf(LinphoneCore *lc); + int linphone_core_get_current_call_duration(const LinphoneCore *lc); const LinphoneAddress *linphone_core_get_remote_address(LinphoneCore *lc); diff --git a/coreapi/private.h b/coreapi/private.h index cb3ff78e2..bbb48d0cb 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -367,6 +367,7 @@ struct _LinphoneCore MSList *friends; MSList *auth_info; struct _RingStream *ringstream; + time_t dmfs_playing_start_time; LCCallbackObj preview_finished_cb; LinphoneCall *current_call; /* the current call */ MSList *calls; /* all the processed calls */ diff --git a/gtk-glade/main.c b/gtk-glade/main.c index d5a1b0997..ddae9ff90 100644 --- a/gtk-glade/main.c +++ b/gtk-glade/main.c @@ -997,12 +997,12 @@ void linphone_gtk_load_identities(void){ static void linphone_gtk_dtmf_clicked(GtkButton *button){ const char *label=gtk_button_get_label(button); + GtkWidget *uri_bar=linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"uribar"); + int pos=-1; + gtk_editable_insert_text(GTK_EDITABLE(uri_bar),label,1,&pos); + linphone_core_play_dtmf (linphone_gtk_get_core(),label[0],100); if (linphone_core_in_call(linphone_gtk_get_core())){ linphone_core_send_dtmf(linphone_gtk_get_core(),label[0]); - }else{ - GtkWidget *uri_bar=linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(button)),"uribar"); - int pos=-1; - gtk_editable_insert_text(GTK_EDITABLE(uri_bar),label,1,&pos); } } diff --git a/mediastreamer2 b/mediastreamer2 index 030250c16..332d79209 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 030250c162f546af5b1c2b97e51a71d81a73679b +Subproject commit 332d79209b333bd8ded5b16a7b9dcfe2c0aedc63