<h1>Project "FreeSWITCH Source" received a push.</h1>

<h2>branch: master updated</h2>
<pre>
       via: 80cbfe6fa3f3e11852436d9fdbd44811775ac074 (commit)
       via: 93b85b5a4c8abff3be692288176a40fda5b13c3f (commit)
       via: 6a524a1d567f9e73d10d14067212bda5f67b7ffb (commit)
       via: d72cde9b76a856cf002366300bea02c26db44ffb (commit)
       via: 2404dd295aa0b6ef2e9da1598a4b3d479ee6317f (commit)
       via: 45b3adda57a9281d0dd4389884d2a42eebc7dbba (commit)
       via: 52bf0423e2231e7e16126baa13b8fef14132ac57 (commit)
       via: 33848eb01c327b04ad3c34bb5165bb1e01891863 (commit)
       via: 2d6161e889fdaf8b03608fefdd7ef480a56ddf8b (commit)
       via: e88b9639624cef4f35901146241f515730b3b118 (commit)
       via: 86d5e441da872719faf72e24afdda85d8491406b (commit)
       via: 9470e70057c549598d6d5e768d6cb08a2ba82104 (commit)
       via: 1f1541b474c549d6a13b6a943d13f046d463751a (commit)
       via: 766f2d61651f161b074fad2f987b4f10532a9a7a (commit)
       via: 1623e5d2952d63e2e49d454cd6fdf921a8516227 (commit)
       via: 256a82dbf2d7f4b4e1d7527f1e6a15d8d0d38a21 (commit)
       via: c8f5c66c3520ecda8f8dbc07dc01f1d4035058e4 (commit)
       via: 2ad81ac82f3c3c989e4d7d11f788c43c2c6f20d8 (commit)
       via: 49a5effcdf2cea9e0ddcf146cf3fe85d1872e654 (commit)
       via: be3483b924a674e4c4f0f05734e7e4917634f3ca (commit)
       via: e6e4bcea734fbfb54b901ff8b1107ddfe76b7010 (commit)
       via: 068d36a5c95c5a4143f423b7c36cbe6d5cea36d5 (commit)
       via: 9986f4ebf2a0c40cc99bc7f9f03f2dec6ae74645 (commit)
       via: 6d3abd41cadef3a2bff8175487c094c80d7d9cf7 (commit)
       via: b3ac44f555a80f8278c5f915cfb36766903905a4 (commit)
       via: 9e6503a482ff533ff214b01a07c3432be14ff1ce (commit)
       via: 97a2b4f9025099bdab5718a13ee36d15a6152411 (commit)
       via: 68b2756970bd4280eba700b7439afdff374fd9e3 (commit)
       via: 9b0c16b5d48a7b9d0ea15ac429a8ca4c8eef8693 (commit)
       via: f05fe55594ffca6edc8f4e74204650aa219ed1ac (commit)
       via: 08f494b80802aacf101705382f149ca4b028eb57 (commit)
       via: daa28cfccae9b171221408f3af4f8c10283e67b3 (commit)
       via: c64b78577f65b586ff6d7af711c79d0427fc61c5 (commit)
       via: 9ade16e9291aa74b4483bb9b9d9db266e082f7cc (commit)
       via: 314a2a1e2061ef321fa5f9b32a9c70ef0040cdb8 (commit)
       via: 48c02b7cd2770f6aee1d6e89f5ecfe207231f398 (commit)
       via: f954d21ab8f84ea3518525d6f8a5a25c5cd39d6b (commit)
       via: f8254f81607c9b2fe8ece3c48cb6dff700bcbead (commit)
       via: 608be370bcca24023ee9d05ee4a99c133044f0d3 (commit)
       via: 02082c930cc08cd65b3ac51d2e8231e502bd8f31 (commit)
       via: 89253a139117b32fa0a6dc101e53e9b830361048 (commit)
       via: 15e65cfafb8a46caca8bb8a63d55edf817f17f2d (commit)
       via: 92a9bacc44576e7b1d41c48752af597801e41d21 (commit)
       via: 8f483f41c78ae3dd1bad7c3378733f04438f6af1 (commit)
       via: 0f39c8f9c3d8e8bce05c551e0168e476ce29437a (commit)
       via: 6d7e019b5c0244f53c16361d2667049b430adb55 (commit)
       via: 128d53c2e6a73a6136efcfffa4e880e6635e43f1 (commit)
       via: 4cbdfbe481d7f9b448663418dccc88b017f9ce69 (commit)
       via: e719ae662b7cb08ebd7f8e732a140e9aeb502960 (commit)
       via: 439df43cae04a053a1c22befdd7f1009f6cb6dfa (commit)
       via: d395b654fb0abab4889d5b8c239728683e772959 (commit)
       via: acd56d2fe2a0458801010cc6b03c524023cbc597 (commit)
      from: 05a8a9455695ae8e6b63fe78bead1a92bee9183b (commit)


</pre>= COMMIT LOG ===========================================================
<div class="highlight"><pre>committer: Michael S Collins
comments: 
Merge branch &#39;master&#39; of git://git.freeswitch.org/freeswitch
</pre></div>
<div class="highlight"><pre>committer: David Yat Sin
comments: 
Merge branch &#39;master&#39; of git.freeswitch.org:freeswitch
</pre></div>
<div class="highlight"><pre>committer: David Yat Sin
comments: 
chlog: freetdm: Fix for only checking first progress indicator for early-media flag

<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c</span>
<span style="color: #000080; font-weight: bold">index 0b52011..578677a 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c</span>
<span style="color: #800080; font-weight: bold">@@ -385,8 +385,12 @@ void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event)</span>
                                 case FTDM_CHANNEL_STATE_DIALING:
                                 case FTDM_CHANNEL_STATE_PROCEED:
                                 case FTDM_CHANNEL_STATE_PROGRESS:
