From: Tilghman Lesher Date: Wed, 19 May 2010 06:41:58 +0000 (+0000) Subject: Merged revisions 263950 via svnmerge from X-Git-Tag: 1.6.2.9-rc1~2^2~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9567b5c7d9372cba2d6190eb2730dc43cf4e6e4a;p=thirdparty%2Fasterisk.git Merged revisions 263950 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r263950 | tilghman | 2010-05-19 01:41:04 -0500 (Wed, 19 May 2010) | 15 lines Merged revisions 263949 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r263949 | tilghman | 2010-05-19 01:32:27 -0500 (Wed, 19 May 2010) | 8 lines Because progress is called multiple times, across several frames, we must persist states when detecting multitone sequences. (closes issue #16749) Reported by: dant Patches: dsp.c-bug16749-1.patch uploaded by dant (license 670) Tested by: dant ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@263951 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/dsp.c b/main/dsp.c index 0796fd034c..1a8892289b 100644 --- a/main/dsp.c +++ b/main/dsp.c @@ -998,10 +998,13 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len) } else if (hz[HZ_950] > TONE_MIN_THRESH * TONE_THRESH) { newstate = DSP_TONE_STATE_SPECIAL1; } else if (hz[HZ_1400] > TONE_MIN_THRESH * TONE_THRESH) { - if (dsp->tstate == DSP_TONE_STATE_SPECIAL1) + /* End of SPECIAL1 or middle of SPECIAL2 */ + if (dsp->tstate == DSP_TONE_STATE_SPECIAL1 || dsp->tstate == DSP_TONE_STATE_SPECIAL2) { newstate = DSP_TONE_STATE_SPECIAL2; + } } else if (hz[HZ_1800] > TONE_MIN_THRESH * TONE_THRESH) { - if (dsp->tstate == DSP_TONE_STATE_SPECIAL2) { + /* End of SPECIAL2 or middle of SPECIAL3 */ + if (dsp->tstate == DSP_TONE_STATE_SPECIAL2 || dsp->tstate == DSP_TONE_STATE_SPECIAL3) { newstate = DSP_TONE_STATE_SPECIAL3; } } else if (dsp->genergy > TONE_MIN_THRESH * TONE_THRESH) { @@ -1035,43 +1038,43 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len) 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; + 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 (dsp->ringtimeout == THRESH_RING2ANSWER) { ast_debug(1, "Consider call as answered because of timeout after last ring\n"); res = AST_CONTROL_ANSWER; dsp->features &= ~DSP_FEATURE_CALL_PROGRESS; @@ -1082,8 +1085,8 @@ static int __ast_dsp_call_progress(struct ast_dsp *dsp, short *s, int len) dsp->tstate = newstate; dsp->tcount = 1; } - - /* Reset goertzel */ + + /* Reset goertzel */ for (x = 0; x < 7; x++) { dsp->freqs[x].v2 = dsp->freqs[x].v3 = 0.0; }