\brief - NEEDDESC -
\param session the session to act on
*/
-SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session, switch_input_args_t *args);
+SWITCH_DECLARE(switch_status_t) switch_ivr_session_echo(switch_core_session_t *session, switch_input_args_t *args);
/*!
\brief Stop looking for TONES
typedef struct switch_ivr_dmachine_match switch_ivr_dmachine_match_t;
typedef switch_status_t (*switch_ivr_dmachine_callback_t) (switch_ivr_dmachine_match_t *match);
+#define MAX_ARG_RECURSION 25
+
+#define arg_recursion_check_start(_args) if (_args) { \
+ if (_args->loops >= MAX_ARG_RECURSION) { \
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, \
+ "RECURSION ERROR! It's not the best idea to call things that collect input recursively from an input callback.\n"); \
+ return SWITCH_STATUS_GENERR; \
+ } else {_args->loops++;} \
+ }
+
+
+#define arg_recursion_check_stop(_args) if (_args) _args->loops--
+
typedef struct {
switch_input_callback_function_t input_callback;
void *buf;
switch_read_frame_callback_function_t read_frame_callback;
void *user_data;
switch_ivr_dmachine_t *dmachine;
+ int loops;
} switch_input_args_t;
int sval = 0;
const char *var;
+ arg_recursion_check_start(args);
+
/*
if (switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_INBOUND && !switch_channel_test_flag(channel, CF_PROXY_MODE) &&
!switch_channel_media_ready(channel) && !switch_channel_test_flag(channel, CF_SERVICE)) {
for (elapsed=0; switch_channel_up(channel) && elapsed<(ms/20); elapsed++) {
if (switch_channel_test_flag(channel, CF_BREAK)) {
switch_channel_clear_flag(channel, CF_BREAK);
- return SWITCH_STATUS_BREAK;
+ switch_goto_status(SWITCH_STATUS_BREAK, end);
}
switch_yield(20 * 1000);
}
- return SWITCH_STATUS_SUCCESS;
+ switch_goto_status(SWITCH_STATUS_SUCCESS, end);
}
var = switch_channel_get_variable(channel, SWITCH_SEND_SILENCE_WHEN_IDLE_VARIABLE);
switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Codec Error L16@%uhz %u channels %dms\n",
imp.samples_per_second, imp.number_of_channels, imp.microseconds_per_packet / 1000);
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
}
if (!ms) {
- return SWITCH_STATUS_SUCCESS;
+ switch_goto_status(SWITCH_STATUS_SUCCESS, end);
}
for (;;) {
}
}
+
+ end:
+
+ arg_recursion_check_stop(args);
+
if (write_frame.codec) {
switch_core_codec_destroy(&codec);
}
unsigned char *abuf = NULL;
switch_codec_implementation_t imp = { 0 };
+
+
if (switch_channel_test_flag(channel, CF_RECOVERED) && switch_channel_test_flag(channel, CF_CONTROLLED)) {
switch_channel_clear_flag(channel, CF_CONTROLLED);
}
return SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_start(args);
+
if ((to = switch_channel_get_variable(channel, "park_timeout"))) {
char *cause_str;
switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Codec Error L16@%uhz %u channels %dms\n",
imp.samples_per_second, imp.number_of_channels, imp.microseconds_per_packet / 1000);
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
if (switch_channel_test_flag(channel, CF_UNICAST)) {
if (!switch_channel_media_ready(channel)) {
if (switch_channel_pre_answer(channel) != SWITCH_STATUS_SUCCESS) {
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
}
}
+ end:
+
+ arg_recursion_check_stop(args);
+
if (write_frame.codec) {
switch_core_codec_destroy(&codec);
}
return SWITCH_STATUS_GENERR;
}
+ arg_recursion_check_start(args);
+
if (abs_timeout) {
abs_started = switch_micro_time_now();
}
if (digit_timeout) {
digit_started = switch_micro_time_now();
}
+
while (switch_channel_ready(channel)) {
switch_frame_t *read_frame = NULL;
switch_event_t *event;
}
}
+ arg_recursion_check_stop(args);
+
return status;
}
channel = switch_core_session_get_channel(session);
switch_assert(channel);
+ arg_recursion_check_start(args);
+
+
if (zstr(module_name)) {
module_name = "en";
}
done:
+ arg_recursion_check_stop(args);
+
+
if (hint_data) {
switch_event_destroy(&hint_data);
}
}
#endif
-SWITCH_DECLARE(void) switch_ivr_session_echo(switch_core_session_t *session, switch_input_args_t *args)
+SWITCH_DECLARE(switch_status_t) switch_ivr_session_echo(switch_core_session_t *session, switch_input_args_t *args)
{
switch_status_t status;
switch_frame_t *read_frame;
#endif
if (switch_channel_pre_answer(channel) != SWITCH_STATUS_SUCCESS) {
- return;
+ return SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_start(args);
+
restart:
#ifdef SWITCH_VIDEO_IN_THREADS
}
#endif
+ return SWITCH_STATUS_SUCCESS;
}
typedef struct {
play_and_detect_speech_state_t state = { 0, "" };
switch_channel_t *channel = switch_core_session_get_channel(session);
+ arg_recursion_check_start(args);
+
if (result == NULL) {
goto done;
}
status = SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_stop(args);
+
return status;;
}
switch_bool_t sound_prefix_enforced = switch_true(switch_channel_get_variable(channel, "sound_prefix_enforced"));
switch_bool_t local_sound_prefix_enforced = SWITCH_FALSE;
+
if (!macro_name) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "No phrase macro specified.\n");
return status;
}
+ arg_recursion_check_start(args);
+
if (!lang) {
chan_lang = switch_channel_get_variable(channel, "default_language");
if (!chan_lang) {
done:
+ arg_recursion_check_stop(args);
+
if (hint_data) {
switch_event_destroy(&hint_data);
}
int restart_limit_on_dtmf = 0;
const char *prefix, *var;
+
prefix = switch_channel_get_variable(channel, "sound_prefix");
if (!prefix) {
return SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_start(args);
+
if (!fh) {
fh = &lfh;
}
write_frame.samples = write_frame.datalen / 2;
write_frame.codec = &write_codec;
} else {
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_FALSE;
}
}
if (switch_core_file_open(fh, file, fh->channels, read_impl.actual_samples_per_second, file_flags, NULL) != SWITCH_STATUS_SUCCESS) {
switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_GENERR;
}
fh->channels, read_impl.microseconds_per_packet / 1000);
switch_core_file_close(fh);
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_GENERR;
}
}
}
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
+
+ arg_recursion_check_stop(args);
return status;
}
return SWITCH_STATUS_FALSE;
}
+
+ arg_recursion_check_start(args);
+
memset(&ts, 0, sizeof(ts));
write_frame.codec = &write_codec;
write_frame.data = data;
switch_buffer_destroy(&audio_buffer);
teletone_destroy_session(&ts);
+ arg_recursion_check_stop(args);
+
return SWITCH_STATUS_SUCCESS;
}
return SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_start(args);
+
if (!strcasecmp(read_impl.iananame, "l16")) {
l16++;
}
*arg++ = '\0';
}
if ((status = switch_ivr_phrase_macro(session, dup, arg, lang, args)) != SWITCH_STATUS_SUCCESS) {
+ arg_recursion_check_stop(args);
return status;
}
continue;
if (!zstr(engine) && !zstr(voice) && !zstr(text)) {
if ((status = switch_ivr_speak_text(session, engine, voice, text, args)) != SWITCH_STATUS_SUCCESS) {
+ arg_recursion_check_stop(args);
return status;
}
} else {
voice = (char *) switch_channel_get_variable(channel, "tts_voice");
if (engine && text) {
if ((status = switch_ivr_speak_text(session, engine, voice, text, args)) != SWITCH_STATUS_SUCCESS) {
+ arg_recursion_check_stop(args);
return status;
}
} else {
switch_safe_free(abuf);
switch_core_session_reset(session, SWITCH_FALSE, SWITCH_FALSE);
+
+ arg_recursion_check_stop(args);
+
return status;
}
return SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_start(args);
+
write_frame.data = abuf;
write_frame.buflen = sizeof(abuf);
switch_size_t mylen = strlen(text) + extra + 1;
tmp = malloc(mylen);
if (!tmp) {
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_MEMERR;
}
memset(tmp, 0, mylen);
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "done speaking text\n");
flags = 0;
switch_core_speech_flush_tts(sh);
+
+ arg_recursion_check_stop(args);
return status;
}
return SWITCH_STATUS_FALSE;
}
+ arg_recursion_check_start(args);
+
sh = ↰
codec = &lcodec;
timer = <imer;
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Invalid TTS module!\n");
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
switch_ivr_clear_speech_cache(session);
+ arg_recursion_check_stop(args);
return status;
}
} else if (cache_obj && strcasecmp(cache_obj->voice_name, voice_name)) {
if (switch_channel_pre_answer(channel) != SWITCH_STATUS_SUCCESS) {
flags = 0;
switch_core_speech_close(sh, &flags);
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_FALSE;
}
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "OPEN TTS %s\n", tts_name);
switch_core_speech_close(sh, &flags);
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
switch_ivr_clear_speech_cache(session);
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_GENERR;
}
}
switch_core_speech_close(sh, &flags);
switch_core_session_reset(session, SWITCH_TRUE, SWITCH_TRUE);
switch_ivr_clear_speech_cache(session);
+ arg_recursion_check_stop(args);
return SWITCH_STATUS_GENERR;
}
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "Setup timer success %u bytes per %d ms!\n", sh->samples * 2,
}
switch_core_session_reset(session, SWITCH_FALSE, SWITCH_TRUE);
+ arg_recursion_check_stop(args);
+
return status;
}
SWITCH_DECLARE(switch_status_t) switch_ivr_say_spell(switch_core_session_t *session, char *tosay, switch_say_args_t *say_args, switch_input_args_t *args)
{
char *p;
+
+ arg_recursion_check_start(args);
for (p = tosay; p && *p; p++) {
int a = tolower((int) *p);
}
}
+ arg_recursion_check_stop(args);
+
return SWITCH_STATUS_SUCCESS;
}
switch_input_args_t *args)
{
char *a, *b, *c, *d;
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+ arg_recursion_check_start(args);
+
if (!(a = switch_core_session_strdup(session, tosay))) {
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
if (!(b = strchr(a, '.'))) {
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
*b++ = '\0';
if (!(c = strchr(b, '.'))) {
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
*c++ = '\0';
if (!(d = strchr(c, '.'))) {
- return SWITCH_STATUS_FALSE;
+ switch_goto_status(SWITCH_STATUS_FALSE, end);
}
*d++ = '\0';
say_file("digits/dot.wav");
say_num(atoi(d), say_args->method);
- return SWITCH_STATUS_SUCCESS;
+ end:
+
+ arg_recursion_check_stop(args);
+
+ return status;
}