<span style="color: #A00000">-                                case FTDM_CHANNEL_STATE_RINGING:                                        </span>
<span style="color: #A00000">-                                        if (cnStEvnt-&gt;progInd.eh.pres &amp;&amp; cnStEvnt-&gt;progInd.progDesc.val == IN_PD_IBAVAIL) {</span>
<span style="color: #00A000">+                                case FTDM_CHANNEL_STATE_RINGING:</span>
<span style="color: #00A000">+                                        if ((cnStEvnt-&gt;progInd.eh.pres &amp;&amp; cnStEvnt-&gt;progInd.progDesc.val == IN_PD_IBAVAIL) ||</span>
<span style="color: #00A000">+                                                (cnStEvnt-&gt;progInd1.eh.pres &amp;&amp; cnStEvnt-&gt;progInd1.progDesc.val == IN_PD_IBAVAIL) ||</span>
<span style="color: #00A000">+                                                (cnStEvnt-&gt;progInd2.eh.pres &amp;&amp; cnStEvnt-&gt;progInd2.progDesc.val == IN_PD_IBAVAIL) ||</span>
<span style="color: #00A000">+                                                (cnStEvnt-&gt;progInd3.eh.pres &amp;&amp; cnStEvnt-&gt;progInd3.progDesc.val == IN_PD_IBAVAIL)) {</span>
<span style="color: #00A000">+                                                </span>
                                                 ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, &quot;Early media available\n&quot;);
                                                 sngisdn_set_flag(sngisdn_info, FLAG_MEDIA_READY);
                                         } else {
</pre></div>
<div class="highlight"><pre>committer: Anthony Minessale
comments: 
only execute execute_on_[answer|media|ring] async when its expressed in app::arg form vs &#39;app arg form&#39;

<span style="color: #000080; font-weight: bold">diff --git a/src/switch_channel.c b/src/switch_channel.c</span>
<span style="color: #000080; font-weight: bold">index de472a9..70b1879 100644</span>
<span style="color: #A00000">--- a/src/switch_channel.c</span>
<span style="color: #00A000">+++ b/src/switch_channel.c</span>
<span style="color: #800080; font-weight: bold">@@ -2595,14 +2595,15 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_ring_ready_value(swi</span>
                 if (var) {
                         char *arg = NULL;
                         app = switch_core_session_strdup(channel-&gt;session, var);
<span style="color: #A00000">-                        if ((arg = strchr(app, &#39; &#39;))) {</span>
<span style="color: #A00000">-                                *arg++ = &#39;\0&#39;;</span>
<span style="color: #A00000">-                        }</span>
 
<span style="color: #A00000">-                        if (switch_core_session_in_thread(channel-&gt;session)) {</span>
<span style="color: #A00000">-                                switch_core_session_execute_application(channel-&gt;session, app, arg);</span>
<span style="color: #A00000">-                        } else {</span>
<span style="color: #00A000">+                        if (strstr(app, &quot;::&quot;)) {</span>
                                 switch_core_session_execute_application_async(channel-&gt;session, app, arg);
<span style="color: #00A000">+                        } else {</span>
<span style="color: #00A000">+                                if ((arg = strchr(app, &#39; &#39;))) {</span>
<span style="color: #00A000">+                                        *arg++ = &#39;\0&#39;;</span>
<span style="color: #00A000">+                                }</span>
<span style="color: #00A000">+                                </span>
<span style="color: #00A000">+                                switch_core_session_execute_application(channel-&gt;session, app, arg);</span>
                         }
                 }
 
<span style="color: #800080; font-weight: bold">@@ -2653,14 +2654,16 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_pre_answered(switch_</span>
                          (var = switch_channel_get_variable(channel, SWITCH_CHANNEL_EXECUTE_ON_MEDIA_VARIABLE))) &amp;&amp; !zstr(var)) {
                         char *arg = NULL;
                         app = switch_core_session_strdup(channel-&gt;session, var);
<span style="color: #A00000">-                        if ((arg = strchr(app, &#39; &#39;))) {</span>
<span style="color: #A00000">-                                *arg++ = &#39;\0&#39;;</span>
<span style="color: #A00000">-                        }</span>
 
<span style="color: #A00000">-                        if (switch_core_session_in_thread(channel-&gt;session)) {</span>
<span style="color: #A00000">-                                switch_core_session_execute_application(channel-&gt;session, app, arg);</span>
<span style="color: #A00000">-                        } else {</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                        if (strstr(app, &quot;::&quot;)) {</span>
                                 switch_core_session_execute_application_async(channel-&gt;session, app, arg);
<span style="color: #00A000">+                        } else {</span>
<span style="color: #00A000">+                                if ((arg = strchr(app, &#39; &#39;))) {</span>
<span style="color: #00A000">+                                        *arg++ = &#39;\0&#39;;</span>
<span style="color: #00A000">+                                }</span>
<span style="color: #00A000">+                                </span>
<span style="color: #00A000">+                                switch_core_session_execute_application(channel-&gt;session, app, arg);</span>
                         }
                 }
 
<span style="color: #800080; font-weight: bold">@@ -2825,27 +2828,17 @@ SWITCH_DECLARE(switch_status_t) switch_channel_perform_mark_answered(switch_chan</span>
                  (!switch_channel_test_flag(channel, CF_EARLY_MEDIA) &amp;&amp; (var = switch_channel_get_variable(channel, SWITCH_CHANNEL_EXECUTE_ON_MEDIA_VARIABLE))))
                 &amp;&amp; !zstr(var)) {
                 char *arg = NULL;
<span style="color: #A00000">-                char *colon = NULL;</span>
 
                 app = switch_core_session_strdup(channel-&gt;session, var);
 
<span style="color: #A00000">-                arg = strchr(app, &#39; &#39;);</span>
<span style="color: #A00000">-                colon = strchr(app, &#39;:&#39;);</span>
<span style="color: #A00000">-                if (colon &amp;&amp; (!arg || arg &gt; colon) &amp;&amp; *(colon + 1) == &#39;:&#39;) {</span>
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, &quot;%s execute on answer: %s (BROADCAST)\n&quot;, channel-&gt;name, app);</span>
<span style="color: #A00000">-                        switch_ivr_broadcast(switch_core_session_get_uuid(channel-&gt;session), app, SMF_NONE);</span>
<span style="color: #00A000">+                if (strstr(app, &quot;::&quot;)) {</span>
<span style="color: #00A000">+                        switch_core_session_execute_application_async(channel-&gt;session, app, arg);</span>
                 } else {
<span style="color: #A00000">-                        if (arg) {</span>
<span style="color: #00A000">+                        if ((arg = strchr(app, &#39; &#39;))) {</span>
                                 *arg++ = &#39;\0&#39;;
                         }
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_DEBUG, &quot;%s execute on answer: %s(%s)\n&quot;, channel-&gt;name, app,</span>
<span style="color: #A00000">-                                                          switch_str_nil(arg));</span>
<span style="color: #A00000">-</span>
<span style="color: #A00000">-                        if (switch_core_session_in_thread(channel-&gt;session)) {</span>
<span style="color: #A00000">-                                switch_core_session_execute_application(channel-&gt;session, app, arg);</span>
<span style="color: #A00000">-                        } else {</span>
<span style="color: #A00000">-                                switch_core_session_execute_application_async(channel-&gt;session, app, arg);</span>
<span style="color: #A00000">-                        }</span>
<span style="color: #00A000">+                        </span>
<span style="color: #00A000">+                        switch_core_session_execute_application(channel-&gt;session, app, arg);</span>
                 }
         }
 
</pre></div>
<div class="highlight"><pre>committer: Anthony Minessale
comments: 
try another approach to previous mod_loopback fix ... FS-3011

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c</span>
<span style="color: #000080; font-weight: bold">index f875f6b..727de27 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_loopback/mod_loopback.c</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c</span>
<span style="color: #800080; font-weight: bold">@@ -608,9 +608,9 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch</span>
                         if (encode_status != SWITCH_STATUS_SUCCESS) {
                                 switch_channel_hangup(channel, SWITCH_CAUSE_DESTINATION_OUT_OF_ORDER);
                         }
<span style="color: #A00000">-</span>
<span style="color: #00A000">+                } else {</span>
<span style="color: #00A000">+                        switch_set_flag((&amp;tech_pvt-&gt;cng_frame), SFF_CNG);</span>
                 }
<span style="color: #A00000">-                //switch_set_flag((&amp;tech_pvt-&gt;cng_frame), SFF_CNG);</span>
                 switch_clear_flag_locked(tech_pvt, TFLAG_CNG);
         }
 
<span style="color: #800080; font-weight: bold">@@ -642,7 +642,10 @@ static switch_status_t channel_write_frame(switch_core_session_t *session, switc</span>
         tech_pvt = switch_core_session_get_private(session);
         switch_assert(tech_pvt != NULL);
 
<span style="color: #A00000">-        if (switch_test_flag(frame, SFF_CNG) || switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) &amp;&amp; switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {</span>
<span style="color: #00A000">+        if (switch_test_flag(frame, SFF_CNG) || </span>
<span style="color: #00A000">+                switch_test_flag(tech_pvt, TFLAG_CNG) || (switch_test_flag(tech_pvt, TFLAG_BOWOUT) &amp;&amp; switch_test_flag(tech_pvt, TFLAG_BOWOUT_USED))) {</span>
<span style="color: #00A000">+                switch_core_timer_sync(&amp;tech_pvt-&gt;timer);</span>
<span style="color: #00A000">+                switch_core_timer_sync(&amp;tech_pvt-&gt;other_tech_pvt-&gt;timer);</span>
                 return SWITCH_STATUS_SUCCESS;
         }
 
</pre></div>
<div class="highlight"><pre>committer: Anthony Minessale
comments: 
revert 02d1af647bac6b937de02608d53ea1831f51b968

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_loopback/mod_loopback.c b/src/mod/endpoints/mod_loopback/mod_loopback.c</span>
<span style="color: #000080; font-weight: bold">index aa57668..f875f6b 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_loopback/mod_loopback.c</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_loopback/mod_loopback.c</span>
<span style="color: #800080; font-weight: bold">@@ -77,11 +77,11 @@ struct private_object {</span>
 
         switch_frame_t cng_frame;
         unsigned char cng_databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
<span style="color: #00A000">+        switch_timer_t timer;</span>
         switch_caller_profile_t *caller_profile;
         int32_t bowout_frame_count;
         char *other_uuid;
         switch_queue_t *frame_queue;
<span style="color: #A00000">-        switch_codec_implementation_t read_impl;</span>
 };
 
 typedef struct private_object private_t;
<span style="color: #800080; font-weight: bold">@@ -111,6 +111,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses</span>
         int interval = 20;
         switch_status_t status = SWITCH_STATUS_SUCCESS;
         switch_channel_t *channel = switch_core_session_get_channel(session);
<span style="color: #00A000">+        const switch_codec_implementation_t *read_impl;</span>
 
         if (codec) {
                 iananame = codec-&gt;implementation-&gt;iananame;
<span style="color: #800080; font-weight: bold">@@ -165,7 +166,15 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses</span>
         switch_core_session_set_read_codec(session, &amp;tech_pvt-&gt;read_codec);
         switch_core_session_set_write_codec(session, &amp;tech_pvt-&gt;write_codec);
 
<span style="color: #A00000">-        tech_pvt-&gt;read_impl = *tech_pvt-&gt;read_codec.implementation;</span>
<span style="color: #00A000">+        if (tech_pvt-&gt;flag_mutex) {</span>
<span style="color: #00A000">+                switch_core_timer_destroy(&amp;tech_pvt-&gt;timer);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        read_impl = tech_pvt-&gt;read_codec.implementation;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_core_timer_init(&amp;tech_pvt-&gt;timer, &quot;soft&quot;,</span>
<span style="color: #00A000">+                                                   read_impl-&gt;microseconds_per_packet / 1000, read_impl-&gt;samples_per_packet * 4, switch_core_session_get_pool(session));</span>
<span style="color: #00A000">+</span>
 
         if (!tech_pvt-&gt;flag_mutex) {
                 switch_mutex_init(&amp;tech_pvt-&gt;flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
<span style="color: #800080; font-weight: bold">@@ -367,6 +376,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)</span>
         tech_pvt = switch_core_session_get_private(session);
 
         if (tech_pvt) {
<span style="color: #00A000">+                switch_core_timer_destroy(&amp;tech_pvt-&gt;timer);</span>
 
                 if (switch_core_codec_ready(&amp;tech_pvt-&gt;read_codec)) {
                         switch_core_codec_destroy(&amp;tech_pvt-&gt;read_codec);
<span style="color: #800080; font-weight: bold">@@ -558,10 +568,12 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch</span>
                 goto end;
         }
 
<span style="color: #A00000">-        mutex = tech_pvt-&gt;mutex;</span>
<span style="color: #00A000">+        switch_core_timer_next(&amp;tech_pvt-&gt;timer);</span>
 
<span style="color: #00A000">+        mutex = tech_pvt-&gt;mutex;</span>
<span style="color: #00A000">+        switch_mutex_lock(mutex);</span>
 
<span style="color: #A00000">-        if (switch_queue_pop_timeout(tech_pvt-&gt;frame_queue, &amp;pop, tech_pvt-&gt;read_impl.microseconds_per_packet) == SWITCH_STATUS_SUCCESS &amp;&amp; pop) {</span>
<span style="color: #00A000">+        if (switch_queue_trypop(tech_pvt-&gt;frame_queue, &amp;pop) == SWITCH_STATUS_SUCCESS &amp;&amp; pop) {</span>
                 if (tech_pvt-&gt;write_frame) {
                         switch_frame_free(&amp;tech_pvt-&gt;write_frame);
                 }
<span style="color: #800080; font-weight: bold">@@ -573,8 +585,6 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch</span>
                 switch_set_flag(tech_pvt, TFLAG_CNG);
         }
 
<span style="color: #A00000">-        switch_mutex_lock(mutex);</span>
<span style="color: #A00000">-</span>
         if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
                 unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE];
                 uint32_t flag = 0;
<span style="color: #800080; font-weight: bold">@@ -765,6 +775,8 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s</span>
                                 switch_frame_free(&amp;frame);
                         }
 
<span style="color: #00A000">+                        switch_core_timer_sync(&amp;tech_pvt-&gt;timer);</span>
<span style="color: #00A000">+</span>
                 }
                 break;
         default:
</pre></div>
<div class="highlight"><pre>committer: Anthony Minessale
comments: 
try to fix SOA problem with early and answer audio with dissimilar sdp

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c</span>
<span style="color: #000080; font-weight: bold">index 6c91ce1..8bceb3b 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_sofia/mod_sofia.c</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_sofia/mod_sofia.c</span>
<span style="color: #800080; font-weight: bold">@@ -707,11 +707,20 @@ static switch_status_t sofia_answer_channel(switch_core_session_t *session)</span>
                 cid = generate_pai_str(tech_pvt);
 
 
<span style="color: #A00000">-                if (switch_channel_test_flag(tech_pvt-&gt;channel, CF_PROXY_MODE) &amp;&amp; tech_pvt-&gt;early_sdp &amp;&amp; strcmp(tech_pvt-&gt;early_sdp, tech_pvt-&gt;local_sdp_str)) {</span>
<span style="color: #A00000">-                        /* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won&#39;t do us much good unless </span>
<span style="color: #A00000">-                           we do so in this case we will abandon the SOA rules and go rogue.</span>
<span style="color: #A00000">-                         */</span>
<span style="color: #A00000">-                        sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);</span>
<span style="color: #00A000">+                if (switch_channel_test_flag(tech_pvt-&gt;channel, CF_PROXY_MODE) &amp;&amp; tech_pvt-&gt;early_sdp) {</span>
<span style="color: #00A000">+                        char *a, *b;</span>
<span style="color: #00A000">+                        </span>
<span style="color: #00A000">+                        /* start at the s= line to avoid some devices who update the o= between messages */</span>
<span style="color: #00A000">+                        a = strstr(tech_pvt-&gt;early_sdp, &quot;s=&quot;);</span>
<span style="color: #00A000">+                        b = strstr(tech_pvt-&gt;local_sdp_str, &quot;s=&quot;);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                        if (!a || !b || strcmp(a, b)) {</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                                /* The SIP RFC for SOA forbids sending a 183 with one sdp then a 200 with another but it won&#39;t do us much good unless </span>
<span style="color: #00A000">+                                   we do so in this case we will abandon the SOA rules and go rogue.</span>
<span style="color: #00A000">+                                */</span>
<span style="color: #00A000">+                                sofia_clear_flag(tech_pvt, TFLAG_ENABLE_SOA);</span>
<span style="color: #00A000">+                        }</span>
                 }
 
                 if (sofia_use_soa(tech_pvt)) {
</pre></div>
<div class="highlight"><pre>committer: Mathieu Parent
comments: 
Skinny: handle Enbloc messages

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_skinny/skinny_protocol.h b/src/mod/endpoints/mod_skinny/skinny_protocol.h</span>
<span style="color: #000080; font-weight: bold">index 20e7d7f..1a26558 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_skinny/skinny_protocol.h</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_skinny/skinny_protocol.h</span>
<span style="color: #800080; font-weight: bold">@@ -68,6 +68,13 @@ struct PACKED keypad_button_message {</span>
     uint32_t call_id;
 };
 
<span style="color: #00A000">+/* EnblocCallMessage */</span>
<span style="color: #00A000">+#define ENBLOC_CALL_MESSAGE 0x0004</span>
<span style="color: #00A000">+struct PACKED enbloc_call_message {</span>
<span style="color: #00A000">+    char called_party[24];</span>
<span style="color: #00A000">+    uint32_t line_instance;</span>
<span style="color: #00A000">+};</span>
<span style="color: #00A000">+</span>
 /* StimulusMessage */
 #define STIMULUS_MESSAGE 0x0005
 struct PACKED stimulus_message {
<span style="color: #800080; font-weight: bold">@@ -562,6 +569,7 @@ union skinny_data {</span>
     struct register_message reg;
     struct port_message port;
     struct keypad_button_message keypad_button;
<span style="color: #00A000">+    struct enbloc_call_message enbloc_call;</span>
     struct stimulus_message stimulus;
     struct off_hook_message off_hook;
     struct on_hook_message on_hook;
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_skinny/skinny_server.c b/src/mod/endpoints/mod_skinny/skinny_server.c</span>
<span style="color: #000080; font-weight: bold">index 5874be4..e7c761d 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_skinny/skinny_server.c</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_skinny/skinny_server.c</span>
<span style="color: #800080; font-weight: bold">@@ -1171,6 +1171,29 @@ switch_status_t skinny_handle_keypad_button_message(listener_t *listener, skinny</span>
         return SWITCH_STATUS_SUCCESS;
 }
 
<span style="color: #00A000">+switch_status_t skinny_handle_enbloc_call_message(listener_t *listener, skinny_message_t *request)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        uint32_t line_instance = 1;</span>
<span style="color: #00A000">+        switch_core_session_t *session = NULL;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        skinny_check_data_length(request, sizeof(request-&gt;data.enbloc_call.called_party));</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if(skinny_check_data_length_soft(request, sizeof(request-&gt;data.enbloc_call))) {</span>
<span style="color: #00A000">+                if (request-&gt;data.enbloc_call.line_instance &gt; 0) {</span>
<span style="color: #00A000">+                        line_instance = request-&gt;data.enbloc_call.line_instance;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        session = skinny_profile_find_session(listener-&gt;profile, listener, &amp;line_instance, 0);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if(session) {</span>
<span style="color: #00A000">+                skinny_session_process_dest(session, listener, line_instance, request-&gt;data.enbloc_call.called_party, &#39;\0&#39;, 0);</span>
<span style="color: #00A000">+                switch_core_session_rwunlock(session);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 switch_status_t skinny_handle_stimulus_message(listener_t *listener, skinny_message_t *request)
 {
         switch_status_t status = SWITCH_STATUS_SUCCESS;
<span style="color: #800080; font-weight: bold">@@ -2004,6 +2027,8 @@ switch_status_t skinny_handle_request(listener_t *listener, skinny_message_t *re</span>
                         return skinny_handle_port_message(listener, request);
                 case KEYPAD_BUTTON_MESSAGE:
                         return skinny_handle_keypad_button_message(listener, request);
<span style="color: #00A000">+                case ENBLOC_CALL_MESSAGE:</span>
<span style="color: #00A000">+                        return skinny_handle_enbloc_call_message(listener, request);</span>
                 case STIMULUS_MESSAGE:
                         return skinny_handle_stimulus_message(listener, request);
                 case OFF_HOOK_MESSAGE:
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_skinny/skinny_tables.c b/src/mod/endpoints/mod_skinny/skinny_tables.c</span>
<span style="color: #000080; font-weight: bold">index 053b350..466a705 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_skinny/skinny_tables.c</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_skinny/skinny_tables.c</span>
<span style="color: #800080; font-weight: bold">@@ -39,6 +39,7 @@ struct skinny_table SKINNY_MESSAGE_TYPES[] = {</span>
     {&quot;RegisterMessage&quot;, REGISTER_MESSAGE},
     {&quot;PortMessage&quot;, PORT_MESSAGE},
     {&quot;KeypadButtonMessage&quot;, KEYPAD_BUTTON_MESSAGE},
<span style="color: #00A000">+    {&quot;EnblocCallMessage&quot;, ENBLOC_CALL_MESSAGE},</span>
     {&quot;StimulusMessage&quot;, STIMULUS_MESSAGE},
     {&quot;OffHookMessage&quot;, OFF_HOOK_MESSAGE},
     {&quot;OnHookMessage&quot;, ON_HOOK_MESSAGE},
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_skinny/skinny_tables.h b/src/mod/endpoints/mod_skinny/skinny_tables.h</span>
<span style="color: #000080; font-weight: bold">index c119e1f..bc92f9f 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_skinny/skinny_tables.h</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_skinny/skinny_tables.h</span>
<span style="color: #800080; font-weight: bold">@@ -87,7 +87,7 @@ uint32_t func(const char *str)\</span>
     }
 
 
<span style="color: #A00000">-extern struct skinny_table SKINNY_MESSAGE_TYPES[66];</span>
<span style="color: #00A000">+extern struct skinny_table SKINNY_MESSAGE_TYPES[67];</span>
 const char *skinny_message_type2str(uint32_t id);
 uint32_t skinny_str2message_type(const char *str);
 #define SKINNY_PUSH_MESSAGE_TYPES SKINNY_DECLARE_PUSH_MATCH(SKINNY_MESSAGE_TYPES)
</pre></div>
<div class="highlight"><pre>committer: Marc Olivier Chouinard
comments: 
switch_xml: Fix a lock on reloadxml when stderr write is blocked.  Also remove an error parsing print since reason generated were wrong and duplicate.

<span style="color: #000080; font-weight: bold">diff --git a/src/switch_xml.c b/src/switch_xml.c</span>
<span style="color: #000080; font-weight: bold">index fe6a199..964a769 100644</span>
<span style="color: #A00000">--- a/src/switch_xml.c</span>
<span style="color: #00A000">+++ b/src/switch_xml.c</span>
<span style="color: #800080; font-weight: bold">@@ -1286,9 +1286,7 @@ static int preprocess_glob(const char *cwd, const char *pattern, int write_fd, i</span>
         }
 
         if (glob(pattern, GLOB_NOCHECK, NULL, &amp;glob_data) != 0) {
<span style="color: #A00000">-                if (stderr) {</span>
<span style="color: #A00000">-                        fprintf(stderr, &quot;Error including %s\n&quot;, pattern);</span>
<span style="color: #A00000">-                }</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Error including %s\n&quot;, pattern);</span>
                 goto end;
         }
 
<span style="color: #800080; font-weight: bold">@@ -1299,11 +1297,9 @@ static int preprocess_glob(const char *cwd, const char *pattern, int write_fd, i</span>
                         *e = &#39;\0&#39;;
                 }
                 if (preprocess(dir_path, glob_data.gl_pathv[n], write_fd, rlevel) &lt; 0) {
<span style="color: #A00000">-                        const char *reason = strerror(errno);</span>
                         if (rlevel &gt; 100) {
<span style="color: #A00000">-                                reason = &quot;Maximum recursion limit reached&quot;;</span>
<span style="color: #00A000">+                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Error including %s (Maximum recursion limit reached)\n&quot;, pattern);</span>
                         }
<span style="color: #A00000">-                        fprintf(stderr, &quot;Error including %s (%s)\n&quot;, pattern, reason);</span>
                 }
                 free(dir_path);
         }
</pre></div>
<div class="highlight"><pre>committer: Jeff Lenk
comments: 
vs2010 reswig

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx</span>
<span style="color: #000080; font-weight: bold">index 9ebd6ff..808d548 100644</span>
<span style="color: #A00000">--- a/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx</span>
<span style="color: #00A000">+++ b/src/mod/languages/mod_managed/freeswitch_wrap.2010.cxx</span>
<span style="color: #800080; font-weight: bold">@@ -8947,6 +8947,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed(void * jarg1, void * jarg</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed_dtmf(void * jarg1, void * jarg2, void * jarg3) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  switch_dtmf_t *arg2 = (switch_dtmf_t *) 0 ;</span>
<span style="color: #00A000">+  switch_asr_flag_t *arg3 = (switch_asr_flag_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_dtmf_t *)jarg2; </span>
<span style="color: #00A000">+  arg3 = (switch_asr_flag_t *)jarg3; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_feed_dtmf(arg1,(switch_dtmf_t const *)arg2,arg3);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_check_results(void * jarg1, void * jarg2) {
   int jresult ;
   switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
<span style="color: #800080; font-weight: bold">@@ -9007,6 +9023,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_unload_grammar(void * jarg1, c</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_enable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_enable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_disable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_all_grammars(void * jarg1) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_disable_all_grammars(arg1);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_pause(void * jarg1) {
   int jresult ;
   switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
<span style="color: #800080; font-weight: bold">@@ -18313,6 +18369,94 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_next_get(void * jarg1)</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_enable_grammar = arg2;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)-&gt;asr_enable_grammar);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_disable_grammar = arg2;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)-&gt;asr_disable_grammar);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *) = (switch_status_t (*)(switch_asr_handle_t *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_disable_all_grammars = arg2;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *)) ((arg1)-&gt;asr_disable_all_grammars);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_feed_dtmf = arg2;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) ((arg1)-&gt;asr_feed_dtmf);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_asr_interface() {
   void * jresult ;
   switch_asr_interface *result = 0 ;
<span style="color: #800080; font-weight: bold">@@ -26320,6 +26464,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_unload_grammar(void *</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_enable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_enable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_disable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_all_grammars(void * jarg1) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_disable_all_grammars(arg1);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg1, char * jarg2, char * jarg3) {
   int jresult ;
   switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
<span style="color: #800080; font-weight: bold">@@ -26336,6 +26520,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_start_input_timers(void * jarg1) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_start_input_timers(arg1);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_record_session(void * jarg1, char * jarg2, unsigned long jarg3, void * jarg4) {
   int jresult ;
   switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/languages/mod_managed/managed/swig.2010.cs b/src/mod/languages/mod_managed/managed/swig.2010.cs</span>
<span style="color: #000080; font-weight: bold">index 059fb89..61c0a4e 100644</span>
<span style="color: #A00000">--- a/src/mod/languages/mod_managed/managed/swig.2010.cs</span>
<span style="color: #00A000">+++ b/src/mod/languages/mod_managed/managed/swig.2010.cs</span>
<span style="color: #800080; font-weight: bold">@@ -2000,6 +2000,11 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_feed_dtmf(switch_asr_handle ah, switch_dtmf_t dtmf, SWIGTYPE_p_unsigned_long flags) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_feed_dtmf(switch_asr_handle.getCPtr(ah), switch_dtmf_t.getCPtr(dtmf), SWIGTYPE_p_unsigned_long.getCPtr(flags));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_core_asr_check_results(switch_asr_handle ah, SWIGTYPE_p_unsigned_long flags) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_check_results(switch_asr_handle.getCPtr(ah), SWIGTYPE_p_unsigned_long.getCPtr(flags));
     return ret;
<span style="color: #800080; font-weight: bold">@@ -2020,6 +2025,21 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_enable_grammar(switch_asr_handle ah, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_enable_grammar(switch_asr_handle.getCPtr(ah), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_disable_grammar(switch_asr_handle ah, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_grammar(switch_asr_handle.getCPtr(ah), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_disable_all_grammars(switch_asr_handle ah) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_all_grammars(switch_asr_handle.getCPtr(ah));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_core_asr_pause(switch_asr_handle ah) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_pause(switch_asr_handle.getCPtr(ah));
     return ret;
<span style="color: #800080; font-weight: bold">@@ -4070,11 +4090,31 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session session, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session session, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session session) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session.getCPtr(session));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session session, string name, string val) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session.getCPtr(session), name, val);
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session session) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session.getCPtr(session));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_ivr_record_session(SWIGTYPE_p_switch_core_session session, string file, uint limit, switch_file_handle fh) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_record_session(SWIGTYPE_p_switch_core_session.getCPtr(session), file, limit, switch_file_handle.getCPtr(fh));
     return ret;
<span style="color: #800080; font-weight: bold">@@ -7907,6 +7947,9 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_feed&quot;)]
   public static extern int switch_core_asr_feed(HandleRef jarg1, HandleRef jarg2, uint jarg3, HandleRef jarg4);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_feed_dtmf&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_feed_dtmf(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_check_results&quot;)]
   public static extern int switch_core_asr_check_results(HandleRef jarg1, HandleRef jarg2);
 
<span style="color: #800080; font-weight: bold">@@ -7919,6 +7962,15 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_unload_grammar&quot;)]
   public static extern int switch_core_asr_unload_grammar(HandleRef jarg1, string jarg2);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_enable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_enable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_disable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_disable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_disable_all_grammars&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_disable_all_grammars(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_pause&quot;)]
   public static extern int switch_core_asr_pause(HandleRef jarg1);
 
<span style="color: #800080; font-weight: bold">@@ -10196,6 +10248,30 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_next_get&quot;)]
   public static extern IntPtr switch_asr_interface_next_get(HandleRef jarg1);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_enable_grammar_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_enable_grammar_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_enable_grammar_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_enable_grammar_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_grammar_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_disable_grammar_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_grammar_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_disable_grammar_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_all_grammars_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_disable_all_grammars_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_all_grammars_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_disable_all_grammars_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_feed_dtmf_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_feed_dtmf_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_feed_dtmf_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_feed_dtmf_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_new_switch_asr_interface&quot;)]
   public static extern IntPtr new_switch_asr_interface();
 
<span style="color: #800080; font-weight: bold">@@ -12140,9 +12216,21 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_unload_grammar&quot;)]
   public static extern int switch_ivr_detect_speech_unload_grammar(HandleRef jarg1, string jarg2);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_enable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_enable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_disable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_disable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_disable_all_grammars&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_disable_all_grammars(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_set_param_detect_speech&quot;)]
   public static extern int switch_ivr_set_param_detect_speech(HandleRef jarg1, string jarg2, string jarg3);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_start_input_timers&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_start_input_timers(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_record_session&quot;)]
   public static extern int switch_ivr_record_session(HandleRef jarg1, string jarg2, uint jarg3, HandleRef jarg4);
 
<span style="color: #800080; font-weight: bold">@@ -14967,6 +15055,36 @@ namespace FreeSWITCH.Native {</span>
 using System;
 using System.Runtime.InteropServices;
 
<span style="color: #00A000">+public class SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t {</span>
<span style="color: #00A000">+  private HandleRef swigCPtr;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  internal SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(IntPtr cPtr, bool futureUse) {</span>
<span style="color: #00A000">+    swigCPtr = new HandleRef(this, cPtr);</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  protected SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t() {</span>
<span style="color: #00A000">+    swigCPtr = new HandleRef(null, IntPtr.Zero);</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t obj) {</span>
<span style="color: #00A000">+    return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+/* ----------------------------------------------------------------------------</span>
<span style="color: #00A000">+ * This file was automatically generated by SWIG (http://www.swig.org).</span>
<span style="color: #00A000">+ * Version 2.0.1</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * Do not make changes to this file unless you know what you are doing--modify</span>
<span style="color: #00A000">+ * the SWIG interface file instead.</span>
<span style="color: #00A000">+ * ----------------------------------------------------------------------------- */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+namespace FreeSWITCH.Native {</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+using System;</span>
<span style="color: #00A000">+using System.Runtime.InteropServices;</span>
<span style="color: #00A000">+</span>
 public class SWIGTYPE_p_f_p_switch_asr_handle_p_unsigned_long__switch_status_t {
   private HandleRef swigCPtr;
 
<span style="color: #800080; font-weight: bold">@@ -19993,6 +20111,50 @@ public class switch_asr_interface : IDisposable {</span>
     } 
   }
 
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_enable_grammar {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_disable_grammar {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t asr_disable_all_grammars {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t asr_feed_dtmf {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public switch_asr_interface() : this(freeswitchPINVOKE.new_switch_asr_interface(), true) {
   }
 
<span style="color: #800080; font-weight: bold">@@ -28589,7 +28751,8 @@ public enum switch_rtp_bug_flag_t {</span>
   RTP_BUG_IGNORE_MARK_BIT = (1 &lt;&lt; 2),
   RTP_BUG_SEND_LINEAR_TIMESTAMPS = (1 &lt;&lt; 3),
   RTP_BUG_START_SEQ_AT_ZERO = (1 &lt;&lt; 4),
<span style="color: #A00000">-  RTP_BUG_NEVER_SEND_MARKER = (1 &lt;&lt; 5)</span>
<span style="color: #00A000">+  RTP_BUG_NEVER_SEND_MARKER = (1 &lt;&lt; 5),</span>
<span style="color: #00A000">+  RTP_BUG_IGNORE_DTMF_DURATION = (1 &lt;&lt; 6)</span>
 }
 
 }
<span style="color: #800080; font-weight: bold">@@ -30446,7 +30609,7 @@ public enum switch_status_t {</span>
   SWITCH_STATUS_FALSE,
   SWITCH_STATUS_TIMEOUT,
   SWITCH_STATUS_RESTART,
<span style="color: #A00000">-  SWITCH_STATUS_TERM,</span>
<span style="color: #00A000">+  SWITCH_STATUS_INTR,</span>
   SWITCH_STATUS_NOTIMPL,
   SWITCH_STATUS_MEMERR,
   SWITCH_STATUS_NOOP,
<span style="color: #800080; font-weight: bold">@@ -30463,6 +30626,7 @@ public enum switch_status_t {</span>
   SWITCH_STATUS_TOO_SMALL,
   SWITCH_STATUS_FOUND,
   SWITCH_STATUS_CONTINUE,
<span style="color: #00A000">+  SWITCH_STATUS_TERM,</span>
   SWITCH_STATUS_NOT_INITALIZED
 }
 
</pre></div>
<div class="highlight"><pre>committer: Michael Jerris
comments: 
add more details to xml_curl errors

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c b/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c</span>
<span style="color: #000080; font-weight: bold">index 9bf837e..bc143d7 100644</span>
<span style="color: #A00000">--- a/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c</span>
<span style="color: #00A000">+++ b/src/mod/xml_int/mod_xml_curl/mod_xml_curl.c</span>
<span style="color: #800080; font-weight: bold">@@ -293,12 +293,12 @@ static switch_xml_t xml_url_fetch(const char *section, const char *tag_name, con</span>
         }
 
         if (config_data.err) {
<span style="color: #A00000">-                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Error encountered!\n&quot;);</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Error encountered! [%s]\ndata: [%s]\n&quot;, binding-&gt;url, data);</span>
                 xml = NULL;
         } else {
                 if (httpRes == 200) {
                         if (!(xml = switch_xml_parse_file(filename))) {
<span style="color: #A00000">-                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Error Parsing Result!\n&quot;);</span>
<span style="color: #00A000">+                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Error Parsing Result! [%s]\ndata: [%s]\n&quot;, binding-&gt;url, data);</span>
                         }
                 } else {
                         switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Received HTTP error %ld trying to fetch %s\ndata: [%s]\n&quot;, httpRes, binding-&gt;url,
</pre></div>
<div class="highlight"><pre>committer: Brian West
comments: 
swigall

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx</span>
<span style="color: #000080; font-weight: bold">index 3ee6ff6..e91de6d 100644</span>
<span style="color: #A00000">--- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx</span>
<span style="color: #00A000">+++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx</span>
<span style="color: #800080; font-weight: bold">@@ -9238,6 +9238,22 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed(void * jarg1, void * jarg</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_feed_dtmf(void * jarg1, void * jarg2, void * jarg3) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  switch_dtmf_t *arg2 = (switch_dtmf_t *) 0 ;</span>
<span style="color: #00A000">+  switch_asr_flag_t *arg3 = (switch_asr_flag_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_dtmf_t *)jarg2; </span>
<span style="color: #00A000">+  arg3 = (switch_asr_flag_t *)jarg3; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_feed_dtmf(arg1,(switch_dtmf_t const *)arg2,arg3);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_check_results(void * jarg1, void * jarg2) {
   int jresult ;
   switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
<span style="color: #800080; font-weight: bold">@@ -9298,6 +9314,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_unload_grammar(void * jarg1, c</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_enable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_enable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_disable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_disable_all_grammars(void * jarg1) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_handle_t *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_asr_disable_all_grammars(arg1);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_asr_pause(void * jarg1) {
   int jresult ;
   switch_asr_handle_t *arg1 = (switch_asr_handle_t *) 0 ;
<span style="color: #800080; font-weight: bold">@@ -18820,6 +18876,98 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_next_get(void * jarg1)</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_enable_grammar = arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_enable_grammar_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)-&gt;asr_enable_grammar);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *,char const *) = (switch_status_t (*)(switch_asr_handle_t *,char const *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *,char const *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_disable_grammar = arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_grammar_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *,char const *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *,char const *)) ((arg1)-&gt;asr_disable_grammar);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *) = (switch_status_t (*)(switch_asr_handle_t *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_disable_all_grammars = arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_disable_all_grammars_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *)) ((arg1)-&gt;asr_disable_all_grammars);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*arg2)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *))jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;asr_feed_dtmf = arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_asr_interface_asr_feed_dtmf_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_asr_interface *arg1 = (switch_asr_interface *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t (*result)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *) = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_asr_interface *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t (*)(switch_asr_handle_t *,switch_dtmf_t const *,switch_asr_flag_t *)) ((arg1)-&gt;asr_feed_dtmf);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_asr_interface() {
   void * jresult ;
   switch_asr_interface *result = 0 ;
<span style="color: #800080; font-weight: bold">@@ -27013,6 +27161,46 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_unload_grammar(void *</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_enable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_enable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_grammar(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 = (char *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_disable_grammar(arg1,(char const *)arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_disable_all_grammars(void * jarg1) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_disable_all_grammars(arg1);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg1, char * jarg2, char * jarg3) {
   int jresult ;
   switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
<span style="color: #800080; font-weight: bold">@@ -27029,6 +27217,18 @@ SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_set_param_detect_speech(void * jarg</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_detect_speech_start_input_timers(void * jarg1) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_ivr_detect_speech_start_input_timers(arg1);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT int SWIGSTDCALL CSharp_switch_ivr_record_session(void * jarg1, char * jarg2, unsigned long jarg3, void * jarg4) {
   int jresult ;
   switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs</span>
<span style="color: #000080; font-weight: bold">index 48d585e..1f02c3f 100644</span>
<span style="color: #A00000">--- a/src/mod/languages/mod_managed/managed/swig.cs</span>
<span style="color: #00A000">+++ b/src/mod/languages/mod_managed/managed/swig.cs</span>
<span style="color: #800080; font-weight: bold">@@ -1990,6 +1990,11 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_feed_dtmf(switch_asr_handle ah, switch_dtmf_t dtmf, SWIGTYPE_p_unsigned_long flags) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_feed_dtmf(switch_asr_handle.getCPtr(ah), switch_dtmf_t.getCPtr(dtmf), SWIGTYPE_p_unsigned_long.getCPtr(flags));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_core_asr_check_results(switch_asr_handle ah, SWIGTYPE_p_unsigned_long flags) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_check_results(switch_asr_handle.getCPtr(ah), SWIGTYPE_p_unsigned_long.getCPtr(flags));
     return ret;
<span style="color: #800080; font-weight: bold">@@ -2010,6 +2015,21 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_enable_grammar(switch_asr_handle ah, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_enable_grammar(switch_asr_handle.getCPtr(ah), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_disable_grammar(switch_asr_handle ah, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_grammar(switch_asr_handle.getCPtr(ah), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_core_asr_disable_all_grammars(switch_asr_handle ah) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_disable_all_grammars(switch_asr_handle.getCPtr(ah));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_core_asr_pause(switch_asr_handle ah) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_asr_pause(switch_asr_handle.getCPtr(ah));
     return ret;
<span style="color: #800080; font-weight: bold">@@ -4060,11 +4080,31 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session session, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_enable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session session, string name) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_grammar(SWIGTYPE_p_switch_core_session.getCPtr(session), name);</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session session) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_disable_all_grammars(SWIGTYPE_p_switch_core_session.getCPtr(session));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session session, string name, string val) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_set_param_detect_speech(SWIGTYPE_p_switch_core_session.getCPtr(session), name, val);
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session session) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_detect_speech_start_input_timers(SWIGTYPE_p_switch_core_session.getCPtr(session));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static switch_status_t switch_ivr_record_session(SWIGTYPE_p_switch_core_session session, string file, uint limit, switch_file_handle fh) {
     switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_ivr_record_session(SWIGTYPE_p_switch_core_session.getCPtr(session), file, limit, switch_file_handle.getCPtr(fh));
     return ret;
<span style="color: #800080; font-weight: bold">@@ -7893,6 +7933,9 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_feed&quot;)]
   public static extern int switch_core_asr_feed(HandleRef jarg1, HandleRef jarg2, uint jarg3, HandleRef jarg4);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_feed_dtmf&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_feed_dtmf(HandleRef jarg1, HandleRef jarg2, HandleRef jarg3);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_check_results&quot;)]
   public static extern int switch_core_asr_check_results(HandleRef jarg1, HandleRef jarg2);
 
<span style="color: #800080; font-weight: bold">@@ -7905,6 +7948,15 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_unload_grammar&quot;)]
   public static extern int switch_core_asr_unload_grammar(HandleRef jarg1, string jarg2);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_enable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_enable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_disable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_disable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_disable_all_grammars&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_asr_disable_all_grammars(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_asr_pause&quot;)]
   public static extern int switch_core_asr_pause(HandleRef jarg1);
 
<span style="color: #800080; font-weight: bold">@@ -10182,6 +10234,30 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_next_get&quot;)]
   public static extern IntPtr switch_asr_interface_next_get(HandleRef jarg1);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_enable_grammar_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_enable_grammar_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_enable_grammar_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_enable_grammar_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_grammar_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_disable_grammar_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_grammar_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_disable_grammar_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_all_grammars_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_disable_all_grammars_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_disable_all_grammars_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_disable_all_grammars_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_feed_dtmf_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_asr_interface_asr_feed_dtmf_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_asr_interface_asr_feed_dtmf_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_asr_interface_asr_feed_dtmf_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_new_switch_asr_interface&quot;)]
   public static extern IntPtr new_switch_asr_interface();
 
<span style="color: #800080; font-weight: bold">@@ -12126,9 +12202,21 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_unload_grammar&quot;)]
   public static extern int switch_ivr_detect_speech_unload_grammar(HandleRef jarg1, string jarg2);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_enable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_enable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_disable_grammar&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_disable_grammar(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_disable_all_grammars&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_disable_all_grammars(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_set_param_detect_speech&quot;)]
   public static extern int switch_ivr_set_param_detect_speech(HandleRef jarg1, string jarg2, string jarg3);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_detect_speech_start_input_timers&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_ivr_detect_speech_start_input_timers(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_ivr_record_session&quot;)]
   public static extern int switch_ivr_record_session(HandleRef jarg1, string jarg2, uint jarg3, HandleRef jarg4);
 
<span style="color: #800080; font-weight: bold">@@ -14943,6 +15031,36 @@ namespace FreeSWITCH.Native {</span>
 using System;
 using System.Runtime.InteropServices;
 
<span style="color: #00A000">+public class SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t {</span>
<span style="color: #00A000">+  private HandleRef swigCPtr;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  internal SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(IntPtr cPtr, bool futureUse) {</span>
<span style="color: #00A000">+    swigCPtr = new HandleRef(this, cPtr);</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  protected SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t() {</span>
<span style="color: #00A000">+    swigCPtr = new HandleRef(null, IntPtr.Zero);</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  internal static HandleRef getCPtr(SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t obj) {</span>
<span style="color: #00A000">+    return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+/* ----------------------------------------------------------------------------</span>
<span style="color: #00A000">+ * This file was automatically generated by SWIG (http://www.swig.org).</span>
<span style="color: #00A000">+ * Version 1.3.35</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * Do not make changes to this file unless you know what you are doing--modify</span>
<span style="color: #00A000">+ * the SWIG interface file instead.</span>
<span style="color: #00A000">+ * ----------------------------------------------------------------------------- */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+namespace FreeSWITCH.Native {</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+using System;</span>
<span style="color: #00A000">+using System.Runtime.InteropServices;</span>
<span style="color: #00A000">+</span>
 public class SWIGTYPE_p_f_p_switch_asr_handle_p_unsigned_long__switch_status_t {
   private HandleRef swigCPtr;
 
<span style="color: #800080; font-weight: bold">@@ -19959,6 +20077,50 @@ public class switch_asr_interface : IDisposable {</span>
     } 
   }
 
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_enable_grammar {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_enable_grammar_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t asr_disable_grammar {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_grammar_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__char__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t asr_disable_all_grammars {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_disable_all_grammars_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t asr_feed_dtmf {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_set(swigCPtr, SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_asr_interface_asr_feed_dtmf_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_f_p_switch_asr_handle_p_q_const__switch_dtmf_t_p_unsigned_long__switch_status_t(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public switch_asr_interface() : this(freeswitchPINVOKE.new_switch_asr_interface(), true) {
   }
 
</pre></div>
<div class="highlight"><pre>committer: Travis Cross
comments: 
lower log-level of a mod_spy message
When a session loses a race to bridge a call, the CHANNEL_BRIDGE event
handler is still run, yet session_locate is going to return null as it
won&#39;t get a read-lock on the peer&#39;s session.  Since this is a normal
and common condition, let&#39;s log this as a debug message rather than as
an error condition.

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_spy/mod_spy.c b/src/mod/applications/mod_spy/mod_spy.c</span>
<span style="color: #000080; font-weight: bold">index e0a9317..1797539 100644</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_spy/mod_spy.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_spy/mod_spy.c</span>
<span style="color: #800080; font-weight: bold">@@ -201,7 +201,7 @@ static void event_handler(switch_event_t *event)</span>
                 }
 
                 if (!(peer_session = switch_core_session_locate(peer_uuid))) {
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Can&#39;t locate peer session for uuid %s\n&quot;, peer_uuid);</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Can&#39;t locate peer session for uuid %s\n&quot;, peer_uuid);</span>
                         return;
                 }
 
</pre></div>
<div class="highlight"><pre>committer: Travis Cross
comments: 
fix typo: cant -&gt; can&#39;t

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_spy/mod_spy.c b/src/mod/applications/mod_spy/mod_spy.c</span>
<span style="color: #000080; font-weight: bold">index 9986703..e0a9317 100644</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_spy/mod_spy.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_spy/mod_spy.c</span>
<span style="color: #800080; font-weight: bold">@@ -201,14 +201,14 @@ static void event_handler(switch_event_t *event)</span>
                 }
 
                 if (!(peer_session = switch_core_session_locate(peer_uuid))) {
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Cant locate peer session for uuid %s\n&quot;, peer_uuid);</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Can&#39;t locate peer session for uuid %s\n&quot;, peer_uuid);</span>
                         return;
                 }
 
                 peer_channel = switch_core_session_get_channel(peer_session);
                 
                 if (switch_event_create(&amp;peer_event, SWITCH_EVENT_CHANNEL_BRIDGE) != SWITCH_STATUS_SUCCESS) {
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Cant create bridge event for peer channel %s\n&quot;, peer_uuid);</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;Can&#39;t create bridge event for peer channel %s\n&quot;, peer_uuid);</span>
                         goto end;
                 }
 
<span style="color: #800080; font-weight: bold">@@ -249,7 +249,7 @@ SWITCH_STANDARD_APP(userspy_function)</span>
                         status = switch_core_hash_insert(globals.spy_hash, argv[0], (void *) uuid);
 
                         if ((status != SWITCH_STATUS_SUCCESS)) {
<span style="color: #A00000">-                                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, &quot;Cant insert to spy hash\n&quot;);</span>
<span style="color: #00A000">+                                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, &quot;Can&#39;t insert to spy hash\n&quot;);</span>
                                 switch_channel_hangup(channel, SWITCH_CAUSE_SERVICE_NOT_IMPLEMENTED);
                                 switch_thread_rwlock_unlock(globals.spy_hash_lock);
                                 return;
</pre></div>
<div class="highlight"><pre>committer: Brian West
comments: 
Merge branch &#39;openmethods-merged-dtmf-20110126&#39; of git://scm.dashjr.org/var/scmroot/git/freeswitch
</pre></div>
<div class="highlight"><pre>committer: Jeff Lenk
comments: 
OPENZAP-140 VS2010 build cleanup

<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/msvc/testboost/testboost.2010.vcxproj b/libs/freetdm/msvc/testboost/testboost.2010.vcxproj</span>
<span style="color: #000080; font-weight: bold">index 6206148..314440b 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/msvc/testboost/testboost.2010.vcxproj</span>
<span style="color: #00A000">+++ b/libs/freetdm/msvc/testboost/testboost.2010.vcxproj</span>
<span style="color: #800080; font-weight: bold">@@ -105,7 +105,7 @@</span>
       &lt;DisableSpecificWarnings&gt;4100;%(DisableSpecificWarnings)&lt;/DisableSpecificWarnings&gt;
     &lt;/ClCompile&gt;
     &lt;Link&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;..\..\debug\freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;GenerateDebugInformation&gt;true&lt;/GenerateDebugInformation&gt;
       &lt;SubSystem&gt;Console&lt;/SubSystem&gt;
       &lt;RandomizedBaseAddress&gt;false&lt;/RandomizedBaseAddress&gt;
<span style="color: #800080; font-weight: bold">@@ -162,7 +162,7 @@</span>
       &lt;DisableSpecificWarnings&gt;4100;%(DisableSpecificWarnings)&lt;/DisableSpecificWarnings&gt;
     &lt;/ClCompile&gt;
     &lt;Link&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;GenerateDebugInformation&gt;true&lt;/GenerateDebugInformation&gt;
       &lt;SubSystem&gt;Console&lt;/SubSystem&gt;
       &lt;RandomizedBaseAddress&gt;false&lt;/RandomizedBaseAddress&gt;
<span style="color: #800080; font-weight: bold">@@ -199,7 +199,7 @@</span>
       &lt;DataExecutionPrevention&gt;
       &lt;/DataExecutionPrevention&gt;
       &lt;TargetMachine&gt;MachineX64&lt;/TargetMachine&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;AdditionalLibraryDirectories&gt;../../$(PlatformName)\$(Configuration);%(AdditionalLibraryDirectories)&lt;/AdditionalLibraryDirectories&gt;
     &lt;/Link&gt;
   &lt;/ItemDefinitionGroup&gt;
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj b/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj</span>
<span style="color: #000080; font-weight: bold">index 5994da6..4077a60 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj</span>
<span style="color: #00A000">+++ b/libs/freetdm/msvc/testboost/testsangomaboost.2010.vcxproj</span>
<span style="color: #800080; font-weight: bold">@@ -105,7 +105,7 @@</span>
       &lt;DisableSpecificWarnings&gt;4100;%(DisableSpecificWarnings)&lt;/DisableSpecificWarnings&gt;
     &lt;/ClCompile&gt;
     &lt;Link&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;..\..\debug\freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;GenerateDebugInformation&gt;true&lt;/GenerateDebugInformation&gt;
       &lt;SubSystem&gt;Console&lt;/SubSystem&gt;
       &lt;RandomizedBaseAddress&gt;false&lt;/RandomizedBaseAddress&gt;
<span style="color: #800080; font-weight: bold">@@ -162,7 +162,7 @@</span>
       &lt;DisableSpecificWarnings&gt;4100;%(DisableSpecificWarnings)&lt;/DisableSpecificWarnings&gt;
     &lt;/ClCompile&gt;
     &lt;Link&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;GenerateDebugInformation&gt;true&lt;/GenerateDebugInformation&gt;
       &lt;SubSystem&gt;Console&lt;/SubSystem&gt;
       &lt;RandomizedBaseAddress&gt;false&lt;/RandomizedBaseAddress&gt;
<span style="color: #800080; font-weight: bold">@@ -199,7 +199,7 @@</span>
       &lt;DataExecutionPrevention&gt;
       &lt;/DataExecutionPrevention&gt;
       &lt;TargetMachine&gt;MachineX64&lt;/TargetMachine&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;AdditionalLibraryDirectories&gt;../../$(PlatformName)\$(Configuration);%(AdditionalLibraryDirectories)&lt;/AdditionalLibraryDirectories&gt;
     &lt;/Link&gt;
   &lt;/ItemDefinitionGroup&gt;
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj</span>
<span style="color: #000080; font-weight: bold">index 78689c3..684e432 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.2010.vcxproj</span>
<span style="color: #800080; font-weight: bold">@@ -61,11 +61,11 @@</span>
   &lt;PropertyGroup Label=&quot;UserMacros&quot; /&gt;
   &lt;PropertyGroup&gt;
     &lt;_ProjectFileVersion&gt;10.0.30319.1&lt;/_ProjectFileVersion&gt;
<span style="color: #A00000">-    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(SolutionDir)$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #A00000">-    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(Configuration)\&lt;/IntDir&gt;</span>
<span style="color: #00A000">+    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #00A000">+    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;</span>
     &lt;LinkIncremental Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;true&lt;/LinkIncremental&gt;
<span style="color: #A00000">-    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(SolutionDir)$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #A00000">-    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(Configuration)\&lt;/IntDir&gt;</span>
<span style="color: #00A000">+    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #00A000">+    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;</span>
     &lt;LinkIncremental Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;false&lt;/LinkIncremental&gt;
     &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|x64&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;
     &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|x64&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;
<span style="color: #800080; font-weight: bold">@@ -102,7 +102,7 @@</span>
       &lt;DisableSpecificWarnings&gt;4100;%(DisableSpecificWarnings)&lt;/DisableSpecificWarnings&gt;
     &lt;/ClCompile&gt;
     &lt;Link&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;AdditionalLibraryDirectories&gt;$(OutDir);%(AdditionalLibraryDirectories)&lt;/AdditionalLibraryDirectories&gt;
       &lt;GenerateDebugInformation&gt;true&lt;/GenerateDebugInformation&gt;
       &lt;SubSystem&gt;Windows&lt;/SubSystem&gt;
<span style="color: #800080; font-weight: bold">@@ -151,7 +151,7 @@</span>
       &lt;DisableSpecificWarnings&gt;4100;%(DisableSpecificWarnings)&lt;/DisableSpecificWarnings&gt;
     &lt;/ClCompile&gt;
     &lt;Link&gt;
<span style="color: #A00000">-      &lt;AdditionalDependencies&gt;freetdm.lib;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
<span style="color: #00A000">+      &lt;AdditionalDependencies&gt;%(AdditionalDependencies)&lt;/AdditionalDependencies&gt;</span>
       &lt;AdditionalLibraryDirectories&gt;$(OutDir);%(AdditionalLibraryDirectories)&lt;/AdditionalLibraryDirectories&gt;
       &lt;GenerateDebugInformation&gt;true&lt;/GenerateDebugInformation&gt;
       &lt;SubSystem&gt;Windows&lt;/SubSystem&gt;
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj</span>
<span style="color: #000080; font-weight: bold">index 40d0a73..a21be22 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj</span>
<span style="color: #00A000">+++ b/libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj</span>
<span style="color: #800080; font-weight: bold">@@ -61,14 +61,14 @@</span>
   &lt;PropertyGroup Label=&quot;UserMacros&quot; /&gt;
   &lt;PropertyGroup&gt;
     &lt;_ProjectFileVersion&gt;10.0.30319.1&lt;/_ProjectFileVersion&gt;
<span style="color: #A00000">-    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(SolutionDir)$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #A00000">-    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(Configuration)\&lt;/IntDir&gt;</span>
<span style="color: #00A000">+    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #00A000">+    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;</span>
     &lt;LinkIncremental Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|Win32&#39;&quot;&gt;true&lt;/LinkIncremental&gt;
     &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|x64&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;
     &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|x64&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;
     &lt;LinkIncremental Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Debug|x64&#39;&quot;&gt;true&lt;/LinkIncremental&gt;
<span style="color: #A00000">-    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(SolutionDir)$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #A00000">-    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(Configuration)\&lt;/IntDir&gt;</span>
<span style="color: #00A000">+    &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;</span>
<span style="color: #00A000">+    &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;</span>
     &lt;LinkIncremental Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|Win32&#39;&quot;&gt;false&lt;/LinkIncremental&gt;
     &lt;OutDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|x64&#39;&quot;&gt;$(SolutionDir)$(Platform)\$(Configuration)\&lt;/OutDir&gt;
     &lt;IntDir Condition=&quot;&#39;$(Configuration)|$(Platform)&#39;==&#39;Release|x64&#39;&quot;&gt;$(Platform)\$(Configuration)\&lt;/IntDir&gt;
</pre></div>
<div class="highlight"><pre>committer: Daniel Swarbrick
comments: 
mostly complete implementation of channel list via SNMP

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB</span>
<span style="color: #000080; font-weight: bold">index 11c3999..8448526 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB</span>
<span style="color: #800080; font-weight: bold">@@ -3,11 +3,14 @@ FREESWITCH-MIB DEFINITIONS ::= BEGIN</span>
 IMPORTS
     OBJECT-TYPE, MODULE-IDENTITY,
     Integer32, Gauge32, Counter32, Counter64, TimeTicks,
<span style="color: #A00000">-    enterprises,</span>
<span style="color: #00A000">+    enterprises</span>
         FROM SNMPv2-SMI
 
<span style="color: #A00000">-    DisplayString</span>
<span style="color: #00A000">+    DisplayString, DateAndTime</span>
         FROM SNMPv2-TC
<span style="color: #00A000">+</span>
<span style="color: #00A000">+    InetAddressType, InetAddress</span>
<span style="color: #00A000">+        FROM INET-ADDRESS-MIB</span>
 ;
 
 
<span style="color: #800080; font-weight: bold">@@ -109,13 +112,27 @@ maxSessionsPerSecond OBJECT-TYPE</span>
 
 
 ChannelEntry ::= SEQUENCE {
<span style="color: #A00000">-    chanUUID        DisplayString,</span>
<span style="color: #A00000">-    chanDirection   DisplayString,</span>
<span style="color: #A00000">-    chanCreated     DisplayString,</span>
<span style="color: #A00000">-    chanName        DisplayString,</span>
<span style="color: #A00000">-    chanState       DisplayString,</span>
<span style="color: #A00000">-    chanCIDName     DisplayString,</span>
<span style="color: #A00000">-    chanCIDNum      DisplayString</span>
<span style="color: #00A000">+    chanIndex           Integer32,</span>
<span style="color: #00A000">+    chanUUID            DisplayString,</span>
<span style="color: #00A000">+    chanDirection       DisplayString,</span>
<span style="color: #00A000">+    chanCreated         DateAndTime,</span>
<span style="color: #00A000">+    chanName            DisplayString,</span>
<span style="color: #00A000">+    chanState           DisplayString,</span>
<span style="color: #00A000">+    chanCIDName         DisplayString,</span>
<span style="color: #00A000">+    chanCIDNum          DisplayString,</span>
<span style="color: #00A000">+    chanInetAddressType InetAddressType,</span>
<span style="color: #00A000">+    chanInetAddress     InetAddress,</span>
<span style="color: #00A000">+    chanDest            DisplayString,</span>
<span style="color: #00A000">+    chanApplication     DisplayString,</span>
<span style="color: #00A000">+    chanAppData         DisplayString,</span>
<span style="color: #00A000">+    chanDialplan        DisplayString,</span>
<span style="color: #00A000">+    chanContext         DisplayString,</span>
<span style="color: #00A000">+    chanReadCodec       DisplayString,</span>
<span style="color: #00A000">+    chanReadRate        Gauge32,</span>
<span style="color: #00A000">+    chanReadBitRate     Gauge32,</span>
<span style="color: #00A000">+    chanWriteCodec      DisplayString,</span>
<span style="color: #00A000">+    chanWriteRate       Gauge32,</span>
<span style="color: #00A000">+    chanWriteBitRate    Gauge32</span>
 }
 
 channelList OBJECT-TYPE
<span style="color: #800080; font-weight: bold">@@ -135,60 +152,172 @@ channelEntry OBJECT-TYPE</span>
     INDEX { chanIndex }
     ::= { channelList 1 }
 
<span style="color: #00A000">+chanIndex OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      Integer32</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel SNMP index.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 1 }</span>
<span style="color: #00A000">+</span>
 chanUUID OBJECT-TYPE
     SYNTAX      DisplayString
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
<span style="color: #A00000">-        &quot;The channel UUID.&quot;</span>
<span style="color: #A00000">-    ::= { channelEntry 1 }</span>
<span style="color: #00A000">+        &quot;Channel UUID.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 2 }</span>
 
 chanDirection OBJECT-TYPE
     SYNTAX      DisplayString
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
<span style="color: #A00000">-        &quot;The channel direction.&quot;</span>
<span style="color: #A00000">-    ::= { channelEntry 2 }</span>
<span style="color: #00A000">+        &quot;Channel direction.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 3 }</span>
 
 chanCreated OBJECT-TYPE
<span style="color: #A00000">-    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    SYNTAX      DateAndTime</span>
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
         &quot;Channel creation timestamp.&quot;
<span style="color: #A00000">-    ::= { channelEntry 3 }</span>
<span style="color: #00A000">+    ::= { channelEntry 4 }</span>
 
 chanName OBJECT-TYPE
     SYNTAX      DisplayString
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
<span style="color: #A00000">-        &quot;The channel name.&quot;</span>
<span style="color: #A00000">-    ::= { channelEntry 4 }</span>
<span style="color: #00A000">+        &quot;Channel name.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 5 }</span>
 
 chanState OBJECT-TYPE
     SYNTAX      DisplayString
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
<span style="color: #A00000">-        &quot;The channel state.&quot;</span>
<span style="color: #A00000">-    ::= { channelEntry 5 }</span>
<span style="color: #00A000">+        &quot;Channel state.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 6 }</span>
 
 chanCIDName OBJECT-TYPE
     SYNTAX      DisplayString
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
<span style="color: #A00000">-        &quot;The channel caller ID name.&quot;</span>
<span style="color: #A00000">-    ::= { channelEntry 6 }</span>
<span style="color: #00A000">+        &quot;Channel caller ID name.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 7 }</span>
 
 chanCIDNum OBJECT-TYPE
     SYNTAX      DisplayString
     MAX-ACCESS  read-only
     STATUS      current
     DESCRIPTION
<span style="color: #A00000">-        &quot;The channel caller ID number.&quot;</span>
<span style="color: #A00000">-    ::= { channelEntry 7 }</span>
<span style="color: #00A000">+        &quot;Channel caller ID number.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 8 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanInetAddressType OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      InetAddressType</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel originator&#39;s IP address type (IPv4 or IPv6).&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 9 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanInetAddress OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      InetAddress</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel originator&#39;s IP address.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 10 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanDest OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel destination.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 11 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanApplication OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel application.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 12 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanAppData OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel application data.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 13 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanDialplan OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel dialplan.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 14 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanContext OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel dialplan context.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 15 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanReadCodec OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel read codec.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 16 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanReadRate OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      Gauge32</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel read samples per second.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 17 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanReadBitRate OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      Gauge32</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel read bits per second.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 18 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanWriteCodec OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel write codec.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 19 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanWriteRate OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      Gauge32</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel write samples per second.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 20 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanWriteBitRate OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      Gauge32</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel write bits per second.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 21 }</span>
 
 END
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/subagent.c b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #000080; font-weight: bold">index 7b9faa7..43975ee 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #800080; font-weight: bold">@@ -42,6 +42,17 @@ netsnmp_handler_registration *ch_reginfo;</span>
 uint32_t idx;
 
 
<span style="color: #00A000">+static void time_t_to_datetime(time_t epoch, char *buf, switch_size_t buflen)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        struct tm *dt;</span>
<span style="color: #00A000">+        uint16_t year;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        dt = gmtime(&amp;epoch);</span>
<span style="color: #00A000">+        year = dt-&gt;tm_year + 1900;</span>
<span style="color: #00A000">+        switch_snprintf(buf, buflen, &quot;%c%c%c%c%c%c%c%c+%c%c&quot;, year &gt;&gt; 8, year &amp; 0xff, dt-&gt;tm_mon + 1, dt-&gt;tm_mday, dt-&gt;tm_hour, dt-&gt;tm_min, dt-&gt;tm_sec, 0, 0, 0);</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)
 {
         uint32_t *count = (uint32_t *) pArg;
<span style="color: #800080; font-weight: bold">@@ -69,11 +80,31 @@ static int channelList_callback(void *pArg, int argc, char **argv, char **column</span>
         entry-&gt;idx = idx++;
         strncpy(entry-&gt;uuid, argv[0], sizeof(entry-&gt;uuid));
         strncpy(entry-&gt;direction, argv[1], sizeof(entry-&gt;direction));
<span style="color: #A00000">-        strncpy(entry-&gt;created, argv[2], sizeof(entry-&gt;created));</span>
<span style="color: #00A000">+        entry-&gt;created_epoch = atoi(argv[3]);</span>
         strncpy(entry-&gt;name, argv[4], sizeof(entry-&gt;name));
         strncpy(entry-&gt;state, argv[5], sizeof(entry-&gt;state));
         strncpy(entry-&gt;cid_name, argv[6], sizeof(entry-&gt;cid_name));
         strncpy(entry-&gt;cid_num, argv[7], sizeof(entry-&gt;cid_num));
<span style="color: #00A000">+        strncpy(entry-&gt;dest, argv[9], sizeof(entry-&gt;dest));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;application, argv[10], sizeof(entry-&gt;application));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;application_data, argv[11], sizeof(entry-&gt;application_data));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;dialplan, argv[12], sizeof(entry-&gt;dialplan));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;context, argv[13], sizeof(entry-&gt;context));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;read_codec, argv[14], sizeof(entry-&gt;read_codec));</span>
<span style="color: #00A000">+        entry-&gt;read_rate = atoi(argv[15]);</span>
<span style="color: #00A000">+        entry-&gt;read_bitrate = atoi(argv[16]);</span>
<span style="color: #00A000">+        strncpy(entry-&gt;write_codec, argv[17], sizeof(entry-&gt;write_codec));</span>
<span style="color: #00A000">+        entry-&gt;write_rate = atoi(argv[18]);</span>
<span style="color: #00A000">+        entry-&gt;write_bitrate = atoi(argv[19]);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        memset(&amp;entry-&gt;ip_addr, 0, sizeof(entry-&gt;ip_addr));</span>
<span style="color: #00A000">+        if (strchr(argv[8], &#39;:&#39;)) {</span>
<span style="color: #00A000">+                switch_inet_pton(AF_INET6, argv[8], &amp;entry-&gt;ip_addr);</span>
<span style="color: #00A000">+                entry-&gt;addr_family = AF_INET6;</span>
<span style="color: #00A000">+        } else {</span>
<span style="color: #00A000">+                switch_inet_pton(AF_INET, argv[8], &amp;entry-&gt;ip_addr);</span>
<span style="color: #00A000">+                entry-&gt;addr_family = AF_INET;</span>
<span style="color: #00A000">+        }</span>
 
         netsnmp_tdata_row_add_index(row, ASN_INTEGER, &amp;entry-&gt;idx, sizeof(entry-&gt;idx));
         netsnmp_tdata_add_row(ch_table, row);
<span style="color: #800080; font-weight: bold">@@ -128,9 +159,9 @@ void init_subagent(switch_memory_pool_t *pool)</span>
         netsnmp_register_scalar_group(netsnmp_create_handler_registration(&quot;systemStats&quot;, handle_systemStats, systemStats_oid, OID_LENGTH(systemStats_oid), HANDLER_CAN_RONLY), 1, 7);
 
         ch_table_info = switch_core_alloc(pool, sizeof(netsnmp_table_registration_info));
<span style="color: #A00000">-        netsnmp_table_helper_add_index(ch_table_info, ASN_INTEGER);</span>
<span style="color: #A00000">-        ch_table_info-&gt;min_column = 1;</span>
<span style="color: #A00000">-        ch_table_info-&gt;max_column = 7;</span>
<span style="color: #00A000">+        netsnmp_table_helper_add_indexes(ch_table_info, ASN_INTEGER, 0);</span>
<span style="color: #00A000">+        ch_table_info-&gt;min_column = CH_INDEX;</span>
<span style="color: #00A000">+        ch_table_info-&gt;max_column = CH_WRITE_BITRATE;</span>
         ch_table = netsnmp_tdata_create_table(&quot;channelList&quot;, 0);
         ch_reginfo = netsnmp_create_handler_registration(&quot;channelList&quot;, handle_channelList, channelList_oid, OID_LENGTH(channelList_oid), HANDLER_CAN_RONLY);
         netsnmp_tdata_register(ch_reginfo, ch_table, ch_table_info);
<span style="color: #800080; font-weight: bold">@@ -191,15 +222,15 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                         break;
                 case SS_SESSIONS_SINCE_STARTUP:
                         int_val = switch_core_session_id() - 1;
<span style="color: #A00000">-                        snmp_set_var_typed_value(requests-&gt;requestvb, ASN_COUNTER, (u_char *) &amp;int_val, sizeof(int_val));</span>
<span style="color: #00A000">+                        snmp_set_var_typed_integer(requests-&gt;requestvb, ASN_COUNTER, int_val);</span>
                         break;
                 case SS_CURRENT_SESSIONS:
                         int_val = switch_core_session_count();
<span style="color: #A00000">-                        snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));</span>
<span style="color: #00A000">+                        snmp_set_var_typed_integer(requests-&gt;requestvb, ASN_GAUGE, int_val);</span>
                         break;
                 case SS_MAX_SESSIONS:
                         switch_core_session_ctl(SCSC_MAX_SESSIONS, &amp;int_val);
<span style="color: #A00000">-                        snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));</span>
<span style="color: #00A000">+                        snmp_set_var_typed_integer(requests-&gt;requestvb, ASN_GAUGE, int_val);</span>
                         break;
                 case SS_CURRENT_CALLS:
                         {
<span style="color: #800080; font-weight: bold">@@ -213,17 +244,17 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                         gethostname(hostname, sizeof(hostname));
                         sprintf(sql, &quot;SELECT COUNT(*) FROM calls WHERE hostname=&#39;%s&#39;&quot;, hostname);
                         switch_cache_db_execute_sql_callback(dbh, sql, sql_count_callback, &amp;int_val, NULL);
<span style="color: #A00000">-                        snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));</span>
<span style="color: #00A000">+                        snmp_set_var_typed_integer(requests-&gt;requestvb, ASN_GAUGE, int_val);</span>
                         switch_cache_db_release_db_handle(&amp;dbh);
                         }
                         break;
                 case SS_SESSIONS_PER_SECOND:
                         switch_core_session_ctl(SCSC_LAST_SPS, &amp;int_val);
