From 9bf48f9ce720e4950a1c45b1cfb0cd6326a3eb96 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Mon, 15 Nov 2004 00:48:36 +0000
Subject: [PATCH] DSP enhancements (bug #2826) courtesy pcadach

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4248 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 dsp.c                  | 13 +++++++------
 include/asterisk/dsp.h | 15 ++++++++++-----
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/dsp.c b/dsp.c
index a906119fe4..ad753a3668 100755
--- a/dsp.c
+++ b/dsp.c
@@ -1174,15 +1174,15 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len)
 			if (newstate == dsp->tstate) {
 				dsp->tcount++;
 				if (dsp->tcount == COUNT_THRESH) {
-					if (dsp->tstate == TONE_STATE_BUSY) {
+					if ((dsp->features & DSP_PROGRESS_BUSY) && dsp->tstate == TONE_STATE_BUSY) {
 						res = AST_CONTROL_BUSY;
 						dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
-					} else if (dsp->tstate == TONE_STATE_TALKING) {
+					} else if ((dsp->features & DSP_PROGRESS_TALK) && dsp->tstate == TONE_STATE_TALKING) {
 						res = AST_CONTROL_ANSWER;
 						dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
-					} else if (dsp->tstate == TONE_STATE_RINGING)
+					} else if ((dsp->features & DSP_PROGRESS_RINGING) && dsp->tstate == TONE_STATE_RINGING)
 						res = AST_CONTROL_RINGING;
-					else if (dsp->tstate == TONE_STATE_SPECIAL3) {
+					else if ((dsp->features & DSP_PROGRESS_CONGESTION) && dsp->tstate == TONE_STATE_SPECIAL3) {
 						res = AST_CONTROL_CONGESTION;
 						dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
 					}
@@ -1576,15 +1576,16 @@ struct ast_frame *ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp,
 	}
 	if ((dsp->features & DSP_FEATURE_CALL_PROGRESS)) {
 		res = __ast_dsp_call_progress(dsp, shortdata, len);
-		memset(&dsp->f, 0, sizeof(dsp->f));
-		dsp->f.frametype = AST_FRAME_CONTROL;
 		if (res) {
 			switch(res) {
 			case AST_CONTROL_ANSWER:
 			case AST_CONTROL_BUSY:
 			case AST_CONTROL_RINGING:
 			case AST_CONTROL_CONGESTION:
+				memset(&dsp->f, 0, sizeof(dsp->f));
+				dsp->f.frametype = AST_FRAME_CONTROL;
 				dsp->f.subclass = res;
+				dsp->f.src = "dsp_progress";
 				if (chan) 
 					ast_queue_frame(chan, &dsp->f);
 				break;
diff --git a/include/asterisk/dsp.h b/include/asterisk/dsp.h
index 916e248983..e86ca47110 100755
--- a/include/asterisk/dsp.h
+++ b/include/asterisk/dsp.h
@@ -14,11 +14,10 @@
 #ifndef _ASTERISK_DSP_H
 #define _ASTERISK_DSP_H
 
-#define DSP_FEATURE_SILENCE_SUPPRESS (1 << 0)
-#define DSP_FEATURE_BUSY_DETECT      (1 << 1)
-#define DSP_FEATURE_CALL_PROGRESS    (1 << 2)
-#define DSP_FEATURE_DTMF_DETECT		 (1 << 3)
-#define DSP_FEATURE_FAX_DETECT		 (1 << 4)
+#define DSP_FEATURE_SILENCE_SUPPRESS	(1 << 0)
+#define DSP_FEATURE_BUSY_DETECT		(1 << 1)
+#define DSP_FEATURE_DTMF_DETECT		(1 << 3)
+#define DSP_FEATURE_FAX_DETECT		(1 << 4)
 
 #define	DSP_DIGITMODE_DTMF			0				/* Detect DTMF digits */
 #define DSP_DIGITMODE_MF			1				/* Detect MF digits */
@@ -28,6 +27,12 @@
 #define DSP_DIGITMODE_MUTEMAX		(1 << 10)		/* Delay audio by a frame to try to extra quelch */
 #define DSP_DIGITMODE_RELAXDTMF		(1 << 11)		/* "Radio" mode (relaxed DTMF) */
 
+#define DSP_PROGRESS_TALK		(1 << 16)		/* Enable talk detection */
+#define DSP_PROGRESS_RINGING		(1 << 17)		/* Enable calling tone detection */
+#define DSP_PROGRESS_BUSY		(1 << 18)		/* Enable busy tone detection */
+#define DSP_PROGRESS_CONGESTION		(1 << 19)		/* Enable congestion tone detection */
+#define DSP_FEATURE_CALL_PROGRESS	(DSP_PROGRESS_TALK | DSP_PROGRESS_RINGING | DSP_PROGRESS_BUSY | DSP_PROGRESS_CONGESTION)
+
 struct ast_dsp;
 
 struct ast_dsp *ast_dsp_new(void);
-- 
GitLab