Extend the ast_senddigit and ast_dtmf_stream API calls to allow the duration of the DTMF digit(s) to be specified and make the SendDTMF application have the capability to use it.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@78278 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Joshua Colp 2007-08-06 21:52:30 +00:00
parent 431c60f818
commit 9ef1b0a974
8 changed files with 30 additions and 26 deletions

View File

@ -1527,7 +1527,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
/* Ok, done. stop autoservice */
res = ast_autoservice_stop(chan);
if (digit > 0 && !res)
res = ast_senddigit(chan, digit);
res = ast_senddigit(chan, digit, 0);
else
res = digit;
@ -1696,12 +1696,12 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags
if (!ast_strlen_zero(dtmfcalled)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Sending DTMF '%s' to the called party.\n", dtmfcalled);
res = ast_dtmf_stream(peer,chan,dtmfcalled,250);
res = ast_dtmf_stream(peer,chan,dtmfcalled,250,0);
}
if (!ast_strlen_zero(dtmfcalling)) {
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Sending DTMF '%s' to the calling party.\n", dtmfcalling);
res = ast_dtmf_stream(chan,peer,dtmfcalling,250);
res = ast_dtmf_stream(chan,peer,dtmfcalling,250,0);
}
}

View File

@ -60,10 +60,11 @@ static int senddtmf_exec(struct ast_channel *chan, void *vdata)
{
int res = 0;
char *data;
int timeout;
int timeout, duration;
AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(digits);
AST_APP_ARG(timeout);
AST_APP_ARG(duration);
);
if (ast_strlen_zero(vdata)) {
@ -75,7 +76,8 @@ static int senddtmf_exec(struct ast_channel *chan, void *vdata)
AST_STANDARD_APP_ARGS(args, data);
timeout = atoi(args.timeout);
res = ast_dtmf_stream(chan, NULL, args.digits, timeout <= 0 ? 250 : timeout);
duration = atoi(args.duration);
res = ast_dtmf_stream(chan, NULL, args.digits, timeout <= 0 ? 250 : timeout, duration);
return res;
}
@ -102,7 +104,7 @@ static int manager_play_dtmf(struct mansession *s, const struct message *m)
return 0;
}
ast_senddigit(chan, *digit);
ast_senddigit(chan, *digit, 0);
ast_mutex_unlock(&chan->lock);
astman_send_ack(s, m, "DTMF successfully queued");

View File

