[asterisk-commits] trunk - r8156 /trunk/dsp.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Tue Jan 17 16:37:22 MST 2006
Author: mattf
Date: Tue Jan 17 17:37:22 2006
New Revision: 8156
URL: http://svn.digium.com/view/asterisk?rev=8156&view=rev
Log:
Improvements to DSP callprogress=yes code (#5009)
Modified:
trunk/dsp.c
Modified: trunk/dsp.c
URL: http://svn.digium.com/view/asterisk/trunk/dsp.c?rev=8156&r1=8155&r2=8156&view=diff
==============================================================================
--- trunk/dsp.c (original)
+++ trunk/dsp.c Tue Jan 17 17:37:22 2006
@@ -119,8 +119,14 @@
#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 */
+
+ /* All THRESH_XXX values are in GSAMP_SIZE chunks (us = 22ms) */
+#define THRESH_RING 8 /* Need at least 150ms ring to accept */
+#define THRESH_TALK 2 /* Talk detection does not work continously */
+#define THRESH_BUSY 4 /* Need at least 80ms to accept */
+#define THRESH_CONGESTION 4 /* Need at least 80ms to accept */
+#define THRESH_HANGUP 60 /* Need at least 1300ms to accept hangup */
+#define THRESH_RING2ANSWER 300 /* Timeout from start of ring to answer (about 6600 ms) */
#define MAX_DTMF_DIGITS 128
@@ -315,6 +321,7 @@
int totalsilence;
int totalnoise;
int features;
+ int ringtimeout;
int busymaybe;
int busycount;
int busy_tonelength;
@@ -1037,7 +1044,6 @@
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;
@@ -1099,31 +1105,56 @@
}
if (newstate == dsp->tstate) {
dsp->tcount++;
- if (dsp->tcount == thresh) {
- if ((dsp->features & DSP_PROGRESS_BUSY) &&
- dsp->tstate == DSP_TONE_STATE_BUSY) {
- res = AST_CONTROL_BUSY;
- dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
- } else if ((dsp->features & DSP_PROGRESS_TALK) &&
- dsp->tstate == DSP_TONE_STATE_TALKING) {
- res = AST_CONTROL_ANSWER;
- dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
- } else if ((dsp->features & DSP_PROGRESS_RINGING) &&
- dsp->tstate == DSP_TONE_STATE_RINGING)
- res = AST_CONTROL_RINGING;
- else if ((dsp->features & DSP_PROGRESS_CONGESTION) &&
- 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;
- }
+ if (dsp->ringtimeout)
+ dsp->ringtimeout++;
+ switch (dsp->tstate) {
+ case DSP_TONE_STATE_RINGING:
+ if ((dsp->features & DSP_PROGRESS_RINGING) &&
+ (dsp->tcount==THRESH_RING)) {
+ res = AST_CONTROL_RINGING;
+ dsp->ringtimeout= 1;
+ }
+ break;
+ case DSP_TONE_STATE_BUSY:
+ if ((dsp->features & DSP_PROGRESS_BUSY) &&
+ (dsp->tcount==THRESH_BUSY)) {
+ res = AST_CONTROL_BUSY;
+ dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
+ }
+ break;
+ case DSP_TONE_STATE_TALKING:
+ if ((dsp->features & DSP_PROGRESS_TALK) &&
+ (dsp->tcount==THRESH_TALK)) {
+ res = AST_CONTROL_ANSWER;
+ dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
+ }
+ break;
+ case DSP_TONE_STATE_SPECIAL3:
+ if ((dsp->features & DSP_PROGRESS_CONGESTION) &&
+ (dsp->tcount==THRESH_CONGESTION)) {
+ res = AST_CONTROL_CONGESTION;
+ dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
+ }
+ break;
+ case DSP_TONE_STATE_HUNGUP:
+ if ((dsp->features & DSP_FEATURE_CALL_PROGRESS) &&
+ (dsp->tcount==THRESH_HANGUP)) {
+ res = AST_CONTROL_HANGUP;
+ dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
+ }
+ break;
+ }
+ if (dsp->ringtimeout==THRESH_RING2ANSWER) {
+#if 0
+ ast_log(LOG_NOTICE, "Consider call as answered because of timeout after last ring\n");
+#endif
+ res = AST_CONTROL_ANSWER;
+ dsp->features &= ~DSP_FEATURE_CALL_PROGRESS;
}
} else {
#if 0
- printf("Newstate: %d\n", newstate);
+ ast_log(LOG_NOTICE, "Stop state %d with duration %d\n", dsp->tstate, dsp->tcount);
+ ast_log(LOG_NOTICE, "Start state %d\n", newstate);
#endif
dsp->tstate = newstate;
dsp->tcount = 1;
@@ -1570,6 +1601,7 @@
}
}
dsp->freqcount = max;
+ dsp->ringtimeout= 0;
}
struct ast_dsp *ast_dsp_new(void)
@@ -1681,6 +1713,7 @@
dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0;
memset(dsp->historicsilence, 0, sizeof(dsp->historicsilence));
memset(dsp->historicnoise, 0, sizeof(dsp->historicnoise));
+ dsp->ringtimeout= 0;
}
int ast_dsp_digitmode(struct ast_dsp *dsp, int digitmode)
More information about the asterisk-commits
mailing list