<span style="color: #A00000">-                        snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));</span>
<span style="color: #00A000">+                        snmp_set_var_typed_integer(requests-&gt;requestvb, ASN_GAUGE, int_val);</span>
                         break;
                 case SS_MAX_SESSIONS_PER_SECOND:
                         switch_core_session_ctl(SCSC_SPS, &amp;int_val);
<span style="color: #A00000">-                        snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));</span>
<span style="color: #00A000">+                        snmp_set_var_typed_integer(requests-&gt;requestvb, ASN_GAUGE, int_val);</span>
                         break;
                 default:
                         snmp_log(LOG_WARNING, &quot;Unregistered OID-suffix requested (%d)\n&quot;, (int) subid);
<span style="color: #800080; font-weight: bold">@@ -246,6 +277,7 @@ int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
         netsnmp_request_info *request;
         netsnmp_table_request_info *table_info;
         chan_entry_t *entry;
<span style="color: #00A000">+        char dt_str[12];</span>
 
         switch (reqinfo-&gt;mode) {
         case MODE_GET:
<span style="color: #800080; font-weight: bold">@@ -254,6 +286,9 @@ int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                         entry = (chan_entry_t *) netsnmp_tdata_extract_entry(request);
 
                         switch (table_info-&gt;colnum) {
<span style="color: #00A000">+                        case CH_INDEX:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_integer(request-&gt;requestvb, ASN_INTEGER, entry-&gt;idx);</span>
<span style="color: #00A000">+                                break;</span>
                         case CH_UUID:
                                 snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;uuid, strlen(entry-&gt;uuid));
                                 break;
<span style="color: #800080; font-weight: bold">@@ -261,7 +296,8 @@ int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                                 snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;direction, strlen(entry-&gt;direction));
                                 break;
                         case CH_CREATED:
<span style="color: #A00000">-                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;created, strlen(entry-&gt;created));</span>
<span style="color: #00A000">+                                time_t_to_datetime(entry-&gt;created_epoch, (char *) &amp;dt_str, sizeof(dt_str));</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) &amp;dt_str, sizeof(dt_str));</span>
                                 break;
                         case CH_NAME:
                                 snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;name, strlen(entry-&gt;name));
<span style="color: #800080; font-weight: bold">@@ -275,6 +311,53 @@ int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                         case CH_CID_NUM:
                                 snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;cid_num, strlen(entry-&gt;cid_num));
                                 break;
