Mercurial > SDL_sound_CoreAudio
annotate filter_templates.h @ 540:cdbee48bb275 stable-1.0
Added Speex to the README.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Thu, 17 Apr 2008 18:16:09 +0000 |
parents | 45ee760a6f5a |
children |
rev | line source |
---|---|
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
1 /* |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
2 * Extended Audio Converter for SDL (Simple DirectMedia Layer) |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
3 * Copyright (C) 2002 Frank Ranostaj |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
4 * Institute of Applied Physik |
535
45ee760a6f5a
Converted all text encoding from ISO-8859-1 to UTF-8.
Ryan C. Gordon <icculus@icculus.org>
parents:
403
diff
changeset
|
5 * Johann Wolfgang Goethe-Universität |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
6 * Frankfurt am Main, Germany |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
7 * |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
8 * This library is free software; you can redistribute it and/or |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
9 * modify it under the terms of the GNU Library General Public |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
11 * version 2 of the License, or (at your option) any later version. |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
12 * |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
13 * This library is distributed in the hope that it will be useful, |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
16 * Library General Public License for more details. |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
17 * |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
18 * You should have received a copy of the GNU Library General Public |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
19 * License along with this library; if not, write to the Free |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
21 * |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
22 * Frank Ranostaj |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
23 * ranostaj@stud.uni-frankfurt.de |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
24 * |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
25 * (This code blatantly abducted for SDL_sound. Thanks, Frank! --ryan.) |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
26 */ |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
27 |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
28 #ifndef Suffix |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
29 #error include filter_template.h with defined Suffix macro! |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
30 #else |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
31 #define CH(x) (Suffix((x)*)) |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
32 |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
33 /*-------------------------------------------------------------------------*/ |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
34 /* this filter (Kaiser-window beta=6.8) gives a decent -80dB attentuation */ |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
35 /*-------------------------------------------------------------------------*/ |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
36 #define sum_d(v,dx) ((int) v[CH(dx)] + v[CH(1-dx)]) |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
37 static Sint16* Suffix(doubleRate)( Sint16 *outp, Sint16 *inp, int length, |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
38 VarFilter* filt, RateAux* aux ) |
338 | 39 { |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
40 int out; |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
41 Sint16 *to; |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
42 |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
43 to = inp - length; |
338 | 44 |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
45 while( inp > to ) |
362 | 46 { |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
47 out = 0; |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
48 out-= 9 * sum_d( inp, 16); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
49 out+= 23 * sum_d( inp, 15); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
50 out-= 46 * sum_d( inp, 14); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
51 out+= 83 * sum_d( inp, 13); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
52 out-= 138 * sum_d( inp, 12); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
53 out+= 217 * sum_d( inp, 11); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
54 out-= 326 * sum_d( inp, 10); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
55 out+= 474 * sum_d( inp, 9); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
56 out-= 671 * sum_d( inp, 8); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
57 out+= 936 * sum_d( inp, 7); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
58 out-= 1295 * sum_d( inp, 6); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
59 out+= 1800 * sum_d( inp, 5); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
60 out-= 2560 * sum_d( inp, 4); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
61 out+= 3863 * sum_d( inp, 3); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
62 out-= 6764 * sum_d( inp, 2); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
63 out+= 20798 * sum_d( inp, 1); |
338 | 64 |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
65 outp[CH(1)] = ( 32770 * inp[CH(1)] + out) >> 16; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
66 outp[CH(0)] = ( 32770 * inp[CH(0)] + out) >> 16; |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
67 |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
68 inp -= CH(1); |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
69 outp -= CH(2); |
362 | 70 } |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
71 |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
72 return outp; |
338 | 73 } |
373
24a610dfbbfd
More altcvt updates from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
371
diff
changeset
|
74 #undef sum_d |
338 | 75 |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
76 /*-------------------------------------------------------------------------*/ |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
77 #define sum_h(v,dx) ((int) v[CH(dx)] + v[CH(-dx)]) |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
78 static Sint16* Suffix(halfRate)( Sint16 *outp, Sint16 *inp, int length, |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
79 VarFilter* filt, RateAux* aux ) |
338 | 80 { |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
81 int out; |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
82 Sint16* to; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
83 |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
84 to = inp + length; |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
85 inp += aux->carry; |
338 | 86 |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
87 while( inp < to ) |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
88 { |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
89 out = 0; |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
90 out-= 9 * sum_h( inp, 31); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
91 out+= 23 * sum_h( inp, 29); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
92 out-= 46 * sum_h( inp, 27); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
93 out+= 83 * sum_h( inp, 25); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
94 out-= 138 * sum_h( inp, 23); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
95 out+= 217 * sum_h( inp, 21); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
96 out-= 326 * sum_h( inp, 19); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
97 out+= 474 * sum_h( inp, 17); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
98 out-= 671 * sum_h( inp, 15); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
99 out+= 936 * sum_h( inp, 13); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
100 out-= 1295 * sum_h( inp, 11); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
101 out+= 1800 * sum_h( inp, 9); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
102 out-= 2560 * sum_h( inp, 7); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
103 out+= 3863 * sum_h( inp, 5); |
371 | 104 out-= 6764 * sum_h( inp, 3); |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
105 out+= 20798 * sum_h( inp, 1); |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
106 out+= 32770 * (int)inp[0]; |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
107 |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
108 outp[0] = out >> 16; |
338 | 109 |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
110 inp += CH(2); |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
111 outp += CH(1); |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
112 } |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
113 |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
114 aux->carry = inp < to + CH(1) ? 0 : CH(1); |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
115 return outp; |
338 | 116 } |
373
24a610dfbbfd
More altcvt updates from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
371
diff
changeset
|
117 #undef sum_h |
338 | 118 |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
119 /*-------------------------------------------------------------------------*/ |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
120 static Sint16* Suffix(increaseRate)( Sint16 *outp, Sint16 *inp, int length, |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
121 VarFilter* filter, RateAux* aux ) |
338 | 122 { |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
123 const static int fsize = CH(2*_fsize); |
371 | 124 Sint16 *f; |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
125 int out; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
126 int i, pos; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
127 Sint16* to; |
362 | 128 |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
129 inp -= fsize; |
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
130 to = inp - length; |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
131 pos = aux->pos; |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
132 |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
133 while( inp > to ) |
362 | 134 { |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
135 out = 0; |
371 | 136 f = filter->c[pos]; |
380
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
137 for( i = _fsize + 1; --i; inp+=CH(4), f+=4 ) |
371 | 138 { |
139 out+= f[0] * (int)inp[CH(0)]; | |
380
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
140 out+= f[1] * (int)inp[CH(1)]; |
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
141 out+= f[2] * (int)inp[CH(2)]; |
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
142 out+= f[3] * (int)inp[CH(3)]; |
371 | 143 } |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
144 outp[0] = out >> 16; |
362 | 145 |
380
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
146 pos = ( pos + filter->ratio.denominator - 1 ) |
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
147 % filter->ratio.denominator; |
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
148 inp -= CH( 4 * _fsize ); |
371 | 149 inp -= CH( filter->incr[pos] ); |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
150 outp -= CH(1); |
362 | 151 } |
371 | 152 |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
153 aux->pos = pos; |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
154 return outp; |
362 | 155 } |
156 | |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
157 /*-------------------------------------------------------------------------*/ |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
158 static Sint16* Suffix(decreaseRate)( Sint16 *outp, Sint16 *inp, int length, |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
159 VarFilter* filter, RateAux* aux ) |
362 | 160 { |
366
eda146d666d1
More patches from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
365
diff
changeset
|
161 const static int fsize = CH(2*_fsize); |
371 | 162 Sint16 *f; |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
163 int out; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
164 int i, pos; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
165 Sint16 *to; |
338 | 166 |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
167 inp -= fsize; |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
168 to = inp + length; |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
169 pos = aux->pos; |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
170 inp += aux->carry; |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
171 |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
172 while( inp < to ) |
362 | 173 { |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
174 out = 0; |
371 | 175 f = filter->c[pos]; |
176 for( i = _fsize + 1; --i; inp+=CH(4), f+=4 ) | |
177 { | |
178 out+= f[0] * (int)inp[CH(0)]; | |
179 out+= f[1] * (int)inp[CH(1)]; | |
180 out+= f[2] * (int)inp[CH(2)]; | |
181 out+= f[3] * (int)inp[CH(3)]; | |
182 } | |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
183 outp[0] = out >> 16; |
362 | 184 |
371 | 185 inp -= CH( 4 * _fsize ); |
186 inp += CH( filter->incr[pos] ); | |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
187 outp += CH(1); |
380
44ed8bdeba74
More fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
373
diff
changeset
|
188 pos = ( pos + 1 ) % filter->ratio.denominator; |
362 | 189 } |
371 | 190 |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
191 aux->pos = pos; |
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
192 aux->carry = inp < to + CH(1) ? 0 : CH(1); |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
193 return outp; |
338 | 194 } |
365
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
195 |
f61eadea1f44
More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
362
diff
changeset
|
196 /*-------------------------------------------------------------------------*/ |
338 | 197 #undef CH |
198 #endif /* Suffix */ | |
403
b1e511c879d1
More altcvt updates and fixes from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents:
380
diff
changeset
|
199 |