提交 df749a42 authored 作者: Anthony Minessale's avatar Anthony Minessale

fix dtmf code

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@7125 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 1fbb21e8
...@@ -134,13 +134,19 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s ...@@ -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
......
...@@ -4125,7 +4125,7 @@ SWITCH_STANDARD_APP(conference_function) ...@@ -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);
......
...@@ -367,7 +367,7 @@ SWITCH_STANDARD_APP(rss_function) ...@@ -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;
......
...@@ -826,7 +826,7 @@ static switch_status_t vm_macro_get(switch_core_session_t *session, ...@@ -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;
......
...@@ -1928,7 +1928,7 @@ static JSBool session_get_digits(JSContext * cx, JSObject * obj, uintN argc, jsv ...@@ -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 ...@@ -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);
}
if (argc > 4) {
JS_ValueToInt32(cx, argv[4], &abs_timeout);
}
switch_ivr_collect_digits_count(jss->session, buf, sizeof(buf), digits, terminators, &term, 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;
} }
......
...@@ -216,7 +216,7 @@ int CoreSession::getDigits(char *dtmf_buf, ...@@ -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();
......
...@@ -599,13 +599,18 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s ...@@ -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 ...@@ -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 ...@@ -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;
......
...@@ -274,7 +274,7 @@ static switch_status_t play_or_say(switch_core_session_t *session, switch_ivr_me ...@@ -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);
} }
......
...@@ -129,7 +129,7 @@ static void *SWITCH_THREAD_FUNC collect_thread_run(switch_thread_t * thread, voi ...@@ -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++) {
......
...@@ -1179,7 +1179,7 @@ SWITCH_DECLARE(switch_status_t) switch_play_and_get_digits(switch_core_session_t ...@@ -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) {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论