[Asterisk-cvs] asterisk dsp.c,1.44,1.45
mattf at lists.digium.com
mattf at lists.digium.com
Tue Jun 28 10:36:55 CDT 2005
Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv2149
Modified Files:
dsp.c
Log Message:
UK discconnect tone detection support. Need to enable callprogress in
zapata.conf and set progzone=uk
Index: dsp.c
===================================================================
RCS file: /usr/cvsroot/asterisk/dsp.c,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- dsp.c 6 Jun 2005 22:12:18 -0000 1.44
+++ dsp.c 28 Jun 2005 14:36:56 -0000 1.45
@@ -50,9 +50,11 @@
/* Number of goertzels for progress detect */
#define GSAMP_SIZE_NA 183 /* North America - 350, 440, 480, 620, 950, 1400, 1800 Hz */
#define GSAMP_SIZE_CR 188 /* Costa Rica, Brazil - Only care about 425 Hz */
+#define GSAMP_SIZE_UK 160 /* UK disconnect goertzel feed - shoud trigger 400hz */
#define PROG_MODE_NA 0
#define PROG_MODE_CR 1
+#define PROG_MODE_UK 2
/* For US modes */
#define HZ_350 0
@@ -66,6 +68,9 @@
/* For CR/BR modes */
#define HZ_425 0
+/* For UK mode */
+#define HZ_400 0
+
static struct progalias {
char *name;
int mode;
@@ -74,6 +79,7 @@
{ "ca", PROG_MODE_NA },
{ "cr", PROG_MODE_CR },
{ "br", PROG_MODE_CR },
+ { "uk", PROG_MODE_UK },
};
static struct progress {
@@ -82,6 +88,7 @@
} modes[] = {
{ GSAMP_SIZE_NA, { 350, 440, 480, 620, 950, 1400, 1800 } }, /* North America */
{ GSAMP_SIZE_CR, { 425 } },
+ { GSAMP_SIZE_UK, { 400 } },
};
#define DEFAULT_THRESHOLD 512
@@ -100,6 +107,8 @@
#define TONE_THRESH 10.0 /* How much louder the tone should be than channel energy */
#define TONE_MIN_THRESH 1e8 /* How much tone there should be at least to attempt */
#define COUNT_THRESH 3 /* Need at least 50ms of stuff to count it */
+#define UK_HANGUP_THRESH 60 /* This is the threshold for the UK */
+
#define MAX_DTMF_DIGITS 128
@@ -1009,6 +1018,7 @@
int pass;
int newstate = DSP_TONE_STATE_SILENCE;
int res = 0;
+ int thresh = (dsp->progmode == PROG_MODE_UK) ? UK_HANGUP_THRESH : COUNT_THRESH;
while(len) {
/* Take the lesser of the number of samples we need and what we have */
pass = len;
@@ -1060,12 +1070,17 @@
} else
newstate = DSP_TONE_STATE_SILENCE;
break;
+ case PROG_MODE_UK:
+ if (hz[HZ_400] > TONE_MIN_THRESH * TONE_THRESH) {
+ newstate = DSP_TONE_STATE_HUNGUP;
+ }
+ break;
default:
ast_log(LOG_WARNING, "Can't process in unknown prog mode '%d'\n", dsp->progmode);
}
if (newstate == dsp->tstate) {
dsp->tcount++;
- if (dsp->tcount == COUNT_THRESH) {
+ if (dsp->tcount == thresh) {
if ((dsp->features & DSP_PROGRESS_BUSY) &&
dsp->tstate == DSP_TONE_STATE_BUSY) {
res = AST_CONTROL_BUSY;
@@ -1081,6 +1096,10 @@
dsp->tstate == DSP_TONE_STATE_SPECIAL3) {
res = AST_CONTROL_CONGESTION;
dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
+ } else if ((dsp->features & DSP_FEATURE_CALL_PROGRESS) &&
+ dsp->tstate == DSP_TONE_STATE_HUNGUP) {
+ res = AST_CONTROL_HANGUP;
+ dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
}
}
} else {
@@ -1478,6 +1497,7 @@
case AST_CONTROL_BUSY:
case AST_CONTROL_RINGING:
case AST_CONTROL_CONGESTION:
+ case AST_CONTROL_HANGUP:
memset(&dsp->f, 0, sizeof(dsp->f));
dsp->f.frametype = AST_FRAME_CONTROL;
dsp->f.subclass = res;
More information about the svn-commits
mailing list