<span style="color: #00A000">+                        case CH_IP_ADDR_TYPE:</span>
<span style="color: #00A000">+                                if (entry-&gt;addr_family == AF_INET6) {</span>
<span style="color: #00A000">+                                        snmp_set_var_typed_integer(request-&gt;requestvb, ASN_INTEGER, INETADDRESSTYPE_IPV6);</span>
<span style="color: #00A000">+                                } else {</span>
<span style="color: #00A000">+                                        snmp_set_var_typed_integer(request-&gt;requestvb, ASN_INTEGER, INETADDRESSTYPE_IPV4);</span>
<span style="color: #00A000">+                                }</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_IP_ADDR:</span>
<span style="color: #00A000">+                                if (entry-&gt;addr_family == AF_INET6) {</span>
<span style="color: #00A000">+                                        snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) &amp;entry-&gt;ip_addr.v6, sizeof(entry-&gt;ip_addr.v6));</span>
<span style="color: #00A000">+                                } else {</span>
<span style="color: #00A000">+                                        snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) &amp;entry-&gt;ip_addr.v4, sizeof(entry-&gt;ip_addr.v4));</span>
<span style="color: #00A000">+                                }</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_DEST:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;dest, strlen(entry-&gt;dest));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_APPLICATION:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;application, strlen(entry-&gt;application));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_APPLICATION_DATA:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;application_data, strlen(entry-&gt;application_data));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_DIALPLAN:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;dialplan, strlen(entry-&gt;dialplan));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_CONTEXT:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;context, strlen(entry-&gt;context));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_READ_CODEC:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;read_codec, strlen(entry-&gt;read_codec));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_READ_RATE:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;entry-&gt;read_rate, sizeof(entry-&gt;read_rate));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_READ_BITRATE:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;entry-&gt;read_bitrate, sizeof(entry-&gt;read_bitrate));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_WRITE_CODEC:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;write_codec, strlen(entry-&gt;write_codec));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_WRITE_RATE:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;entry-&gt;write_rate, sizeof(entry-&gt;write_rate));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_WRITE_BITRATE:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;entry-&gt;write_bitrate, sizeof(entry-&gt;write_bitrate));</span>
<span style="color: #00A000">+                                break;</span>
                         default:
                                 snmp_log(LOG_WARNING, &quot;Unregistered OID-suffix requested (%d)\n&quot;, table_info-&gt;colnum);
                                 netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/subagent.h b/src/mod/event_handlers/mod_snmp/subagent.h</span>
<span style="color: #000080; font-weight: bold">index 0070b2c..5da87a6 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/subagent.h</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/subagent.h</span>
<span style="color: #800080; font-weight: bold">@@ -15,23 +15,58 @@</span>
 #define SS_MAX_SESSIONS_PER_SECOND        7
 
 /* .1.3.6.1.4.1.27880.1.9 */
<span style="color: #A00000">-#define CH_UUID                                1</span>
<span style="color: #A00000">-#define CH_DIRECTION                        2</span>
<span style="color: #A00000">-#define CH_CREATED                        3</span>
<span style="color: #A00000">-#define CH_NAME                                4</span>
<span style="color: #A00000">-#define CH_STATE                        5</span>
<span style="color: #A00000">-#define CH_CID_NAME                        6</span>
<span style="color: #A00000">-#define CH_CID_NUM                        7</span>
<span style="color: #00A000">+#define CH_INDEX                        1</span>
<span style="color: #00A000">+#define CH_UUID                                2</span>
<span style="color: #00A000">+#define CH_DIRECTION                        3</span>
<span style="color: #00A000">+#define CH_CREATED                        4</span>
<span style="color: #00A000">+#define CH_NAME                                5</span>
<span style="color: #00A000">+#define CH_STATE                        6</span>
<span style="color: #00A000">+#define CH_CID_NAME                        7</span>
<span style="color: #00A000">+#define CH_CID_NUM                        8</span>
<span style="color: #00A000">+#define CH_IP_ADDR_TYPE                        9</span>
<span style="color: #00A000">+#define CH_IP_ADDR                        10</span>
<span style="color: #00A000">+#define CH_DEST                                11</span>
<span style="color: #00A000">+#define CH_APPLICATION                        12</span>
<span style="color: #00A000">+#define CH_APPLICATION_DATA                13</span>
<span style="color: #00A000">+#define CH_DIALPLAN                        14</span>
<span style="color: #00A000">+#define CH_CONTEXT                        15</span>
<span style="color: #00A000">+#define CH_READ_CODEC                        16</span>
<span style="color: #00A000">+#define CH_READ_RATE                        17</span>
<span style="color: #00A000">+#define CH_READ_BITRATE                        18</span>
<span style="color: #00A000">+#define CH_WRITE_CODEC                        19</span>
<span style="color: #00A000">+#define CH_WRITE_RATE                        20</span>
<span style="color: #00A000">+#define CH_WRITE_BITRATE                21</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/* Why aren&#39;t these in net-snmp-includes.h ? */</span>
<span style="color: #00A000">+#define INETADDRESSTYPE_UNKNOWN                0</span>
<span style="color: #00A000">+#define INETADDRESSTYPE_IPV4                1</span>
<span style="color: #00A000">+#define INETADDRESSTYPE_IPV6                2</span>
<span style="color: #00A000">+#define INETADDRESSTYPE_IPV4Z                3</span>
<span style="color: #00A000">+#define INETADDRESSTYPE_IPV6Z                4</span>
<span style="color: #00A000">+#define INETADDRESSTYPE_DNS                16</span>
 
 typedef struct {
         uint32_t idx;
         char uuid[38];
         char direction[32];
<span style="color: #A00000">-        char created[128];</span>
<span style="color: #00A000">+        time_t created_epoch;</span>
         char name[1024];
         char state[64];
         char cid_name[1024];
         char cid_num[256];
<span style="color: #00A000">+        ip_t ip_addr;</span>
<span style="color: #00A000">+        uint8_t addr_family;</span>
<span style="color: #00A000">+        char dest[1024];</span>
<span style="color: #00A000">+        char application[128];</span>
<span style="color: #00A000">+        char application_data[4096];</span>
<span style="color: #00A000">+        char dialplan[128];</span>
<span style="color: #00A000">+        char context[128];</span>
<span style="color: #00A000">+        char read_codec[128];</span>
<span style="color: #00A000">+        uint32_t read_rate;</span>
<span style="color: #00A000">+        uint32_t read_bitrate;</span>
<span style="color: #00A000">+        char write_codec[128];</span>
<span style="color: #00A000">+        uint32_t write_rate;</span>
<span style="color: #00A000">+        uint32_t write_bitrate;</span>
 } chan_entry_t;
 
 void init_subagent(switch_memory_pool_t *pool);
</pre></div>
<div class="highlight"><pre>committer: Anthony Minessale
comments: 
fix || where it should be or in sql stmt that may cause stray records in the calls table

<span style="color: #000080; font-weight: bold">diff --git a/src/switch_core_sqldb.c b/src/switch_core_sqldb.c</span>
<span style="color: #000080; font-weight: bold">index 4167b4a..35311c9 100644</span>
<span style="color: #A00000">--- a/src/switch_core_sqldb.c</span>
<span style="color: #00A000">+++ b/src/switch_core_sqldb.c</span>
<span style="color: #800080; font-weight: bold">@@ -1160,15 +1160,14 @@ static void core_event_handler(switch_event_t *event)</span>
         case SWITCH_EVENT_CHANNEL_DESTROY:
                 {
                         const char *uuid = switch_event_get_header(event, &quot;unique-id&quot;);
<span style="color: #A00000">-                        const char *sig = switch_event_get_header(event, &quot;signal_bridge&quot;);</span>
                         
                         if (uuid) {
                                 new_sql() = switch_mprintf(&quot;delete from channels where uuid=&#39;%q&#39; and hostname=&#39;%q&#39;&quot;,
                                                                                    uuid, switch_core_get_variable(&quot;hostname&quot;));
<span style="color: #A00000">-                                if (switch_true(sig)) {</span>
<span style="color: #A00000">-                                        new_sql() = switch_mprintf(&quot;delete from calls where (caller_uuid=&#39;%q&#39; || callee_uuid=&#39;%q&#39;) and hostname=&#39;%q&#39;&quot;,</span>
<span style="color: #A00000">-                                                                                           uuid, uuid, switch_core_get_variable(&quot;hostname&quot;));</span>
<span style="color: #A00000">-                                }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                                new_sql() = switch_mprintf(&quot;delete from calls where (caller_uuid=&#39;%q&#39; or callee_uuid=&#39;%q&#39;) and hostname=&#39;%q&#39;&quot;,</span>
<span style="color: #00A000">+                                                                                   uuid, uuid, switch_core_get_variable(&quot;hostname&quot;));</span>
<span style="color: #00A000">+</span>
                         }
                 }
                 break;
<span style="color: #800080; font-weight: bold">@@ -1410,7 +1409,7 @@ static void core_event_handler(switch_event_t *event)</span>
                 }
                 break;
         case SWITCH_EVENT_CHANNEL_UNBRIDGE:
<span style="color: #A00000">-                new_sql() = switch_mprintf(&quot;delete from calls where caller_uuid=&#39;%s&#39; and hostname=&#39;%q&#39;&quot;,</span>
<span style="color: #00A000">+                new_sql() = switch_mprintf(&quot;delete from calls where (caller_uuid=&#39;%s&#39; or callee_uuid=&#39;%q&#39;) and hostname=&#39;%q&#39;&quot;,</span>
                                                                    switch_event_get_header_nil(event, &quot;caller-unique-id&quot;), switch_core_get_variable(&quot;hostname&quot;));
                 break;
         case SWITCH_EVENT_SHUTDOWN:
</pre></div>
<div class="highlight"><pre>committer: Marc Olivier Chouinard
comments: 
mod_callcenter: Add error response for queue load and queue reload (FS-2988)

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_callcenter/mod_callcenter.c b/src/mod/applications/mod_callcenter/mod_callcenter.c</span>
<span style="color: #000080; font-weight: bold">index d1de632..61305bb 100644</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_callcenter/mod_callcenter.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_callcenter/mod_callcenter.c</span>
<span style="color: #800080; font-weight: bold">@@ -2625,8 +2625,10 @@ SWITCH_STANDARD_API(cc_config_api_function)</span>
                                 cc_queue_t *queue = NULL;
                                 if ((queue = get_queue(queue_name))) {
                                         queue_rwunlock(queue);
<span style="color: #00A000">+                                        stream-&gt;write_function(stream, &quot;%s&quot;, &quot;+OK\n&quot;);</span>
<span style="color: #00A000">+                                } else {</span>
<span style="color: #00A000">+                                        stream-&gt;write_function(stream, &quot;%s&quot;, &quot;-ERR Invalid Queue not found!\n&quot;);</span>
                                 }
<span style="color: #A00000">-                                stream-&gt;write_function(stream, &quot;%s&quot;, &quot;+OK\n&quot;);</span>
                         }
                 } else if (action &amp;&amp; !strcasecmp(action, &quot;unload&quot;)) {
                         if (argc-initial_argc &lt; 1) {
<span style="color: #800080; font-weight: bold">@@ -2648,8 +2650,10 @@ SWITCH_STANDARD_API(cc_config_api_function)</span>
                                 destroy_queue(queue_name, SWITCH_FALSE);
                                 if ((queue = get_queue(queue_name))) {
                                         queue_rwunlock(queue);
<span style="color: #00A000">+                                        stream-&gt;write_function(stream, &quot;%s&quot;, &quot;+OK\n&quot;);</span>
<span style="color: #00A000">+                                } else {</span>
<span style="color: #00A000">+                                        stream-&gt;write_function(stream, &quot;%s&quot;, &quot;-ERR Invalid Queue not found!\n&quot;);</span>
                                 }
<span style="color: #A00000">-                                stream-&gt;write_function(stream, &quot;%s&quot;, &quot;+OK\n&quot;);</span>
                         }
                 } else if (action &amp;&amp; !strcasecmp(action, &quot;list&quot;)) {
                         if (argc-initial_argc &lt; 1) {
<span style="color: #800080; font-weight: bold">@@ -2671,7 +2675,6 @@ SWITCH_STANDARD_API(cc_config_api_function)</span>
                                 goto done;
                         } else {
                                 const char *queue_name = argv[0 + initial_argc];
<span style="color: #A00000">-</span>
                                 struct list_result cbt;
                                 cbt.row_process = 0;
                                 cbt.stream = stream;
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
Merge branch &#39;master&#39; of fs-git:freeswitch
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
TEST-002

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 5fc9402..6914128 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -61,5 +61,4 @@</span>
       &lt;X-PRE-PROCESS cmd=&quot;include&quot; data=&quot;lang/ru/*.xml&quot;/&gt;
     &lt;/macros&gt;
   &lt;/section&gt;
<span style="color: #A00000">-</span>
 &lt;/document&gt;
</pre></div>
<div class="highlight"><pre>committer: Daniel Swarbrick
comments: 
partial implementation of channel list via snmp

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB</span>
<span style="color: #000080; font-weight: bold">index 9584c8b..11c3999 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/FREESWITCH-MIB</span>
<span style="color: #800080; font-weight: bold">@@ -107,4 +107,88 @@ maxSessionsPerSecond OBJECT-TYPE</span>
         &quot;Maximum permissible sessions per second&quot;
     ::= { systemStats 7 }
 
<span style="color: #00A000">+</span>
<span style="color: #00A000">+ChannelEntry ::= SEQUENCE {</span>
<span style="color: #00A000">+    chanUUID        DisplayString,</span>
<span style="color: #00A000">+    chanDirection   DisplayString,</span>
<span style="color: #00A000">+    chanCreated     DisplayString,</span>
<span style="color: #00A000">+    chanName        DisplayString,</span>
<span style="color: #00A000">+    chanState       DisplayString,</span>
<span style="color: #00A000">+    chanCIDName     DisplayString,</span>
<span style="color: #00A000">+    chanCIDNum      DisplayString</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+channelList OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      SEQUENCE OF ChannelEntry</span>
<span style="color: #00A000">+    MAX-ACCESS  not-accessible</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;A table containing a list of active channels&quot;</span>
<span style="color: #00A000">+    ::= { core 9 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+channelEntry OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      ChannelEntry</span>
<span style="color: #00A000">+    MAX-ACCESS  not-accessible</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;A channel entry&quot;</span>
<span style="color: #00A000">+    INDEX { chanIndex }</span>
<span style="color: #00A000">+    ::= { channelList 1 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanUUID OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;The channel UUID.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 1 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanDirection OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;The channel direction.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 2 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanCreated OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;Channel creation timestamp.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 3 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanName OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;The channel name.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 4 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanState OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;The channel state.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 5 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanCIDName OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;The channel caller ID name.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 6 }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+chanCIDNum OBJECT-TYPE</span>
<span style="color: #00A000">+    SYNTAX      DisplayString</span>
<span style="color: #00A000">+    MAX-ACCESS  read-only</span>
<span style="color: #00A000">+    STATUS      current</span>
<span style="color: #00A000">+    DESCRIPTION</span>
<span style="color: #00A000">+        &quot;The channel caller ID number.&quot;</span>
<span style="color: #00A000">+    ::= { channelEntry 7 }</span>
<span style="color: #00A000">+</span>
 END
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/mod_snmp.c b/src/mod/event_handlers/mod_snmp/mod_snmp.c</span>
<span style="color: #000080; font-weight: bold">index 56c7be1..d415d4f 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/mod_snmp.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/mod_snmp.c</span>
<span style="color: #800080; font-weight: bold">@@ -109,7 +109,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_snmp_load)</span>
          */
         netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_PING_INTERVAL, 2);
 
<span style="color: #A00000">-        init_subagent();  </span>
<span style="color: #00A000">+        init_subagent(pool);</span>
         init_snmp(&quot;mod_snmp&quot;);
 
         return status;
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/subagent.c b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #000080; font-weight: bold">index bad3dc6..7b9faa7 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #800080; font-weight: bold">@@ -36,27 +36,108 @@</span>
 #include &lt;net-snmp/agent/net-snmp-agent-includes.h&gt;
 #include &quot;subagent.h&quot;
 
<span style="color: #00A000">+netsnmp_table_registration_info *ch_table_info;</span>
<span style="color: #00A000">+netsnmp_tdata *ch_table;</span>
<span style="color: #00A000">+netsnmp_handler_registration *ch_reginfo;</span>
<span style="color: #00A000">+uint32_t idx;</span>
 
<span style="color: #A00000">-void init_subagent(void)</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)</span>
 {
<span style="color: #A00000">-        static oid identity_oid[] = { 1,3,6,1,4,1,27880,1,1 };</span>
<span style="color: #A00000">-        static oid systemStats_oid[] = { 1,3,6,1,4,1,27880,1,2 };</span>
<span style="color: #00A000">+        uint32_t *count = (uint32_t *) pArg;</span>
<span style="color: #00A000">+        *count = atoi(argv[0]);</span>
<span style="color: #00A000">+        return 0;</span>
<span style="color: #00A000">+}</span>
 
<span style="color: #A00000">-        DEBUGMSGTL((&quot;init_subagent&quot;, &quot;Initializing\n&quot;));</span>
 
<span style="color: #A00000">-        netsnmp_register_scalar_group(netsnmp_create_handler_registration(&quot;identity&quot;, handle_identity, identity_oid, OID_LENGTH(identity_oid), HANDLER_CAN_RONLY), 1, 2);</span>
<span style="color: #A00000">-        netsnmp_register_scalar_group(netsnmp_create_handler_registration(&quot;systemStats&quot;, handle_systemStats, systemStats_oid, OID_LENGTH(systemStats_oid), HANDLER_CAN_RONLY), 1, 7);</span>
<span style="color: #00A000">+static int channelList_callback(void *pArg, int argc, char **argv, char **columnNames)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        chan_entry_t *entry;</span>
<span style="color: #00A000">+        netsnmp_tdata_row *row;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_zmalloc(entry, sizeof(chan_entry_t));</span>
<span style="color: #00A000">+        if (!entry)</span>
<span style="color: #00A000">+                return 0;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        row = netsnmp_tdata_create_row();</span>
<span style="color: #00A000">+        if (!row) {</span>
<span style="color: #00A000">+                switch_safe_free(entry);</span>
<span style="color: #00A000">+                return 0;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        row-&gt;data = entry;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        entry-&gt;idx = idx++;</span>
<span style="color: #00A000">+        strncpy(entry-&gt;uuid, argv[0], sizeof(entry-&gt;uuid));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;direction, argv[1], sizeof(entry-&gt;direction));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;created, argv[2], sizeof(entry-&gt;created));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;name, argv[4], sizeof(entry-&gt;name));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;state, argv[5], sizeof(entry-&gt;state));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;cid_name, argv[6], sizeof(entry-&gt;cid_name));</span>
<span style="color: #00A000">+        strncpy(entry-&gt;cid_num, argv[7], sizeof(entry-&gt;cid_num));</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        netsnmp_tdata_row_add_index(row, ASN_INTEGER, &amp;entry-&gt;idx, sizeof(entry-&gt;idx));</span>
<span style="color: #00A000">+        netsnmp_tdata_add_row(ch_table, row);</span>
<span style="color: #00A000">+        return 0;</span>
 }
 
 
