[Asterisk-cvs] asterisk/apps app_dial.c,1.64,1.65 app_senddtmf.c,1.3,1.4
anthm at lists.digium.com
anthm at lists.digium.com
Fri May 7 16:30:07 CDT 2004
Update of /usr/cvsroot/asterisk/apps
In directory mongoose.digium.com:/tmp/cvs-serv17955/apps
Modified Files:
app_dial.c app_senddtmf.c
Log Message:
Created API call ast_dtmf_stream
int ast_dtmf_stream(struct ast_channel *chan,struct ast_channel *peer,char *digits,int between)
changed app_senddtmf.c to use this new call
added D() parameter to app_dial to allow post connect dtmf stream to be sent using above call
-Tony
Index: app_dial.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_dial.c,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -d -r1.64 -r1.65
--- app_dial.c 4 May 2004 19:11:25 -0000 1.64
+++ app_dial.c 7 May 2004 20:39:14 -0000 1.65
@@ -70,6 +70,8 @@
" 'g' -- goes on in context if the destination channel hangs up\n"
" 'A(x)' -- play an announcement to the called party, using x as file\n"
" 'S(x)' -- hangup the call after x seconds AFTER called party picked up\n"
+" 'D([digits])' -- Send DTMF digit string *after* called party has answered\n"
+" but before the bridge. (w=500ms sec pause)\n"
" 'L(x[:y][:z])' -- Limit the call to 'x' ms warning when 'y' ms are left (repeated every 'z' ms)\n"
" -- Only 'x' is required, 'y' and 'z' are optional.\n"
" -- The following special variables are optional:\n"
@@ -410,6 +412,8 @@
char *start_sound=NULL;
char *limitptr;
char limitdata[256];
+ char *sdtmfptr;
+ char sdtmfdata[256] = "";
char *stack,*var;
int play_to_caller=0,play_to_callee=0;
int playargs=0;
@@ -461,83 +465,100 @@
ast_verbose(VERBOSE_PREFIX_3 "Setting call duration limit to %i seconds.\n",calldurationlimit);
}
+ /* DTMF SCRIPT*/
+ if ((sdtmfptr = strstr(transfer, "D("))) {
+ strncpy(sdtmfdata, sdtmfptr + 2, sizeof(sdtmfdata) - 1);
+ /* Overwrite with X's what was the sdtmf info */
+ while(*sdtmfptr && (*sdtmfptr != ')'))
+ *(sdtmfptr++) = 'X';
+ if (*sdtmfptr)
+ *sdtmfptr = 'X';
+ /* Now find the end */
+ sdtmfptr = strchr(sdtmfdata, ')');
+ if (sdtmfptr)
+ *sdtmfptr = '\0';
+ else {
+ ast_log(LOG_WARNING, "D( Data lacking trailing ')'\n");
+ }
+ }
+
/* XXX LIMIT SUPPORT */
if ((limitptr = strstr(transfer, "L("))) {
- strncpy(limitdata, limitptr + 2, sizeof(limitdata) - 1);
- /* Overwrite with X's what was the limit info */
- while(*limitptr && (*limitptr != ')'))
- *(limitptr++) = 'X';
- if (*limitptr)
- *limitptr = 'X';
- /* Now find the end of the privdb */
- limitptr = strchr(limitdata, ')');
- if (limitptr)
- *limitptr = '\0';
- else {
- ast_log(LOG_WARNING, "Limit Data lacking trailing ')'\n");
- }
-
- var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLER");
- play_to_caller = var ? ast_true(var) : 1;
-
- var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLEE");
- play_to_callee = var ? ast_true(var) : 0;
-
- if(! play_to_caller && ! play_to_callee)
- play_to_caller=1;
-
- var = pbx_builtin_getvar_helper(chan,"LIMIT_WARNING_FILE");
- warning_sound = var ? var : "timeleft";
-
- var = pbx_builtin_getvar_helper(chan,"LIMIT_TIMEOUT_FILE");
- end_sound = var ? var : NULL;
+ strncpy(limitdata, limitptr + 2, sizeof(limitdata) - 1);
+ /* Overwrite with X's what was the limit info */
+ while(*limitptr && (*limitptr != ')'))
+ *(limitptr++) = 'X';
+ if (*limitptr)
+ *limitptr = 'X';
+ /* Now find the end */
+ limitptr = strchr(limitdata, ')');
+ if (limitptr)
+ *limitptr = '\0';
+ else {
+ ast_log(LOG_WARNING, "Limit Data lacking trailing ')'\n");
+ }
- var = pbx_builtin_getvar_helper(chan,"LIMIT_CONNECT_FILE");
- start_sound = var ? var : NULL;
-
- var=stack=limitdata;
-
- var = strsep(&stack, ":");
- if(var) {
- timelimit = atol(var);
- playargs++;
- }
- var = strsep(&stack, ":");
- if(var) {
- play_warning = atol(var);
- playargs++;
- }
+ var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLER");
+ play_to_caller = var ? ast_true(var) : 1;
+
+ var = pbx_builtin_getvar_helper(chan,"LIMIT_PLAYAUDIO_CALLEE");
+ play_to_callee = var ? ast_true(var) : 0;
+
+ if(! play_to_caller && ! play_to_callee)
+ play_to_caller=1;
+
+ var = pbx_builtin_getvar_helper(chan,"LIMIT_WARNING_FILE");
+ warning_sound = var ? var : "timeleft";
+
+ var = pbx_builtin_getvar_helper(chan,"LIMIT_TIMEOUT_FILE");
+ end_sound = var ? var : NULL;
+
+ var = pbx_builtin_getvar_helper(chan,"LIMIT_CONNECT_FILE");
+ start_sound = var ? var : NULL;
+
+ var=stack=limitdata;
- var = strsep(&stack, ":");
- if(var) {
- warning_freq = atol(var);
- playargs++;
- }
-
- if(! timelimit) {
- timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
- warning_sound=NULL;
- }
- calldurationlimit=0; /* undo effect of S(x) in case they are both used */
- /* more efficient do it like S(x) does since no advanced opts*/
- if(! play_warning && ! start_sound && ! end_sound && timelimit) {
- calldurationlimit=timelimit/1000;
- timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
- }
- else {
- ast_verbose(VERBOSE_PREFIX_3"Limit Data:\n");
- ast_verbose(VERBOSE_PREFIX_3"timelimit=%ld\n",timelimit);
- ast_verbose(VERBOSE_PREFIX_3"play_warning=%ld\n",play_warning);
- ast_verbose(VERBOSE_PREFIX_3"play_to_caller=%s\n",play_to_caller ? "yes" : "no");
- ast_verbose(VERBOSE_PREFIX_3"play_to_callee=%s\n",play_to_callee ? "yes" : "no");
- ast_verbose(VERBOSE_PREFIX_3"warning_freq=%ld\n",warning_freq);
- ast_verbose(VERBOSE_PREFIX_3"start_sound=%s\n",start_sound ? start_sound : "UNDEF");
- ast_verbose(VERBOSE_PREFIX_3"warning_sound=%s\n",warning_sound ? warning_sound : "UNDEF");
- ast_verbose(VERBOSE_PREFIX_3"end_sound=%s\n",end_sound ? end_sound : "UNDEF");
- }
-
+ var = strsep(&stack, ":");
+ if(var) {
+ timelimit = atol(var);
+ playargs++;
+ var = strsep(&stack, ":");
+ if(var) {
+ play_warning = atol(var);
+ playargs++;
+ var = strsep(&stack, ":");
+ if(var) {
+ warning_freq = atol(var);
+ playargs++;
+ }
+ }
+ }
+
+ if(! timelimit) {
+ timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
+ warning_sound=NULL;
+ }
+ /* undo effect of S(x) in case they are both used */
+ calldurationlimit=0;
+ /* more efficient do it like S(x) does since no advanced opts*/
+ if(! play_warning && ! start_sound && ! end_sound && timelimit) {
+ calldurationlimit=timelimit/1000;
+ timelimit=play_to_caller=play_to_callee=play_warning=warning_freq=0;
+ }
+ else if (option_verbose > 2) {
+ ast_verbose(VERBOSE_PREFIX_3"Limit Data:\n");
+ ast_verbose(VERBOSE_PREFIX_3"timelimit=%ld\n",timelimit);
+ ast_verbose(VERBOSE_PREFIX_3"play_warning=%ld\n",play_warning);
+ ast_verbose(VERBOSE_PREFIX_3"play_to_caller=%s\n",play_to_caller ? "yes" : "no");
+ ast_verbose(VERBOSE_PREFIX_3"play_to_callee=%s\n",play_to_callee ? "yes" : "no");
+ ast_verbose(VERBOSE_PREFIX_3"warning_freq=%ld\n",warning_freq);
+ ast_verbose(VERBOSE_PREFIX_3"start_sound=%s\n",start_sound ? start_sound : "UNDEF");
+ ast_verbose(VERBOSE_PREFIX_3"warning_sound=%s\n",warning_sound ? warning_sound : "UNDEF");
+ ast_verbose(VERBOSE_PREFIX_3"end_sound=%s\n",end_sound ? end_sound : "UNDEF");
+ }
+
}
-
+
/* XXX ANNOUNCE SUPPORT */
if ((ann = strstr(transfer, "A("))) {
announce = 1;
@@ -813,40 +834,51 @@
ast_log(LOG_DEBUG, "app_dial: sendurl=%s.\n", url);
ast_channel_sendurl( peer, url );
} /* /JDG */
- if (announce && announcemsg)
- {
- int res2;
+ if (announce && announcemsg) {
// Start autoservice on the other chan
- res2 = ast_autoservice_start(chan);
+ res = ast_autoservice_start(chan);
// Now Stream the File
- if (!res2)
- res2 = ast_streamfile(peer,announcemsg,peer->language);
- if (!res2)
- res2 = ast_waitstream(peer,"");
+ if (!res)
+ res = ast_streamfile(peer,announcemsg,peer->language);
+ if (!res)
+ res = ast_waitstream(peer,"");
+
// Ok, done. stop autoservice
- res2 = ast_autoservice_stop(chan);
- }
- if (calldurationlimit > 0) {
- time(&now);
- chan->whentohangup = now + calldurationlimit;
+ res = ast_autoservice_stop(chan);
}
+ else
+ res = 0;
- memset(&config,0,sizeof(struct ast_bridge_config));
- config.play_to_caller=play_to_caller;
- config.play_to_callee=play_to_callee;
- config.allowredirect_in = allowredir_in;
- config.allowredirect_out = allowredir_out;
- config.allowdisconnect = allowdisconnect;
- config.timelimit = timelimit;
- config.play_warning = play_warning;
- config.warning_freq = warning_freq;
- config.warning_sound = warning_sound;
- config.end_sound = end_sound;
- config.start_sound = start_sound;
- res = ast_bridge_call(chan,peer,&config);
+ if(!res) {
+ if (calldurationlimit > 0) {
+ time(&now);
+ chan->whentohangup = now + calldurationlimit;
+ }
+ if(strlen(sdtmfdata))
+ res = ast_dtmf_stream(peer,chan,sdtmfdata,0);
+ }
+
+ if(!res) {
+ memset(&config,0,sizeof(struct ast_bridge_config));
+ config.play_to_caller=play_to_caller;
+ config.play_to_callee=play_to_callee;
+ config.allowredirect_in = allowredir_in;
+ config.allowredirect_out = allowredir_out;
+ config.allowdisconnect = allowdisconnect;
+ config.timelimit = timelimit;
+ config.play_warning = play_warning;
+ config.warning_freq = warning_freq;
+ config.warning_sound = warning_sound;
+ config.end_sound = end_sound;
+ config.start_sound = start_sound;
+ res = ast_bridge_call(chan,peer,&config);
+ }
+ else
+ res = -1;
+
if (res != AST_PBX_NO_HANGUP_PEER)
- ast_hangup(peer);
+ ast_hangup(peer);
}
out:
hanguptree(outgoing, NULL);
Index: app_senddtmf.c
===================================================================
RCS file: /usr/cvsroot/asterisk/apps/app_senddtmf.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- app_senddtmf.c 7 Apr 2004 20:14:19 -0000 1.3
+++ app_senddtmf.c 7 May 2004 20:39:14 -0000 1.4
@@ -43,34 +43,13 @@
int res = 0;
struct localuser *u;
char *digits = data;
- struct ast_frame f;
- int x;
+
if (!digits || !strlen(digits)) {
- ast_log(LOG_WARNING, "SendDTMF requires an argument (digits or *#abcd)\n");
+ ast_log(LOG_WARNING, "SendDTMF requires an argument (digits or *#aAbBcCdD)\n");
return -1;
}
LOCAL_USER_ADD(u);
- for (x=0;x<strlen(digits);x++) {
- memset(&f, 0, sizeof(f));
- f.frametype = AST_FRAME_DTMF;
- f.subclass = digits[x];
- f.src = "app_senddtmf";
- if (strchr("0123456789*#abcd",digits[x])==NULL) {
- ast_log(LOG_WARNING, "Illegal DTMF character in string. (0-9*#abcd allowed)\n");
- } else {
- res = ast_write(chan, &f);
- if (res)
- break;
- /* Wait 250ms */
- res = ast_safe_sleep(chan, 250);
- if (res)
- break;
- }
- }
- if (!res)
- if (option_verbose > 2)
- ast_verbose(VERBOSE_PREFIX_3 "Sent digit string '%s' on %s\n", digits, chan->name);
-
+ res = ast_dtmf_stream(chan,NULL,digits,250);
LOCAL_USER_REMOVE(u);
return res;
}
More information about the svn-commits
mailing list