diff options
author | Timo Teräs <timo.teras@iki.fi> | 2012-09-14 10:24:18 +0300 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2012-09-14 10:31:24 +0300 |
commit | 4e9ea6ee6ed5a7a6d43ddce5e3e3629194ed58d5 (patch) | |
tree | e14a77f52fc3c6d6d99e08cc773c30489a387ea4 /main/asterisk/ASTERISK-19610a.patch | |
parent | 56ee3af825be8baa95f8344f1805ac5cae90b006 (diff) | |
download | aports-4e9ea6ee6ed5a7a6d43ddce5e3e3629194ed58d5.tar.bz2 aports-4e9ea6ee6ed5a7a6d43ddce5e3e3629194ed58d5.tar.xz |
main/asterisk: upgrade to 10.8.0
Also cherry-pick ASTERISK-19610 related commits from 10.9.0-rc1 to
fix a long-time DTMF detection regression bug early. These three
patches can be dropped when upgrading to 10.9.0.
Diffstat (limited to 'main/asterisk/ASTERISK-19610a.patch')
-rw-r--r-- | main/asterisk/ASTERISK-19610a.patch | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/main/asterisk/ASTERISK-19610a.patch b/main/asterisk/ASTERISK-19610a.patch new file mode 100644 index 0000000000..60ced07946 --- /dev/null +++ b/main/asterisk/ASTERISK-19610a.patch @@ -0,0 +1,115 @@ +commit f831c4f +Author: alecdavis <alecdavis@f38db490-d61c-443f-a65b-d21fe96a405b> +Date: Wed Sep 5 06:47:54 2012 +0000 + + dsp.c: optimize goerztzel sample loops, in dtmf_detect, mf_detect and tone_detect + + use a temporary short int when repeatedly used to call goertzel_sample. + + alecdavis (license 585) + Reported by: alecdavis + Tested by: alecdavis + + Review: https://reviewboard.asterisk.org/r/2093/ + ........ + + Merged revisions 372212 from http://svn.asterisk.org/svn/asterisk/branches/1.8 + + + git-svn-id: http://svn.digium.com/svn/asterisk/branches/10@372213 f38db490-d61c-443f-a65b-d21fe96a405b + +diff --git a/main/dsp.c b/main/dsp.c +index 96a101f..9ba4775 100644 +--- a/main/dsp.c ++++ b/main/dsp.c +@@ -530,6 +530,7 @@ static int tone_detect(struct ast_dsp *dsp, tone_detect_state_t *s, int16_t *amp + int limit; + int res = 0; + int16_t *ptr; ++ short samp; + int start, end; + fragment_t mute = {0, 0}; + +@@ -547,10 +548,11 @@ static int tone_detect(struct ast_dsp *dsp, tone_detect_state_t *s, int16_t *amp + end = start + limit; + + for (i = limit, ptr = amp ; i > 0; i--, ptr++) { ++ samp = *ptr; + /* signed 32 bit int should be enough to suqare any possible signed 16 bit value */ +- s->energy += (int32_t) *ptr * (int32_t) *ptr; ++ s->energy += (int32_t) samp * (int32_t) samp; + +- goertzel_sample(&s->tone, *ptr); ++ goertzel_sample(&s->tone, samp); + } + + s->samples_pending -= limit; +@@ -643,10 +645,10 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp + { + float row_energy[4]; + float col_energy[4]; +- float famp; + int i; + int j; + int sample; ++ short samp; + int best_row; + int best_col; + int hit; +@@ -669,18 +671,18 @@ static int dtmf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp + /* The following unrolled loop takes only 35% (rough estimate) of the + time of a rolled loop on the machine on which it was developed */ + for (j = sample; j < limit; j++) { +- famp = amp[j]; +- s->td.dtmf.energy += famp*famp; ++ samp = amp[j]; ++ s->td.dtmf.energy += (int32_t) samp * (int32_t) samp; + /* With GCC 2.95, the following unrolled code seems to take about 35% + (rough estimate) as long as a neat little 0-3 loop */ +- goertzel_sample(s->td.dtmf.row_out, amp[j]); +- goertzel_sample(s->td.dtmf.col_out, amp[j]); +- goertzel_sample(s->td.dtmf.row_out + 1, amp[j]); +- goertzel_sample(s->td.dtmf.col_out + 1, amp[j]); +- goertzel_sample(s->td.dtmf.row_out + 2, amp[j]); +- goertzel_sample(s->td.dtmf.col_out + 2, amp[j]); +- goertzel_sample(s->td.dtmf.row_out + 3, amp[j]); +- goertzel_sample(s->td.dtmf.col_out + 3, amp[j]); ++ goertzel_sample(s->td.dtmf.row_out, samp); ++ goertzel_sample(s->td.dtmf.col_out, samp); ++ goertzel_sample(s->td.dtmf.row_out + 1, samp); ++ goertzel_sample(s->td.dtmf.col_out + 1, samp); ++ goertzel_sample(s->td.dtmf.row_out + 2, samp); ++ goertzel_sample(s->td.dtmf.col_out + 2, samp); ++ goertzel_sample(s->td.dtmf.row_out + 3, samp); ++ goertzel_sample(s->td.dtmf.col_out + 3, samp); + } + s->td.dtmf.current_sample += (limit - sample); + if (s->td.dtmf.current_sample < DTMF_GSIZE) { +@@ -798,6 +800,7 @@ static int mf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[] + int i; + int j; + int sample; ++ short samp; + int hit; + int limit; + fragment_t mute = {0, 0}; +@@ -821,12 +824,13 @@ static int mf_detect(struct ast_dsp *dsp, digit_detect_state_t *s, int16_t amp[] + for (j = sample; j < limit; j++) { + /* With GCC 2.95, the following unrolled code seems to take about 35% + (rough estimate) as long as a neat little 0-3 loop */ +- goertzel_sample(s->td.mf.tone_out, amp[j]); +- goertzel_sample(s->td.mf.tone_out + 1, amp[j]); +- goertzel_sample(s->td.mf.tone_out + 2, amp[j]); +- goertzel_sample(s->td.mf.tone_out + 3, amp[j]); +- goertzel_sample(s->td.mf.tone_out + 4, amp[j]); +- goertzel_sample(s->td.mf.tone_out + 5, amp[j]); ++ samp = amp[j]; ++ goertzel_sample(s->td.mf.tone_out, samp); ++ goertzel_sample(s->td.mf.tone_out + 1, samp); ++ goertzel_sample(s->td.mf.tone_out + 2, samp); ++ goertzel_sample(s->td.mf.tone_out + 3, samp); ++ goertzel_sample(s->td.mf.tone_out + 4, samp); ++ goertzel_sample(s->td.mf.tone_out + 5, samp); + } + s->td.mf.current_sample += (limit - sample); + if (s->td.mf.current_sample < MF_GSIZE) { |