<p>Michael Cargile has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/8389">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">apps/app_amd.c: Fixed total time and silence calculations<br><br>Between Asterisk 11 and Asterisk 13 there was a significant increase<br>in the number of AST_FRAME_NULL frames being processed by app_amd.c's<br>main loop. Each AST_FRAME_NULL frame was being counted as 100ms<br>towards the total time and silence. This may have been accurate<br>when app_amd.c was orginally added, but it is not in Asterisk 13.<br>As such the total analysis time and silence calculations were way<br>off effectively breaking app_amd.c<br><br>* Additional debug messages were added<br>* AST_FRAME_NULL are now ignored<br><br>ASTERISK-27610<br><br>Change-Id: I18aca01af98f87c1e168e6ae0d85c136d1df5ea9<br>---<br>M apps/app_amd.c<br>1 file changed, 17 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/89/8389/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/apps/app_amd.c b/apps/app_amd.c<br>index 273ca37..a8b939d 100644<br>--- a/apps/app_amd.c<br>+++ b/apps/app_amd.c<br>@@ -174,6 +174,7 @@<br>      int silenceDuration = 0;<br>      int iTotalTime = 0;<br>   int iWordsCount = 0;<br>+ int ms = 0;<br>   int currentState = STATE_IN_WORD;<br>     int consecutiveVoiceDuration = 0;<br>     char amdCause[256] = "", amdStatus[256] = "";<br>@@ -279,6 +280,10 @@<br> <br>    /* Now we go into a loop waiting for frames from the channel */<br>       while ((res = ast_waitfor(chan, 2 * maxWaitTimeForFrame)) > -1) {<br>+         /* Figure out how long we waited */<br>+          if ( res > 0 ) {<br>+                  ms = 2 * maxWaitTimeForFrame - res;<br>+          } <br> <br>                 /* If we fail to read in a frame, that means they hung up */<br>          if (!(f = ast_read(chan))) {<br>@@ -289,15 +294,22 @@<br>                   break;<br>                }<br> <br>-         if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_NULL || f->frametype == AST_FRAME_CNG) {<br>-                   /* If the total time exceeds the analysis time then give up as we are not too sure */<br>+                if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_CNG) {<br>+                        /* figure out how long the frame is in ms */<br>                  if (f->frametype == AST_FRAME_VOICE) {<br>                             framelength = (ast_codec_samples_count(f) / DEFAULT_SAMPLES_PER_MS);<br>                  } else {<br>-                             framelength = 2 * maxWaitTimeForFrame;<br>+                               framelength = ms;<br>+                    }<br>+                    iTotalTime += framelength;<br>+<br>+                        if ( f->frametype == AST_FRAME_VOICE ) {<br>+                          ast_debug(1, "AMD: Channel [%s] frametype [AST_FRAME_VOICE] iTotalTime [%d] framelength [%d] totalAnalysisTime [%d]\n", ast_channel_name(chan), iTotalTime, framelength, totalAnalysisTime );<br>+                      } else {<br>+                             ast_debug(1, "AMD: Channel [%s] frametype [AST_FRAME_CNG] iTotalTime [%d] framelength [%d] totalAnalysisTime [%d]\n", ast_channel_name(chan), iTotalTime, framelength, totalAnalysisTime );<br>                         }<br> <br>-                 iTotalTime += framelength;<br>+                   /* If the total time exceeds the analysis time then give up as we are not too sure */<br>                         if (iTotalTime >= totalAnalysisTime) {<br>                             ast_verb(3, "AMD: Channel [%s]. Too long...\n", ast_channel_name(chan));<br>                            ast_frfree(f);<br>@@ -308,7 +320,7 @@<br> <br>                        /* Feed the frame of audio into the silence detector and see if we get a result */<br>                    if (f->frametype != AST_FRAME_VOICE)<br>-                              dspsilence += 2 * maxWaitTimeForFrame;<br>+                               dspsilence += framelength;<br>                    else {<br>                                dspsilence = 0;<br>                               ast_dsp_silence(silenceDetector, f, &dspsilence);<br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/8389">change 8389</a>. To unsubscribe, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/8389"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: 13 </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I18aca01af98f87c1e168e6ae0d85c136d1df5ea9 </div>
<div style="display:none"> Gerrit-Change-Number: 8389 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Michael Cargile <mikec@vicidial.com> </div>