fix dtmf code

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7125 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2008-01-07 16:49:46 +00:00
parent 1fbb21e8fd
commit df749a420f
10 changed files with 67 additions and 19 deletions

View File

@ -134,13 +134,19 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s
\param maxdigits max number of digits to read \param maxdigits max number of digits to read
\param terminators digits to end the collection \param terminators digits to end the collection
\param terminator actual digit that caused the collection to end (if any) \param terminator actual digit that caused the collection to end (if any)
\param timeout timeout in ms \param first_timeout timeout in ms
\param digit_timeout digit timeout in ms
\param abs_timeout abs timeout in ms
\return SWITCH_STATUS_SUCCESS to keep the collection moving. \return SWITCH_STATUS_SUCCESS to keep the collection moving.
*/ */
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session, SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
char *buf, char *buf,
switch_size_t buflen, switch_size_t buflen,
switch_size_t maxdigits, const char *terminators, char *terminator, uint32_t timeout); switch_size_t maxdigits,
const char *terminators, char *terminator,
uint32_t first_timeout,
uint32_t digit_timeout,
uint32_t abs_timeout);
/*! /*!
\brief Engage background Speech detection on a session \brief Engage background Speech detection on a session

View File

@ -4125,7 +4125,7 @@ SWITCH_STANDARD_APP(conference_function)
status = switch_ivr_collect_digits_count(session, status = switch_ivr_collect_digits_count(session,
buf, buf,
sizeof(pin_buf) - strlen(pin_buf), sizeof(pin_buf) - strlen(pin_buf),
strlen(conference->pin) - strlen(pin_buf), "#", &term, 10000); strlen(conference->pin) - strlen(pin_buf), "#", &term, 10000, 0, 0);
} }
pin_valid = (status == SWITCH_STATUS_SUCCESS && strcmp(pin_buf, conference->pin) == 0); pin_valid = (status == SWITCH_STATUS_SUCCESS && strcmp(pin_buf, conference->pin) == 0);

View File

@ -367,7 +367,7 @@ SWITCH_STANDARD_APP(rss_function)
switch_size_t blen = sizeof(cmd) - strlen(cmd); switch_size_t blen = sizeof(cmd) - strlen(cmd);
cp = cmd + blen; cp = cmd + blen;
switch_ivr_collect_digits_count(session, cp, blen, blen, "#", &term, 5000); switch_ivr_collect_digits_count(session, cp, blen, blen, "#", &term, 5000, 0, 0);
} }
x = atoi(cmd) - 1; x = atoi(cmd) - 1;

View File

@ -826,7 +826,7 @@ static switch_status_t vm_macro_get(switch_core_session_t *session,
maxlen = buflen -1; maxlen = buflen -1;
} }
if (bslen < maxlen) { if (bslen < maxlen) {
status = switch_ivr_collect_digits_count(session, buf + bslen, buflen, maxlen - bslen, term_chars, terminator_key, timeout); status = switch_ivr_collect_digits_count(session, buf + bslen, buflen, maxlen - bslen, term_chars, terminator_key, timeout, 0, 0);
} }
return status; return status;

View File

@ -1928,7 +1928,7 @@ static JSBool session_get_digits(JSContext * cx, JSObject * obj, uintN argc, jsv
struct js_session *jss = JS_GetPrivate(cx, obj); struct js_session *jss = JS_GetPrivate(cx, obj);
char *terminators = NULL; char *terminators = NULL;
char buf[513] = { 0 }; char buf[513] = { 0 };
int32 digits = 0, timeout = 5000; int32 digits = 0, timeout = 5000, digit_timeout = 0, abs_timeout = 0;
switch_channel_t *channel; switch_channel_t *channel;
METHOD_SANITY_CHECK(); METHOD_SANITY_CHECK();
@ -1950,12 +1950,21 @@ static JSBool session_get_digits(JSContext * cx, JSObject * obj, uintN argc, jsv
if (argc > 1) { if (argc > 1) {
terminators = JS_GetStringBytes(JS_ValueToString(cx, argv[1])); terminators = JS_GetStringBytes(JS_ValueToString(cx, argv[1]));
} }
if (argc > 2) { if (argc > 2) {
JS_ValueToInt32(cx, argv[2], &timeout); JS_ValueToInt32(cx, argv[2], &timeout);
} }
if (argc > 3) {
JS_ValueToInt32(cx, argv[3], &digit_timeout);
}
switch_ivr_collect_digits_count(jss->session, buf, sizeof(buf), digits, terminators, &term, timeout); if (argc > 4) {
JS_ValueToInt32(cx, argv[4], &abs_timeout);
}
switch_ivr_collect_digits_count(jss->session, buf, sizeof(buf), digits, terminators, &term, timeout, digit_timeout, abs_timeout);
*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buf)); *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, buf));
return JS_TRUE; return JS_TRUE;
} }

View File

@ -216,7 +216,7 @@ int CoreSession::getDigits(char *dtmf_buf,
maxdigits, maxdigits,
terminators, terminators,
terminator, terminator,
(uint32_t) timeout); (uint32_t) timeout, 0, 0);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "getDigits dtmf_buf: %s\n", dtmf_buf); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "getDigits dtmf_buf: %s\n", dtmf_buf);
end_allow_threads(); end_allow_threads();

View File

@ -599,13 +599,18 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s
SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session, SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session,
char *buf, char *buf,
switch_size_t buflen, switch_size_t buflen,
switch_size_t maxdigits, const char *terminators, char *terminator, uint32_t timeout) switch_size_t maxdigits,
const char *terminators, char *terminator,
uint32_t first_timeout,
uint32_t digit_timeout,
uint32_t abs_timeout)
{ {
switch_size_t i = 0, x = strlen(buf); switch_size_t i = 0, x = strlen(buf);
switch_channel_t *channel; switch_channel_t *channel;
switch_status_t status = SWITCH_STATUS_FALSE; switch_status_t status = SWITCH_STATUS_FALSE;
switch_time_t started = 0; switch_time_t started = 0, digit_started = 0;
uint32_t elapsed; uint32_t abs_elapsed = 0, digit_elapsed = 0;
uint32_t eff_timeout = 0;
channel = switch_core_session_get_channel(session); channel = switch_core_session_get_channel(session);
switch_assert(channel != NULL); switch_assert(channel != NULL);
@ -622,16 +627,31 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess
} }
} }
if (timeout) { if (abs_timeout) {
started = switch_time_now(); started = switch_timestamp_now();
} }
if (digit_timeout && first_timeout) {
eff_timeout = first_timeout;
} else if (digit_timeout && !first_timeout) {
first_timeout = eff_timeout = digit_timeout;
} else if (first_timeout) {
digit_timeout = eff_timeout = first_timeout;
}
if (eff_timeout) {
digit_started = switch_timestamp_now();
}
while (switch_channel_ready(channel)) { while (switch_channel_ready(channel)) {
switch_frame_t *read_frame; switch_frame_t *read_frame;
if (timeout) { if (abs_timeout) {
elapsed = (uint32_t) ((switch_time_now() - started) / 1000); abs_elapsed = (uint32_t) ((switch_timestamp_now() - started) / 1000);
if (elapsed >= timeout) { if (abs_elapsed >= abs_timeout) {
break; break;
} }
} }
@ -640,10 +660,23 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess
switch_ivr_parse_all_events(session); switch_ivr_parse_all_events(session);
} }
if (eff_timeout) {
digit_elapsed = (uint32_t) ((switch_timestamp_now() - digit_started) / 1000);
if (digit_elapsed >= eff_timeout) {
break;
}
}
if (switch_channel_has_dtmf(channel)) { if (switch_channel_has_dtmf(channel)) {
switch_dtmf_t dtmf = {0}; switch_dtmf_t dtmf = {0};
switch_size_t y; switch_size_t y;
if (eff_timeout) {
eff_timeout = digit_timeout;
digit_started = switch_timestamp_now();
}
for (y = 0; y < maxdigits; y++) { for (y = 0; y < maxdigits; y++) {
if (switch_channel_dequeue_dtmf(channel, &dtmf) != SWITCH_STATUS_SUCCESS) { if (switch_channel_dequeue_dtmf(channel, &dtmf) != SWITCH_STATUS_SUCCESS) {
break; break;

View File

@ -274,7 +274,7 @@ static switch_status_t play_or_say(switch_core_session_t *session, switch_ivr_me
menu->ptr += strlen(menu->buf); menu->ptr += strlen(menu->buf);
if (strlen(menu->buf) < need) { if (strlen(menu->buf) < need) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "waiting for %u digits\n", (uint32_t)need); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "waiting for %u digits\n", (uint32_t)need);
status = switch_ivr_collect_digits_count(session, menu->ptr, menu->inlen - strlen(menu->buf), need, "#", &terminator, menu->timeout); status = switch_ivr_collect_digits_count(session, menu->ptr, menu->inlen - strlen(menu->buf), need, "#", &terminator, menu->timeout, 0, 0);
} }
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "digits '%s'\n", menu->buf); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "digits '%s'\n", menu->buf);
} }

View File

@ -129,7 +129,7 @@ static void *SWITCH_THREAD_FUNC collect_thread_run(switch_thread_t * thread, voi
args.buflen = sizeof(buf); args.buflen = sizeof(buf);
switch_ivr_play_file(collect->session, NULL, collect->file, &args); switch_ivr_play_file(collect->session, NULL, collect->file, &args);
} else { } else {
switch_ivr_collect_digits_count(collect->session, buf, sizeof(buf), 1, SWITCH_BLANK_STRING, &term, 0); switch_ivr_collect_digits_count(collect->session, buf, sizeof(buf), 1, SWITCH_BLANK_STRING, &term, 0, 0, 0);
} }
for (p = buf; *p; p++) { for (p = buf; *p; p++) {

View File

@ -1179,7 +1179,7 @@ SWITCH_DECLARE(switch_status_t) switch_play_and_get_digits(switch_core_session_t
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Calling more digits try %d\n", max_tries); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Calling more digits try %d\n", max_tries);
//Try to grab some more digits for the timeout period //Try to grab some more digits for the timeout period
status = switch_ivr_collect_digits_count(session, digit_buffer, digit_buffer_length, max_digits, valid_terminators, &terminator, timeout); status = switch_ivr_collect_digits_count(session, digit_buffer, digit_buffer_length, max_digits, valid_terminators, &terminator, timeout, 0, 0);
//Make sure we made it out alive //Make sure we made it out alive
if (status != SWITCH_STATUS_SUCCESS) { if (status != SWITCH_STATUS_SUCCESS) {