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 */ /* Ok, done. stop autoservice */
res = ast_autoservice_stop(chan); res = ast_autoservice_stop(chan);
if (digit > 0 && !res) if (digit > 0 && !res)
res = ast_senddigit(chan, digit); res = ast_senddigit(chan, digit, 0);
else else
res = digit; 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 (!ast_strlen_zero(dtmfcalled)) {
if (option_verbose > 2) if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Sending DTMF '%s' to the called party.\n", dtmfcalled); 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 (!ast_strlen_zero(dtmfcalling)) {
if (option_verbose > 2) if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Sending DTMF '%s' to the calling party.\n", dtmfcalling); 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; int res = 0;
char *data; char *data;
int timeout; int timeout, duration;
AST_DECLARE_APP_ARGS(args, AST_DECLARE_APP_ARGS(args,
AST_APP_ARG(digits); AST_APP_ARG(digits);
AST_APP_ARG(timeout); AST_APP_ARG(timeout);
AST_APP_ARG(duration);
); );
if (ast_strlen_zero(vdata)) { 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); AST_STANDARD_APP_ARGS(args, data);
timeout = atoi(args.timeout); 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; return res;
} }
@@ -102,7 +104,7 @@ static int manager_play_dtmf(struct mansession *s, const struct message *m)
return 0; return 0;
} }
ast_senddigit(chan, *digit); ast_senddigit(chan, *digit, 0);
ast_mutex_unlock(&chan->lock); ast_mutex_unlock(&chan->lock);
astman_send_ack(s, m, "DTMF successfully queued"); 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); res = ast_safe_sleep(chan, 3000);
/* Transmit client version */ /* Transmit client version */
if (!res) 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"); ast_debug(1, "Transmit client version\n");
/* Read server version */ /* Read server version */
@@ -166,9 +166,9 @@ static int testclient_exec(struct ast_channel *chan, void *data)
res = ast_safe_sleep(chan, 1000); res = ast_safe_sleep(chan, 1000);
/* Send test id */ /* Send test id */
if (!res) if (!res)
res = ast_dtmf_stream(chan, NULL, testid, 0); res = ast_dtmf_stream(chan, NULL, testid, 0, 0);
if (!res) 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); ast_debug(1, "send test identifier: %s\n", testid);
if ((res >=0) && (!ast_strlen_zero(testid))) { if ((res >=0) && (!ast_strlen_zero(testid))) {
@@ -198,7 +198,7 @@ static int testclient_exec(struct ast_channel *chan, void *data)
if (!res) { if (!res) {
/* Step 2: Send "2" */ /* Step 2: Send "2" */
ast_debug(1, "TestClient: 2. Send DTMF 2\n"); 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"); fprintf(f, "SEND DTMF 2: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0) if (res > 0)
res = 0; res = 0;
@@ -265,7 +265,7 @@ static int testclient_exec(struct ast_channel *chan, void *data)
if (!res) { if (!res) {
/* Step 10: Send "7" */ /* Step 10: Send "7" */
ast_debug(1, "TestClient: 7. Send DTMF 7\n"); 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"); fprintf(f, "SEND DTMF 7: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0) if (res > 0)
res =0; res =0;
@@ -318,7 +318,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
res = ast_safe_sleep(chan, 1000); res = ast_safe_sleep(chan, 1000);
if (!res) if (!res)
res = ast_dtmf_stream(chan, NULL, "8378*1#", 0); res = ast_dtmf_stream(chan, NULL, "8378*1#", 0, 0);
if (res > 0) if (res > 0)
res = 0; res = 0;
@@ -344,7 +344,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) { if (!res) {
/* Step 1: Send "1" */ /* Step 1: Send "1" */
ast_debug(1, "TestServer: 1. Send DTMF 1\n"); 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"); fprintf(f, "SEND DTMF 1: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0) if (res > 0)
res = 0; res = 0;
@@ -370,7 +370,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) { if (!res) {
/* Step 4: Send "4" */ /* Step 4: Send "4" */
ast_debug(1, "TestServer: 4. Send DTMF 4\n"); 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"); fprintf(f, "SEND DTMF 4: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0) if (res > 0)
res = 0; res = 0;
@@ -397,7 +397,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) { if (!res) {
/* Step 7: Send "5" */ /* Step 7: Send "5" */
ast_debug(1, "TestServer: 7. Send DTMF 5\n"); 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"); fprintf(f, "SEND DTMF 5: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0) if (res > 0)
res = 0; res = 0;
@@ -426,7 +426,7 @@ static int testserver_exec(struct ast_channel *chan, void *data)
if (!res) { if (!res) {
/* Step 10: Send "8" */ /* Step 10: Send "8" */
ast_debug(1, "TestServer: 10. Send DTMF 8\n"); 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"); fprintf(f, "SEND DTMF 8: %s\n", (res < 0) ? "FAIL" : "PASS");
if (res > 0) if (res > 0)
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 \param between This is the number of milliseconds to wait in between each
DTMF digit. If zero milliseconds is specified, then the DTMF digit. If zero milliseconds is specified, then the
default value of 100 will be used. 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. */ /*! Stream a filename (or file descriptor) as a generator. */
int ast_linear_stream(struct ast_channel *chan, const char *filename, int fd, int allowoverride); 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. * Send a DTMF digit to a channel.
* \param chan channel to act upon * \param chan channel to act upon
* \param digit the DTMF digit to send, encoded in ASCII * \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 * \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 /*! \brief Send a DTMF digit to a channel
* 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; 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; const char *ptr;
int res = 0; 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 */ /* ignore return values if not supported by channel */
ast_indicate(chan, AST_CONTROL_FLASH); ast_indicate(chan, AST_CONTROL_FLASH);
} else } else
ast_senddigit(chan, *ptr); ast_senddigit(chan, *ptr, duration);
/* pause between digits */ /* pause between digits */
if ((res = ast_safe_sleep(chan, between))) if ((res = ast_safe_sleep(chan, between)))
break; break;

View File

@@ -2657,14 +2657,14 @@ int ast_senddigit_end(struct ast_channel *chan, char digit, unsigned int duratio
return 0; 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) { if (chan->tech->send_digit_begin) {
ast_senddigit_begin(chan, digit); 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) 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. */ digits to come in for features. */
ast_debug(1, "Timed out for feature!\n"); ast_debug(1, "Timed out for feature!\n");
if (!ast_strlen_zero(peer_featurecode)) { 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)); memset(peer_featurecode, 0, sizeof(peer_featurecode));
} }
if (!ast_strlen_zero(chan_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)); memset(chan_featurecode, 0, sizeof(chan_featurecode));
} }
if (f) 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); res = ast_feature_interpret(chan, peer, config, featurecode, sense);
switch(res) { switch(res) {
case FEATURE_RETURN_PASSDIGITS: case FEATURE_RETURN_PASSDIGITS:
ast_dtmf_stream(other, who, featurecode, 0); ast_dtmf_stream(other, who, featurecode, 0, 0);
/* Fall through */ /* Fall through */
case FEATURE_RETURN_SUCCESS: case FEATURE_RETURN_SUCCESS:
memset(featurecode, 0, sizeof(chan_featurecode)); memset(featurecode, 0, sizeof(chan_featurecode));