annotate filter_templates.h @ 365:f61eadea1f44

More revisions from Frank.
author Ryan C. Gordon <icculus@icculus.org>
date Tue, 18 Jun 2002 21:49:44 +0000
parents c7f73428deaf
children eda146d666d1
rev   line source
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
1 /*
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
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
5 * Johann Wolfgang Goethe-Universität
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 */
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
27
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
28 #ifndef Suffix
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
29 #error include filter_template.h with defined Suffix macro!
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
30 #else
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
31 #define CH(x) (Suffix((x)*))
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
32 /*-------------------------------------------------------------------------*/
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
33 /*
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
34 * !!! FIXME !!!
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
35 *
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
36 *
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
37 * Tune doubleRate(), halfRate() and varRate() for speed
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
38 * - Frank
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
39 */
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
40
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
41 /*-------------------------------------------------------------------------*/
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
42 static Sint16* Suffix(doubleRate)( Sint16 *outp, Sint16 *inp, int length,
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
43 VarFilter* filt, int* cpos )
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
44 {
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
45 static const int fsize = _fsize;
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
46 int i, out;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
47 Sint16* to;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
48
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
49 inp += fsize;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
50 to = inp + length;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
51
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
52 for(; inp > to; inp -= CH(1) )
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
53 {
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
54 out = 0;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
55 for( i = 1; i < 1+fsize; i++ )
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
56 out+= filter[2*i] * ( inp[CH(i)] + inp[CH(1-i)] );
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
57
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
58 outp[CH(1)] = ( 32770 * inp[CH(1)] + out) >> 16;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
59 outp[CH(0)] = ( 32770 * inp[CH(0)] + out) >> 16;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
60 outp -= CH(2);
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
61 }
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
62 return outp;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
63 }
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
64
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
65 /*-------------------------------------------------------------------------*/
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
66 static Sint16* Suffix(halfRate)( Sint16 *outp, Sint16 *inp, int length,
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
67 VarFilter* filt, int* cpos )
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
68 {
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
69 static const int fsize = CH(_fsize/2);
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
70 int i, out;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
71 Sint16* to;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
72
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
73 inp -= fsize;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
74 to = inp + length;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
75
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
76 for(; inp < to; inp+= CH(2) )
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
77 {
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
78 out = 32770 * inp[0];
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
79 for( i = 1; i < fsize/2; i+=2 )
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
80 out+= filter[i]*( (int)inp[CH(i)] + inp[CH(-i)] );
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
81 outp[0] = out >> 16;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
82
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
83 outp += CH(1);
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
84 }
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
85 return outp;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
86 }
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
87
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
88 /*-------------------------------------------------------------------------*/
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
89 static Sint16* Suffix(increaseRate)( Sint16 *outp, Sint16 *inp, int length,
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
90 VarFilter* filt, int* cpos )
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
91 {
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
92 const static int fsize = 2*_fsize;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
93 Sint16 *filter;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
94 int out;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
95 int i, pos;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
96 Sint16* to;
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
97
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
98 inp += fsize;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
99 to = inp + length;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
100
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
101 while( inp > to )
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
102 {
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
103 pos = *cpos;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
104 out = 0;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
105 filter = filt->c[pos];
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
106 for( i = 0; i < 2*_fsize; i++ )
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
107 out+= filter[i] * (int)inp[CH(i)];
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
108 outp[0] = out >> 16;
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
109
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
110 inp -= CH(filt->incr[pos]);
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 *cpos = ( pos + 1 ) % filt->denominator;
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
113 }
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
114 return outp;
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
115 }
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
116
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
117 /*-------------------------------------------------------------------------*/
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
118 static Sint16* Suffix(decreaseRate)( Sint16 *outp, Sint16 *inp, int length,
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
119 VarFilter* filt, int* cpos )
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
120 {
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
121 const static int fsize = 2*_fsize;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
122 Sint16 *filter;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
123 int out;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
124 int i, pos;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
125 Sint16 *to;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
126
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
127 inp -= fsize;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
128 to = inp + length;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
129
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
130 while( inp < to )
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
131 {
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
132 pos = *cpos;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
133 out = 0;
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
134 filter = filt->c[pos];
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
135 for( i = 0; i < 2*_fsize; i++ )
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
136 out+= filter[i] * (int)inp[CH(i)];
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
137 outp[0] = out >> 16;
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
138
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
139 inp += CH(filt->incr[pos]);
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
140 outp += CH(1);
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
141 *cpos = ( pos + 1 ) % filt->denominator;
362
c7f73428deaf Updated from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 338
diff changeset
142 }
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
143 return outp;
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
144 }
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
145
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
146 /*-------------------------------------------------------------------------*/
338
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
147 #undef CH
7b9a0f3f030e Initial add.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
148 #endif /* Suffix */
365
f61eadea1f44 More revisions from Frank.
Ryan C. Gordon <icculus@icculus.org>
parents: 362
diff changeset
149