while ( isdigit(*cl) || *cl == '#' || *cl == '*' )
{
linphone_core_send_dtmf(lc, *cl);
+ linphone_core_play_dtmf (lc,*cl,100);
ms_sleep(1); // be nice
++cl;
}
/* 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...");
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;
#include "mediastreamer2/mseventqueue.h"
#include "mediastreamer2/msvolume.h"
#include "mediastreamer2/msequalizer.h"
+#include "mediastreamer2/dtmfgen.h"
#ifdef INET6
#ifndef WIN32
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);
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;
}
}
+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()
*
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);
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 */
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);
}
}
-Subproject commit 030250c162f546af5b1c2b97e51a71d81a73679b
+Subproject commit 332d79209b333bd8ded5b16a7b9dcfe2c0aedc63