<span style="color: #A00000">-static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)</span>
<span style="color: #00A000">+void channelList_free(netsnmp_cache *cache, void *magic)</span>
 {
<span style="color: #A00000">-        uint32_t *count = (uint32_t *) pArg;</span>
<span style="color: #A00000">-        *count = atoi(argv[0]);</span>
<span style="color: #00A000">+        netsnmp_tdata_row *row = netsnmp_tdata_row_first(ch_table);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        /* Delete table rows one by one */</span>
<span style="color: #00A000">+        while (row) {</span>
<span style="color: #00A000">+                netsnmp_tdata_remove_and_delete_row(ch_table, row);</span>
<span style="color: #00A000">+                switch_safe_free(row-&gt;data);</span>
<span style="color: #00A000">+                row = netsnmp_tdata_row_first(ch_table);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+int channelList_load(netsnmp_cache *cache, void *vmagic)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_cache_db_handle_t *dbh;</span>
<span style="color: #00A000">+        char sql[1024] = &quot;&quot;, hostname[256] = &quot;&quot;;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        channelList_free(cache, NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (switch_core_db_handle(&amp;dbh) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                return 0;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        idx = 1;</span>
<span style="color: #00A000">+        gethostname(hostname, sizeof(hostname));</span>
<span style="color: #00A000">+        sprintf(sql, &quot;SELECT * FROM channels WHERE hostname=&#39;%s&#39; ORDER BY created_epoch&quot;, hostname);</span>
<span style="color: #00A000">+        switch_cache_db_execute_sql_callback(dbh, sql, channelList_callback, NULL, NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_cache_db_release_db_handle(&amp;dbh);</span>
<span style="color: #00A000">+</span>
         return 0;
 }
 
 
<span style="color: #00A000">+void init_subagent(switch_memory_pool_t *pool)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        static oid identity_oid[] = { 1,3,6,1,4,1,27880,1,1 };</span>
<span style="color: #00A000">+        static oid systemStats_oid[] = { 1,3,6,1,4,1,27880,1,2 };</span>
<span style="color: #00A000">+        static oid channelList_oid[] = { 1,3,6,1,4,1,27880,1,9 };</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        DEBUGMSGTL((&quot;init_subagent&quot;, &quot;mod_snmp subagent initializing\n&quot;));</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        netsnmp_register_scalar_group(netsnmp_create_handler_registration(&quot;identity&quot;, handle_identity, identity_oid, OID_LENGTH(identity_oid), HANDLER_CAN_RONLY), 1, 2);</span>
<span style="color: #00A000">+        netsnmp_register_scalar_group(netsnmp_create_handler_registration(&quot;systemStats&quot;, handle_systemStats, systemStats_oid, OID_LENGTH(systemStats_oid), HANDLER_CAN_RONLY), 1, 7);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        ch_table_info = switch_core_alloc(pool, sizeof(netsnmp_table_registration_info));</span>
<span style="color: #00A000">+        netsnmp_table_helper_add_index(ch_table_info, ASN_INTEGER);</span>
<span style="color: #00A000">+        ch_table_info-&gt;min_column = 1;</span>
<span style="color: #00A000">+        ch_table_info-&gt;max_column = 7;</span>
<span style="color: #00A000">+        ch_table = netsnmp_tdata_create_table(&quot;channelList&quot;, 0);</span>
<span style="color: #00A000">+        ch_reginfo = netsnmp_create_handler_registration(&quot;channelList&quot;, handle_channelList, channelList_oid, OID_LENGTH(channelList_oid), HANDLER_CAN_RONLY);</span>
<span style="color: #00A000">+        netsnmp_tdata_register(ch_reginfo, ch_table, ch_table_info);</span>
<span style="color: #00A000">+        netsnmp_inject_handler(ch_reginfo, netsnmp_get_cache_handler(5, channelList_load, channelList_free, channelList_oid, OID_LENGTH(channelList_oid)));</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 int handle_identity(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
 {
         netsnmp_request_info *request = NULL;
<span style="color: #800080; font-weight: bold">@@ -97,7 +178,7 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
         netsnmp_request_info *request = NULL;
         oid subid;
         switch_time_t uptime;
<span style="color: #A00000">-        uint32_t int_val;</span>
<span style="color: #00A000">+        uint32_t int_val = 0;</span>
 
         switch(reqinfo-&gt;mode) {
         case MODE_GET:
<span style="color: #800080; font-weight: bold">@@ -160,6 +241,55 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
 }
 
 
<span style="color: #00A000">+int handle_channelList(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        netsnmp_request_info *request;</span>
<span style="color: #00A000">+        netsnmp_table_request_info *table_info;</span>
<span style="color: #00A000">+        chan_entry_t *entry;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch (reqinfo-&gt;mode) {</span>
<span style="color: #00A000">+        case MODE_GET:</span>
<span style="color: #00A000">+                for (request = requests; request; request = request-&gt;next) {</span>
<span style="color: #00A000">+                        table_info = netsnmp_extract_table_info(request);</span>
<span style="color: #00A000">+                        entry = (chan_entry_t *) netsnmp_tdata_extract_entry(request);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                        switch (table_info-&gt;colnum) {</span>
<span style="color: #00A000">+                        case CH_UUID:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;uuid, strlen(entry-&gt;uuid));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_DIRECTION:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;direction, strlen(entry-&gt;direction));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_CREATED:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;created, strlen(entry-&gt;created));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_NAME:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;name, strlen(entry-&gt;name));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_STATE:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;state, strlen(entry-&gt;state));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_CID_NAME:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;cid_name, strlen(entry-&gt;cid_name));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        case CH_CID_NUM:</span>
<span style="color: #00A000">+                                snmp_set_var_typed_value(request-&gt;requestvb, ASN_OCTET_STR, (u_char *) entry-&gt;cid_num, strlen(entry-&gt;cid_num));</span>
<span style="color: #00A000">+                                break;</span>
<span style="color: #00A000">+                        default:</span>
<span style="color: #00A000">+                                snmp_log(LOG_WARNING, &quot;Unregistered OID-suffix requested (%d)\n&quot;, table_info-&gt;colnum);</span>
<span style="color: #00A000">+                                netsnmp_set_request_error(reqinfo, request, SNMP_NOSUCHOBJECT);</span>
<span style="color: #00A000">+                        }</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                break;</span>
<span style="color: #00A000">+        default:</span>
<span style="color: #00A000">+                /* we should never get here, so this is a really bad error */</span>
<span style="color: #00A000">+                snmp_log(LOG_ERR, &quot;Unknown mode (%d) in handle_foo\n&quot;, reqinfo-&gt;mode );</span>
<span style="color: #00A000">+                return SNMP_ERR_GENERR;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return SNMP_ERR_NOERROR;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 
 /* For Emacs:
  * Local Variables:
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/subagent.h b/src/mod/event_handlers/mod_snmp/subagent.h</span>
<span style="color: #000080; font-weight: bold">index 3315378..0070b2c 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/subagent.h</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/subagent.h</span>
<span style="color: #800080; font-weight: bold">@@ -14,9 +14,29 @@</span>
 #define SS_SESSIONS_PER_SECOND                6
 #define SS_MAX_SESSIONS_PER_SECOND        7
 
<span style="color: #00A000">+/* .1.3.6.1.4.1.27880.1.9 */</span>
<span style="color: #00A000">+#define CH_UUID                                1</span>
<span style="color: #00A000">+#define CH_DIRECTION                        2</span>
<span style="color: #00A000">+#define CH_CREATED                        3</span>
<span style="color: #00A000">+#define CH_NAME                                4</span>
<span style="color: #00A000">+#define CH_STATE                        5</span>
<span style="color: #00A000">+#define CH_CID_NAME                        6</span>
<span style="color: #00A000">+#define CH_CID_NUM                        7</span>
 
<span style="color: #A00000">-void init_subagent(void);</span>
<span style="color: #00A000">+typedef struct {</span>
<span style="color: #00A000">+        uint32_t idx;</span>
<span style="color: #00A000">+        char uuid[38];</span>
<span style="color: #00A000">+        char direction[32];</span>
<span style="color: #00A000">+        char created[128];</span>
<span style="color: #00A000">+        char name[1024];</span>
<span style="color: #00A000">+        char state[64];</span>
<span style="color: #00A000">+        char cid_name[1024];</span>
<span style="color: #00A000">+        char cid_num[256];</span>
<span style="color: #00A000">+} chan_entry_t;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+void init_subagent(switch_memory_pool_t *pool);</span>
 Netsnmp_Node_Handler handle_identity;
 Netsnmp_Node_Handler handle_systemStats;
<span style="color: #00A000">+Netsnmp_Node_Handler handle_channelList;</span>
 
 #endif /* subagent_H */
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
Merge branch &#39;master&#39; of fs-git:freeswitch
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
TEST-001

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 6ed99ef..5fc9402 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -63,4 +63,3 @@</span>
   &lt;/section&gt;
 
 &lt;/document&gt;
<span style="color: #A00000">-</span>
</pre></div>
<div class="highlight"><pre>committer: Daniel Swarbrick
comments: 
add support for getting current call count

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/subagent.c b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #000080; font-weight: bold">index 8f08baf..bad3dc6 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #800080; font-weight: bold">@@ -49,6 +49,14 @@ void init_subagent(void)</span>
 }
 
 
<span style="color: #00A000">+static int sql_count_callback(void *pArg, int argc, char **argv, char **columnNames)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        uint32_t *count = (uint32_t *) pArg;</span>
<span style="color: #00A000">+        *count = atoi(argv[0]);</span>
<span style="color: #00A000">+        return 0;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 int handle_identity(netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests)
 {
         netsnmp_request_info *request = NULL;
<span style="color: #800080; font-weight: bold">@@ -113,13 +121,20 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                         snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));
                         break;
                 case SS_CURRENT_CALLS:
<span style="color: #A00000">-                        /*</span>
<span style="color: #A00000">-                         * This is zero for now, since there is no convenient way to get total call</span>
<span style="color: #A00000">-                         * count (not to be confused with session count), without touching the</span>
<span style="color: #A00000">-                         * database.</span>
<span style="color: #A00000">-                         */</span>
<span style="color: #A00000">-                        int_val = 0;</span>
<span style="color: #00A000">+                        {</span>
<span style="color: #00A000">+                        switch_cache_db_handle_t *dbh;</span>
<span style="color: #00A000">+                        char sql[1024] = &quot;&quot;, hostname[256] = &quot;&quot;;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                        if (switch_core_db_handle(&amp;dbh) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                                return SNMP_ERR_GENERR;</span>
<span style="color: #00A000">+                        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+                        gethostname(hostname, sizeof(hostname));</span>
<span style="color: #00A000">+                        sprintf(sql, &quot;SELECT COUNT(*) FROM calls WHERE hostname=&#39;%s&#39;&quot;, hostname);</span>
<span style="color: #00A000">+                        switch_cache_db_execute_sql_callback(dbh, sql, sql_count_callback, &amp;int_val, NULL);</span>
                         snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));
<span style="color: #00A000">+                        switch_cache_db_release_db_handle(&amp;dbh);</span>
<span style="color: #00A000">+                        }</span>
                         break;
                 case SS_SESSIONS_PER_SECOND:
                         switch_core_session_ctl(SCSC_LAST_SPS, &amp;int_val);
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 80e7728..6ed99ef 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -64,4 +64,3 @@</span>
 
 &lt;/document&gt;
 
<span style="color: #A00000">-</span>
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 6ed99ef..80e7728 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -64,3 +64,4 @@</span>
 
 &lt;/document&gt;
 
<span style="color: #00A000">+</span>
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 5fc9402..6ed99ef 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -63,3 +63,4 @@</span>
   &lt;/section&gt;
 
 &lt;/document&gt;
<span style="color: #00A000">+</span>
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 6ed99ef..5fc9402 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -63,4 +63,3 @@</span>
   &lt;/section&gt;
 
 &lt;/document&gt;
<span style="color: #A00000">-</span>
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/conf/freeswitch.xml b/conf/freeswitch.xml</span>
<span style="color: #000080; font-weight: bold">index 80e7728..6ed99ef 100644</span>
<span style="color: #A00000">--- a/conf/freeswitch.xml</span>
<span style="color: #00A000">+++ b/conf/freeswitch.xml</span>
<span style="color: #800080; font-weight: bold">@@ -64,4 +64,3 @@</span>
 
 &lt;/document&gt;
 
<span style="color: #A00000">-</span>
</pre></div>
<div class="highlight"><pre>committer: Daniel Swarbrick
comments: 
typo

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/subagent.c b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #000080; font-weight: bold">index 2da9ebe..8f08baf 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/subagent.c</span>
<span style="color: #800080; font-weight: bold">@@ -109,7 +109,7 @@ int handle_systemStats(netsnmp_mib_handler *handler, netsnmp_handler_registratio</span>
                         snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));
                         break;
                 case SS_MAX_SESSIONS:
<span style="color: #A00000">-                        switch_core_session_ctl(SCSC_MAX_SESSIONS, &amp;int_val);;</span>
<span style="color: #00A000">+                        switch_core_session_ctl(SCSC_MAX_SESSIONS, &amp;int_val);</span>
                         snmp_set_var_typed_value(requests-&gt;requestvb, ASN_GAUGE, (u_char *) &amp;int_val, sizeof(int_val));
                         break;
                 case SS_CURRENT_CALLS:
</pre></div>
<div class="highlight"><pre>committer: Jeff Lenk
comments: 
add missing files

<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/msvc/freetdm.2010.vcxproj b/libs/freetdm/msvc/freetdm.2010.vcxproj</span>
<span style="color: #000080; font-weight: bold">index 71eb6db..aecb9ef 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/msvc/freetdm.2010.vcxproj</span>
<span style="color: #00A000">+++ b/libs/freetdm/msvc/freetdm.2010.vcxproj</span>
<span style="color: #800080; font-weight: bold">@@ -188,6 +188,7 @@</span>
     &lt;ClInclude Include=&quot;..\src\include\ftdm_os.h&quot; /&gt;
     &lt;ClInclude Include=&quot;..\src\include\private\ftdm_sched.h&quot; /&gt;
     &lt;ClInclude Include=&quot;..\src\include\ftdm_threadmutex.h&quot; /&gt;
<span style="color: #00A000">+    &lt;ClInclude Include=&quot;..\src\include\private\ftdm_state.h&quot; /&gt;</span>
     &lt;ClInclude Include=&quot;..\src\include\private\ftdm_types.h&quot; /&gt;
     &lt;ClInclude Include=&quot;..\src\include\private\g711.h&quot; /&gt;
     &lt;ClInclude Include=&quot;..\src\include\private\hashtable.h&quot; /&gt;
<span style="color: #800080; font-weight: bold">@@ -209,6 +210,7 @@</span>
     &lt;ClCompile Include=&quot;..\src\ftdm_io.c&quot; /&gt;
     &lt;ClCompile Include=&quot;..\src\ftdm_queue.c&quot; /&gt;
     &lt;ClCompile Include=&quot;..\src\ftdm_sched.c&quot; /&gt;
<span style="color: #00A000">+    &lt;ClCompile Include=&quot;..\src\ftdm_state.c&quot; /&gt;</span>
     &lt;ClCompile Include=&quot;..\src\ftdm_threadmutex.c&quot; /&gt;
     &lt;ClCompile Include=&quot;..\src\g711.c&quot; /&gt;
     &lt;ClCompile Include=&quot;..\src\hashtable.c&quot; /&gt;
<span style="color: #000080; font-weight: bold">diff --git a/libs/freetdm/msvc/freetdm.2010.vcxproj.filters b/libs/freetdm/msvc/freetdm.2010.vcxproj.filters</span>
<span style="color: #000080; font-weight: bold">index ed642ba..e6dc40d 100644</span>
<span style="color: #A00000">--- a/libs/freetdm/msvc/freetdm.2010.vcxproj.filters</span>
<span style="color: #00A000">+++ b/libs/freetdm/msvc/freetdm.2010.vcxproj.filters</span>
<span style="color: #800080; font-weight: bold">@@ -71,6 +71,9 @@</span>
     &lt;ClInclude Include=&quot;..\src\include\private\uart.h&quot;&gt;
       &lt;Filter&gt;Header Files&lt;/Filter&gt;
     &lt;/ClInclude&gt;
<span style="color: #00A000">+    &lt;ClInclude Include=&quot;..\src\include\private\ftdm_state.h&quot;&gt;</span>
<span style="color: #00A000">+      &lt;Filter&gt;Header Files&lt;/Filter&gt;</span>
<span style="color: #00A000">+    &lt;/ClInclude&gt;</span>
   &lt;/ItemGroup&gt;
   &lt;ItemGroup&gt;
     &lt;ClCompile Include=&quot;..\src\fsk.c&quot;&gt;
<span style="color: #800080; font-weight: bold">@@ -124,5 +127,8 @@</span>
     &lt;ClCompile Include=&quot;..\src\uart.c&quot;&gt;
       &lt;Filter&gt;Source Files&lt;/Filter&gt;
     &lt;/ClCompile&gt;
<span style="color: #00A000">+    &lt;ClCompile Include=&quot;..\src\ftdm_state.c&quot;&gt;</span>
<span style="color: #00A000">+      &lt;Filter&gt;Source Files&lt;/Filter&gt;</span>
<span style="color: #00A000">+    &lt;/ClCompile&gt;</span>
   &lt;/ItemGroup&gt;
 &lt;/Project&gt;
\ No newline at end of file
</pre></div>
<div class="highlight"><pre>committer: Travis Cross
comments: 
.gitignore compressed files

<span style="color: #000080; font-weight: bold">diff --git a/.gitignore b/.gitignore</span>
<span style="color: #000080; font-weight: bold">index 304b42c..c53d07d 100644</span>
<span style="color: #A00000">--- a/.gitignore</span>
<span style="color: #00A000">+++ b/.gitignore</span>
<span style="color: #800080; font-weight: bold">@@ -33,6 +33,12 @@</span>
 *.ilk
 *.bsc
 *.pch
<span style="color: #00A000">+*.tar</span>
<span style="color: #00A000">+*.gz</span>
<span style="color: #00A000">+*.tgz</span>
<span style="color: #00A000">+*.xz</span>
<span style="color: #00A000">+*.bz2</span>
<span style="color: #00A000">+*.tbz2</span>
 core.*
 /Path
 /w32/Library/lastversion
<span style="color: #800080; font-weight: bold">@@ -79,7 +85,6 @@ configure.lineno</span>
 /scripts/fsxs
 /scripts/gentls_cert
 /a.out.dSYM
<span style="color: #A00000">-/freeswitch-sounds-*</span>
 src/mod/applications/mod_easyroute/Makefile
 src/mod/applications/mod_lcr/Makefile
 src/mod/applications/mod_nibblebill/Makefile
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/endpoints/mod_gsmopen/.gitignore b/src/mod/endpoints/mod_gsmopen/.gitignore</span>
<span style="color: #000080; font-weight: bold">index 9fdeeb1..fe8dc68 100644</span>
<span style="color: #A00000">--- a/src/mod/endpoints/mod_gsmopen/.gitignore</span>
<span style="color: #00A000">+++ b/src/mod/endpoints/mod_gsmopen/.gitignore</span>
<span style="color: #800080; font-weight: bold">@@ -1,2 +1,4 @@</span>
 !/gsmlib/gsmlib-*/aclocal.m4
 !/gsmlib/gsmlib-*/configure
<span style="color: #00A000">+!/gsmlib/gsmlib-1.10.tar.gz</span>
<span style="color: #00A000">+!/gsmlib/gsmlib_1.10-12ubuntu1.diff.gz</span>
</pre></div>
<div class="highlight"><pre>committer: Brian West
comments: 
swigall

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/languages/mod_managed/freeswitch_wrap.cxx b/src/mod/languages/mod_managed/freeswitch_wrap.cxx</span>
<span style="color: #000080; font-weight: bold">index aa2a84f..3ee6ff6 100644</span>
<span style="color: #A00000">--- a/src/mod/languages/mod_managed/freeswitch_wrap.cxx</span>
<span style="color: #00A000">+++ b/src/mod/languages/mod_managed/freeswitch_wrap.cxx</span>
<span style="color: #800080; font-weight: bold">@@ -7413,6 +7413,20 @@ SWIGEXPORT void * SWIGSTDCALL CSharp_switch_core_session_get_dmachine(void * jar</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_codec_slin(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  int jresult ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  switch_slin_data_t *arg2 = (switch_slin_data_t *) 0 ;</span>
<span style="color: #00A000">+  switch_status_t result;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_core_session_t *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_slin_data_t *)jarg2; </span>
<span style="color: #00A000">+  result = (switch_status_t)switch_core_session_set_codec_slin(arg1,arg2);</span>
<span style="color: #00A000">+  jresult = result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT char * SWIGSTDCALL CSharp_switch_core_get_uuid() {
   char * jresult ;
   char *result = 0 ;
<span style="color: #800080; font-weight: bold">@@ -22794,6 +22808,119 @@ SWIGEXPORT void SWIGSTDCALL CSharp_delete_switch_api_interface(void * jarg1) {</span>
 }
 
 
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_session_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  switch_core_session_t *arg2 = (switch_core_session_t *) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_core_session_t *)jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;session = arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_slin_data_session_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  switch_core_session_t *result = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_core_session_t *) ((arg1)-&gt;session);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_write_frame_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  switch_frame_t *arg2 = (switch_frame_t *) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_frame_t *)jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;write_frame = *arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_slin_data_write_frame_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  switch_frame_t *result = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_frame_t *)&amp; ((arg1)-&gt;write_frame);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_codec_set(void * jarg1, void * jarg2) {</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  switch_codec_t *arg2 = (switch_codec_t *) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (switch_codec_t *)jarg2; </span>
<span style="color: #00A000">+  if (arg1) (arg1)-&gt;codec = *arg2;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_switch_slin_data_codec_get(void * jarg1) {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  switch_codec_t *result = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  result = (switch_codec_t *)&amp; ((arg1)-&gt;codec);</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_switch_slin_data_frame_data_set(void * jarg1, char * jarg2) {</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  char *arg2 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  arg2 = (char *)jarg2; </span>
<span style="color: #00A000">+  {</span>
<span style="color: #00A000">+    if (arg2) strncpy((char *)arg1-&gt;frame_data, (const char *)arg2, 4096);</span>
<span style="color: #00A000">+    else arg1-&gt;frame_data[0] = 0;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT char * SWIGSTDCALL CSharp_switch_slin_data_frame_data_get(void * jarg1) {</span>
<span style="color: #00A000">+  char * jresult ;</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  char *result = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  result = (char *)(char *) ((arg1)-&gt;frame_data);</span>
<span style="color: #00A000">+  jresult = SWIG_csharp_string_callback((const char *)result); </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void * SWIGSTDCALL CSharp_new_switch_slin_data() {</span>
<span style="color: #00A000">+  void * jresult ;</span>
<span style="color: #00A000">+  switch_slin_data *result = 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  result = (switch_slin_data *)new switch_slin_data();</span>
<span style="color: #00A000">+  jresult = (void *)result; </span>
<span style="color: #00A000">+  return jresult;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWIGEXPORT void SWIGSTDCALL CSharp_delete_switch_slin_data(void * jarg1) {</span>
<span style="color: #00A000">+  switch_slin_data *arg1 = (switch_slin_data *) 0 ;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+  arg1 = (switch_slin_data *)jarg1; </span>
<span style="color: #00A000">+  delete arg1;</span>
<span style="color: #00A000">+  </span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 SWIGEXPORT void SWIGSTDCALL CSharp_switch_channel_timetable_profile_created_set(void * jarg1, void * jarg2) {
   switch_channel_timetable *arg1 = (switch_channel_timetable *) 0 ;
   switch_time_t arg2 ;
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/languages/mod_managed/managed/swig.cs b/src/mod/languages/mod_managed/managed/swig.cs</span>
<span style="color: #000080; font-weight: bold">index 5a2188a..48d585e 100644</span>
<span style="color: #A00000">--- a/src/mod/languages/mod_managed/managed/swig.cs</span>
<span style="color: #00A000">+++ b/src/mod/languages/mod_managed/managed/swig.cs</span>
<span style="color: #800080; font-weight: bold">@@ -1357,6 +1357,11 @@ public class freeswitch {</span>
     return ret;
   }
 
<span style="color: #00A000">+  public static switch_status_t switch_core_session_set_codec_slin(SWIGTYPE_p_switch_core_session session, switch_slin_data data) {</span>
<span style="color: #00A000">+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_codec_slin(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_slin_data.getCPtr(data));</span>
<span style="color: #00A000">+    return ret;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
   public static string switch_core_get_uuid() {
     string ret = freeswitchPINVOKE.switch_core_get_uuid();
     return ret;
<span style="color: #800080; font-weight: bold">@@ -7504,6 +7509,9 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_get_dmachine&quot;)]
   public static extern IntPtr switch_core_session_get_dmachine(HandleRef jarg1);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_set_codec_slin&quot;)]</span>
<span style="color: #00A000">+  public static extern int switch_core_session_set_codec_slin(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_get_uuid&quot;)]
   public static extern string switch_core_get_uuid();
 
<span style="color: #800080; font-weight: bold">@@ -11188,6 +11196,36 @@ class freeswitchPINVOKE {</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_delete_switch_api_interface&quot;)]
   public static extern void delete_switch_api_interface(HandleRef jarg1);
 
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_session_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_slin_data_session_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_session_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_slin_data_session_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_write_frame_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_slin_data_write_frame_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_write_frame_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_slin_data_write_frame_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_codec_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_slin_data_codec_set(HandleRef jarg1, HandleRef jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_codec_get&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr switch_slin_data_codec_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_frame_data_set&quot;)]</span>
<span style="color: #00A000">+  public static extern void switch_slin_data_frame_data_set(HandleRef jarg1, string jarg2);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_slin_data_frame_data_get&quot;)]</span>
<span style="color: #00A000">+  public static extern string switch_slin_data_frame_data_get(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_new_switch_slin_data&quot;)]</span>
<span style="color: #00A000">+  public static extern IntPtr new_switch_slin_data();</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_delete_switch_slin_data&quot;)]</span>
<span style="color: #00A000">+  public static extern void delete_switch_slin_data(HandleRef jarg1);</span>
<span style="color: #00A000">+</span>
   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_channel_timetable_profile_created_set&quot;)]
   public static extern void switch_channel_timetable_profile_created_set(HandleRef jarg1, HandleRef jarg2);
 
<span style="color: #800080; font-weight: bold">@@ -28401,7 +28439,8 @@ public enum switch_rtp_bug_flag_t {</span>
   RTP_BUG_IGNORE_MARK_BIT = (1 &lt;&lt; 2),
   RTP_BUG_SEND_LINEAR_TIMESTAMPS = (1 &lt;&lt; 3),
   RTP_BUG_START_SEQ_AT_ZERO = (1 &lt;&lt; 4),
<span style="color: #A00000">-  RTP_BUG_NEVER_SEND_MARKER = (1 &lt;&lt; 5)</span>
<span style="color: #00A000">+  RTP_BUG_NEVER_SEND_MARKER = (1 &lt;&lt; 5),</span>
<span style="color: #00A000">+  RTP_BUG_IGNORE_DTMF_DURATION = (1 &lt;&lt; 6)</span>
 }
 
 }
<span style="color: #800080; font-weight: bold">@@ -29437,6 +29476,96 @@ public enum switch_signal_t {</span>
 
 namespace FreeSWITCH.Native {
 
<span style="color: #00A000">+using System;</span>
<span style="color: #00A000">+using System.Runtime.InteropServices;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+public class switch_slin_data : IDisposable {</span>
<span style="color: #00A000">+  private HandleRef swigCPtr;</span>
<span style="color: #00A000">+  protected bool swigCMemOwn;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  internal switch_slin_data(IntPtr cPtr, bool cMemoryOwn) {</span>
<span style="color: #00A000">+    swigCMemOwn = cMemoryOwn;</span>
<span style="color: #00A000">+    swigCPtr = new HandleRef(this, cPtr);</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  internal static HandleRef getCPtr(switch_slin_data obj) {</span>
<span style="color: #00A000">+    return (obj == null) ? new HandleRef(null, IntPtr.Zero) : obj.swigCPtr;</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  ~switch_slin_data() {</span>
<span style="color: #00A000">+    Dispose();</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public virtual void Dispose() {</span>
<span style="color: #00A000">+    lock(this) {</span>
<span style="color: #00A000">+      if(swigCPtr.Handle != IntPtr.Zero &amp;&amp; swigCMemOwn) {</span>
<span style="color: #00A000">+        swigCMemOwn = false;</span>
<span style="color: #00A000">+        freeswitchPINVOKE.delete_switch_slin_data(swigCPtr);</span>
<span style="color: #00A000">+      }</span>
<span style="color: #00A000">+      swigCPtr = new HandleRef(null, IntPtr.Zero);</span>
<span style="color: #00A000">+      GC.SuppressFinalize(this);</span>
<span style="color: #00A000">+    }</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public SWIGTYPE_p_switch_core_session session {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_slin_data_session_set(swigCPtr, SWIGTYPE_p_switch_core_session.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_slin_data_session_get(swigCPtr);</span>
<span style="color: #00A000">+      SWIGTYPE_p_switch_core_session ret = (cPtr == IntPtr.Zero) ? null : new SWIGTYPE_p_switch_core_session(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public switch_frame write_frame {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_slin_data_write_frame_set(swigCPtr, switch_frame.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_slin_data_write_frame_get(swigCPtr);</span>
<span style="color: #00A000">+      switch_frame ret = (cPtr == IntPtr.Zero) ? null : new switch_frame(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public switch_codec codec {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_slin_data_codec_set(swigCPtr, switch_codec.getCPtr(value));</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      IntPtr cPtr = freeswitchPINVOKE.switch_slin_data_codec_get(swigCPtr);</span>
<span style="color: #00A000">+      switch_codec ret = (cPtr == IntPtr.Zero) ? null : new switch_codec(cPtr, false);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public string frame_data {</span>
<span style="color: #00A000">+    set {</span>
<span style="color: #00A000">+      freeswitchPINVOKE.switch_slin_data_frame_data_set(swigCPtr, value);</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+    get {</span>
<span style="color: #00A000">+      string ret = freeswitchPINVOKE.switch_slin_data_frame_data_get(swigCPtr);</span>
<span style="color: #00A000">+      return ret;</span>
<span style="color: #00A000">+    } </span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+  public switch_slin_data() : this(freeswitchPINVOKE.new_switch_slin_data(), true) {</span>
<span style="color: #00A000">+  }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+/* ----------------------------------------------------------------------------</span>
<span style="color: #00A000">+ * This file was automatically generated by SWIG (http://www.swig.org).</span>
<span style="color: #00A000">+ * Version 1.3.35</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * Do not make changes to this file unless you know what you are doing--modify</span>
<span style="color: #00A000">+ * the SWIG interface file instead.</span>
<span style="color: #00A000">+ * ----------------------------------------------------------------------------- */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+namespace FreeSWITCH.Native {</span>
<span style="color: #00A000">+</span>
 [System.Flags] public enum switch_speech_flag_enum_t {
   SWITCH_SPEECH_FLAG_NONE = 0,
   SWITCH_SPEECH_FLAG_HASTEXT = (1 &lt;&lt; 0),
<span style="color: #800080; font-weight: bold">@@ -30146,7 +30275,7 @@ public enum switch_status_t {</span>
   SWITCH_STATUS_FALSE,
   SWITCH_STATUS_TIMEOUT,
   SWITCH_STATUS_RESTART,
<span style="color: #A00000">-  SWITCH_STATUS_TERM,</span>
<span style="color: #00A000">+  SWITCH_STATUS_INTR,</span>
   SWITCH_STATUS_NOTIMPL,
   SWITCH_STATUS_MEMERR,
   SWITCH_STATUS_NOOP,
<span style="color: #800080; font-weight: bold">@@ -30163,6 +30292,7 @@ public enum switch_status_t {</span>
   SWITCH_STATUS_TOO_SMALL,
   SWITCH_STATUS_FOUND,
   SWITCH_STATUS_CONTINUE,
<span style="color: #00A000">+  SWITCH_STATUS_TERM,</span>
   SWITCH_STATUS_NOT_INITALIZED
 }
 
</pre></div>
<div class="highlight"><pre>committer: Brian West
comments: 
FS-3004

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c</span>
<span style="color: #000080; font-weight: bold">index 21c6a68..4dd936b 100644</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_spandsp/mod_spandsp_fax.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_spandsp/mod_spandsp_fax.c</span>
<span style="color: #800080; font-weight: bold">@@ -40,6 +40,9 @@</span>
 #define MAX_FEC_ENTRIES             4
 #define MAX_FEC_SPAN                4
 
<span style="color: #00A000">+#define SPANDSP_EVENT_TXFAXRESULT &quot;spandsp::txfaxresult&quot;</span>
<span style="color: #00A000">+#define SPANDSP_EVENT_RXFAXRESULT &quot;spandsp::rxfaxresult&quot;</span>
<span style="color: #00A000">+</span>
 /*****************************************************************************
         OUR DEFINES AND STRUCTS
 *****************************************************************************/
<span style="color: #800080; font-weight: bold">@@ -305,7 +308,14 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)</span>
         switch_core_session_t *session;
         switch_channel_t *channel;
         pvt_t *pvt;
<span style="color: #A00000">-        char *tmp;</span>
<span style="color: #00A000">+        char *fax_document_transferred_pages = NULL;</span>
<span style="color: #00A000">+        char *fax_document_total_pages = NULL;</span>
<span style="color: #00A000">+        char *fax_image_resolution = NULL;</span>
<span style="color: #00A000">+        char *fax_image_size = NULL;</span>
<span style="color: #00A000">+        char *fax_bad_rows = NULL;</span>
<span style="color: #00A000">+        char *fax_transfer_rate = NULL;</span>
<span style="color: #00A000">+        char *fax_result_code = NULL;</span>
<span style="color: #00A000">+        switch_event_t *event;</span>
 
         pvt = (pvt_t *) user_data;
         switch_assert(pvt);
<span style="color: #800080; font-weight: bold">@@ -353,13 +363,12 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)</span>
         switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, &quot;==============================================================================\n&quot;);
 
         /*
<span style="color: #A00000">-           Set our channel variables</span>
<span style="color: #00A000">+           Set our channel variables, variables are also used in event</span>
          */
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%i&quot;, result);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_result_code&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_result_code = switch_core_session_sprintf(session, &quot;%i&quot;, result);</span>
<span style="color: #00A000">+        if (fax_result_code) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_result_code&quot;, fax_result_code);</span>
         }
 
         switch_channel_set_variable(channel, &quot;fax_result_text&quot;, t30_completion_code_to_str(result));
<span style="color: #800080; font-weight: bold">@@ -368,49 +377,56 @@ static void phase_e_handler(t30_state_t *s, void *user_data, int result)</span>
         switch_channel_set_variable(channel, &quot;fax_local_station_id&quot;, local_ident);
         switch_channel_set_variable(channel, &quot;fax_remote_station_id&quot;, far_ident);
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%i&quot;, pvt-&gt;app_mode == FUNCTION_TX ? t.pages_tx : t.pages_rx);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_document_transferred_pages&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_document_transferred_pages = switch_core_session_sprintf(session, &quot;%i&quot;, pvt-&gt;app_mode == FUNCTION_TX ? t.pages_tx : t.pages_rx);</span>
<span style="color: #00A000">+        if (fax_document_transferred_pages) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_document_transferred_pages&quot;, fax_document_transferred_pages);</span>
         }
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%i&quot;, t.pages_in_file);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_document_total_pages&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_document_total_pages = switch_core_session_sprintf(session, &quot;%i&quot;, t.pages_in_file);</span>
<span style="color: #00A000">+        if (fax_document_total_pages) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_document_total_pages&quot;, fax_document_total_pages);</span>
         }
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%ix%i&quot;, t.x_resolution, t.y_resolution);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_image_resolution&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_image_resolution = switch_core_session_sprintf(session, &quot;%ix%i&quot;, t.x_resolution, t.y_resolution);</span>
<span style="color: #00A000">+        if (fax_image_resolution) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_image_resolution&quot;, fax_image_resolution);</span>
         }
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%d&quot;, t.image_size);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_image_size&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_image_size = switch_core_session_sprintf(session, &quot;%d&quot;, t.image_size);</span>
<span style="color: #00A000">+        if (fax_image_size) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_image_size&quot;, fax_image_size);</span>
         }
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%d&quot;, t.bad_rows);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_bad_rows&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_bad_rows = switch_core_session_sprintf(session, &quot;%d&quot;, t.bad_rows);</span>
<span style="color: #00A000">+        if (fax_bad_rows) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_bad_rows&quot;, fax_bad_rows);</span>
         }
 
