From 32a9cf9141c445128baaabe7aef551fcf1f62842 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Thu, 24 Sep 2009 22:21:44 +0000 Subject: [PATCH] add i flag to bind_meta_app to do inline execute of the app (not wise to use unless app returns instantly) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14969 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_types.h | 6 ++++-- src/mod/applications/mod_dptools/mod_dptools.c | 6 +++++- src/switch_ivr_async.c | 8 +++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 58b0b5d462..7113497a28 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -194,7 +194,8 @@ typedef enum { SBF_EXEC_BLEG = (1 << 3), SBF_EXEC_OPPOSITE = (1 << 4), SBF_EXEC_SAME = (1 << 5), - SBF_ONCE = (1 << 6) + SBF_ONCE = (1 << 6), + SBF_EXEC_INLINE = (1 << 7) } switch_bind_flag_enum_t; typedef uint32_t switch_bind_flag_t; @@ -318,7 +319,8 @@ typedef enum { SMF_FORCE = (1 << 3), SMF_LOOP = (1 << 4), SMF_HOLD_BLEG = (1 << 5), - SMF_IMMEDIATE = (1 << 6) + SMF_IMMEDIATE = (1 << 6), + SMF_EXEC_INLINE = (1 << 7) } switch_media_flag_enum_t; typedef uint32_t switch_media_flag_t; diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c index 5b180d0b60..c3d4ea1d54 100644 --- a/src/mod/applications/mod_dptools/mod_dptools.c +++ b/src/mod/applications/mod_dptools/mod_dptools.c @@ -198,7 +198,7 @@ SWITCH_STANDARD_APP(dtmf_unbind_function) } -#define BIND_SYNTAX " [a|b|ab] [a|b|o|s|1] " +#define BIND_SYNTAX " [a|b|ab] [a|b|o|s|i|1] " SWITCH_STANDARD_APP(dtmf_bind_function) { char *argv[4] = { 0 }; @@ -242,6 +242,10 @@ SWITCH_STANDARD_APP(dtmf_bind_function) } } + if (strchr(argv[2], 'i')) { + bind_flags |= SBF_EXEC_INLINE; + } + if (strchr(argv[2], 'o')) { if ((bind_flags & SBF_EXEC_BLEG) || (bind_flags & SBF_EXEC_ALEG) || (bind_flags & SBF_EXEC_SAME)) { switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, "Cannot bind execute to multiple legs\n"); diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c index 627c5826ac..d25369305a 100644 --- a/src/switch_ivr_async.c +++ b/src/switch_ivr_async.c @@ -2031,6 +2031,8 @@ static switch_status_t meta_on_dtmf(switch_core_session_t *session, const switch } else { flags |= SMF_ECHO_ALEG; } + } else if ((md->sr[direction].map[dval].bind_flags & SBF_EXEC_INLINE)) { + flags |= SMF_EXEC_INLINE; } else if ((md->sr[direction].map[dval].bind_flags & SBF_EXEC_ALEG)) { flags |= SMF_ECHO_ALEG; } else if ((md->sr[direction].map[dval].bind_flags & SBF_EXEC_BLEG)) { @@ -2684,7 +2686,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_broadcast(const char *uuid, const cha switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "hold-bleg", "true"); } - switch_core_session_queue_private_event(other_session, &event); + if ((flags & SMF_EXEC_INLINE)) { + switch_core_session_execute_application(other_session, app, path); + } else { + switch_core_session_queue_private_event(other_session, &event); + } } switch_core_session_rwunlock(other_session);