[Asterisk-code-review] apps/app amd.c: Fixed total time and silence calculations (asterisk[master])

Jenkins2 asteriskteam at digium.com
Wed Mar 7 13:59:29 CST 2018


Jenkins2 has submitted this change and it was merged. ( https://gerrit.asterisk.org/8392 )

Change subject: apps/app_amd.c: Fixed total time and silence calculations
......................................................................

apps/app_amd.c: Fixed total time and silence calculations

Between Asterisk 11 and Asterisk 13 there was a significant increase
in the number of AST_FRAME_NULL frames being processed by app_amd.c's
main loop. Each AST_FRAME_NULL frame was being counted as 100ms
towards the total time and silence. This may have been accurate
when app_amd.c was orginally added, but it is not in Asterisk 13.
As such the total analysis time and silence calculations were way
off effectively breaking app_amd.c

* Additional debug messages were added
* AST_FRAME_NULL are now ignored

ASTERISK-27610

Change-Id: I18aca01af98f87c1e168e6ae0d85c136d1df5ea9
---
M apps/app_amd.c
1 file changed, 17 insertions(+), 4 deletions(-)

Approvals:
  Richard Mudgett: Looks good to me, but someone else must approve
  Joshua Colp: Looks good to me, approved
  Jenkins2: Approved for Submit



diff --git a/apps/app_amd.c b/apps/app_amd.c
index e10f2cc..3f805bb 100644
--- a/apps/app_amd.c
+++ b/apps/app_amd.c
@@ -277,6 +277,12 @@
 
 	/* Now we go into a loop waiting for frames from the channel */
 	while ((res = ast_waitfor(chan, 2 * maxWaitTimeForFrame)) > -1) {
+		int ms = 0;
+
+		/* Figure out how long we waited */
+		if (res > 0) {
+			ms = 2 * maxWaitTimeForFrame - res;
+		}
 
 		/* If we fail to read in a frame, that means they hung up */
 		if (!(f = ast_read(chan))) {
@@ -287,15 +293,22 @@
 			break;
 		}
 
-		if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_NULL || f->frametype == AST_FRAME_CNG) {
-			/* If the total time exceeds the analysis time then give up as we are not too sure */
+		if (f->frametype == AST_FRAME_VOICE || f->frametype == AST_FRAME_CNG) {
+			/* Figure out how long the frame is in milliseconds */
 			if (f->frametype == AST_FRAME_VOICE) {
 				framelength = (ast_codec_samples_count(f) / DEFAULT_SAMPLES_PER_MS);
 			} else {
-				framelength = 2 * maxWaitTimeForFrame;
+				framelength = ms;
 			}
 
 			iTotalTime += framelength;
+
+			ast_debug(1, "AMD: Channel [%s] frametype [%s] iTotalTime [%d] framelength [%d] totalAnalysisTime [%d]\n",
+					  ast_channel_name(chan),
+					  f->frametype == AST_FRAME_VOICE ? "AST_FRAME_VOICE" : "AST_FRAME_CNG",
+					  iTotalTime, framelength, totalAnalysisTime);
+
+			/* If the total time exceeds the analysis time then give up as we are not too sure */
 			if (iTotalTime >= totalAnalysisTime) {
 				ast_verb(3, "AMD: Channel [%s]. Too long...\n", ast_channel_name(chan));
 				ast_frfree(f);
@@ -306,7 +319,7 @@
 
 			/* Feed the frame of audio into the silence detector and see if we get a result */
 			if (f->frametype != AST_FRAME_VOICE)
-				dspsilence += 2 * maxWaitTimeForFrame;
+				dspsilence += framelength;
 			else {
 				dspsilence = 0;
 				ast_dsp_silence(silenceDetector, f, &dspsilence);

-- 
To view, visit https://gerrit.asterisk.org/8392
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: I18aca01af98f87c1e168e6ae0d85c136d1df5ea9
Gerrit-Change-Number: 8392
Gerrit-PatchSet: 1
Gerrit-Owner: Sean Bright <sean.bright at gmail.com>
Gerrit-Reviewer: Jenkins2
Gerrit-Reviewer: Joshua Colp <jcolp at digium.com>
Gerrit-Reviewer: Michael Cargile <mikec at vicidial.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett at digium.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20180307/eb9ab1b2/attachment.html>


More information about the asterisk-code-review mailing list