<span style="color: #A00000">-        tmp = switch_mprintf(&quot;%i&quot;, t.bit_rate);</span>
<span style="color: #A00000">-        if (tmp) {</span>
<span style="color: #A00000">-                switch_channel_set_variable(channel, &quot;fax_transfer_rate&quot;, tmp);</span>
<span style="color: #A00000">-                switch_safe_free(tmp);</span>
<span style="color: #00A000">+        fax_transfer_rate = switch_core_session_sprintf(session, &quot;%i&quot;, t.bit_rate);</span>
<span style="color: #00A000">+        if (fax_transfer_rate) {</span>
<span style="color: #00A000">+                switch_channel_set_variable(channel, &quot;fax_transfer_rate&quot;, fax_transfer_rate);</span>
         }
 
         /* switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING); */
 
         pvt-&gt;done = 1;
 
<span style="color: #A00000">-        /*</span>
<span style="color: #A00000">-           TODO Fire events</span>
<span style="color: #A00000">-         */</span>
<span style="color: #00A000">+        /* Fire event */</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (switch_event_create_subclass(&amp;event, SWITCH_EVENT_CUSTOM, pvt-&gt;app_mode == FUNCTION_TX ? SPANDSP_EVENT_TXFAXRESULT : SPANDSP_EVENT_RXFAXRESULT) == SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-document-transferred-pages&quot;, fax_document_transferred_pages);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-document-total-pages&quot;, fax_document_total_pages);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-image-resolution&quot;, fax_image_resolution);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-image-size&quot;, fax_image_size);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-bad-rows&quot;, fax_bad_rows);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-transfer-rate&quot;, fax_transfer_rate);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-result-code&quot;, fax_result_code);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-result-text&quot;, t30_completion_code_to_str(result));</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-ecm-used&quot;, (t.error_correcting_mode) ? &quot;on&quot; : &quot;off&quot;);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-local-station-id&quot;, local_ident);</span>
<span style="color: #00A000">+                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;fax-remote-station-id&quot;, far_ident);</span>
<span style="color: #00A000">+                switch_core_session_queue_private_event(session, &amp;event, SWITCH_FALSE);</span>
<span style="color: #00A000">+        }</span>
 }
 
 static int t38_tx_packet_handler(t38_core_state_t *s, void *user_data, const uint8_t *buf, int len, int count)
<span style="color: #800080; font-weight: bold">@@ -1026,7 +1042,6 @@ void mod_spandsp_fax_process_fax(switch_core_session_t *session, const char *dat</span>
                         switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, &quot;Fax TX filename not set.\n&quot;);
                         goto done;
                 } else if (pvt-&gt;app_mode == FUNCTION_RX) {
<span style="color: #A00000">-                        char *fname;</span>
                         const char *prefix;
                         switch_time_t time;
 
<span style="color: #800080; font-weight: bold">@@ -1036,11 +1051,7 @@ void mod_spandsp_fax_process_fax(switch_core_session_t *session, const char *dat</span>
                                 prefix = globals.prepend_string;
                         }
 
<span style="color: #A00000">-                        fname = switch_mprintf(&quot;%s/%s-%ld-%ld.tif&quot;, globals.spool, prefix, globals.total_sessions, time);</span>
<span style="color: #A00000">-                        if (fname) {</span>
<span style="color: #A00000">-                                pvt-&gt;filename = switch_core_session_strdup(session, fname);</span>
<span style="color: #A00000">-                                switch_safe_free(fname);</span>
<span style="color: #A00000">-                        } else {</span>
<span style="color: #00A000">+                        if (!(pvt-&gt;filename = switch_core_session_sprintf(session, &quot;%s/%s-%ld-%ld.tif&quot;, globals.spool, prefix, globals.total_sessions, time))) {</span>
                                 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, &quot;Cannot automatically set fax RX destination file\n&quot;);
                                 goto done;
                         }
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/build/modules.conf.in b/build/modules.conf.in</span>
<span style="color: #000080; font-weight: bold">index b46c2ff..84a9e9a 100644</span>
<span style="color: #A00000">--- a/build/modules.conf.in</span>
<span style="color: #00A000">+++ b/build/modules.conf.in</span>
<span style="color: #800080; font-weight: bold">@@ -112,4 +112,3 @@ say/mod_say_ru</span>
 
 ## Experimental Modules (don&#39;t cry if they&#39;re broken)
 #../../contrib/mod/xml_int/mod_xml_odbc
<span style="color: #A00000">-</span>
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
Merge branch &#39;master&#39; of fs-git:freeswitch
</pre></div>
<div class="highlight"><pre>committer: Raymond Chandler
comments: 
test

<span style="color: #000080; font-weight: bold">diff --git a/build/modules.conf.in b/build/modules.conf.in</span>
<span style="color: #000080; font-weight: bold">index 84a9e9a..b46c2ff 100644</span>
<span style="color: #A00000">--- a/build/modules.conf.in</span>
<span style="color: #00A000">+++ b/build/modules.conf.in</span>
<span style="color: #800080; font-weight: bold">@@ -112,3 +112,4 @@ say/mod_say_ru</span>
 
 ## Experimental Modules (don&#39;t cry if they&#39;re broken)
 #../../contrib/mod/xml_int/mod_xml_odbc
<span style="color: #00A000">+</span>
</pre></div>
<div class="highlight"><pre>committer: Daniel Swarbrick
comments: 
reduce agentx heartbeat to 2s, add management hook for mutex lock/unlock

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/event_handlers/mod_snmp/mod_snmp.c b/src/mod/event_handlers/mod_snmp/mod_snmp.c</span>
<span style="color: #000080; font-weight: bold">index 0310637..56c7be1 100644</span>
<span style="color: #A00000">--- a/src/mod/event_handlers/mod_snmp/mod_snmp.c</span>
<span style="color: #00A000">+++ b/src/mod/event_handlers/mod_snmp/mod_snmp.c</span>
<span style="color: #800080; font-weight: bold">@@ -48,6 +48,20 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_snmp_runtime);</span>
 SWITCH_MODULE_DEFINITION(mod_snmp, mod_snmp_load, mod_snmp_shutdown, mod_snmp_runtime);
 
 
<span style="color: #00A000">+static switch_status_t snmp_manage(char *relative_oid, switch_management_action_t action, char *data, switch_size_t datalen)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        if (action == SMA_GET) {</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Mutex lock request from relative OID %s.\n&quot;, relative_oid);</span>
<span style="color: #00A000">+                switch_mutex_lock(globals.mutex);</span>
<span style="color: #00A000">+        } else if (action == SMA_SET) {</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;Mutex unlock request from relative OID %s.\n&quot;, relative_oid);</span>
<span style="color: #00A000">+                switch_mutex_unlock(globals.mutex);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+</span>
 static int snmp_callback_log(int major, int minor, void *serverarg, void *clientarg)
 {
         struct snmp_log_message *slm = (struct snmp_log_message *) serverarg;
<span style="color: #800080; font-weight: bold">@@ -71,10 +85,14 @@ static switch_status_t load_config(switch_memory_pool_t *pool)</span>
 SWITCH_MODULE_LOAD_FUNCTION(mod_snmp_load)
 {
         switch_status_t status = SWITCH_STATUS_SUCCESS;
<span style="color: #00A000">+        switch_management_interface_t *management_interface;</span>
 
         load_config(pool);
 
         *module_interface = switch_loadable_module_create_module_interface(pool, modname);
<span style="color: #00A000">+        management_interface = switch_loadable_module_create_interface(*module_interface, SWITCH_MANAGEMENT_INTERFACE);</span>
<span style="color: #00A000">+        management_interface-&gt;relative_oid = &quot;1000&quot;;</span>
<span style="color: #00A000">+        management_interface-&gt;management_function = snmp_manage;</span>
 
         /* Register callback function so we get Net-SNMP logging handled by FreeSWITCH */
         snmp_register_callback(SNMP_CALLBACK_LIBRARY, SNMP_CALLBACK_LOGGING, snmp_callback_log, NULL);
<span style="color: #800080; font-weight: bold">@@ -86,10 +104,10 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_snmp_load)</span>
         init_agent(&quot;mod_snmp&quot;);
 
         /*
<span style="color: #A00000">-         * Override master/subagent ping interval to 5s, to ensure that</span>
<span style="color: #00A000">+         * Override master/subagent ping interval to 2s, to ensure that</span>
          * agent_check_and_process() never blocks for longer than that.
          */
<span style="color: #A00000">-        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_PING_INTERVAL, 5);</span>
<span style="color: #00A000">+        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_AGENTX_PING_INTERVAL, 2);</span>
 
         init_subagent();  
         init_snmp(&quot;mod_snmp&quot;);
<span style="color: #800080; font-weight: bold">@@ -107,6 +125,8 @@ SWITCH_MODULE_RUNTIME_FUNCTION(mod_snmp_runtime)</span>
                 switch_mutex_unlock(globals.mutex);
         }
 
<span style="color: #00A000">+        switch_yield(5000);</span>
<span style="color: #00A000">+</span>
         return SWITCH_STATUS_SUCCESS;
 }
 
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
MERGE: OpenMethods DTMF recognition via ASR modules
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
MERGE: OpenMethods ASR enhancements: multiple concurrent grammars and dialplan access to start-input-timers

<span style="color: #000080; font-weight: bold">diff --cc src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #000080; font-weight: bold">index 5a3be03,fe089a6..928a9b8</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #800080; font-weight: bold">@@@ -95,181 -96,7 +96,181 @@@ SWITCH_STANDARD_DIALPLAN(inline_dialpla</span>
          return extension;
  }
  
 +struct action_binding {
 +        char *realm;
 +        char *input;
 +        char *string;
 +        char *value;
 +        switch_core_session_t *session;
 +};
 +
 +static switch_status_t digit_nomatch_action_callback(switch_ivr_dmachine_match_t *match)
 +{
 +        switch_core_session_t *session = (switch_core_session_t *) match-&gt;user_data;
 +        switch_channel_t *channel = switch_core_session_get_channel(session);
 +        char str[DMACHINE_MAX_DIGIT_LEN + 2];
 +        switch_event_t *event;
 +        switch_status_t status;
 +
 +        switch_channel_set_variable(channel, &quot;last_non_matching_digits&quot;, match-&gt;match_digits);
 +
 +        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, &quot;%s Digit NOT match binding [%s]\n&quot;, 
 +                                          switch_channel_get_name(channel), match-&gt;match_digits);
 +
 +        if (switch_event_create_plain(&amp;event, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS) {
 +                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;digits&quot;, match-&gt;match_digits);
 +
 +                if ((status = switch_core_session_queue_event(session, &amp;event)) != SWITCH_STATUS_SUCCESS) {
 +                        switch_event_destroy(&amp;event);
 +                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s event queue faiure.\n&quot;, 
 +                                                          switch_core_session_get_name(session));
 +                }
 +        }
 +
 +        /* send it back around flagged to skip the dmachine */
 +        switch_snprintf(str, sizeof(str), &quot;!%s&quot;, match-&gt;match_digits);
 +        
 +        switch_channel_queue_dtmf_string(channel, str);
 +        
 +        return SWITCH_STATUS_SUCCESS;
 +}
 +
 +static switch_status_t digit_action_callback(switch_ivr_dmachine_match_t *match)
 +{
 +        struct action_binding *act = (struct action_binding *) match-&gt;user_data;
 +        switch_event_t *event;
 +        switch_status_t status;
 +        int exec = 0;
 +        char *string = act-&gt;string;
 +        switch_channel_t *channel = switch_core_session_get_channel(act-&gt;session);
 +
 +        switch_channel_set_variable(channel, &quot;last_matching_digits&quot;, match-&gt;match_digits);
 +        
 +        if (switch_event_create_plain(&amp;event, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS) {
 +                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(act-&gt;session), SWITCH_LOG_DEBUG, &quot;%s Digit match binding [%s][%s]\n&quot;, 
 +                                                  switch_channel_get_name(channel), act-&gt;string, act-&gt;value);
 +
 +                if (!strncasecmp(string, &quot;exec:&quot;, 5)) {
 +                        string += 5;
 +                        exec = 1;
 +                }
 +
 +                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, string, act-&gt;value);
 +                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;digits&quot;, match-&gt;match_digits);
 +
 +                if (exec) {
 +                        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, &quot;execute&quot;, exec == 2 ? &quot;non-blocking&quot; : &quot;blocking&quot;);
 +                } 
 +
 +                if ((status = switch_core_session_queue_event(act-&gt;session, &amp;event)) != SWITCH_STATUS_SUCCESS) {
 +                        switch_event_destroy(&amp;event);
 +                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(act-&gt;session), SWITCH_LOG_WARNING, &quot;%s event queue faiure.\n&quot;, 
 +                                                          switch_core_session_get_name(act-&gt;session));
 +                }
 +        }
 +
 +        if (exec) {
 +                char *cmd = switch_core_session_sprintf(act-&gt;session, &quot;%s::%s&quot;, string, act-&gt;value);
 +                switch_ivr_broadcast_in_thread(act-&gt;session, cmd, SMF_ECHO_ALEG|SMF_HOLD_BLEG);
 +        }
 +        
 +        return SWITCH_STATUS_SUCCESS;
 +}
 +
 +#define CLEAR_DIGIT_ACTION_USAGE &quot;&lt;realm&gt;|all&quot;
 +SWITCH_STANDARD_APP(clear_digit_action_function)
 +{
 +        //switch_channel_t *channel = switch_core_session_get_channel(session);
 +        switch_ivr_dmachine_t *dmachine;
 +        char *realm = (char *) data;
 +
 +        if ((dmachine = switch_core_session_get_dmachine(session))) {
 +                if (zstr(realm) || !strcasecmp(realm, &quot;all&quot;)) {
 +                        switch_core_session_set_dmachine(session, NULL);
 +                        switch_ivr_dmachine_destroy(&amp;dmachine);
 +                } else {
 +                        switch_ivr_dmachine_clear_realm(dmachine, realm);
 +                }
 +        }
 +}
 +
 +#define DIGIT_ACTION_SET_REALM_USAGE &quot;&lt;realm&gt;&quot;
 +SWITCH_STANDARD_APP(digit_action_set_realm_function)
 +{
 +        switch_ivr_dmachine_t *dmachine;
 +        char *realm = (char *) data;
 +
 +        if (zstr(data)) {
 +                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;Syntax Error, USAGE %s\n&quot;, DIGIT_ACTION_SET_REALM_USAGE);
 +                return;
 +        }
 +        
 +        if ((dmachine = switch_core_session_get_dmachine(session))) {
 +                switch_ivr_dmachine_set_realm(dmachine, realm);
 +        }
 +
 +}
 +
 +#define BIND_DIGIT_ACTION_USAGE &quot;&lt;realm&gt;,&lt;digits|~regex&gt;,&lt;string&gt;,&lt;value&gt;&quot;
 +SWITCH_STANDARD_APP(bind_digit_action_function)
 +{
 +        switch_channel_t *channel = switch_core_session_get_channel(session);
 +        switch_ivr_dmachine_t *dmachine;
 +        char *mydata;
 +        int argc = 0;
 +        char *argv[4] = { 0 };
 +        struct action_binding *act;
 +
 +        if (zstr(data)) {
 +                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;Syntax Error, USAGE %s\n&quot;, BIND_DIGIT_ACTION_USAGE);
 +                return;
 +        }
 +
 +        mydata = switch_core_session_strdup(session, data);
 +
 +        argc = switch_separate_string(mydata, &#39;,&#39;, argv, (sizeof(argv) / sizeof(argv[0])));
 +        
 +        if (argc &lt; 4 || zstr(argv[0]) || zstr(argv[1]) || zstr(argv[2]) || zstr(argv[3])) {
 +                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;Syntax Error, USAGE %s\n&quot;, BIND_DIGIT_ACTION_USAGE);
 +                return;
 +        }
 +
 +        
 +        if (!(dmachine = switch_core_session_get_dmachine(session))) {
 +                uint32_t digit_timeout = 1500;
 +                uint32_t input_timeout = 0;
 +                const char *var;
 +                uint32_t tmp;
 +
 +                if ((var = switch_channel_get_variable(channel, &quot;bind_digit_digit_timeout&quot;))) {
 +                        tmp = (uint32_t) atol(var);
 +                        if (tmp &lt; 0) tmp = 0;
 +                        digit_timeout = tmp;
 +                }
 +                
 +                if ((var = switch_channel_get_variable(channel, &quot;bind_digit_input_timeout&quot;))) {
 +                        tmp = (uint32_t) atol(var);
 +                        if (tmp &lt; 0) tmp = 0;
 +                        input_timeout = tmp;
 +                }
 +                
 +                switch_ivr_dmachine_create(&amp;dmachine, &quot;DPTOOLS&quot;, NULL, digit_timeout, input_timeout, NULL, digit_nomatch_action_callback, session);
 +                switch_core_session_set_dmachine(session, dmachine);
 +        }
 +
 +        
 +        act = switch_core_session_alloc(session, sizeof(*act));
 +        act-&gt;realm = argv[0];
 +        act-&gt;input = argv[1];
 +        act-&gt;string = argv[2];
 +        act-&gt;value = argv[3];
 +        act-&gt;session = session;
 +        
 +        switch_ivr_dmachine_bind(dmachine, act-&gt;realm, act-&gt;input, 0, digit_action_callback, act);
 +}
 +
 +
<span style="color: #A00000">- #define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR pause OR resume OR stop OR param &lt;name&gt; &lt;value&gt;&quot;</span>
<span style="color: #00A000">+ #define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR grammaron/grammaroff &lt;gram_name&gt; OR grammarsalloff OR pause OR resume OR start_input_timers OR stop OR param &lt;name&gt; &lt;value&gt;&quot;</span>
  SWITCH_STANDARD_APP(detect_speech_function)
  {
          char *argv[4];
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
MERGE: DTMF recognition via ASR modules (implemented in UniMRCP)

<span style="color: #000080; font-weight: bold">diff --git a/src/include/switch_core.h b/src/include/switch_core.h</span>
<span style="color: #000080; font-weight: bold">index 26a048c..a3d74e9 100644</span>
<span style="color: #A00000">--- a/src/include/switch_core.h</span>
<span style="color: #00A000">+++ b/src/include/switch_core.h</span>
<span style="color: #800080; font-weight: bold">@@ -1715,6 +1715,15 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_close(switch_asr_handle_t *ah, s</span>
 SWITCH_DECLARE(switch_status_t) switch_core_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
 
 /*!
<span style="color: #00A000">+  \brief Feed DTMF to an asr handle</span>
<span style="color: #00A000">+  \param ah the handle to feed data to</span>
<span style="color: #00A000">+  \param dtmf a string of DTMF digits</span>
<span style="color: #00A000">+  \param flags flags to influence behaviour</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
   \brief Check an asr handle for results
   \param ah the handle to check
   \param flags flags to influence behaviour
<span style="color: #000080; font-weight: bold">diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h</span>
<span style="color: #000080; font-weight: bold">index e0119b4..8303af7 100644</span>
<span style="color: #A00000">--- a/src/include/switch_module_interfaces.h</span>
<span style="color: #00A000">+++ b/src/include/switch_module_interfaces.h</span>
<span style="color: #800080; font-weight: bold">@@ -400,6 +400,8 @@ struct switch_asr_interface {</span>
         switch_status_t (*asr_disable_grammar) (switch_asr_handle_t *ah, const char *name);
         /*! function to disable all grammars to the asr interface */
         switch_status_t (*asr_disable_all_grammars) (switch_asr_handle_t *ah);
<span style="color: #00A000">+        /*! function to feed DTMF to the ASR */</span>
<span style="color: #00A000">+        switch_status_t (*asr_feed_dtmf) (switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);</span>
 };
 
 /*! an abstract representation of an asr speech interface. */
<span style="color: #000080; font-weight: bold">diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #000080; font-weight: bold">index b9cecd1..b3679cf 100644</span>
<span style="color: #A00000">--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #00A000">+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #800080; font-weight: bold">@@ -49,6 +49,7 @@</span>
 #include &quot;mrcp_resource_loader.h&quot;
 #include &quot;mpf_engine.h&quot;
 #include &quot;mpf_codec_manager.h&quot;
<span style="color: #00A000">+#include &quot;mpf_dtmf_generator.h&quot;</span>
 #include &quot;mpf_rtp_termination_factory.h&quot;
 #include &quot;mrcp_sofiasip_client_agent.h&quot;
 #include &quot;mrcp_unirtsp_client_agent.h&quot;
<span style="color: #800080; font-weight: bold">@@ -442,6 +443,12 @@ struct recognizer_data {</span>
         int start_of_input;
         /** true, if input timers have started */
         int timers_started;
<span style="color: #00A000">+        /** UniMRCP mpf stream */</span>
<span style="color: #00A000">+        mpf_audio_stream_t *unimrcp_stream;</span>
<span style="color: #00A000">+        /** DTMF generator */</span>
<span style="color: #00A000">+        mpf_dtmf_generator_t *dtmf_generator;</span>
<span style="color: #00A000">+        /** true, if presently transmitting DTMF */</span>
<span style="color: #00A000">+        char dtmf_generator_active;</span>
 };
 typedef struct recognizer_data recognizer_data_t;
 
<span style="color: #800080; font-weight: bold">@@ -457,6 +464,7 @@ static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const</span>
 static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah);
 static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_t *flags);
 static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
<span style="color: #00A000">+static switch_status_t recog_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags);</span>
 #if 0
 static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name);
 #endif
<span style="color: #800080; font-weight: bold">@@ -472,6 +480,7 @@ static void recog_asr_float_param(switch_asr_handle_t *ah, char *param, double v</span>
 /* recognizer&#39;s interface for UniMRCP */
 static apt_bool_t recog_message_handler(const mrcp_app_message_t *app_message);
 static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp_session_t *session, mrcp_channel_t *channel, mrcp_message_t *message);
<span style="color: #00A000">+static apt_bool_t recog_stream_open(mpf_audio_stream_t *stream, mpf_codec_t *codec);</span>
 static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame);
 
 /* recognizer specific speech_channel_funcs */
<span style="color: #800080; font-weight: bold">@@ -3114,6 +3123,9 @@ static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_</span>
         speech_channel_destroy(schannel);
         switch_core_hash_destroy(&amp;r-&gt;grammars);
         switch_core_hash_destroy(&amp;r-&gt;enabled_grammars);
<span style="color: #00A000">+        if (r-&gt;dtmf_generator) {</span>
<span style="color: #00A000">+                mpf_dtmf_generator_destroy(r-&gt;dtmf_generator);</span>
<span style="color: #00A000">+        }</span>
 
         /* this lets FreeSWITCH&#39;s speech_thread know the handle is closed */
         switch_set_flag(ah, SWITCH_ASR_FLAG_CLOSED);
<span style="color: #800080; font-weight: bold">@@ -3134,6 +3146,39 @@ static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsig</span>
         return speech_channel_write(schannel, data, &amp;slen);
 }
 
<span style="color: #00A000">+/**</span>
<span style="color: #00A000">+ * Process asr_feed_dtmf request from FreeSWITCH</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * @param ah the FreeSWITCH speech recognition handle</span>
<span style="color: #00A000">+ * @return SWITCH_STATUS_SUCCESS if successful </span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;</span>
<span style="color: #00A000">+        recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;</span>
<span style="color: #00A000">+        char digits[2];</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (!r-&gt;dtmf_generator) {</span>
<span style="color: #00A000">+                if (!r-&gt;unimrcp_stream) {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) Cannot queue DTMF: No UniMRCP stream object open\n&quot;, schannel-&gt;name);</span>
<span style="color: #00A000">+                        return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                r-&gt;dtmf_generator = mpf_dtmf_generator_create(r-&gt;unimrcp_stream, schannel-&gt;unimrcp_session-&gt;pool);</span>
<span style="color: #00A000">+                if (!r-&gt;dtmf_generator) {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) Cannot queue DTMF: Failed to create DTMF generator\n&quot;, schannel-&gt;name);</span>
<span style="color: #00A000">+                        return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        digits[0] = dtmf-&gt;digit;</span>
<span style="color: #00A000">+        digits[1] = &#39;\0&#39;;</span>
<span style="color: #00A000">+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;(%s) Queued DTMF: %s\n&quot;, schannel-&gt;name, digits);</span>
<span style="color: #00A000">+        mpf_dtmf_generator_enqueue(r-&gt;dtmf_generator, digits);</span>
<span style="color: #00A000">+        r-&gt;dtmf_generator_active = 1;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 #if 0
 /**
  * Process asr_start request from FreeSWITCH
<span style="color: #800080; font-weight: bold">@@ -3380,6 +3425,23 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp</span>
 }
 
 /**
<span style="color: #00A000">+ * UniMRCP callback requesting open for speech recognition</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * @param stream the UniMRCP stream</span>
<span style="color: #00A000">+ * @param codec the codec</span>
<span style="color: #00A000">+ * @return TRUE</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static apt_bool_t recog_stream_open(mpf_audio_stream_t *stream, mpf_codec_t *codec)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        speech_channel_t *schannel = (speech_channel_t *) stream-&gt;obj;</span>
<span style="color: #00A000">+        recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        r-&gt;unimrcp_stream = stream;</span>
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        return TRUE;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
  * UniMRCP callback requesting next frame for speech recognition
  *
  * @param stream the UniMRCP stream
<span style="color: #800080; font-weight: bold">@@ -3389,6 +3451,7 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp</span>
 static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame)
 {
         speech_channel_t *schannel = (speech_channel_t *) stream-&gt;obj;
<span style="color: #00A000">+        recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;</span>
         switch_size_t to_read = frame-&gt;codec_frame.size;
 
         /* grab the data.  pad it if there isn&#39;t enough */
