<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][14893] </title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=14893">14893</a></dd>
<dt>Author</dt> <dd>brian</dd>
<dt>Date</dt> <dd>2009-09-16 16:24:22 -0500 (Wed, 16 Sep 2009)</dd>
</dl>

<h3>Log Message</h3>
<pre> <a href="http://jira.freeswitch.org/browse/FSCORE-442">FSCORE-442</a> </pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunkconfautoload_configsswitchconfxml">freeswitch/trunk/conf/autoload_configs/switch.conf.xml</a></li>
<li><a href="#freeswitchtrunksrcincludeprivateswitch_core_pvth">freeswitch/trunk/src/include/private/switch_core_pvt.h</a></li>
<li><a href="#freeswitchtrunksrcincludeswitch_coreh">freeswitch/trunk/src/include/switch_core.h</a></li>
<li><a href="#freeswitchtrunksrcincludeswitch_typesh">freeswitch/trunk/src/include/switch_types.h</a></li>
<li><a href="#freeswitchtrunksrcmodapplicationsmod_commandsmod_commandsc">freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c</a></li>
<li><a href="#freeswitchtrunksrcmodendpointsmod_sofiasofiac">freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c</a></li>
<li><a href="#freeswitchtrunksrcmodlanguagesmod_managedfreeswitch_wrapcxx">freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx</a></li>
<li><a href="#freeswitchtrunksrcmodlanguagesmod_managedmanagedswigcs">freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs</a></li>
<li><a href="#freeswitchtrunksrcmodlanguagesmod_perlmod_perl_wrapcpp">freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp</a></li>
<li><a href="#freeswitchtrunksrcswitch_channelc">freeswitch/trunk/src/switch_channel.c</a></li>
<li><a href="#freeswitchtrunksrcswitch_corec">freeswitch/trunk/src/switch_core.c</a></li>
<li><a href="#freeswitchtrunksrcswitch_core_ioc">freeswitch/trunk/src/switch_core_io.c</a></li>
<li><a href="#freeswitchtrunksrcswitch_rtpc">freeswitch/trunk/src/switch_rtp.c</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunkconfautoload_configsswitchconfxml"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/conf/autoload_configs/switch.conf.xml (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/conf/autoload_configs/switch.conf.xml        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/conf/autoload_configs/switch.conf.xml        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -26,8 +26,25 @@
</span><span class="cx">     &lt;param name=&quot;loglevel&quot; value=&quot;debug&quot;/&gt;
</span><span class="cx">     &lt;!--Try to catch any crashes that can be recoverable (in the context of a call)--&gt;
</span><span class="cx">     &lt;param name=&quot;crash-protection&quot; value=&quot;false&quot;/&gt;
</span><ins>+        &lt;!-- The min_dtmf_duration specifies the minimum DTMF duration to use on 
+             outgoing events. Events shorter than this will be increased in duration
+                 to match min_dtmf_duration. You cannot configure a dtmf duration on a 
+                 profile that is less than this setting. You may increase this value,
+                 but cannot set it lower than 400. This value cannot exceed 
+                 max_dtmf_duration. --&gt;
+    &lt;!--&lt;param name=&quot;min_dtmf_duration&quot; value=&quot;400&quot;/&gt;--&gt;
+        &lt;!-- The max_dtmf_duration caps the playout of a DTMF event at the specified
+             duration. Events exceeding this duration will be truncated to this
+                 duration. You cannot configure a duration on a profile that exceeds
+                 this setting. This setting can be lowered, but cannot exceed 192000. 
+                 This setting cannot be set lower than min_dtmf_duration. --&gt;
</ins><span class="cx">     &lt;!--&lt;param name=&quot;max_dtmf_duration&quot; value=&quot;192000&quot;/&gt;--&gt;
</span><del>-    &lt;!--&lt;param name=&quot;default_dtmf_duration&quot; value=&quot;8000&quot;/&gt;--&gt;
</del><ins>+        &lt;!-- The default_dtmf_duration specifies the DTMF duration to use on
+             originated DTMF events or on events that are received without a
+                 duration specified. This value can be increased or lowered. This
+                 value is lower-bounded by min_dtmf_duration and upper-bounded by
+                 max_dtmf_duration. --&gt;
+    &lt;!--&lt;param name=&quot;default_dtmf_duration&quot; value=&quot;2000&quot;/&gt;--&gt;
</ins><span class="cx">     &lt;!--
</span><span class="cx">          If you want to send out voicemail notifications via Windows you'll need to change the mailer-app
</span><span class="cx">          variable to the setting below:
</span></span></pre></div>
<a id="freeswitchtrunksrcincludeprivateswitch_core_pvth"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/include/private/switch_core_pvt.h (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/include/private/switch_core_pvt.h        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/include/private/switch_core_pvt.h        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -202,6 +202,7 @@
</span><span class="cx">         char *mailer_app;
</span><span class="cx">         char *mailer_app_args;
</span><span class="cx">         uint32_t max_dtmf_duration;
</span><ins>+        uint32_t min_dtmf_duration;
</ins><span class="cx">         uint32_t default_dtmf_duration;
</span><span class="cx">         switch_frame_t dummy_cng_frame;
</span><span class="cx">         char dummy_data[5];
</span></span></pre></div>
<a id="freeswitchtrunksrcincludeswitch_coreh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/include/switch_core.h (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/include/switch_core.h        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/include/switch_core.h        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -1890,6 +1890,7 @@
</span><span class="cx"> SWITCH_DECLARE(switch_bool_t) switch_check_network_list_ip_token(const char *ip_str, const char *list_name, const char **token);
</span><span class="cx"> #define switch_check_network_list_ip(_ip_str, _list_name) switch_check_network_list_ip_token(_ip_str, _list_name, NULL)
</span><span class="cx"> SWITCH_DECLARE(void) switch_time_set_monotonic(switch_bool_t enable);
</span><ins>+SWITCH_DECLARE(uint32_t) switch_core_min_dtmf_duration(uint32_t duration);
</ins><span class="cx"> SWITCH_DECLARE(uint32_t) switch_core_max_dtmf_duration(uint32_t duration);
</span><span class="cx"> SWITCH_DECLARE(uint32_t) switch_core_default_dtmf_duration(uint32_t duration);
</span><span class="cx"> SWITCH_DECLARE(switch_status_t) switch_console_set_complete(const char *string);
</span></span></pre></div>
<a id="freeswitchtrunksrcincludeswitch_typesh"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/include/switch_types.h (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/include/switch_types.h        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/include/switch_types.h        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -102,6 +102,7 @@
</span><span class="cx"> #define SWITCH_SEQ_CLEARSCR SWITCH_SEQ_ESC SWITCH_SEQ_CLEARSCR_CHAR SWITCH_SEQ_HOME
</span><span class="cx"> #endif
</span><span class="cx"> #define SWITCH_DEFAULT_DTMF_DURATION 2000
</span><ins>+#define SWITCH_MIN_DTMF_DURATION 400
</ins><span class="cx"> #define SWITCH_MAX_DTMF_DURATION 192000
</span><span class="cx"> #define SWITCH_DEFAULT_DIR_PERMS SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE | SWITCH_FPROT_UEXECUTE | SWITCH_FPROT_GREAD | SWITCH_FPROT_GEXECUTE
</span><span class="cx"> #ifdef WIN32
</span><span class="lines">@@ -1371,6 +1372,7 @@
</span><span class="cx">         SCSC_MAX_SESSIONS,
</span><span class="cx">         SCSC_SYNC_CLOCK,
</span><span class="cx">         SCSC_MAX_DTMF_DURATION,
</span><ins>+        SCSC_MIN_DTMF_DURATION,
</ins><span class="cx">         SCSC_DEFAULT_DTMF_DURATION,
</span><span class="cx">         SCSC_SHUTDOWN_ELEGANT,
</span><span class="cx">         SCSC_SHUTDOWN_ASAP,
</span></span></pre></div>
<a id="freeswitchtrunksrcmodapplicationsmod_commandsmod_commandsc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/mod/applications/mod_commands/mod_commands.c        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -1242,7 +1242,7 @@
</span><span class="cx">         return SWITCH_STATUS_SUCCESS;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#define CTL_SYNTAX &quot;[send_sighup|hupall|pause|resume|shutdown [cancel|elegant|asap|restart]|sps|sync_clock|reclaim_mem|max_sessions|max_dtmf_duration [num]|loglevel [level]]&quot;
</del><ins>+#define CTL_SYNTAX &quot;[send_sighup|hupall|pause|resume|shutdown [cancel|elegant|asap|restart]|sps|sync_clock|reclaim_mem|max_sessions|min_dtmf_duration [num]|max_dtmf_duration [num]|default_dtmf_duration [num]|loglevel [level]]&quot;
</ins><span class="cx"> SWITCH_STANDARD_API(ctl_function)
</span><span class="cx"> {
</span><span class="cx">         int argc;
</span><span class="lines">@@ -1311,6 +1311,12 @@
</span><span class="cx">                         }
</span><span class="cx">                         switch_core_session_ctl(SCSC_MAX_DTMF_DURATION, &amp;arg);
</span><span class="cx">                         stream-&gt;write_function(stream, &quot;+OK max dtmf duration: %d\n&quot;, arg);
</span><ins>+                } else if (!strcasecmp(argv[0], &quot;min_dtmf_duration&quot;)) {
+                        if (argc &gt; 1) {
+                                arg = atoi(argv[1]);
+                        }
+                        switch_core_session_ctl(SCSC_MIN_DTMF_DURATION, &amp;arg);
+                        stream-&gt;write_function(stream, &quot;+OK min dtmf duration: %d\n&quot;, arg);
</ins><span class="cx">                 } else if (!strcasecmp(argv[0], &quot;default_dtmf_duration&quot;)) {
</span><span class="cx">                         if (argc &gt; 1) {
</span><span class="cx">                                 arg = atoi(argv[1]);
</span><span class="lines">@@ -3636,6 +3642,8 @@
</span><span class="cx">         switch_console_set_complete(&quot;add fsctl reclaim_mem&quot;);
</span><span class="cx">         switch_console_set_complete(&quot;add fsctl max_sessions&quot;);
</span><span class="cx">         switch_console_set_complete(&quot;add fsctl max_dtmf_duration&quot;);
</span><ins>+        switch_console_set_complete(&quot;add fsctl min_dtmf_duration&quot;);
+        switch_console_set_complete(&quot;add fsctl default_dtmf_duration&quot;);
</ins><span class="cx">         SWITCH_ADD_API(commands_api_interface, &quot;help&quot;, &quot;Show help for all the api commands&quot;, help_function, &quot;&quot;);
</span><span class="cx">         SWITCH_ADD_API(commands_api_interface, &quot;version&quot;, &quot;Show version of the switch&quot;, version_function, &quot;&quot;);
</span><span class="cx">         SWITCH_ADD_API(commands_api_interface, &quot;sched_hangup&quot;, &quot;Schedule a running call to hangup&quot;, sched_hangup_function, SCHED_HANGUP_SYNTAX);
</span></span></pre></div>
<a id="freeswitchtrunksrcmodendpointsmod_sofiasofiac"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/mod/endpoints/mod_sofia/sofia.c        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -1926,7 +1926,7 @@
</span><span class="cx">                                                 profile-&gt;challenge_realm = switch_core_strdup(profile-&gt;pool, val);
</span><span class="cx">                                         } else if (!strcasecmp(var, &quot;dtmf-duration&quot;)) {
</span><span class="cx">                                                 int dur = atoi(val);
</span><del>-                                                if (dur &gt; 10 &amp;&amp; dur &lt; 8000) {
</del><ins>+                                                if (dur &gt; switch_core_min_dtmf_duration(0) &amp;&amp; dur &lt; switch_core_max_dtmf_duration(0)) {
</ins><span class="cx">                                                         profile-&gt;dtmf_duration = dur;
</span><span class="cx">                                                 } else {
</span><span class="cx">                                                         profile-&gt;dtmf_duration = SWITCH_DEFAULT_DTMF_DURATION;
</span><span class="lines">@@ -2598,7 +2598,7 @@
</span><span class="cx">                                                 profile-&gt;challenge_realm = switch_core_strdup(profile-&gt;pool, val);
</span><span class="cx">                                         } else if (!strcasecmp(var, &quot;dtmf-duration&quot;)) {
</span><span class="cx">                                                 int dur = atoi(val);
</span><del>-                                                if (dur &gt; 10 &amp;&amp; dur &lt; 8000) {
</del><ins>+                                                if (dur &gt; switch_core_min_dtmf_duration(0) &amp;&amp; dur &lt; switch_core_max_dtmf_duration(0)) {
</ins><span class="cx">                                                         profile-&gt;dtmf_duration = dur;
</span><span class="cx">                                                 } else {
</span><span class="cx">                                                         profile-&gt;dtmf_duration = SWITCH_DEFAULT_DTMF_DURATION;
</span></span></pre></div>
<a id="freeswitchtrunksrcmodlanguagesmod_managedfreeswitch_wrapcxx"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/mod/languages/mod_managed/freeswitch_wrap.cxx        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -894,6 +894,17 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_MIN_DTMF_DURATION_get() {
+  int jresult ;
+  int result;
+  
+  result = (int) 400;
+  
+  jresult = result; 
+  return jresult;
+}
+
+
</ins><span class="cx"> SWIGEXPORT int SWIGSTDCALL CSharp_SWITCH_MAX_DTMF_DURATION_get() {
</span><span class="cx">   int jresult ;
</span><span class="cx">   int result;
</span><span class="lines">@@ -6732,6 +6743,62 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_read_impl(void * jarg1, void * jarg2) {
+  int jresult ;
+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+  switch_codec_implementation_t *arg2 = (switch_codec_implementation_t *) 0 ;
+  switch_status_t result;
+  
+  arg1 = (switch_core_session_t *)jarg1; 
+  arg2 = (switch_codec_implementation_t *)jarg2; 
+  result = (switch_status_t)switch_core_session_set_read_impl(arg1,(switch_codec_implementation const *)arg2);
+  jresult = result; 
+  return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_write_impl(void * jarg1, void * jarg2) {
+  int jresult ;
+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+  switch_codec_implementation_t *arg2 = (switch_codec_implementation_t *) 0 ;
+  switch_status_t result;
+  
+  arg1 = (switch_core_session_t *)jarg1; 
+  arg2 = (switch_codec_implementation_t *)jarg2; 
+  result = (switch_status_t)switch_core_session_set_write_impl(arg1,(switch_codec_implementation const *)arg2);
+  jresult = result; 
+  return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_video_read_impl(void * jarg1, void * jarg2) {
+  int jresult ;
+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+  switch_codec_implementation_t *arg2 = (switch_codec_implementation_t *) 0 ;
+  switch_status_t result;
+  
+  arg1 = (switch_core_session_t *)jarg1; 
+  arg2 = (switch_codec_implementation_t *)jarg2; 
+  result = (switch_status_t)switch_core_session_set_video_read_impl(arg1,(switch_codec_implementation const *)arg2);
+  jresult = result; 
+  return jresult;
+}
+
+
+SWIGEXPORT int SWIGSTDCALL CSharp_switch_core_session_set_video_write_impl(void * jarg1, void * jarg2) {
+  int jresult ;
+  switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
+  switch_codec_implementation_t *arg2 = (switch_codec_implementation_t *) 0 ;
+  switch_status_t result;
+  
+  arg1 = (switch_core_session_t *)jarg1; 
+  arg2 = (switch_codec_implementation_t *)jarg2; 
+  result = (switch_status_t)switch_core_session_set_video_write_impl(arg1,(switch_codec_implementation const *)arg2);
+  jresult = result; 
+  return jresult;
+}
+
+
</ins><span class="cx"> SWIGEXPORT void SWIGSTDCALL CSharp_switch_core_session_reset(void * jarg1, int jarg2, int jarg3) {
</span><span class="cx">   switch_core_session_t *arg1 = (switch_core_session_t *) 0 ;
</span><span class="cx">   switch_bool_t arg2 ;
</span><span class="lines">@@ -8348,6 +8415,18 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_core_min_dtmf_duration(unsigned long jarg1) {
+  unsigned long jresult ;
+  uint32_t arg1 ;
+  uint32_t result;
+  
+  arg1 = (uint32_t)jarg1; 
+  result = (uint32_t)switch_core_min_dtmf_duration(arg1);
+  jresult = (unsigned long)result; 
+  return jresult;
+}
+
+
</ins><span class="cx"> SWIGEXPORT unsigned long SWIGSTDCALL CSharp_switch_core_max_dtmf_duration(unsigned long jarg1) {
</span><span class="cx">   unsigned long jresult ;
</span><span class="cx">   uint32_t arg1 ;
</span></span></pre></div>
<a id="freeswitchtrunksrcmodlanguagesmod_managedmanagedswigcs"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/mod/languages/mod_managed/managed/swig.cs        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -1399,6 +1399,26 @@
</span><span class="cx">     return ret;
</span><span class="cx">   }
</span><span class="cx"> 
</span><ins>+  public static switch_status_t switch_core_session_set_read_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) {
+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_read_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp));
+    return ret;
+  }
+
+  public static switch_status_t switch_core_session_set_write_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) {
+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_write_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp));
+    return ret;
+  }
+
+  public static switch_status_t switch_core_session_set_video_read_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) {
+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_video_read_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp));
+    return ret;
+  }
+
+  public static switch_status_t switch_core_session_set_video_write_impl(SWIGTYPE_p_switch_core_session session, switch_codec_implementation impp) {
+    switch_status_t ret = (switch_status_t)freeswitchPINVOKE.switch_core_session_set_video_write_impl(SWIGTYPE_p_switch_core_session.getCPtr(session), switch_codec_implementation.getCPtr(impp));
+    return ret;
+  }
+
</ins><span class="cx">   public static void switch_core_session_reset(SWIGTYPE_p_switch_core_session session, switch_bool_t flush_dtmf, switch_bool_t reset_read_codec) {
</span><span class="cx">     freeswitchPINVOKE.switch_core_session_reset(SWIGTYPE_p_switch_core_session.getCPtr(session), (int)flush_dtmf, (int)reset_read_codec);
</span><span class="cx">   }
</span><span class="lines">@@ -1977,6 +1997,11 @@
</span><span class="cx">     freeswitchPINVOKE.switch_time_set_monotonic((int)enable);
</span><span class="cx">   }
</span><span class="cx"> 
</span><ins>+  public static uint switch_core_min_dtmf_duration(uint duration) {
+    uint ret = freeswitchPINVOKE.switch_core_min_dtmf_duration(duration);
+    return ret;
+  }
+
</ins><span class="cx">   public static uint switch_core_max_dtmf_duration(uint duration) {
</span><span class="cx">     uint ret = freeswitchPINVOKE.switch_core_max_dtmf_duration(duration);
</span><span class="cx">     return ret;
</span><span class="lines">@@ -4280,6 +4305,7 @@
</span><span class="cx">   public static readonly string SWITCH_SEQ_CLEARLINEEND = freeswitchPINVOKE.SWITCH_SEQ_CLEARLINEEND_get();
</span><span class="cx">   public static readonly string SWITCH_SEQ_CLEARSCR = freeswitchPINVOKE.SWITCH_SEQ_CLEARSCR_get();
</span><span class="cx">   public static readonly int SWITCH_DEFAULT_DTMF_DURATION = freeswitchPINVOKE.SWITCH_DEFAULT_DTMF_DURATION_get();
</span><ins>+  public static readonly int SWITCH_MIN_DTMF_DURATION = freeswitchPINVOKE.SWITCH_MIN_DTMF_DURATION_get();
</ins><span class="cx">   public static readonly int SWITCH_MAX_DTMF_DURATION = freeswitchPINVOKE.SWITCH_MAX_DTMF_DURATION_get();
</span><span class="cx">   public static readonly string SWITCH_PATH_SEPARATOR = freeswitchPINVOKE.SWITCH_PATH_SEPARATOR_get();
</span><span class="cx">   public static readonly string SWITCH_URL_SEPARATOR = freeswitchPINVOKE.SWITCH_URL_SEPARATOR_get();
</span><span class="lines">@@ -4753,6 +4779,9 @@
</span><span class="cx">   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_SWITCH_DEFAULT_DTMF_DURATION_get&quot;)]
</span><span class="cx">   public static extern int SWITCH_DEFAULT_DTMF_DURATION_get();
</span><span class="cx"> 
</span><ins>+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_SWITCH_MIN_DTMF_DURATION_get&quot;)]
+  public static extern int SWITCH_MIN_DTMF_DURATION_get();
+
</ins><span class="cx">   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_SWITCH_MAX_DTMF_DURATION_get&quot;)]
</span><span class="cx">   public static extern int SWITCH_MAX_DTMF_DURATION_get();
</span><span class="cx"> 
</span><span class="lines">@@ -6169,6 +6198,18 @@
</span><span class="cx">   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_write_video_frame&quot;)]
</span><span class="cx">   public static extern int switch_core_session_write_video_frame(HandleRef jarg1, HandleRef jarg2, uint jarg3, int jarg4);
</span><span class="cx"> 
</span><ins>+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_set_read_impl&quot;)]
+  public static extern int switch_core_session_set_read_impl(HandleRef jarg1, HandleRef jarg2);
+
+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_set_write_impl&quot;)]
+  public static extern int switch_core_session_set_write_impl(HandleRef jarg1, HandleRef jarg2);
+
+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_set_video_read_impl&quot;)]
+  public static extern int switch_core_session_set_video_read_impl(HandleRef jarg1, HandleRef jarg2);
+
+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_set_video_write_impl&quot;)]
+  public static extern int switch_core_session_set_video_write_impl(HandleRef jarg1, HandleRef jarg2);
+
</ins><span class="cx">   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_session_reset&quot;)]
</span><span class="cx">   public static extern void switch_core_session_reset(HandleRef jarg1, int jarg2, int jarg3);
</span><span class="cx"> 
</span><span class="lines">@@ -6523,6 +6564,9 @@
</span><span class="cx">   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_time_set_monotonic&quot;)]
</span><span class="cx">   public static extern void switch_time_set_monotonic(int jarg1);
</span><span class="cx"> 
</span><ins>+  [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_min_dtmf_duration&quot;)]
+  public static extern uint switch_core_min_dtmf_duration(uint jarg1);
+
</ins><span class="cx">   [DllImport(&quot;mod_managed&quot;, EntryPoint=&quot;CSharp_switch_core_max_dtmf_duration&quot;)]
</span><span class="cx">   public static extern uint switch_core_max_dtmf_duration(uint jarg1);
</span><span class="cx"> 
</span><span class="lines">@@ -24486,6 +24530,7 @@
</span><span class="cx">   SCSC_MAX_SESSIONS,
</span><span class="cx">   SCSC_SYNC_CLOCK,
</span><span class="cx">   SCSC_MAX_DTMF_DURATION,
</span><ins>+  SCSC_MIN_DTMF_DURATION,
</ins><span class="cx">   SCSC_DEFAULT_DTMF_DURATION,
</span><span class="cx">   SCSC_SHUTDOWN_ELEGANT,
</span><span class="cx">   SCSC_SHUTDOWN_ASAP,
</span></span></pre></div>
<a id="freeswitchtrunksrcmodlanguagesmod_perlmod_perl_wrapcpp"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/mod/languages/mod_perl/mod_perl_wrap.cpp        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -11820,17 +11820,17 @@
</span><span class="cx">   SWIG_TypeClientData(SWIGTYPE_p_IVRMenu, (void*) &quot;freeswitch::IVRMenu&quot;);
</span><span class="cx">   SWIG_TypeClientData(SWIGTYPE_p_API, (void*) &quot;freeswitch::API&quot;);
</span><span class="cx">   SWIG_TypeClientData(SWIGTYPE_p_input_callback_state, (void*) &quot;freeswitch::input_callback_state_t&quot;);
</span><del>-  /*@SWIG:/usr/local/share/swig/1.3.35/perl5/perltypemaps.swg,64,%set_constant@*/ do {
</del><ins>+  /*@SWIG:/usr/share/swig/1.3.35/perl5/perltypemaps.swg,64,%set_constant@*/ do {
</ins><span class="cx">     SV *sv = get_sv((char*) SWIG_prefix &quot;S_HUP&quot;, TRUE | 0x2 | GV_ADDMULTI);
</span><span class="cx">     sv_setsv(sv, SWIG_From_int  SWIG_PERL_CALL_ARGS_1(static_cast&lt; int &gt;(S_HUP)));
</span><span class="cx">     SvREADONLY_on(sv);
</span><span class="cx">   } while(0) /*@SWIG@*/;
</span><del>-  /*@SWIG:/usr/local/share/swig/1.3.35/perl5/perltypemaps.swg,64,%set_constant@*/ do {
</del><ins>+  /*@SWIG:/usr/share/swig/1.3.35/perl5/perltypemaps.swg,64,%set_constant@*/ do {
</ins><span class="cx">     SV *sv = get_sv((char*) SWIG_prefix &quot;S_FREE&quot;, TRUE | 0x2 | GV_ADDMULTI);
</span><span class="cx">     sv_setsv(sv, SWIG_From_int  SWIG_PERL_CALL_ARGS_1(static_cast&lt; int &gt;(S_FREE)));
</span><span class="cx">     SvREADONLY_on(sv);
</span><span class="cx">   } while(0) /*@SWIG@*/;
</span><del>-  /*@SWIG:/usr/local/share/swig/1.3.35/perl5/perltypemaps.swg,64,%set_constant@*/ do {
</del><ins>+  /*@SWIG:/usr/share/swig/1.3.35/perl5/perltypemaps.swg,64,%set_constant@*/ do {
</ins><span class="cx">     SV *sv = get_sv((char*) SWIG_prefix &quot;S_RDLOCK&quot;, TRUE | 0x2 | GV_ADDMULTI);
</span><span class="cx">     sv_setsv(sv, SWIG_From_int  SWIG_PERL_CALL_ARGS_1(static_cast&lt; int &gt;(S_RDLOCK)));
</span><span class="cx">     SvREADONLY_on(sv);
</span></span></pre></div>
<a id="freeswitchtrunksrcswitch_channelc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/switch_channel.c (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/switch_channel.c        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/switch_channel.c        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -276,6 +276,10 @@
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, &quot;%s EXCESSIVE DTMF DIGIT [%c] LEN [%d]\n&quot;,
</span><span class="cx">                                                           switch_channel_get_name(channel), new_dtmf.digit, new_dtmf.duration);
</span><span class="cx">                         new_dtmf.duration = switch_core_max_dtmf_duration(0);
</span><ins>+                } else if (new_dtmf.duration &lt; switch_core_min_dtmf_duration(0)) {
+                        switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, &quot;%s SHORT DTMF DIGIT [%c] LEN [%d]\n&quot;,
+                                                          switch_channel_get_name(channel), new_dtmf.digit, new_dtmf.duration);
+                        new_dtmf.duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">                 } else if (!new_dtmf.duration) {
</span><span class="cx">                         new_dtmf.duration = switch_core_default_dtmf_duration(0);
</span><span class="cx">                 }
</span><span class="lines">@@ -333,6 +337,9 @@
</span><span class="cx">                 if (dtmf.duration &gt; switch_core_max_dtmf_duration(0)) {
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, &quot;EXCESSIVE DTMF DIGIT LEN %c %d\n&quot;, dtmf.digit, dtmf.duration);
</span><span class="cx">                         dtmf.duration = switch_core_max_dtmf_duration(0);
</span><ins>+                } else if (dtmf.duration &lt; switch_core_min_dtmf_duration(0)) {
+                        switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, &quot;SHORT DTMF DIGIT LEN %c %d\n&quot;, dtmf.digit, dtmf.duration);
+                        dtmf.duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">                 } else if (!dtmf.duration) {
</span><span class="cx">                         dtmf.duration = switch_core_default_dtmf_duration(0);
</span><span class="cx">                 }
</span><span class="lines">@@ -377,6 +384,10 @@
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, &quot;%s EXCESSIVE DTMF DIGIT [%c] LEN [%d]\n&quot;,
</span><span class="cx">                                                           switch_channel_get_name(channel), dtmf-&gt;digit, dtmf-&gt;duration);
</span><span class="cx">                         dtmf-&gt;duration = switch_core_max_dtmf_duration(0);
</span><ins>+                } else if (dtmf-&gt;duration &lt; switch_core_min_dtmf_duration(0)) {
+                        switch_log_printf(SWITCH_CHANNEL_CHANNEL_LOG(channel), SWITCH_LOG_WARNING, &quot;%s SHORT DTMF DIGIT [%c] LEN [%d]\n&quot;,
+                                                          switch_channel_get_name(channel), dtmf-&gt;digit, dtmf-&gt;duration);
+                        dtmf-&gt;duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">                 } else if (!dtmf-&gt;duration) {
</span><span class="cx">                         dtmf-&gt;duration = switch_core_default_dtmf_duration(0);
</span><span class="cx">                 }
</span></span></pre></div>
<a id="freeswitchtrunksrcswitch_corec"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/switch_core.c (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/switch_core.c        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/switch_core.c        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -1104,6 +1104,9 @@
</span><span class="cx">                 if (duration &gt; SWITCH_MAX_DTMF_DURATION) {
</span><span class="cx">                         duration = SWITCH_MAX_DTMF_DURATION;
</span><span class="cx">                 }
</span><ins>+                if (duration &lt; SWITCH_MIN_DTMF_DURATION) {
+                        duration = SWITCH_MIN_DTMF_DURATION;
+                }
</ins><span class="cx">                 runtime.max_dtmf_duration = duration;
</span><span class="cx">         }
</span><span class="cx">         return runtime.max_dtmf_duration;
</span><span class="lines">@@ -1112,14 +1115,30 @@
</span><span class="cx"> SWITCH_DECLARE(uint32_t) switch_core_default_dtmf_duration(uint32_t duration)
</span><span class="cx"> {
</span><span class="cx">         if (duration) {
</span><del>-                if (duration &lt; SWITCH_DEFAULT_DTMF_DURATION) {
-                        duration = SWITCH_DEFAULT_DTMF_DURATION;
</del><ins>+                if (duration &lt; SWITCH_MIN_DTMF_DURATION) {
+                        duration = SWITCH_MIN_DTMF_DURATION;
</ins><span class="cx">                 }
</span><ins>+                if (duration &gt; SWITCH_MAX_DTMF_DURATION) {
+                        duration = SWITCH_MAX_DTMF_DURATION;
+                }
</ins><span class="cx">                 runtime.default_dtmf_duration = duration;
</span><span class="cx">         }
</span><span class="cx">         return runtime.default_dtmf_duration;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SWITCH_DECLARE(uint32_t) switch_core_min_dtmf_duration(uint32_t duration)
+{
+        if (duration) {
+                if (duration &lt; SWITCH_MIN_DTMF_DURATION) {
+                        duration = SWITCH_MIN_DTMF_DURATION;
+                }
+                if (duration &gt; SWITCH_MAX_DTMF_DURATION) {
+                        duration = SWITCH_MAX_DTMF_DURATION;
+                }
+        }
+        return runtime.min_dtmf_duration;
+}
+
</ins><span class="cx"> static void switch_core_set_serial(void)
</span><span class="cx"> {
</span><span class="cx">         char buf[13] = &quot;&quot;;
</span><span class="lines">@@ -1184,6 +1203,7 @@
</span><span class="cx">         runtime.mailer_app_args = &quot;-t&quot;;
</span><span class="cx">         runtime.max_dtmf_duration = SWITCH_MAX_DTMF_DURATION;
</span><span class="cx">         runtime.default_dtmf_duration = SWITCH_DEFAULT_DTMF_DURATION;
</span><ins>+        runtime.min_dtmf_duration = SWITCH_MIN_DTMF_DURATION;
</ins><span class="cx"> 
</span><span class="cx">         /* INIT APR and Create the pool context */
</span><span class="cx">         if (apr_initialize() != SWITCH_STATUS_SUCCESS) {
</span><span class="lines">@@ -1395,6 +1415,11 @@
</span><span class="cx">                                         if (tmp &gt; 0) {
</span><span class="cx">                                                 switch_core_max_dtmf_duration((uint32_t) tmp);
</span><span class="cx">                                         }
</span><ins>+                                } else if (!strcasecmp(var, &quot;min_dtmf_duration&quot;) &amp;&amp; !switch_strlen_zero(val)) {
+                                        int tmp = atoi(val);
+                                        if (tmp &gt; 0) {
+                                                switch_core_min_dtmf_duration((uint32_t) tmp);
+                                        }
</ins><span class="cx">                                 } else if (!strcasecmp(var, &quot;default_dtmf_duration&quot;) &amp;&amp; !switch_strlen_zero(val)) {
</span><span class="cx">                                         int tmp = atoi(val);
</span><span class="cx">                                         if (tmp &gt; 0) {
</span><span class="lines">@@ -1610,6 +1635,9 @@
</span><span class="cx">         case SCSC_MAX_DTMF_DURATION:
</span><span class="cx">                 *val = switch_core_max_dtmf_duration(*val);
</span><span class="cx">                 break;
</span><ins>+        case SCSC_MIN_DTMF_DURATION:
+                *val = switch_core_min_dtmf_duration(*val);
+                break;
</ins><span class="cx">         case SCSC_DEFAULT_DTMF_DURATION:
</span><span class="cx">                 *val = switch_core_default_dtmf_duration(*val);
</span><span class="cx">                 break;
</span></span></pre></div>
<a id="freeswitchtrunksrcswitch_core_ioc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/switch_core_io.c (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/switch_core_io.c        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/switch_core_io.c        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -1102,6 +1102,10 @@
</span><span class="cx">                 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s EXCESSIVE DTMF DIGIT [%c] LEN [%d]\n&quot;,
</span><span class="cx">                                                   switch_channel_get_name(session-&gt;channel), new_dtmf.digit, new_dtmf.duration);
</span><span class="cx">                 new_dtmf.duration = switch_core_max_dtmf_duration(0);
</span><ins>+        } else if (new_dtmf.duration &lt; switch_core_min_dtmf_duration(0)) {
+                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s SHORT DTMF DIGIT [%c] LEN [%d]\n&quot;,
+                                                  switch_channel_get_name(session-&gt;channel), new_dtmf.digit, new_dtmf.duration);
+                new_dtmf.duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">         } else if (!new_dtmf.duration) {
</span><span class="cx">                 new_dtmf.duration = switch_core_default_dtmf_duration(0);
</span><span class="cx">         }
</span><span class="lines">@@ -1132,6 +1136,10 @@
</span><span class="cx">                 switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s EXCESSIVE DTMF DIGIT [%c] LEN [%d]\n&quot;,
</span><span class="cx">                                                   switch_channel_get_name(session-&gt;channel), new_dtmf.digit, new_dtmf.duration);
</span><span class="cx">                 new_dtmf.duration = switch_core_max_dtmf_duration(0);
</span><ins>+        } else if (new_dtmf.duration &lt; switch_core_min_dtmf_duration(0)) {
+                switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s SHORT DTMF DIGIT [%c] LEN [%d]\n&quot;,
+                                                  switch_channel_get_name(session-&gt;channel), new_dtmf.digit, new_dtmf.duration);
+                new_dtmf.duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">         } else if (!new_dtmf.duration) {
</span><span class="cx">                 new_dtmf.duration = switch_core_default_dtmf_duration(0);
</span><span class="cx">         }
</span><span class="lines">@@ -1203,6 +1211,10 @@
</span><span class="cx">                         switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s EXCESSIVE DTMF DIGIT [%c] LEN [%d]\n&quot;,
</span><span class="cx">                                                           switch_channel_get_name(session-&gt;channel), dtmf.digit, dtmf.duration);
</span><span class="cx">                         dtmf.duration = switch_core_max_dtmf_duration(0);
</span><ins>+                } else if (dtmf.duration &lt; switch_core_min_dtmf_duration(0)) {
+                        switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, &quot;%s SHORT DTMF DIGIT [%c] LEN [%d]\n&quot;,
+                                                          switch_channel_get_name(session-&gt;channel), dtmf.digit, dtmf.duration);
+                        dtmf.duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">                 } else if (!dtmf.duration) {
</span><span class="cx">                         dtmf.duration = switch_core_default_dtmf_duration(0);
</span><span class="cx">                 }
</span></span></pre></div>
<a id="freeswitchtrunksrcswitch_rtpc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/switch_rtp.c (14892 => 14893)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/switch_rtp.c        2009-09-16 21:23:00 UTC (rev 14892)
+++ freeswitch/trunk/src/switch_rtp.c        2009-09-16 21:24:22 UTC (rev 14893)
</span><span class="lines">@@ -2299,8 +2299,8 @@
</span><span class="cx"> 
</span><span class="cx">         if ((rdigit = malloc(sizeof(*rdigit))) != 0) {
</span><span class="cx">                 *rdigit = *dtmf;
</span><del>-                if (rdigit-&gt;duration &lt; switch_core_default_dtmf_duration(0)) {
-                        rdigit-&gt;duration = switch_core_default_dtmf_duration(0);
</del><ins>+                if (rdigit-&gt;duration &lt; switch_core_min_dtmf_duration(0)) {
+                        rdigit-&gt;duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 if ((switch_queue_trypush(rtp_session-&gt;dtmf_data.dtmf_queue, rdigit)) != SWITCH_STATUS_SUCCESS) {
</span><span class="lines">@@ -2324,8 +2324,8 @@
</span><span class="cx"> 
</span><span class="cx">         if ((rdigit = malloc(sizeof(*rdigit))) != 0) {
</span><span class="cx">                 *rdigit = *dtmf;
</span><del>-                if (rdigit-&gt;duration &lt; switch_core_default_dtmf_duration(0)) {
-                        rdigit-&gt;duration = switch_core_default_dtmf_duration(0);
</del><ins>+                if (rdigit-&gt;duration &lt; switch_core_min_dtmf_duration(0)) {
+                        rdigit-&gt;duration = switch_core_min_dtmf_duration(0);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 if ((switch_queue_trypush(rtp_session-&gt;dtmf_data.dtmf_inqueue, rdigit)) != SWITCH_STATUS_SUCCESS) {
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>

</body>
</html>