diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h index f0f75623ee..15f13bb07b 100644 --- a/src/include/switch_ivr.h +++ b/src/include/switch_ivr.h @@ -72,17 +72,15 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s \param terminators digits to end the collection \param terminator actual digit that caused the collection to end (if any) \param timeout timeout in ms - \param poll_channel flag to specify if you want the function to poll the channel while running \return SWITCH_STATUS_SUCCESS to keep the collection moving. */ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_session_t *session, - char *buf, - unsigned int buflen, - unsigned int maxdigits, - const char *terminators, - char *terminator, - unsigned int timeout, - unsigned int poll_channel); + char *buf, + unsigned int buflen, + unsigned int maxdigits, + const char *terminators, + char *terminator, + unsigned int timeout); /*! \brief play a file from the disk to the session diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 51b8bbd0ef..072812a13a 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -344,6 +344,7 @@ CF_ACCEPT_CNG = (1 << 5) - Channel will accept CNG frames CF_LOCK_THREAD = (1 << 6) - Prevent the channel thread from exiting while this flag is set CF_BRIDGED = (1 << 7) - Channel in a bridge CF_HOLD = (1 << 8) - Channel is on hold +CF_SERVICE = (1 << 9) - Channel has a service thread </pre> */ @@ -356,7 +357,8 @@ typedef enum { CF_ACCEPT_CNG = (1 << 5), CF_LOCK_THREAD = (1 << 6), CF_BRIDGED = (1 << 7), - CF_HOLD = (1 << 8) + CF_HOLD = (1 << 8), + CF_SERVICE = (1 << 9) } switch_channel_flag_t; diff --git a/src/mod/applications/mod_ivrtest/mod_ivrtest.c b/src/mod/applications/mod_ivrtest/mod_ivrtest.c index 9ad8971d3e..aad96294ac 100644 --- a/src/mod/applications/mod_ivrtest/mod_ivrtest.c +++ b/src/mod/applications/mod_ivrtest/mod_ivrtest.c @@ -183,7 +183,7 @@ static void ivrtest_function(switch_core_session_t *session, char *data) } } - if (switch_ivr_collect_digits_count(session, buf, sizeof(buf), 10, "#*", &term, 10000, 1) != SWITCH_STATUS_SUCCESS) { + if (switch_ivr_collect_digits_count(session, buf, sizeof(buf), 10, "#*", &term, 10000) != SWITCH_STATUS_SUCCESS) { switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); break; } diff --git a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c index c0904cd7d8..be31afda52 100644 --- a/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c +++ b/src/mod/languages/mod_spidermonkey/mod_spidermonkey.c @@ -559,8 +559,6 @@ static JSBool session_get_digits(JSContext *cx, JSObject *obj, uintN argc, jsval char *buf; int digits; int32 timeout = 5000; - int32 poll_chan = 1; - if (argc > 0) { char term; @@ -571,11 +569,9 @@ static JSBool session_get_digits(JSContext *cx, JSObject *obj, uintN argc, jsval if (argc > 2) { JS_ValueToInt32(cx, argv[2], &timeout); } - if (argc > 3) { - JS_ValueToInt32(cx, argv[3], &poll_chan); - } + buf = switch_core_session_alloc(jss->session, digits); - switch_ivr_collect_digits_count(jss->session, buf, digits, digits, terminators, &term, timeout, poll_chan ? SWITCH_TRUE : SWITCH_FALSE); + switch_ivr_collect_digits_count(jss->session, buf, digits, digits, terminators, &term, timeout); *rval = STRING_TO_JSVAL ( JS_NewStringCopyZ(cx, buf) ); return JS_TRUE; } diff --git a/src/switch_core.c b/src/switch_core.c index 511245a748..d78c322eda 100644 --- a/src/switch_core.c +++ b/src/switch_core.c @@ -743,6 +743,7 @@ static void *switch_core_service_thread(switch_thread_t *thread, void *obj) channel = switch_core_session_get_channel(session); assert(channel != NULL); + switch_channel_set_flag(channel, CF_SERVICE); while (data->running > 0) { switch (switch_core_session_read_frame(session, &read_frame, -1, stream_id)) { case SWITCH_STATUS_SUCCESS: @@ -755,6 +756,7 @@ static void *switch_core_service_thread(switch_thread_t *thread, void *obj) } } + switch_channel_clear_flag(channel, CF_SERVICE); data->running = 0; return NULL; } diff --git a/src/switch_ivr.c b/src/switch_ivr.c index 902a441115..fa029fa88a 100644 --- a/src/switch_ivr.c +++ b/src/switch_ivr.c @@ -63,7 +63,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_callback(switch_core_s break; } - status = switch_core_session_read_frame(session, &read_frame, -1, 0); + if (switch_channel_test_flag(channel, CF_SERVICE)) { + switch_yield(1000); + } else { + status = switch_core_session_read_frame(session, &read_frame, -1, 0); + } if (!SWITCH_READ_ACCEPTABLE(status)) { break; @@ -75,14 +79,12 @@ 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, - char *buf, - unsigned int buflen, - unsigned int maxdigits, - const char *terminators, - char *terminator, - unsigned int timeout, - unsigned int poll_channel - ) + char *buf, + unsigned int buflen, + unsigned int maxdigits, + const char *terminators, + char *terminator, + unsigned int timeout) { unsigned int i = 0, x = (unsigned int) strlen(buf); switch_channel_t *channel; @@ -135,14 +137,14 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_collect_digits_count(switch_core_sess } } } - if (poll_channel) { + + if (switch_channel_test_flag(channel, CF_SERVICE)) { + switch_yield(1000); + } else { status = switch_core_session_read_frame(session, &read_frame, -1, 0); - if (!SWITCH_READ_ACCEPTABLE(status)) { break; } - } else { - switch_yield(1000); } }