<span style="color: #800080; font-weight: bold">@@ -3398,6 +3461,13 @@ static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *fra</span>
                 }
                 frame-&gt;type |= MEDIA_FRAME_TYPE_AUDIO;
         }
<span style="color: #00A000">+        </span>
<span style="color: #00A000">+        if (r-&gt;dtmf_generator_active) {</span>
<span style="color: #00A000">+                if (!mpf_dtmf_generator_put_frame(r-&gt;dtmf_generator, frame)) {</span>
<span style="color: #00A000">+                        if (!mpf_dtmf_generator_sending(r-&gt;dtmf_generator))</span>
<span style="color: #00A000">+                                r-&gt;dtmf_generator_active = 0;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+        }</span>
 
         return TRUE;
 }
<span style="color: #800080; font-weight: bold">@@ -3421,6 +3491,7 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int</span>
         asr_interface-&gt;asr_disable_all_grammars = recog_asr_disable_all_grammars;
         asr_interface-&gt;asr_close = recog_asr_close;
         asr_interface-&gt;asr_feed = recog_asr_feed;
<span style="color: #00A000">+        asr_interface-&gt;asr_feed_dtmf = recog_asr_feed_dtmf;</span>
 #if 0
         asr_interface-&gt;asr_start = recog_asr_start;
 #endif
<span style="color: #800080; font-weight: bold">@@ -3443,7 +3514,7 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int</span>
         globals.recog.dispatcher.on_channel_remove = speech_on_channel_remove;
         globals.recog.dispatcher.on_message_receive = recog_on_message_receive;
         globals.recog.audio_stream_vtable.destroy = NULL;
<span style="color: #A00000">-        globals.recog.audio_stream_vtable.open_rx = NULL;</span>
<span style="color: #00A000">+        globals.recog.audio_stream_vtable.open_rx = recog_stream_open;</span>
         globals.recog.audio_stream_vtable.close_rx = NULL;
         globals.recog.audio_stream_vtable.read_frame = recog_stream_read;
         globals.recog.audio_stream_vtable.open_tx = NULL;
<span style="color: #000080; font-weight: bold">diff --git a/src/switch_core_asr.c b/src/switch_core_asr.c</span>
<span style="color: #000080; font-weight: bold">index 691011a..7f231ef 100644</span>
<span style="color: #A00000">--- a/src/switch_core_asr.c</span>
<span style="color: #00A000">+++ b/src/switch_core_asr.c</span>
<span style="color: #800080; font-weight: bold">@@ -239,6 +239,19 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_feed(switch_asr_handle_t *ah, vo</span>
         return ah-&gt;asr_interface-&gt;asr_feed(ah, data, len, flags);
 }
 
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_feed_dtmf(switch_asr_handle_t *ah, const switch_dtmf_t *dtmf, switch_asr_flag_t *flags)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_assert(ah != NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (ah-&gt;asr_interface-&gt;asr_feed_dtmf) {</span>
<span style="color: #00A000">+                status = ah-&gt;asr_interface-&gt;asr_feed_dtmf(ah, dtmf, flags);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 SWITCH_DECLARE(switch_status_t) switch_core_asr_check_results(switch_asr_handle_t *ah, switch_asr_flag_t *flags)
 {
         switch_assert(ah != NULL);
<span style="color: #000080; font-weight: bold">diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c</span>
<span style="color: #000080; font-weight: bold">index 66cd369..5df7af3 100644</span>
<span style="color: #A00000">--- a/src/switch_ivr_async.c</span>
<span style="color: #00A000">+++ b/src/switch_ivr_async.c</span>
<span style="color: #800080; font-weight: bold">@@ -2660,6 +2660,20 @@ static switch_bool_t speech_callback(switch_media_bug_t *bug, void *user_data, s</span>
         return SWITCH_TRUE;
 }
 
<span style="color: #00A000">+static switch_status_t speech_on_dtmf(switch_core_session_t *session, const switch_dtmf_t *dtmf, switch_dtmf_direction_t direction)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_channel_t *channel = switch_core_session_get_channel(session);</span>
<span style="color: #00A000">+        struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+        switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (switch_core_asr_feed_dtmf(sth-&gt;ah, dtmf, &amp;flags) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_ERROR, &quot;Error Feeding DTMF\n&quot;);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 SWITCH_DECLARE(switch_status_t) switch_ivr_stop_detect_speech(switch_core_session_t *session)
 {
         switch_channel_t *channel = switch_core_session_get_channel(session);
<span style="color: #800080; font-weight: bold">@@ -2875,6 +2889,11 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech(switch_core_session_t *</span>
                 return status;
         }
 
<span style="color: #00A000">+        if ((status = switch_core_event_hook_add_recv_dtmf(session, speech_on_dtmf)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                switch_ivr_stop_detect_speech(session);</span>
<span style="color: #00A000">+                return status;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
         switch_channel_set_private(channel, SWITCH_SPEECH_KEY, sth);
 
         return SWITCH_STATUS_SUCCESS;
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
MERGE: expose ASR start_input_timers to dialplan via IVR and mod_dptools

<span style="color: #000080; font-weight: bold">diff --cc src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #000080; font-weight: bold">index f573661,2f49630..fe089a6</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #800080; font-weight: bold">@@@ -96,7 -96,7 +96,7 @@@ SWITCH_STANDARD_DIALPLAN(inline_dialpla</span>
          return extension;
  }
  
<span style="color: #A00000">- #define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR grammaron/grammaroff &lt;gram_name&gt; OR grammarsalloff OR pause OR resume OR stop OR param &lt;name&gt; &lt;value&gt;&quot;</span>
 -#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume OR start_input_timers&quot;
<span style="color: #00A000">++#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR grammaron/grammaroff &lt;gram_name&gt; OR grammarsalloff OR pause OR resume OR start_input_timers OR stop OR param &lt;name&gt; &lt;value&gt;&quot;</span>
  SWITCH_STANDARD_APP(detect_speech_function)
  {
          char *argv[4];
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
MERGE: document all of detect_speech&#39;s valid syntax

<span style="color: #000080; font-weight: bold">diff --cc src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #000080; font-weight: bold">index e942bc6,6d014fa..f573661</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #800080; font-weight: bold">@@@ -96,7 -96,7 +96,7 @@@ SWITCH_STANDARD_DIALPLAN(inline_dialpla</span>
          return extension;
  }
  
<span style="color: #A00000">- #define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume OR grammaron/grammaroff &lt;gram_name&gt; OR grammarsalloff&quot;</span>
 -#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR pause OR resume OR stop OR param &lt;name&gt; &lt;value&gt;&quot;
<span style="color: #00A000">++#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR grammaron/grammaroff &lt;gram_name&gt; OR grammarsalloff OR pause OR resume OR stop OR param &lt;name&gt; &lt;value&gt;&quot;</span>
  SWITCH_STANDARD_APP(detect_speech_function)
  {
          char *argv[4];
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
expose ASR enable/disable grammar (and disable all grammars) to dialplan via mod_dptools

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #000080; font-weight: bold">index 5a1b8c5..e942bc6 100755</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #800080; font-weight: bold">@@ -28,6 +28,7 @@</span>
  * Michael Murdock &lt;mike at mmurdock dot org&gt;
  * Neal Horman &lt;neal at wanlink dot com&gt;
  * Bret McDanel &lt;trixter AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * mod_dptools.c -- Raw Audio File Streaming Application Module
  *
<span style="color: #800080; font-weight: bold">@@ -95,7 +96,7 @@ SWITCH_STANDARD_DIALPLAN(inline_dialplan_hunt)</span>
         return extension;
 }
 
<span style="color: #A00000">-#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume&quot;</span>
<span style="color: #00A000">+#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume OR grammaron/grammaroff &lt;gram_name&gt; OR grammarsalloff&quot;</span>
 SWITCH_STANDARD_APP(detect_speech_function)
 {
         char *argv[4];
<span style="color: #800080; font-weight: bold">@@ -108,6 +109,12 @@ SWITCH_STANDARD_APP(detect_speech_function)</span>
                         switch_ivr_detect_speech_load_grammar(session, argv[1], argv[2]);
                 } else if (!strcasecmp(argv[0], &quot;nogrammar&quot;)) {
                         switch_ivr_detect_speech_unload_grammar(session, argv[1]);
<span style="color: #00A000">+                } else if (!strcasecmp(argv[0], &quot;grammaron&quot;)) {</span>
<span style="color: #00A000">+                        switch_ivr_detect_speech_enable_grammar(session, argv[1]);</span>
<span style="color: #00A000">+                } else if (!strcasecmp(argv[0], &quot;grammaroff&quot;)) {</span>
<span style="color: #00A000">+                        switch_ivr_detect_speech_disable_grammar(session, argv[1]);</span>
<span style="color: #00A000">+                } else if (!strcasecmp(argv[0], &quot;grammarsalloff&quot;)) {</span>
<span style="color: #00A000">+                        switch_ivr_detect_speech_disable_all_grammars(session);</span>
                 } else if (!strcasecmp(argv[0], &quot;pause&quot;)) {
                         switch_ivr_pause_detect_speech(session);
                 } else if (!strcasecmp(argv[0], &quot;resume&quot;)) {
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
switch_ivr interfaces to enable/disable grammar: switch_ivr_detect_speech_enable_grammar, switch_ivr_detect_speech_disable_grammar, and switch_ivr_detect_speech_disable_all_grammars

<span style="color: #000080; font-weight: bold">diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h</span>
<span style="color: #000080; font-weight: bold">index 40ba1dc..8641766 100644</span>
<span style="color: #A00000">--- a/src/include/switch_ivr.h</span>
<span style="color: #00A000">+++ b/src/include/switch_ivr.h</span>
<span style="color: #800080; font-weight: bold">@@ -26,6 +26,7 @@</span>
  * Anthony Minessale II &lt;anthm@freeswitch.org&gt;
  * Neal Horman &lt;neal at wanlink dot com&gt;
  * Bret McDanel &lt;trixter AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * switch_ivr.h -- IVR Library
  *
<span style="color: #800080; font-weight: bold">@@ -198,6 +199,29 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_load_grammar(switch_cor</span>
 */
 SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_core_session_t *session, const char *name);
 
<span style="color: #00A000">+/*!</span>
<span style="color: #00A000">+  \brief Enable a grammar on a background speech detection handle</span>
<span style="color: #00A000">+  \param session The session to change the grammar on</span>
<span style="color: #00A000">+  \param name the grammar name</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS if all is well</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_enable_grammar(switch_core_session_t *session, const char *name);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
<span style="color: #00A000">+  \brief Disable a grammar on a background speech detection handle</span>
<span style="color: #00A000">+  \param session The session to change the grammar on</span>
<span style="color: #00A000">+  \param name the grammar name</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS if all is well</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_grammar(switch_core_session_t *session, const char *name);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
<span style="color: #00A000">+  \brief Disable all grammars on a background speech detection handle</span>
<span style="color: #00A000">+  \param session The session to change the grammar on</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS if all is well</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_all_grammars(switch_core_session_t *session);</span>
<span style="color: #00A000">+</span>
 SWITCH_DECLARE(switch_status_t) switch_ivr_set_param_detect_speech(switch_core_session_t *session, const char *name, const char *val);
 
 /*!
<span style="color: #000080; font-weight: bold">diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c</span>
<span style="color: #000080; font-weight: bold">index 4fe5732..672750a 100644</span>
<span style="color: #A00000">--- a/src/switch_ivr_async.c</span>
<span style="color: #00A000">+++ b/src/switch_ivr_async.c</span>
<span style="color: #800080; font-weight: bold">@@ -26,6 +26,7 @@</span>
  * Anthony Minessale II &lt;anthm@freeswitch.org&gt;
  * Michael Jerris &lt;mike@jerris.com&gt;
  * Bret McDanel &lt;bret AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * switch_ivr_async.c -- IVR Library (async operations)
  *
<span style="color: #800080; font-weight: bold">@@ -2745,6 +2746,57 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_c</span>
         return SWITCH_STATUS_FALSE;
 }
 
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_enable_grammar(switch_core_session_t *session, const char *name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_channel_t *channel = switch_core_session_get_channel(session);</span>
<span style="color: #00A000">+        switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;</span>
<span style="color: #00A000">+        struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);</span>
<span style="color: #00A000">+        switch_status_t status;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (sth) {</span>
<span style="color: #00A000">+                if ((status = switch_core_asr_enable_grammar(sth-&gt;ah, name)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, &quot;Error enabling Grammar\n&quot;);</span>
<span style="color: #00A000">+                        switch_core_asr_close(sth-&gt;ah, &amp;flags);</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                return status;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_grammar(switch_core_session_t *session, const char *name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_channel_t *channel = switch_core_session_get_channel(session);</span>
<span style="color: #00A000">+        switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;</span>
<span style="color: #00A000">+        struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);</span>
<span style="color: #00A000">+        switch_status_t status;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (sth) {</span>
<span style="color: #00A000">+                if ((status = switch_core_asr_disable_grammar(sth-&gt;ah, name)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, &quot;Error disabling Grammar\n&quot;);</span>
<span style="color: #00A000">+                        switch_core_asr_close(sth-&gt;ah, &amp;flags);</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                return status;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_disable_all_grammars(switch_core_session_t *session)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_channel_t *channel = switch_core_session_get_channel(session);</span>
<span style="color: #00A000">+        switch_asr_flag_t flags = SWITCH_ASR_FLAG_NONE;</span>
<span style="color: #00A000">+        struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);</span>
<span style="color: #00A000">+        switch_status_t status;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (sth) {</span>
<span style="color: #00A000">+                if ((status = switch_core_asr_disable_all_grammars(sth-&gt;ah)) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, &quot;Error disabling all Grammars\n&quot;);</span>
<span style="color: #00A000">+                        switch_core_asr_close(sth-&gt;ah, &amp;flags);</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                return status;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech(switch_core_session_t *session,
                                                                                                                  const char *mod_name,
                                                                                                                  const char *grammar, const char *name, const char *dest, switch_asr_handle_t *ah)
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
Implement UniMRCP asr_enable_grammar, asr_disable_grammar, and asr_disable_all_grammars which allow for multiple grammar recognition

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #000080; font-weight: bold">index a27ddf0..b9cecd1 100644</span>
<span style="color: #A00000">--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #00A000">+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #800080; font-weight: bold">@@ -434,8 +434,8 @@ static const char *grammar_type_to_mime(grammar_type_t type, profile_t *profile)</span>
 struct recognizer_data {
         /** the available grammars */
         switch_hash_t *grammars;
<span style="color: #A00000">-        /** the last grammar used (for pause/resume) */</span>
<span style="color: #A00000">-        grammar_t *last_grammar;</span>
<span style="color: #00A000">+        /** the enabled grammars */</span>
<span style="color: #00A000">+        switch_hash_t *enabled_grammars;</span>
         /** recognize result */
         char *result;
         /** true, if voice has started */
<span style="color: #800080; font-weight: bold">@@ -452,6 +452,9 @@ static switch_status_t recog_shutdown();</span>
 static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec, int rate, const char *dest, switch_asr_flag_t *flags);
 static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const char *grammar, const char *name);
 static switch_status_t recog_asr_unload_grammar(switch_asr_handle_t *ah, const char *name);
<span style="color: #00A000">+static switch_status_t recog_asr_enable_grammar(switch_asr_handle_t *ah, const char *name);</span>
<span style="color: #00A000">+static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const char *name);</span>
<span style="color: #00A000">+static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah);</span>
 static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_t *flags);
 static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsigned int len, switch_asr_flag_t *flags);
 #if 0
<span style="color: #800080; font-weight: bold">@@ -472,9 +475,12 @@ static apt_bool_t recog_on_message_receive(mrcp_application_t *application, mrcp</span>
 static apt_bool_t recog_stream_read(mpf_audio_stream_t *stream, mpf_frame_t *frame);
 
 /* recognizer specific speech_channel_funcs */
<span style="color: #A00000">-static switch_status_t recog_channel_start(speech_channel_t *schannel, const char *name);</span>
<span style="color: #00A000">+static switch_status_t recog_channel_start(speech_channel_t *schannel);</span>
 static switch_status_t recog_channel_load_grammar(speech_channel_t *schannel, const char *name, grammar_type_t type, const char *data);
 static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel, const char *name);
<span style="color: #00A000">+static switch_status_t recog_channel_enable_grammar(speech_channel_t *schannel, const char *name);</span>
<span style="color: #00A000">+static switch_status_t recog_channel_disable_grammar(speech_channel_t *schannel, const char *name);</span>
<span style="color: #00A000">+static switch_status_t recog_channel_disable_all_grammars(speech_channel_t *schannel);</span>
 static switch_status_t recog_channel_check_results(speech_channel_t *schannel);
 static switch_status_t recog_channel_set_start_of_input(speech_channel_t *schannel);
 static switch_status_t recog_channel_start_input_timers(speech_channel_t *schannel);
<span style="color: #800080; font-weight: bold">@@ -2056,19 +2062,24 @@ static const char *grammar_type_to_mime(grammar_type_t type, profile_t *profile)</span>
  * Start RECOGNIZE request
  *
  * @param schannel the channel to start
<span style="color: #A00000">- * @param name the name of the grammar to use or NULL if to reuse the last grammar</span>
  * @return SWITCH_STATUS_SUCCESS if successful
  */
<span style="color: #A00000">-static switch_status_t recog_channel_start(speech_channel_t *schannel, const char *name)</span>
<span style="color: #00A000">+static switch_status_t recog_channel_start(speech_channel_t *schannel)</span>
 {
         switch_status_t status = SWITCH_STATUS_SUCCESS;
<span style="color: #00A000">+        switch_hash_index_t *egk;</span>
         mrcp_message_t *mrcp_message;
         mrcp_recog_header_t *recog_header;
         mrcp_generic_header_t *generic_header;
         recognizer_data_t *r;
         char *start_input_timers;
         const char *mime_type;
<span style="color: #A00000">-        grammar_t *grammar = NULL;</span>
<span style="color: #00A000">+        char *key;</span>
<span style="color: #00A000">+        switch_size_t len;</span>
<span style="color: #00A000">+        grammar_t *grammar;</span>
<span style="color: #00A000">+        switch_size_t grammar_uri_count = 0;</span>
<span style="color: #00A000">+        switch_size_t grammar_uri_list_len = 0;</span>
<span style="color: #00A000">+        char *grammar_uri_list = NULL;</span>
 
         switch_mutex_lock(schannel-&gt;mutex);
         if (schannel-&gt;state != SPEECH_CHANNEL_READY) {
<span style="color: #800080; font-weight: bold">@@ -2089,21 +2100,55 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha</span>
         start_input_timers = (char *) switch_core_hash_find(schannel-&gt;params, &quot;start-input-timers&quot;);
         r-&gt;timers_started = zstr(start_input_timers) || strcasecmp(start_input_timers, &quot;false&quot;);
 
<span style="color: #A00000">-        /* get the cached grammar */</span>
<span style="color: #A00000">-        if (zstr(name)) {</span>
<span style="color: #A00000">-                grammar = r-&gt;last_grammar;</span>
<span style="color: #A00000">-        } else {</span>
<span style="color: #A00000">-                grammar = (grammar_t *) switch_core_hash_find(r-&gt;grammars, name);</span>
<span style="color: #A00000">-                r-&gt;last_grammar = grammar;</span>
<span style="color: #A00000">-        }</span>
<span style="color: #A00000">-        if (grammar == NULL) {</span>
<span style="color: #A00000">-                if (name) {</span>
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) Undefined grammar, %s\n&quot;, schannel-&gt;name, name);</span>
<span style="color: #A00000">-                } else {</span>
<span style="color: #A00000">-                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) No grammar specified\n&quot;, schannel-&gt;name);</span>
<span style="color: #00A000">+        /* count enabled grammars */</span>
<span style="color: #00A000">+        for (egk = switch_hash_first(NULL, r-&gt;enabled_grammars); egk; egk = switch_hash_next(egk)) {</span>
<span style="color: #00A000">+                // NOTE: This postponed type check is necessary to allow a non-URI-list grammar to execute alone</span>
<span style="color: #00A000">+                if (grammar_uri_count == 1 &amp;&amp; grammar-&gt;type != GRAMMAR_TYPE_URI)</span>
<span style="color: #00A000">+                        goto no_grammar_alone;</span>
<span style="color: #00A000">+                ++grammar_uri_count;</span>
<span style="color: #00A000">+                switch_hash_this(egk, (void *) &amp;key, NULL, (void *) &amp;grammar);</span>
<span style="color: #00A000">+                if (grammar-&gt;type != GRAMMAR_TYPE_URI &amp;&amp; grammar_uri_count != 1) {</span>
<span style="color: #00A000">+                      no_grammar_alone:</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) Grammar &#39;%s&#39; can only be used alone (not a URI list)\n&quot;, schannel-&gt;name, key);</span>
<span style="color: #00A000">+                        status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+                        goto done;</span>
                 }
<span style="color: #00A000">+                len = strlen(grammar-&gt;data);</span>
<span style="color: #00A000">+                if (!len)</span>
<span style="color: #00A000">+                        continue;</span>
<span style="color: #00A000">+                grammar_uri_list_len += len;</span>
<span style="color: #00A000">+                if (grammar-&gt;data[len - 1] != &#39;\n&#39;)</span>
<span style="color: #00A000">+                        grammar_uri_list_len += 2;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch (grammar_uri_count) {</span>
<span style="color: #00A000">+        case 0:</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) No grammar specified\n&quot;, schannel-&gt;name);</span>
                 status = SWITCH_STATUS_FALSE;
                 goto done;
<span style="color: #00A000">+        case 1:</span>
<span style="color: #00A000">+                /* grammar should already be the unique grammar */</span>
<span style="color: #00A000">+                break;</span>
<span style="color: #00A000">+        default:</span>
<span style="color: #00A000">+                /* get the enabled grammars list */</span>
<span style="color: #00A000">+                grammar_uri_list = switch_core_alloc(schannel-&gt;memory_pool, grammar_uri_list_len + 1);</span>
<span style="color: #00A000">+                grammar_uri_list_len = 0;</span>
<span style="color: #00A000">+                for (egk = switch_hash_first(NULL, r-&gt;enabled_grammars); egk; egk = switch_hash_next(egk)) {</span>
<span style="color: #00A000">+                        switch_hash_this(egk, (void *) &amp;key, NULL, (void *) &amp;grammar);</span>
<span style="color: #00A000">+                        len = strlen(grammar-&gt;data);</span>
<span style="color: #00A000">+                        if (!len)</span>
<span style="color: #00A000">+                                continue;</span>
<span style="color: #00A000">+                        memcpy(&amp;(grammar_uri_list[grammar_uri_list_len]), grammar-&gt;data, len);</span>
<span style="color: #00A000">+                        grammar_uri_list_len += len;</span>
<span style="color: #00A000">+                        if (grammar_uri_list[grammar_uri_list_len - 1] != &#39;\n&#39;)</span>
<span style="color: #00A000">+                        {</span>
<span style="color: #00A000">+                                grammar_uri_list_len += 2;</span>
<span style="color: #00A000">+                                grammar_uri_list[grammar_uri_list_len - 2] = &#39;\r&#39;;</span>
<span style="color: #00A000">+                                grammar_uri_list[grammar_uri_list_len - 1] = &#39;\n&#39;;</span>
<span style="color: #00A000">+                        }</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                grammar_uri_list[grammar_uri_list_len++] = &#39;\0&#39;;</span>
<span style="color: #00A000">+                grammar = NULL;</span>
         }
 
         /* create MRCP message */
<span style="color: #800080; font-weight: bold">@@ -2121,7 +2166,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha</span>
         }
 
         /* set Content-Type */
