From bd325f52193b9b67c52a79c5bd2aae0e6ac9d871 Mon Sep 17 00:00:00 2001
From: "Kevin P. Fleming" <kpfleming@digium.com>
Date: Thu, 9 Jun 2005 21:04:16 +0000
Subject: [PATCH] add WAITSTATUS channel variable output to WaitForSilence()
 application (bug #4256)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5888 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 apps/app_waitforsilence.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/apps/app_waitforsilence.c b/apps/app_waitforsilence.c
index 3272017996..811cee4ec4 100755
--- a/apps/app_waitforsilence.c
+++ b/apps/app_waitforsilence.c
@@ -40,6 +40,9 @@ static char *synopsis = "Waits for a specified amount of silence";
 static char *descrip = 
 "  WaitForSilence(x[|y]) Wait for Silence: Waits for up to 'x' \n"
 "milliseconds of silence, 'y' times or 1 if omitted\n"
+"Set the channel variable WAITSTATUS with to one of these values:"
+"SILENCE - if silence of x ms was detected"
+"TIMEOUT - if silence of x ms was not detected."
 "Examples:\n"
 "  - WaitForSilence(500,2) will wait for 1/2 second of silence, twice\n"
 "  - WaitForSilence(1000) will wait for 1 second of silence, once\n";
@@ -58,6 +61,8 @@ static int do_waiting(struct ast_channel *chan, int maxsilence) {
 	int rfmt = 0;
 	int res = 0;
 	struct ast_dsp *sildet;	 /* silence detector dsp */
+	time_t start, now;
+	time(&start);
 
 	rfmt = chan->readformat; /* Set to linear mode */
 	res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
@@ -97,17 +102,26 @@ static int do_waiting(struct ast_channel *chan, int maxsilence) {
 		if (f->frametype == AST_FRAME_VOICE) {
 			dspsilence = 0;
 			ast_dsp_silence(sildet, f, &dspsilence);
-			if (dspsilence)
+			if (dspsilence) {
 				totalsilence = dspsilence;
-			else
+				time(&start);
+			} else {
 				totalsilence = 0;
+			}
 
 			if (totalsilence >= maxsilence) {
 				if (option_verbose > 2)
 					ast_verbose(VERBOSE_PREFIX_3 "Exiting with %dms silence > %dms required\n", totalsilence, maxsilence);
 				/* Ended happily with silence */
-				ast_frfree(f);
 				gotsilence = 1;
+				pbx_builtin_setvar_helper(chan, "WAITSTATUS", "SILENCE");
+				ast_log(LOG_DEBUG, "WAITSTATUS was set to SILENCE\n");
+				ast_frfree(f);
+				break;
+			} else if ( difftime(time(&now),start) >= maxsilence/1000 ) {
+				pbx_builtin_setvar_helper(chan, "WAITSTATUS", "TIMEOUT");
+				ast_log(LOG_DEBUG, "WAITSTATUS was set to TIMEOUT\n");
+				ast_frfree(f);
 				break;
 			}
 		}
-- 
GitLab