@ -148,7 +148,7 @@ static int testclient_exec(struct ast_channel *chan, void *data)
res = ast_safe_sleep(chan, 3000);
/* Transmit client version */
if (!res)
res = ast_dtmf_stream(chan, NULL, "8378*1#", 0);
res = ast_dtmf_stream(chan, NULL, "8378*1#", 0, 0);
ast_debug(1, "Transmit client version\n");
/* Read server version */
@ -166,9 +166,9 @@ static int testclient_exec(struct ast_channel *chan, void *data)
res = ast_safe_sleep(chan, 1000);
/* Send test id */
if (!res)
res = ast_dtmf_stream(chan, NULL, testid, 0);
res = ast_dtmf_stream(chan, NULL, testid, 0, 0);
if (!res)
res = ast_dtmf_stream(chan, NULL, "#", 0);
res = ast_dtmf_stream(chan, NULL, "#", 0, 0);
ast_debug(1, "send test identifier: %s\n", testid);
if ((res >=0) && (!ast_strlen_zero(testid))) {
@ -198,7 +198,7 @@ static int testclient_exec(struct ast_channel *chan, void *data)
if (!res) {
/* Step 2: Send "2" */
ast_debug(1, "TestClient: 2. Send DTMF 2\n");
res = ast_dtmf_stream(chan, NULL, "2", 0);
res = ast_dtmf_stream(chan, NULL, "2", 0, 0);
fprintf(f, "SEND DTMF 2: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0)
res = 0;
@ -265,7 +265,7 @@ static int testclient_exec(struct ast_channel *chan, void *data)
if (!res) {
/* Step 10: Send "7" */
ast_debug(1, "TestClient: 7. Send DTMF 7\n");
res = ast_dtmf_stream(chan, NULL, "7", 0);
res = ast_dtmf_stream(chan, NULL, "7", 0, 0);
fprintf(f, "SEND DTMF 7: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0)
res =0;
@ -318,7 +318,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
res = ast_safe_sleep(chan, 1000);
if (!res)
res = ast_dtmf_stream(chan, NULL, "8378*1#", 0);
res = ast_dtmf_stream(chan, NULL, "8378*1#", 0, 0);
if (res > 0)
res = 0;
@ -344,7 +344,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) {
/* Step 1: Send "1" */
ast_debug(1, "TestServer: 1. Send DTMF 1\n");
res = ast_dtmf_stream(chan, NULL, "1", 0);
res = ast_dtmf_stream(chan, NULL, "1", 0,0 );
fprintf(f, "SEND DTMF 1: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0)
res = 0;
@ -370,7 +370,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) {
/* Step 4: Send "4" */
ast_debug(1, "TestServer: 4. Send DTMF 4\n");
res = ast_dtmf_stream(chan, NULL, "4", 0);
res = ast_dtmf_stream(chan, NULL, "4", 0, 0);
fprintf(f, "SEND DTMF 4: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0)
res = 0;
@ -397,7 +397,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) {
/* Step 7: Send "5" */
ast_debug(1, "TestServer: 7. Send DTMF 5\n");
res = ast_dtmf_stream(chan, NULL, "5", 0);
res = ast_dtmf_stream(chan, NULL, "5", 0, 0);
fprintf(f, "SEND DTMF 5: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0)
res = 0;
@ -426,7 +426,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) {
/* Step 10: Send "8" */
ast_debug(1, "TestServer: 10. Send DTMF 8\n");
res = ast_dtmf_stream(chan, NULL, "8", 0);
res = ast_dtmf_stream(chan, NULL, "8", 0, 0);
fprintf(f, "SEND DTMF 8: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0)
res = 0;

View File

@ -157,8 +157,9 @@ void ast_unreplace_sigchld(void);
\param between This is the number of milliseconds to wait in between each
DTMF digit. If zero milliseconds is specified, then the
default value of 100 will be used.
\param duration This is the duration that each DTMF digit should have.
*/
int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, const char *digits, int between);
int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, const char *digits, int between, unsigned int duration);
/*! Stream a filename (or file descriptor) as a generator. */
int ast_linear_stream(struct ast_channel *chan, const char *filename, int fd, int allowoverride);

View File

@ -950,9 +950,10 @@ int ast_recvchar(struct ast_channel *chan, int timeout);
* Send a DTMF digit to a channel.
* \param chan channel to act upon
* \param digit the DTMF digit to send, encoded in ASCII
* \param duration the duration of the digit ending in ms
* \return Returns 0 on success, -1 on failure
*/
int ast_senddigit(struct ast_channel *chan, char digit);
int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration);
/*! \brief Send a DTMF digit to a channel
* Send a DTMF digit to a channel.

View File

@ -245,7 +245,7 @@ int ast_app_messagecount(const char *context, const char *mailbox, const char *f
return 0;
}
int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, const char *digits, int between)
int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, const char *digits, int between, unsigned int duration)
{
const char *ptr;
int res = 0;
@ -274,7 +274,7 @@ int ast_dtmf_stream(struct ast_channel *chan, struct ast_channel *peer, const ch
/* ignore return values if not supported by channel */
ast_indicate(chan, AST_CONTROL_FLASH);
} else
ast_senddigit(chan, *ptr);
ast_senddigit(chan, *ptr, duration);
/* pause between digits */
if ((res = ast_safe_sleep(chan, between)))
break;

View File

@ -2657,14 +2657,14 @@ int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duratio
return 0;
}
int ast_senddigit(struct ast_channel *chan, char digit)
int ast_senddigit(struct ast_channel *chan, char digit, unsigned int duration)
{
if (chan->tech->send_digit_begin) {
ast_senddigit_begin(chan, digit);
ast_safe_sleep(chan, AST_DEFAULT_EMULATE_DTMF_DURATION);
ast_safe_sleep(chan, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
}
return ast_senddigit_end(chan, digit, AST_DEFAULT_EMULATE_DTMF_DURATION);
return ast_senddigit_end(chan, digit, (duration >= AST_DEFAULT_EMULATE_DTMF_DURATION ? duration : AST_DEFAULT_EMULATE_DTMF_DURATION));
}
int ast_prod(struct ast_channel *chan)

View File

@ -1678,11 +1678,11 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
digits to come in for features. */
ast_debug(1, "Timed out for feature!\n");
if (!ast_strlen_zero(peer_featurecode)) {
ast_dtmf_stream(chan, peer, peer_featurecode, 0);
ast_dtmf_stream(chan, peer, peer_featurecode, 0, 0);
memset(peer_featurecode, 0, sizeof(peer_featurecode));
}
if (!ast_strlen_zero(chan_featurecode)) {
ast_dtmf_stream(peer, chan, chan_featurecode, 0);
ast_dtmf_stream(peer, chan, chan_featurecode, 0, 0);
memset(chan_featurecode, 0, sizeof(chan_featurecode));
}
if (f)
@ -1774,7 +1774,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast
res = ast_feature_interpret(chan, peer, config, featurecode, sense);
switch(res) {
case FEATURE_RETURN_PASSDIGITS:
ast_dtmf_stream(other, who, featurecode, 0);
ast_dtmf_stream(other, who, featurecode, 0, 0);
/* Fall through */
case FEATURE_RETURN_SUCCESS:
memset(featurecode, 0, sizeof(chan_featurecode));