<span style="color: #A00000">-        mime_type = grammar_type_to_mime(grammar-&gt;type, schannel-&gt;profile);</span>
<span style="color: #00A000">+        mime_type = grammar_type_to_mime(grammar ? grammar-&gt;type : GRAMMAR_TYPE_URI, schannel-&gt;profile);</span>
         if (zstr(mime_type)) {
                 status = SWITCH_STATUS_FALSE;
                 goto done;
<span style="color: #800080; font-weight: bold">@@ -2130,7 +2175,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha</span>
         mrcp_generic_header_property_add(mrcp_message, GENERIC_HEADER_CONTENT_TYPE);
 
         /* set Content-ID for inline grammars */
<span style="color: #A00000">-        if (grammar-&gt;type != GRAMMAR_TYPE_URI) {</span>
<span style="color: #00A000">+        if (grammar &amp;&amp; grammar-&gt;type != GRAMMAR_TYPE_URI) {</span>
                 apt_string_assign(&amp;generic_header-&gt;content_id, grammar-&gt;name, mrcp_message-&gt;pool);
                 mrcp_generic_header_property_add(mrcp_message, GENERIC_HEADER_CONTENT_ID);
         }
<span style="color: #800080; font-weight: bold">@@ -2152,7 +2197,7 @@ static switch_status_t recog_channel_start(speech_channel_t *schannel, const cha</span>
         recog_channel_set_params(schannel, mrcp_message, generic_header, recog_header);
 
         /* set message body */
<span style="color: #A00000">-        apt_string_assign(&amp;mrcp_message-&gt;body, grammar-&gt;data, mrcp_message-&gt;pool);</span>
<span style="color: #00A000">+        apt_string_assign(&amp;mrcp_message-&gt;body, grammar ? grammar-&gt;data : grammar_uri_list, mrcp_message-&gt;pool);</span>
 
         /* Empty audio queue and send RECOGNIZE to MRCP server */
         audio_queue_clear(schannel-&gt;audio_queue);
<span style="color: #800080; font-weight: bold">@@ -2287,6 +2332,7 @@ static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel,</span>
         } else {
                 recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;
                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;(%s) Unloading grammar %s\n&quot;, schannel-&gt;name, grammar_name);
<span style="color: #00A000">+                switch_core_hash_delete(r-&gt;enabled_grammars, grammar_name);</span>
                 switch_core_hash_delete(r-&gt;grammars, grammar_name);
         }
 
<span style="color: #800080; font-weight: bold">@@ -2294,6 +2340,77 @@ static switch_status_t recog_channel_unload_grammar(speech_channel_t *schannel,</span>
 }
 
 /**
<span style="color: #00A000">+ * Enable speech recognition grammar</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * @param schannel the recognizer channel</span>
<span style="color: #00A000">+ * @param grammar_name the name of the grammar to enable</span>
<span style="color: #00A000">+ * @return SWITCH_STATUS_SUCCESS if successful</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_channel_enable_grammar(speech_channel_t *schannel, const char *grammar_name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (zstr(grammar_name)) {</span>
<span style="color: #00A000">+                status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        } else {</span>
<span style="color: #00A000">+                recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;</span>
<span style="color: #00A000">+                grammar_t *grammar;</span>
<span style="color: #00A000">+                grammar = (grammar_t *) switch_core_hash_find(r-&gt;grammars, grammar_name);</span>
<span style="color: #00A000">+                if (grammar == NULL)</span>
<span style="color: #00A000">+                {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, &quot;(%s) Undefined grammar, %s\n&quot;, schannel-&gt;name, grammar_name);</span>
<span style="color: #00A000">+                        status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                else {</span>
<span style="color: #00A000">+                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;(%s) Enabling grammar %s\n&quot;, schannel-&gt;name, grammar_name);</span>
<span style="color: #00A000">+                        switch_core_hash_insert(r-&gt;enabled_grammars, grammar_name, grammar);</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
<span style="color: #00A000">+ * Disable speech recognition grammar</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * @param schannel the recognizer channel</span>
<span style="color: #00A000">+ * @param grammar_name the name of the grammar to disable</span>
<span style="color: #00A000">+ * @return SWITCH_STATUS_SUCCESS if successful</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_channel_disable_grammar(speech_channel_t *schannel, const char *grammar_name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (zstr(grammar_name)) {</span>
<span style="color: #00A000">+                status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        } else {</span>
<span style="color: #00A000">+                recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;</span>
<span style="color: #00A000">+                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;(%s) Disabling grammar %s\n&quot;, schannel-&gt;name, grammar_name);</span>
<span style="color: #00A000">+                switch_core_hash_delete(r-&gt;enabled_grammars, grammar_name);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
<span style="color: #00A000">+ * Disable all speech recognition grammars</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * @param schannel the recognizer channel</span>
<span style="color: #00A000">+ * @return SWITCH_STATUS_SUCCESS if successful</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_channel_disable_all_grammars(speech_channel_t *schannel)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        recognizer_data_t *r = (recognizer_data_t *) schannel-&gt;data;</span>
<span style="color: #00A000">+        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;(%s) Disabling all grammars\n&quot;, schannel-&gt;name);</span>
<span style="color: #00A000">+        switch_core_hash_destroy(&amp;r-&gt;enabled_grammars);</span>
<span style="color: #00A000">+        switch_core_hash_init(&amp;r-&gt;enabled_grammars, schannel-&gt;memory_pool);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
  * Check if recognition is complete
  *
  * @return SWITCH_STATUS_SUCCESS if results available or start of input
<span style="color: #800080; font-weight: bold">@@ -2740,6 +2857,7 @@ static switch_status_t recog_asr_open(switch_asr_handle_t *ah, const char *codec</span>
         schannel-&gt;data = r;
         memset(r, 0, sizeof(recognizer_data_t));
         switch_core_hash_init(&amp;r-&gt;grammars, ah-&gt;memory_pool);
<span style="color: #00A000">+        switch_core_hash_init(&amp;r-&gt;enabled_grammars, ah-&gt;memory_pool);</span>
 
         /* Open the channel */
         if (zstr(profile_name)) {
<span style="color: #800080; font-weight: bold">@@ -2892,7 +3010,17 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha</span>
 
         start_recognize = (char *) switch_core_hash_find(schannel-&gt;params, &quot;start-recognize&quot;);
         if (zstr(start_recognize) || strcasecmp(start_recognize, &quot;false&quot;))
<span style="color: #A00000">-                status = recog_channel_start(schannel, name);</span>
<span style="color: #00A000">+        {</span>
<span style="color: #00A000">+                if (recog_channel_disable_all_grammars(schannel) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                        status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+                        goto done;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                if (recog_channel_enable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                        status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+                        goto done;</span>
<span style="color: #00A000">+                }</span>
<span style="color: #00A000">+                status = recog_channel_start(schannel);</span>
<span style="color: #00A000">+        }</span>
 
   done:
 
<span style="color: #800080; font-weight: bold">@@ -2921,6 +3049,57 @@ static switch_status_t recog_asr_unload_grammar(switch_asr_handle_t *ah, const c</span>
 }
 
 /**
<span style="color: #00A000">+ * Process asr_enable_grammar request from FreeSWITCH.</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * FreeSWITCH sends this request to enable recognition on this grammar.</span>
<span style="color: #00A000">+ * @param ah the FreeSWITCH speech recognition handle</span>
<span style="color: #00A000">+ * @param name the grammar name.</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_asr_enable_grammar(switch_asr_handle_t *ah, const char *name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+        speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;</span>
<span style="color: #00A000">+        if (zstr(name) || speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_enable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
<span style="color: #00A000">+ * Process asr_disable_grammar request from FreeSWITCH.</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * FreeSWITCH sends this request to disable recognition on this grammar.</span>
<span style="color: #00A000">+ * @param ah the FreeSWITCH speech recognition handle</span>
<span style="color: #00A000">+ * @param name the grammar name.</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_asr_disable_grammar(switch_asr_handle_t *ah, const char *name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+        speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;</span>
<span style="color: #00A000">+        if (zstr(name) || speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_disable_grammar(schannel, name) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
<span style="color: #00A000">+ * Process asr_disable_all_grammars request from FreeSWITCH.</span>
<span style="color: #00A000">+ *</span>
<span style="color: #00A000">+ * FreeSWITCH sends this request to disable recognition of all grammars.</span>
<span style="color: #00A000">+ * @param ah the FreeSWITCH speech recognition handle</span>
<span style="color: #00A000">+ * @param name the grammar name.</span>
<span style="color: #00A000">+ */</span>
<span style="color: #00A000">+static switch_status_t recog_asr_disable_all_grammars(switch_asr_handle_t *ah)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+        speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;</span>
<span style="color: #00A000">+        if (speech_channel_stop(schannel) != SWITCH_STATUS_SUCCESS || recog_channel_disable_all_grammars(schannel) != SWITCH_STATUS_SUCCESS) {</span>
<span style="color: #00A000">+                status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/**</span>
  * Process asr_close request from FreeSWITCH
  *
  * @param ah the FreeSWITCH speech recognition handle
<span style="color: #800080; font-weight: bold">@@ -2934,6 +3113,7 @@ static switch_status_t recog_asr_close(switch_asr_handle_t *ah, switch_asr_flag_</span>
         speech_channel_stop(schannel);
         speech_channel_destroy(schannel);
         switch_core_hash_destroy(&amp;r-&gt;grammars);
<span style="color: #00A000">+        switch_core_hash_destroy(&amp;r-&gt;enabled_grammars);</span>
 
         /* this lets FreeSWITCH&#39;s speech_thread know the handle is closed */
         switch_set_flag(ah, SWITCH_ASR_FLAG_CLOSED);
<span style="color: #800080; font-weight: bold">@@ -2958,14 +3138,13 @@ static switch_status_t recog_asr_feed(switch_asr_handle_t *ah, void *data, unsig</span>
 /**
  * Process asr_start request from FreeSWITCH
  * @param ah the FreeSWITCH speech recognition handle
<span style="color: #A00000">- * @param name name of the grammar to use</span>
  * @return SWITCH_STATUS_SUCCESS if successful
  */
<span style="color: #A00000">-static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name)</span>
<span style="color: #00A000">+static switch_status_t recog_asr_start(switch_asr_handle_t *ah)</span>
 {
         switch_status_t status;
         speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;
<span style="color: #A00000">-        status = recog_channel_start(schannel, name);</span>
<span style="color: #00A000">+        status = recog_channel_start(schannel);</span>
         return status;
 }
 #endif
<span style="color: #800080; font-weight: bold">@@ -2978,7 +3157,7 @@ static switch_status_t recog_asr_start(switch_asr_handle_t *ah, const char *name</span>
 static switch_status_t recog_asr_resume(switch_asr_handle_t *ah)
 {
         speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;
<span style="color: #A00000">-        return recog_channel_start(schannel, NULL);</span>
<span style="color: #00A000">+        return recog_channel_start(schannel);</span>
 }
 
 /**
<span style="color: #800080; font-weight: bold">@@ -3237,6 +3416,9 @@ static switch_status_t recog_load(switch_loadable_module_interface_t *module_int</span>
         asr_interface-&gt;asr_open = recog_asr_open;
         asr_interface-&gt;asr_load_grammar = recog_asr_load_grammar;
         asr_interface-&gt;asr_unload_grammar = recog_asr_unload_grammar;
<span style="color: #00A000">+        asr_interface-&gt;asr_enable_grammar = recog_asr_enable_grammar;</span>
<span style="color: #00A000">+        asr_interface-&gt;asr_disable_grammar = recog_asr_disable_grammar;</span>
<span style="color: #00A000">+        asr_interface-&gt;asr_disable_all_grammars = recog_asr_disable_all_grammars;</span>
         asr_interface-&gt;asr_close = recog_asr_close;
         asr_interface-&gt;asr_feed = recog_asr_feed;
 #if 0
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
switch_core_asr interfaces for enable_grammar, disable_grammar, and disable_all_grammars

<span style="color: #000080; font-weight: bold">diff --git a/src/include/switch_core.h b/src/include/switch_core.h</span>
<span style="color: #000080; font-weight: bold">index 650ffc1..26a048c 100644</span>
<span style="color: #A00000">--- a/src/include/switch_core.h</span>
<span style="color: #00A000">+++ b/src/include/switch_core.h</span>
<span style="color: #800080; font-weight: bold">@@ -24,6 +24,7 @@</span>
  * Contributor(s):
  * 
  * Anthony Minessale II &lt;anthm@freeswitch.org&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  *
  * switch_core.h -- Core Library
<span style="color: #800080; font-weight: bold">@@ -1748,6 +1749,29 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_load_grammar(switch_asr_handle_t</span>
 SWITCH_DECLARE(switch_status_t) switch_core_asr_unload_grammar(switch_asr_handle_t *ah, const char *name);
 
 /*!
<span style="color: #00A000">+  \brief Enable a grammar from an asr handle</span>
<span style="color: #00A000">+  \param ah the handle to enable the grammar from</span>
<span style="color: #00A000">+  \param name the name of the grammar to enable</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_enable_grammar(switch_asr_handle_t *ah, const char *name);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
<span style="color: #00A000">+  \brief Disable a grammar from an asr handle</span>
<span style="color: #00A000">+  \param ah the handle to disable the grammar from</span>
<span style="color: #00A000">+  \param name the name of the grammar to disable</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_grammar(switch_asr_handle_t *ah, const char *name);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
<span style="color: #00A000">+  \brief Disable all grammars from an asr handle</span>
<span style="color: #00A000">+  \param ah the handle to disable the grammars from</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_all_grammars(switch_asr_handle_t *ah);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
   \brief Pause detection on an asr handle
   \param ah the handle to pause
   \return SWITCH_STATUS_SUCCESS
<span style="color: #000080; font-weight: bold">diff --git a/src/include/switch_module_interfaces.h b/src/include/switch_module_interfaces.h</span>
<span style="color: #000080; font-weight: bold">index 078b83d..e0119b4 100644</span>
<span style="color: #A00000">--- a/src/include/switch_module_interfaces.h</span>
<span style="color: #00A000">+++ b/src/include/switch_module_interfaces.h</span>
<span style="color: #800080; font-weight: bold">@@ -24,6 +24,7 @@</span>
  * Contributor(s):
  * 
  * Anthony Minessale II &lt;anthm@freeswitch.org&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  *
  * switch_module_interfaces.h -- Module Interface Definitions
<span style="color: #800080; font-weight: bold">@@ -393,6 +394,12 @@ struct switch_asr_interface {</span>
         switch_mutex_t *reflock;
         switch_loadable_module_interface_t *parent;
         struct switch_asr_interface *next;
<span style="color: #00A000">+        /*! function to enable a grammar to the asr interface */</span>
<span style="color: #00A000">+        switch_status_t (*asr_enable_grammar) (switch_asr_handle_t *ah, const char *name);</span>
<span style="color: #00A000">+        /*! function to disable a grammar to the asr interface */</span>
<span style="color: #00A000">+        switch_status_t (*asr_disable_grammar) (switch_asr_handle_t *ah, const char *name);</span>
<span style="color: #00A000">+        /*! function to disable all grammars to the asr interface */</span>
<span style="color: #00A000">+        switch_status_t (*asr_disable_all_grammars) (switch_asr_handle_t *ah);</span>
 };
 
 /*! an abstract representation of an asr speech interface. */
<span style="color: #000080; font-weight: bold">diff --git a/src/switch_core_asr.c b/src/switch_core_asr.c</span>
<span style="color: #000080; font-weight: bold">index fa4446e..691011a 100644</span>
<span style="color: #A00000">--- a/src/switch_core_asr.c</span>
<span style="color: #00A000">+++ b/src/switch_core_asr.c</span>
<span style="color: #800080; font-weight: bold">@@ -27,6 +27,7 @@</span>
  * Michael Jerris &lt;mike@jerris.com&gt;
  * Paul D. Tinsley &lt;pdt at jackhammer.org&gt;
  * Christopher M. Rienzo &lt;chris@rienzo.net&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  *
  * switch_core_asr.c -- Main Core Library (Speech Detection Interface)
<span style="color: #800080; font-weight: bold">@@ -160,6 +161,45 @@ SWITCH_DECLARE(switch_status_t) switch_core_asr_unload_grammar(switch_asr_handle</span>
         return status;
 }
 
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_enable_grammar(switch_asr_handle_t *ah, const char *name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_assert(ah != NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (ah-&gt;asr_interface-&gt;asr_enable_grammar) {</span>
<span style="color: #00A000">+                status = ah-&gt;asr_interface-&gt;asr_enable_grammar(ah, name);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_grammar(switch_asr_handle_t *ah, const char *name)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_assert(ah != NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (ah-&gt;asr_interface-&gt;asr_disable_grammar) {</span>
<span style="color: #00A000">+                status = ah-&gt;asr_interface-&gt;asr_disable_grammar(ah, name);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_core_asr_disable_all_grammars(switch_asr_handle_t *ah)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_status_t status = SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        switch_assert(ah != NULL);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (ah-&gt;asr_interface-&gt;asr_disable_all_grammars) {</span>
<span style="color: #00A000">+                status = ah-&gt;asr_interface-&gt;asr_disable_all_grammars(ah);</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        return status;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 SWITCH_DECLARE(switch_status_t) switch_core_asr_pause(switch_asr_handle_t *ah)
 {
         switch_assert(ah != NULL);
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
Allow loading grammars without sending RECOGNIZE with start-recognize=false parameter

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #000080; font-weight: bold">index 41c0ccd..a27ddf0 100644</span>
<span style="color: #A00000">--- a/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #00A000">+++ b/src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c</span>
<span style="color: #800080; font-weight: bold">@@ -26,6 +26,7 @@</span>
  *
  * Brian West &lt;brian@freeswitch.org&gt;
  * Christopher M. Rienzo &lt;chris@rienzo.net&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * mod_unimrcp.c -- UniMRCP module (MRCP client)
  *
<span style="color: #800080; font-weight: bold">@@ -2451,6 +2452,8 @@ static switch_status_t recog_channel_set_params(speech_channel_t *schannel, mrcp</span>
                         if (id) {
                                 switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, &quot;(%s) \&quot;%s\&quot;: \&quot;%s\&quot;\n&quot;, schannel-&gt;name, param_name, param_val);
                                 recog_channel_set_header(schannel, id-&gt;id, param_val, msg, recog_hdr);
<span style="color: #00A000">+                        } else if (!strcasecmp(param_name, &quot;start-recognize&quot;)) {</span>
<span style="color: #00A000">+                                // This parameter is used internally only, not in MRCP headers</span>
                         } else {
                                 /* this is probably a vendor-specific MRCP param */
                                 apt_str_t apt_param_name = { 0 };
<span style="color: #800080; font-weight: bold">@@ -2782,6 +2785,7 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha</span>
         speech_channel_t *schannel = (speech_channel_t *) ah-&gt;private_info;
         const char *grammar_data = NULL;
         char *grammar_file_data = NULL;
<span style="color: #00A000">+        char *start_recognize;</span>
         switch_file_t *grammar_file = NULL;
         switch_size_t grammar_file_size = 0, to_read = 0;
         grammar_type_t type = GRAMMAR_TYPE_UNKNOWN;
<span style="color: #800080; font-weight: bold">@@ -2886,7 +2890,9 @@ static switch_status_t recog_asr_load_grammar(switch_asr_handle_t *ah, const cha</span>
                 goto done;
         }
 
<span style="color: #A00000">-        status = recog_channel_start(schannel, name);</span>
<span style="color: #00A000">+        start_recognize = (char *) switch_core_hash_find(schannel-&gt;params, &quot;start-recognize&quot;);</span>
<span style="color: #00A000">+        if (zstr(start_recognize) || strcasecmp(start_recognize, &quot;false&quot;))</span>
<span style="color: #00A000">+                status = recog_channel_start(schannel, name);</span>
 
   done:
 
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
document all of detect_speech&#39;s valid syntax

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #000080; font-weight: bold">index 5a1b8c5..6d014fa 100755</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #800080; font-weight: bold">@@ -28,6 +28,7 @@</span>
  * Michael Murdock &lt;mike at mmurdock dot org&gt;
  * Neal Horman &lt;neal at wanlink dot com&gt;
  * Bret McDanel &lt;trixter AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * mod_dptools.c -- Raw Audio File Streaming Application Module
  *
<span style="color: #800080; font-weight: bold">@@ -95,7 +96,7 @@ SWITCH_STANDARD_DIALPLAN(inline_dialplan_hunt)</span>
         return extension;
 }
 
<span style="color: #A00000">-#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume&quot;</span>
<span style="color: #00A000">+#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR nogrammar &lt;gram_name&gt; OR pause OR resume OR stop OR param &lt;name&gt; &lt;value&gt;&quot;</span>
 SWITCH_STANDARD_APP(detect_speech_function)
 {
         char *argv[4];
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
expose ASR start_input_timers to dialplan via mod_dptools

<span style="color: #000080; font-weight: bold">diff --git a/src/mod/applications/mod_dptools/mod_dptools.c b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #000080; font-weight: bold">index 5a1b8c5..2f49630 100755</span>
<span style="color: #A00000">--- a/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #00A000">+++ b/src/mod/applications/mod_dptools/mod_dptools.c</span>
<span style="color: #800080; font-weight: bold">@@ -28,6 +28,7 @@</span>
  * Michael Murdock &lt;mike at mmurdock dot org&gt;
  * Neal Horman &lt;neal at wanlink dot com&gt;
  * Bret McDanel &lt;trixter AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * mod_dptools.c -- Raw Audio File Streaming Application Module
  *
<span style="color: #800080; font-weight: bold">@@ -95,7 +96,7 @@ SWITCH_STANDARD_DIALPLAN(inline_dialplan_hunt)</span>
         return extension;
 }
 
<span style="color: #A00000">-#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume&quot;</span>
<span style="color: #00A000">+#define DETECT_SPEECH_SYNTAX &quot;&lt;mod_name&gt; &lt;gram_name&gt; &lt;gram_path&gt; [&lt;addr&gt;] OR grammar &lt;gram_name&gt; [&lt;path&gt;] OR pause OR resume OR start_input_timers&quot;</span>
 SWITCH_STANDARD_APP(detect_speech_function)
 {
         char *argv[4];
<span style="color: #800080; font-weight: bold">@@ -116,6 +117,8 @@ SWITCH_STANDARD_APP(detect_speech_function)</span>
                         switch_ivr_stop_detect_speech(session);
                 } else if (!strcasecmp(argv[0], &quot;param&quot;)) {
                         switch_ivr_set_param_detect_speech(session, argv[1], argv[2]);
<span style="color: #00A000">+                } else if (!strcasecmp(argv[0], &quot;start_input_timers&quot;)) {</span>
<span style="color: #00A000">+                        switch_ivr_detect_speech_start_input_timers(session);</span>
                 } else if (argc &gt;= 3) {
                         switch_ivr_detect_speech(session, argv[0], argv[1], argv[2], argv[3], NULL);
                 }
</pre></div>
<div class="highlight"><pre>committer: Luke Dashjr
comments: 
expose ASR start_input_timers on the IVR abstraction level

<span style="color: #000080; font-weight: bold">diff --git a/src/include/switch_ivr.h b/src/include/switch_ivr.h</span>
<span style="color: #000080; font-weight: bold">index 40ba1dc..692ad8d 100644</span>
<span style="color: #A00000">--- a/src/include/switch_ivr.h</span>
<span style="color: #00A000">+++ b/src/include/switch_ivr.h</span>
<span style="color: #800080; font-weight: bold">@@ -26,6 +26,7 @@</span>
  * Anthony Minessale II &lt;anthm@freeswitch.org&gt;
  * Neal Horman &lt;neal at wanlink dot com&gt;
  * Bret McDanel &lt;trixter AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * switch_ivr.h -- IVR Library
  *
<span style="color: #800080; font-weight: bold">@@ -201,6 +202,13 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_c</span>
 SWITCH_DECLARE(switch_status_t) switch_ivr_set_param_detect_speech(switch_core_session_t *session, const char *name, const char *val);
 
 /*!
<span style="color: #00A000">+  \brief Start input timers on a background speech detection handle</span>
<span style="color: #00A000">+  \param session The session to start the timers on</span>
<span style="color: #00A000">+  \return SWITCH_STATUS_SUCCESS if all is well</span>
<span style="color: #00A000">+*/</span>
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(switch_core_session_t *session);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+/*!</span>
   \brief Record a session to disk
   \param session the session to record
   \param file the path to the file
<span style="color: #000080; font-weight: bold">diff --git a/src/switch_ivr_async.c b/src/switch_ivr_async.c</span>
<span style="color: #000080; font-weight: bold">index 4fe5732..ae23d0a 100644</span>
<span style="color: #A00000">--- a/src/switch_ivr_async.c</span>
<span style="color: #00A000">+++ b/src/switch_ivr_async.c</span>
<span style="color: #800080; font-weight: bold">@@ -26,6 +26,7 @@</span>
  * Anthony Minessale II &lt;anthm@freeswitch.org&gt;
  * Michael Jerris &lt;mike@jerris.com&gt;
  * Bret McDanel &lt;bret AT 0xdecafbad dot com&gt;
<span style="color: #00A000">+ * Luke Dashjr &lt;luke@openmethods.com&gt; (OpenMethods, LLC)</span>
  *
  * switch_ivr_async.c -- IVR Library (async operations)
  *
<span style="color: #800080; font-weight: bold">@@ -2728,6 +2729,18 @@ SWITCH_DECLARE(switch_status_t) switch_ivr_set_param_detect_speech(switch_core_s</span>
         return status;
 }
 
<span style="color: #00A000">+SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_start_input_timers(switch_core_session_t *session)</span>
<span style="color: #00A000">+{</span>
<span style="color: #00A000">+        switch_channel_t *channel = switch_core_session_get_channel(session);</span>
<span style="color: #00A000">+        struct speech_thread_handle *sth = switch_channel_get_private(channel, SWITCH_SPEECH_KEY);</span>
<span style="color: #00A000">+</span>
<span style="color: #00A000">+        if (sth) {</span>
<span style="color: #00A000">+                switch_core_asr_start_input_timers(sth-&gt;ah);</span>
<span style="color: #00A000">+                return SWITCH_STATUS_SUCCESS;</span>
<span style="color: #00A000">+        }</span>
<span style="color: #00A000">+        return SWITCH_STATUS_FALSE;</span>
<span style="color: #00A000">+}</span>
<span style="color: #00A000">+</span>
 SWITCH_DECLARE(switch_status_t) switch_ivr_detect_speech_unload_grammar(switch_core_session_t *session, const char *name)
 {
         switch_channel_t *channel = switch_core_session_get_channel(session);
</pre></div>
========================================================================<pre>

Summary of changes:
 .gitignore                                         |    7 +-
 conf/freeswitch.xml                                |    3 -
 libs/freetdm/msvc/freetdm.2010.vcxproj             |    2 +
 libs/freetdm/msvc/freetdm.2010.vcxproj.filters     |    6 +
 libs/freetdm/msvc/testboost/testboost.2010.vcxproj |    6 +-
 .../msvc/testboost/testsangomaboost.2010.vcxproj   |    6 +-
 .../ftmod_sangoma_boost.2010.vcxproj               |   12 +-
 .../ftmod_sangoma_isdn_stack_hndl.c                |    8 +-
 .../ftmod/ftmod_wanpipe/ftmod_wanpipe.2010.vcxproj |    8 +-
 src/include/switch_core.h                          |   33 ++
 src/include/switch_ivr.h                           |   31 ++
 src/include/switch_module_interfaces.h             |    9 +
 .../applications/mod_callcenter/mod_callcenter.c   |    9 +-
 src/mod/applications/mod_dptools/mod_dptools.c     |   11 +-
 src/mod/applications/mod_spandsp/mod_spandsp_fax.c |   89 +++---
 src/mod/applications/mod_spy/mod_spy.c             |    6 +-
 src/mod/asr_tts/mod_unimrcp/mod_unimrcp.c          |  313 +++++++++++++++++--
 src/mod/endpoints/mod_gsmopen/.gitignore           |    2 +
 src/mod/endpoints/mod_loopback/mod_loopback.c      |   33 ++-
 src/mod/endpoints/mod_skinny/skinny_protocol.h     |    8 +
 src/mod/endpoints/mod_skinny/skinny_server.c       |   25 ++
 src/mod/endpoints/mod_skinny/skinny_tables.c       |    1 +
 src/mod/endpoints/mod_skinny/skinny_tables.h       |    2 +-
 src/mod/endpoints/mod_sofia/mod_sofia.c            |   19 +-
 src/mod/event_handlers/mod_snmp/FREESWITCH-MIB     |  217 +++++++++++++-
 src/mod/event_handlers/mod_snmp/mod_snmp.c         |   26 ++-
 src/mod/event_handlers/mod_snmp/subagent.c         |  260 +++++++++++++++-
 src/mod/event_handlers/mod_snmp/subagent.h         |   57 ++++-
 .../languages/mod_managed/freeswitch_wrap.2010.cxx |  196 ++++++++++++
 src/mod/languages/mod_managed/freeswitch_wrap.cxx  |  327 ++++++++++++++++++++
 src/mod/languages/mod_managed/managed/swig.2010.cs |  168 ++++++++++-
 src/mod/languages/mod_managed/managed/swig.cs      |  296 ++++++++++++++++++-
 src/mod/xml_int/mod_xml_curl/mod_xml_curl.c        |    4 +-
 src/switch_channel.c                               |   47 ++--
 src/switch_core_asr.c                              |   53 ++++
 src/switch_core_sqldb.c                            |   11 +-
 src/switch_ivr_async.c                             |   83 +++++
 src/switch_xml.c                                   |    8 +-
 38 files changed, 2225 insertions(+), 177 deletions(-)
</pre>
<p>this email was generated because of /git/your-repo.git/hooks/post-receive by the file /git-core/contrib/hooks/post-receive-email<br />
For more info, see <a href="http://blog.chomperstomp.com/?p=630">http://blog.chomperstomp.com/?p=630</a>
-- <br />
FreeSWITCH Source</p>