]> git.sesse.net Git - vlc/blob - src/audio_decoder/audio_math.c
. portage des vlc_threads aux cthreads de Mach pour GNU/Hurd
[vlc] / src / audio_decoder / audio_math.c
1 /*****************************************************************************
2  * audio_math.c: Inverse Discrete Cosine Transform and Pulse Code Modulation
3  * (c)1999 VideoLAN
4  *****************************************************************************/
5 /*****************************************************************************
6  * Preamble
7  *****************************************************************************/
8 #include <unistd.h>
9 #include <stdio.h>                                           /* "intf_msg.h" */
10 #include <stdlib.h>                                      /* malloc(), free() */
11 #include <sys/types.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>                                           /* ntohl() */
14 #include <sys/uio.h>
15
16 #include "config.h"
17 #include "common.h"
18 #include "mtime.h"
19 #include "vlc_thread.h"
20 #include "debug.h"
21
22 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
23
24 #include "input.h"
25 #include "input_netlist.h"
26 #include "decoder_fifo.h"
27
28 #include "audio_output.h"
29
30 #include "audio_constants.h"
31 #include "audio_decoder.h"
32 #include "audio_math.h"
33
34 /*****************************************************************************
35  * DCT32: Fast 32 points Discrete Cosine Transform
36  *****************************************************************************
37  * 289 additions and multiplications
38  * F(u)=alpha(u)*SUM(x=0, x<N) f(x)*cos((2x+1)u*pi/2N)
39  * where alpha(u) = sqrt(2)/N if u=0, 2/N otherwise.
40  * See fastdct.ps, and fast.tar.gz for a (Fortran :) implementation.
41  *****************************************************************************/
42
43 void DCT32(float *x, adec_bank_t *b)
44 {
45     /* cosine coefficients */
46     static const float c2  =  .70710678118655;
47     static const float c3  =  .54119610014620;
48     static const float c4  = -1.3065629648764;
49     static const float c5  =  .50979557910416;
50     static const float c6  =  .89997622313642;
51     static const float c7  = -2.5629154477415;
52     static const float c8  = -.60134488693505;
53     static const float c9  =  .50241928618816;
54     static const float c10 =  .56694403481636;
55     static const float c11 =  .78815462345125;
56     static const float c12 =  1.7224470982383;
57     static const float c13 = -5.1011486186892;
58     static const float c14 = -1.0606776859903;
59     static const float c15 = -.64682178335999;
60     static const float c16 = -.52249861493969;
61     static const float c17 =  .50060299823520;
62     static const float c18 =  .51544730992262;
63     static const float c19 =  .55310389603444;
64     static const float c20 =  .62250412303566;
65     static const float c21 =  .74453627100230;
66     static const float c22 =  .97256823786196;
67     static const float c23 =  1.4841646163142;
68     static const float c24 =  3.4076084184687;
69     static const float c25 = -10.190008123548;
70     static const float c26 = -2.0577810099534;
71     static const float c27 = -1.1694399334329;
72     static const float c28 = -.83934964541553;
73     static const float c29 = -.67480834145501;
74     static const float c30 = -.58293496820613;
75     static const float c31 = -.53104259108978;
76     static const float c32 = -.50547095989754;
77
78     /* temporary variables */
79     float  t1  , t2  , t3  , t4  , t5  , t6  , t7  , t8  ,
80            t9  , t10 , t11 , t12 , t13 , t14 , t15 , t16 ,
81            t17 , t18 , t19 , t20 , t21 , t22 , t23 , t24 ,
82            t25 , t26 , t27 , t28 , t29 , t30 , t31 , t32 ,
83            tt1 , tt2 , tt3 , tt4 , tt5 , tt6 , tt7 , tt8 ,
84            tt9 , tt10, tt11, tt12, tt13, tt14, tt15, tt16,
85            tt17, tt18, tt19, tt20, tt21, tt22, tt23, tt24,
86            tt25, tt26, tt27, tt28, tt29, tt30, tt31, tt32, *y;
87
88     /* We unrolled the loops */
89     /* Odd-even ordering is integrated before the 1st stage */
90     t17 = c17 * (x[0] - x[31]);
91     t1  = x[0] + x[31];
92     t18 = c18 * (x[2] - x[29]);
93     t2  = x[2] + x[29];
94     t19 = c19 * (x[4] - x[27]);
95     t3  = x[4] + x[27];
96     t20 = c20 * (x[6] - x[25]);
97     t4  = x[6] + x[25];
98     t21 = c21 * (x[8] - x[23]);
99     t5  = x[8] + x[23];
100     t22 = c22 * (x[10] - x[21]);
101     t6  = x[10] + x[21];
102     t23 = c23 * (x[12] - x[19]);
103     t7  = x[12] + x[19];
104     t24 = c24 * (x[14] - x[17]);
105     t8  = x[14] + x[17];
106     t25 = c25 * (x[16] - x[15]);
107     t9  = x[16] + x[15];
108     t26 = c26 * (x[18] - x[13]);
109     t10 = x[18] + x[13];
110     t27 = c27 * (x[20] - x[11]);
111     t11 = x[20] + x[11];
112     t28 = c28 * (x[22] - x[9]);
113     t12 = x[22] + x[9];
114     t29 = c29 * (x[24] - x[7]);
115     t13 = x[24] + x[7];
116     t30 = c30 * (x[26] - x[5]);
117     t14 = x[26] + x[5];
118     t31 = c31 * (x[28] - x[3]);
119     t15 = x[28] + x[3];
120     t32 = c32 * (x[30] - x[1]);
121     t16 = x[30] + x[1];
122     /* 2nd stage */
123     tt9  = c9  * (t1  - t9 );
124     tt1  = t1  + t9;
125     tt10 = c10 * (t2  - t10);
126     tt2  = t2  + t10;
127     tt11 = c11 * (t3  - t11);
128     tt3  = t3  + t11;
129     tt12 = c12 * (t4  - t12);
130     tt4  = t4  + t12;
131     tt13 = c13 * (t5  - t13);
132     tt5  = t5  + t13;
133     tt14 = c14 * (t6  - t14);
134     tt6  = t6  + t14;
135     tt15 = c15 * (t7  - t15);
136     tt7  = t7  + t15;
137     tt16 = c16 * (t8  - t16);
138     tt8  = t8  + t16;
139     tt25 = c9  * (t17 - t25);
140     tt17 = t17 + t25;
141     tt26 = c10 * (t18 - t26);
142     tt18 = t18 + t26;
143     tt27 = c11 * (t19 - t27);
144     tt19 = t19 + t27;
145     tt28 = c12 * (t20 - t28);
146     tt20 = t20 + t28;
147     tt29 = c13 * (t21 - t29);
148     tt21 = t21 + t29;
149     tt30 = c14 * (t22 - t30);
150     tt22 = t22 + t30;
151     tt31 = c15 * (t23 - t31);
152     tt23 = t23 + t31;
153     tt32 = c16 * (t24 - t32);
154     tt24 = t24 + t32;
155     /* 3rd stage */
156     t5  = c5 * (tt1  - tt5 );
157     t1  = tt1  + tt5;
158     t6  = c6 * (tt2  - tt6 );
159     t2  = tt2  + tt6;
160     t7  = c7 * (tt3  - tt7 );
161     t3  = tt3  + tt7;
162     t8  = c8 * (tt4  - tt8 );
163     t4  = tt4  + tt8;
164     t13 = c5 * (tt9  - tt13);
165     t9  = tt9  + tt13;
166     t14 = c6 * (tt10 - tt14);
167     t10 = tt10 + tt14;
168     t15 = c7 * (tt11 - tt15);
169     t11 = tt11 + tt15;
170     t16 = c8 * (tt12 - tt16);
171     t12 = tt12 + tt16;
172     t21 = c5 * (tt17 - tt21);
173     t17 = tt17 + tt21;
174     t22 = c6 * (tt18 - tt22);
175     t18 = tt18 + tt22;
176     t23 = c7 * (tt19 - tt23);
177     t19 = tt19 + tt23;
178     t24 = c8 * (tt20 - tt24);
179     t20 = tt20 + tt24;
180     t29 = c5 * (tt25 - tt29);
181     t25 = tt25 + tt29;
182     t30 = c6 * (tt26 - tt30);
183     t26 = tt26 + tt30;
184     t31 = c7 * (tt27 - tt31);
185     t27 = tt27 + tt31;
186     t32 = c8 * (tt28 - tt32);
187     t28 = tt28 + tt32;
188     /* 4th stage */
189     tt3  = c3 * (t1  - t3 );
190     tt1  = t1  + t3;
191     tt4  = c4 * (t2  - t4 );
192     tt2  = t2  + t4;
193     tt7  = c3 * (t5  - t7 );
194     tt5  = t5  + t7;
195     tt8  = c4 * (t6  - t8 );
196     tt6  = t6  + t8;
197     tt11 = c3 * (t9  - t11);
198     tt9  = t9  + t11;
199     tt12 = c4 * (t10 - t12);
200     tt10 = t10 + t12;
201     tt15 = c3 * (t13 - t15);
202     tt13 = t13 + t15;
203     tt16 = c4 * (t14 - t16);
204     tt14 = t14 + t16;
205     tt19 = c3 * (t17 - t19);
206     tt17 = t17 + t19;
207     tt20 = c4 * (t18 - t20);
208     tt18 = t18 + t20;
209     tt23 = c3 * (t21 - t23);
210     tt21 = t21 + t23;
211     tt24 = c4 * (t22 - t24);
212     tt22 = t22 + t24;
213     tt27 = c3 * (t25 - t27);
214     tt25 = t25 + t27;
215     tt28 = c4 * (t26 - t28);
216     tt26 = t26 + t28;
217     tt31 = c3 * (t29 - t31);
218     tt29 = t29 + t31;
219     tt32 = c4 * (t30 - t32);
220     tt30 = t30 + t32;
221     /* Bit-reverse ordering is integrated after the 5th stage */
222     /* Begin to split the result of the DCT (t1 to t32) in the filter bank */
223     x = b->actual + b->pos;
224     y = (b->actual == b->v1 ? b->v2 : b->v1) + b->pos;
225     x[0] = -(y[0] = c2 * (tt1  - tt2 )); /* t17 */
226     x[256] = 0; y[256] = tt1  + tt2; /* t1  */
227     t25 = c2 * (tt3  - tt4 );
228     t9  = tt3  + tt4;
229     t21 = c2 * (tt5  - tt6 );
230     t5  = tt5  + tt6;
231     t29 = c2 * (tt7  - tt8 );
232     t13 = tt7  + tt8;
233     t19 = c2 * (tt9  - tt10);
234     t3  = tt9  + tt10;
235     t27 = c2 * (tt11 - tt12);
236     t11 = tt11 + tt12;
237     t23 = c2 * (tt13 - tt14);
238     t7  = tt13 + tt14;
239     t31 = c2 * (tt15 - tt16);
240     t15 = tt15 + tt16;
241     t18 = c2 * (tt17 - tt18);
242     t2  = tt17 + tt18;
243     t26 = c2 * (tt19 - tt20);
244     t10 = tt19 + tt20;
245     t22 = c2 * (tt21 - tt22);
246     t6  = tt21 + tt22;
247     t30 = c2 * (tt23 - tt24);
248     t14 = tt23 + tt24;
249     t20 = c2 * (tt25 - tt26);
250     t4  = tt25 + tt26;
251     t28 = c2 * (tt27 - tt28);
252     t12 = tt27 + tt28;
253     t24 = c2 * (tt29 - tt30);
254     t8  = tt29 + tt30;
255     t32 = c2 * (tt31 - tt32);
256     t16 = tt31 + tt32;
257     /* Do the sums */
258     /* Keep on splitting the result */
259     y[384] = y[128] = t9 - (x[128] = -(x[384] = t25)); /* t25, t9  */
260     t10 += t26;
261     t11 += t27;
262     t12 += t28;
263     t13 += t29;
264     t14 += t30;
265     t15 += t31;
266     t16 += t32;
267     y[320] = y[192] = t5 + t13; /* t5  */
268     y[448] = y[64] = t13 + t21; /* t13 */
269     x[64] = -(x[448] = t21 - (x[192] = -(x[320] = t29))); /* t29, t21 */
270     t6  += t14;
271     t14 += t22;
272     t22 += t30;
273     t7  += t15;
274     t15 += t23;
275     t23 += t31;
276     t8  += t16;
277     t16 += t24;
278     t24 += t32;
279     y[288] = y[224] = t3 + t7; /* t3  */
280     y[352] = y[160] = t7 + t11; /* t7  */
281     y[416] = y[96] = t11 + t15; /* t11 */
282     y[480] = y[32] = t15 + t19; /* t15 */
283     x[32] = -(x[480] = t19 + t23); /* t19 */
284     x[96] = -(x[416] = t23 + t27); /* t23 */
285     x[160] = -(x[352] = t27 - (x[224] = -(x[288] = t31))); /* t31, t27 */
286     t4  += t8 ;
287     t8  += t12;
288     t12 += t16;
289     t16 += t20;
290     t20 += t24;
291     t24 += t28;
292     t28 += t32;
293     y[272] = y[240] = t2 + t4; /* t2  */
294     y[304] = y[208] = t4 + t6; /* t4  */
295     y[336] = y[176] = t6 + t8; /* t6  */
296     y[368] = y[144] = t8 + t10; /* t8  */
297     y[400] = y[112] = t10 + t12; /* t10 */
298     y[432] = y[80] = t12 + t14; /* t12 */
299     y[464] = y[48] = t14 + t16; /* t14 */
300     y[496] = y[16] = t16 + t18; /* t16 */
301     x[16] = -(x[496] = t18 + t20); /* t18 */
302     x[48] = -(x[464] = t20 + t22); /* t20 */
303     x[80] = -(x[432] = t22 + t24); /* t22 */
304     x[112] = -(x[400] = t24 + t26); /* t24 */
305     x[144] = -(x[368] = t26 + t28); /* t26 */
306     x[176] = -(x[336] = t28 + t30); /* t28 */
307     x[208] = -(x[304] = t30 - (x[240] = -(x[272] = t32))); /* t32, t30 */
308     /* Note that to be really complete, the DCT should multiply t1 by sqrt(2)/N
309        and t2 to t32 by 2/N, and would take 321 additions and multiplications.
310        But that's unuseful in this application. */
311 }
312
313
314 /*****************************************************************************
315  * PCM: Pulse Code Modulation
316  *****************************************************************************
317  * Compute 32 PCM samples with a convolution product
318  *****************************************************************************/
319
320 void PCM(adec_bank_t *b, s16 **pcm, int jump)
321 {
322     /* scale factor */
323 #define F 32768
324     /* These values are not in the same order as in Annex 3-B.3 of the ISO/IEC
325        DIS 11172-3 */
326     static const float c[512] = {
327         0.000000000 * F, -0.000442505 * F,  0.003250122 * F, -0.007003784 * F,
328         0.031082153 * F, -0.078628540 * F,  0.100311279 * F, -0.572036743 * F,
329         1.144989014 * F,  0.572036743 * F,  0.100311279 * F,  0.078628540 * F,
330         0.031082153 * F,  0.007003784 * F,  0.003250122 * F,  0.000442505 * F,
331        -0.000015259 * F, -0.000473022 * F,  0.003326416 * F, -0.007919312 * F,
332         0.030517578 * F, -0.084182739 * F,  0.090927124 * F, -0.600219727 * F,
333         1.144287109 * F,  0.543823242 * F,  0.108856201 * F,  0.073059082 * F,
334         0.031478882 * F,  0.006118774 * F,  0.003173828 * F,  0.000396729 * F,
335        -0.000015259 * F, -0.000534058 * F,  0.003387451 * F, -0.008865356 * F,
336         0.029785156 * F, -0.089706421 * F,  0.080688477 * F, -0.628295898 * F,
337         1.142211914 * F,  0.515609741 * F,  0.116577148 * F,  0.067520142 * F,
338         0.031738281 * F,  0.005294800 * F,  0.003082275 * F,  0.000366211 * F,
339        -0.000015259 * F, -0.000579834 * F,  0.003433228 * F, -0.009841919 * F,
340         0.028884888 * F, -0.095169067 * F,  0.069595337 * F, -0.656219482 * F,
341         1.138763428 * F,  0.487472534 * F,  0.123474121 * F,  0.061996460 * F,
342         0.031845093 * F,  0.004486084 * F,  0.002990723 * F,  0.000320435 * F,
343        -0.000015259 * F, -0.000625610 * F,  0.003463745 * F, -0.010848999 * F,
344         0.027801514 * F, -0.100540161 * F,  0.057617188 * F, -0.683914185 * F,
345         1.133926392 * F,  0.459472656 * F,  0.129577637 * F,  0.056533813 * F,
346         0.031814575 * F,  0.003723145 * F,  0.002899170 * F,  0.000289917 * F,
347        -0.000015259 * F, -0.000686646 * F,  0.003479004 * F, -0.011886597 * F,
348         0.026535034 * F, -0.105819702 * F,  0.044784546 * F, -0.711318970 * F,
349         1.127746582 * F,  0.431655884 * F,  0.134887695 * F,  0.051132202 * F,
350         0.031661987 * F,  0.003005981 * F,  0.002792358 * F,  0.000259399 * F,
351        -0.000015259 * F, -0.000747681 * F,  0.003479004 * F, -0.012939453 * F,
352         0.025085449 * F, -0.110946655 * F,  0.031082153 * F, -0.738372803 * F,
353         1.120223999 * F,  0.404083252 * F,  0.139450073 * F,  0.045837402 * F,
354         0.031387329 * F,  0.002334595 * F,  0.002685547 * F,  0.000244141 * F,
355        -0.000030518 * F, -0.000808716 * F,  0.003463745 * F, -0.014022827 * F,
356         0.023422241 * F, -0.115921021 * F,  0.016510010 * F, -0.765029907 * F,
357         1.111373901 * F,  0.376800537 * F,  0.143264771 * F,  0.040634155 * F,
358         0.031005859 * F,  0.001693726 * F,  0.002578735 * F,  0.000213623 * F,
359        -0.000030518 * F, -0.000885010 * F,  0.003417969 * F, -0.015121460 * F,
360         0.021575928 * F, -0.120697021 * F,  0.001068115 * F, -0.791213989 * F,
361         1.101211548 * F,  0.349868774 * F,  0.146362305 * F,  0.035552979 * F,
362         0.030532837 * F,  0.001098633 * F,  0.002456665 * F,  0.000198364 * F,
363        -0.000030518 * F, -0.000961304 * F,  0.003372192 * F, -0.016235352 * F,
364         0.019531250 * F, -0.125259399 * F, -0.015228271 * F, -0.816864014 * F,
365         1.089782715 * F,  0.323318481 * F,  0.148773193 * F,  0.030609131 * F,
366         0.029937744 * F,  0.000549316 * F,  0.002349854 * F,  0.000167847 * F,
367        -0.000030518 * F, -0.001037598 * F,  0.003280640 * F, -0.017349243 * F,
368         0.017257690 * F, -0.129562378 * F, -0.032379150 * F, -0.841949463 * F,
369         1.077117920 * F,  0.297210693 * F,  0.150497437 * F,  0.025817871 * F,
370         0.029281616 * F,  0.000030518 * F,  0.002243042 * F,  0.000152588 * F,
371        -0.000045776 * F, -0.001113892 * F,  0.003173828 * F, -0.018463135 * F,
372         0.014801025 * F, -0.133590698 * F, -0.050354004 * F, -0.866363525 * F,
373         1.063217163 * F,  0.271591187 * F,  0.151596069 * F,  0.021179199 * F,
374         0.028533936 * F, -0.000442505 * F,  0.002120972 * F,  0.000137329 * F,
375        -0.000045776 * F, -0.001205444 * F,  0.003051758 * F, -0.019577026 * F,
376         0.012115479 * F, -0.137298584 * F, -0.069168091 * F, -0.890090942 * F,
377         1.048156738 * F,  0.246505737 * F,  0.152069092 * F,  0.016708374 * F,
378         0.027725220 * F, -0.000869751 * F,  0.002014160 * F,  0.000122070 * F,
379        -0.000061035 * F, -0.001296997 * F,  0.002883911 * F, -0.020690918 * F,
380         0.009231567 * F, -0.140670776 * F, -0.088775635 * F, -0.913055420 * F,
381         1.031936646 * F,  0.221984863 * F,  0.151962280 * F,  0.012420654 * F,
382         0.026840210 * F, -0.001266479 * F,  0.001907349 * F,  0.000106812 * F,
383        -0.000061035 * F, -0.001388550 * F,  0.002700806 * F, -0.021789551 * F,
384         0.006134033 * F, -0.143676758 * F, -0.109161377 * F, -0.935195923 * F,
385         1.014617920 * F,  0.198059082 * F,  0.151306152 * F,  0.008316040 * F,
386         0.025909424 * F, -0.001617432 * F,  0.001785278 * F,  0.000106812 * F,
387        -0.000076294 * F, -0.001480103 * F,  0.002487183 * F, -0.022857666 * F,
388         0.002822876 * F, -0.146255493 * F, -0.130310059 * F, -0.956481934 * F,
389         0.996246338 * F,  0.174789429 * F,  0.150115967 * F,  0.004394531 * F,
390         0.024932861 * F, -0.001937866 * F,  0.001693726 * F,  0.000091553 * F,
391        -0.000076294 * F, -0.001586914 * F,  0.002227783 * F, -0.023910522 * F,
392        -0.000686646 * F, -0.148422241 * F, -0.152206421 * F, -0.976852417 * F,
393         0.976852417 * F,  0.152206421 * F,  0.148422241 * F,  0.000686646 * F,
394         0.023910522 * F, -0.002227783 * F,  0.001586914 * F,  0.000076294 * F,
395        -0.000091553 * F, -0.001693726 * F,  0.001937866 * F, -0.024932861 * F,
396        -0.004394531 * F, -0.150115967 * F, -0.174789429 * F, -0.996246338 * F,
397         0.956481934 * F,  0.130310059 * F,  0.146255493 * F, -0.002822876 * F,
398         0.022857666 * F, -0.002487183 * F,  0.001480103 * F,  0.000076294 * F,
399        -0.000106812 * F, -0.001785278 * F,  0.001617432 * F, -0.025909424 * F,
400        -0.008316040 * F, -0.151306152 * F, -0.198059082 * F, -1.014617920 * F,
401         0.935195923 * F,  0.109161377 * F,  0.143676758 * F, -0.006134033 * F,
402         0.021789551 * F, -0.002700806 * F,  0.001388550 * F,  0.000061035 * F,
403        -0.000106812 * F, -0.001907349 * F,  0.001266479 * F, -0.026840210 * F,
404        -0.012420654 * F, -0.151962280 * F, -0.221984863 * F, -1.031936646 * F,
405         0.913055420 * F,  0.088775635 * F,  0.140670776 * F, -0.009231567 * F,
406         0.020690918 * F, -0.002883911 * F,  0.001296997 * F,  0.000061035 * F,
407        -0.000122070 * F, -0.002014160 * F,  0.000869751 * F, -0.027725220 * F,
408        -0.016708374 * F, -0.152069092 * F, -0.246505737 * F, -1.048156738 * F,
409         0.890090942 * F,  0.069168091 * F,  0.137298584 * F, -0.012115479 * F,
410         0.019577026 * F, -0.003051758 * F,  0.001205444 * F,  0.000045776 * F,
411        -0.000137329 * F, -0.002120972 * F,  0.000442505 * F, -0.028533936 * F,
412        -0.021179199 * F, -0.151596069 * F, -0.271591187 * F, -1.063217163 * F,
413         0.866363525 * F,  0.050354004 * F,  0.133590698 * F, -0.014801025 * F,
414         0.018463135 * F, -0.003173828 * F,  0.001113892 * F,  0.000045776 * F,
415        -0.000152588 * F, -0.002243042 * F, -0.000030518 * F, -0.029281616 * F,
416        -0.025817871 * F, -0.150497437 * F, -0.297210693 * F, -1.077117920 * F,
417         0.841949463 * F,  0.032379150 * F,  0.129562378 * F, -0.017257690 * F,
418         0.017349243 * F, -0.003280640 * F,  0.001037598 * F,  0.000030518 * F,
419        -0.000167847 * F, -0.002349854 * F, -0.000549316 * F, -0.029937744 * F,
420        -0.030609131 * F, -0.148773193 * F, -0.323318481 * F, -1.089782715 * F,
421         0.816864014 * F,  0.015228271 * F,  0.125259399 * F, -0.019531250 * F,
422         0.016235352 * F, -0.003372192 * F,  0.000961304 * F,  0.000030518 * F,
423        -0.000198364 * F, -0.002456665 * F, -0.001098633 * F, -0.030532837 * F,
424        -0.035552979 * F, -0.146362305 * F, -0.349868774 * F, -1.101211548 * F,
425         0.791213989 * F, -0.001068115 * F,  0.120697021 * F, -0.021575928 * F,
426         0.015121460 * F, -0.003417969 * F,  0.000885010 * F,  0.000030518 * F,
427        -0.000213623 * F, -0.002578735 * F, -0.001693726 * F, -0.031005859 * F,
428        -0.040634155 * F, -0.143264771 * F, -0.376800537 * F, -1.111373901 * F,
429         0.765029907 * F, -0.016510010 * F,  0.115921021 * F, -0.023422241 * F,
430         0.014022827 * F, -0.003463745 * F,  0.000808716 * F,  0.000030518 * F,
431        -0.000244141 * F, -0.002685547 * F, -0.002334595 * F, -0.031387329 * F,
432        -0.045837402 * F, -0.139450073 * F, -0.404083252 * F, -1.120223999 * F,
433         0.738372803 * F, -0.031082153 * F,  0.110946655 * F, -0.025085449 * F,
434         0.012939453 * F, -0.003479004 * F,  0.000747681 * F,  0.000015259 * F,
435        -0.000259399 * F, -0.002792358 * F, -0.003005981 * F, -0.031661987 * F,
436        -0.051132202 * F, -0.134887695 * F, -0.431655884 * F, -1.127746582 * F,
437         0.711318970 * F, -0.044784546 * F,  0.105819702 * F, -0.026535034 * F,
438         0.011886597 * F, -0.003479004 * F,  0.000686646 * F,  0.000015259 * F,
439        -0.000289917 * F, -0.002899170 * F, -0.003723145 * F, -0.031814575 * F,
440        -0.056533813 * F, -0.129577637 * F, -0.459472656 * F, -1.133926392 * F,
441         0.683914185 * F, -0.057617188 * F,  0.100540161 * F, -0.027801514 * F,
442         0.010848999 * F, -0.003463745 * F,  0.000625610 * F,  0.000015259 * F,
443        -0.000320435 * F, -0.002990723 * F, -0.004486084 * F, -0.031845093 * F,
444        -0.061996460 * F, -0.123474121 * F, -0.487472534 * F, -1.138763428 * F,
445         0.656219482 * F, -0.069595337 * F,  0.095169067 * F, -0.028884888 * F,
446         0.009841919 * F, -0.003433228 * F,  0.000579834 * F,  0.000015259 * F,
447        -0.000366211 * F, -0.003082275 * F, -0.005294800 * F, -0.031738281 * F,
448        -0.067520142 * F, -0.116577148 * F, -0.515609741 * F, -1.142211914 * F,
449         0.628295898 * F, -0.080688477 * F,  0.089706421 * F, -0.029785156 * F,
450         0.008865356 * F, -0.003387451 * F,  0.000534058 * F,  0.000015259 * F,
451        -0.000396729 * F, -0.003173828 * F, -0.006118774 * F, -0.031478882 * F,
452        -0.073059082 * F, -0.108856201 * F, -0.543823242 * F, -1.144287109 * F,
453         0.600219727 * F, -0.090927124 * F,  0.084182739 * F, -0.030517578 * F,
454         0.007919312 * F, -0.003326416 * F,  0.000473022 * F,  0.000015259 * F
455         };
456 #undef F
457     int i;
458     float tmp, *v;
459     const float *f;
460
461     f = c;
462
463     switch(b->pos) {
464         case 0:
465             v = b->actual;
466             for(i=0; i<32; i++) {
467                 tmp = *f++ * *v;
468                 v += 15;
469                 tmp += *f++ * *v--;
470                 tmp += *f++ * *v--;
471                 tmp += *f++ * *v--;
472                 tmp += *f++ * *v--;
473                 tmp += *f++ * *v--;
474                 tmp += *f++ * *v--;
475                 tmp += *f++ * *v--;
476                 tmp += *f++ * *v--;
477                 tmp += *f++ * *v--;
478                 tmp += *f++ * *v--;
479                 tmp += *f++ * *v--;
480                 tmp += *f++ * *v--;
481                 tmp += *f++ * *v--;
482                 tmp += *f++ * *v--;
483                 if((tmp += *f++ * *v) > 32767)
484                     /* ceiling saturation */
485                     **pcm = 0x7FFF;
486                 else
487                     if(tmp < -32768)
488                         /* floor saturation */
489                         **pcm = 0x8000;
490                     else
491                         **pcm = (s16)tmp;
492                 *pcm += jump;
493                 v += 15;
494             }
495             break;
496         case 1:
497             v = b->actual + 1;
498             for(i=0; i<32; i++) {
499                 tmp = *f++ * *v--;
500                 tmp += *f++ * *v;
501                 v += 15;
502                 tmp += *f++ * *v--;
503                 tmp += *f++ * *v--;
504                 tmp += *f++ * *v--;
505                 tmp += *f++ * *v--;
506                 tmp += *f++ * *v--;
507                 tmp += *f++ * *v--;
508                 tmp += *f++ * *v--;
509                 tmp += *f++ * *v--;
510                 tmp += *f++ * *v--;
511                 tmp += *f++ * *v--;
512                 tmp += *f++ * *v--;
513                 tmp += *f++ * *v--;
514                 tmp += *f++ * *v--;
515                 if((tmp += *f++ * *v) > 32767)
516                     **pcm = 0x7FFF;
517                 else
518                     if(tmp < -32768)
519                         **pcm = 0x8000;
520                     else
521                         **pcm = (s16)tmp;
522                 *pcm += jump;
523                 v += 15;
524             }
525             break;
526         case 2:
527             v = b->actual + 2;
528             for(i=0; i<32; i++) {
529                 tmp = *f++ * *v--;
530                 tmp += *f++ * *v--;
531                 tmp += *f++ * *v;
532                 v += 15;
533                 tmp += *f++ * *v--;
534                 tmp += *f++ * *v--;
535                 tmp += *f++ * *v--;
536                 tmp += *f++ * *v--;
537                 tmp += *f++ * *v--;
538                 tmp += *f++ * *v--;
539                 tmp += *f++ * *v--;
540                 tmp += *f++ * *v--;
541                 tmp += *f++ * *v--;
542                 tmp += *f++ * *v--;
543                 tmp += *f++ * *v--;
544                 tmp += *f++ * *v--;
545                 if((tmp += *f++ * *v) > 32767)
546                     **pcm = 0x7FFF;
547                 else
548                     if(tmp < -32768)
549                         **pcm = 0x8000;
550                     else
551                         **pcm = (s16)tmp;
552                 *pcm += jump;
553                 v += 15;
554             }
555             break;
556         case 3:
557             v = b->actual + 3;
558             for(i=0; i<32; i++) {
559                 tmp = *f++ * *v--;
560                 tmp += *f++ * *v--;
561                 tmp += *f++ * *v--;
562                 tmp += *f++ * *v;
563                 v += 15;
564                 tmp += *f++ * *v--;
565                 tmp += *f++ * *v--;
566                 tmp += *f++ * *v--;
567                 tmp += *f++ * *v--;
568                 tmp += *f++ * *v--;
569                 tmp += *f++ * *v--;
570                 tmp += *f++ * *v--;
571                 tmp += *f++ * *v--;
572                 tmp += *f++ * *v--;
573                 tmp += *f++ * *v--;
574                 tmp += *f++ * *v--;
575                 if((tmp += *f++ * *v) > 32767)
576                     **pcm = 0x7FFF;
577                 else
578                     if(tmp < -32768)
579                         **pcm = 0x8000;
580                     else
581                         **pcm = (s16)tmp;
582                 *pcm += jump;
583                 v += 15;
584             }
585             break;
586         case 4:
587             v = b->actual + 4;
588             for(i=0; i<32; i++) {
589                 tmp = *f++ * *v--;
590                 tmp += *f++ * *v--;
591                 tmp += *f++ * *v--;
592                 tmp += *f++ * *v--;
593                 tmp += *f++ * *v;
594                 v += 15;
595                 tmp += *f++ * *v--;
596                 tmp += *f++ * *v--;
597                 tmp += *f++ * *v--;
598                 tmp += *f++ * *v--;
599                 tmp += *f++ * *v--;
600                 tmp += *f++ * *v--;
601                 tmp += *f++ * *v--;
602                 tmp += *f++ * *v--;
603                 tmp += *f++ * *v--;
604                 tmp += *f++ * *v--;
605                 if((tmp += *f++ * *v) > 32767)
606                     **pcm = 0x7FFF;
607                 else
608                     if(tmp < -32768)
609                         **pcm = 0x8000;
610                     else
611                         **pcm = (s16)tmp;
612                 *pcm += jump;
613                 v += 15;
614             }
615             break;
616         case 5:
617             v = b->actual + 5;
618             for(i=0; i<32; i++) {
619                 tmp = *f++ * *v--;
620                 tmp += *f++ * *v--;
621                 tmp += *f++ * *v--;
622                 tmp += *f++ * *v--;
623                 tmp += *f++ * *v--;
624                 tmp += *f++ * *v;
625                 v += 15;
626                 tmp += *f++ * *v--;
627                 tmp += *f++ * *v--;
628                 tmp += *f++ * *v--;
629                 tmp += *f++ * *v--;
630                 tmp += *f++ * *v--;
631                 tmp += *f++ * *v--;
632                 tmp += *f++ * *v--;
633                 tmp += *f++ * *v--;
634                 tmp += *f++ * *v--;
635                 if((tmp += *f++ * *v) > 32767)
636                     **pcm = 0x7FFF;
637                 else
638                     if(tmp < -32768)
639                         **pcm = 0x8000;
640                     else
641                         **pcm = (s16)tmp;
642                 *pcm += jump;
643                 v += 15;
644             }
645             break;
646         case 6:
647             v = b->actual + 6;
648             for(i=0; i<32; i++) {
649                 tmp = *f++ * *v--;
650                 tmp += *f++ * *v--;
651                 tmp += *f++ * *v--;
652                 tmp += *f++ * *v--;
653                 tmp += *f++ * *v--;
654                 tmp += *f++ * *v--;
655                 tmp += *f++ * *v;
656                 v += 15;
657                 tmp += *f++ * *v--;
658                 tmp += *f++ * *v--;
659                 tmp += *f++ * *v--;
660                 tmp += *f++ * *v--;
661                 tmp += *f++ * *v--;
662                 tmp += *f++ * *v--;
663                 tmp += *f++ * *v--;
664                 tmp += *f++ * *v--;
665                 if((tmp += *f++ * *v) > 32767)
666                     **pcm = 0x7FFF;
667                 else
668                     if(tmp < -32768)
669                         **pcm = 0x8000;
670                     else
671                         **pcm = (s16)tmp;
672                 *pcm += jump;
673                 v += 15;
674             }
675             break;
676         case 7:
677             v = b->actual + 7;
678             for(i=0; i<32; i++) {
679                 tmp = *f++ * *v--;
680                 tmp += *f++ * *v--;
681                 tmp += *f++ * *v--;
682                 tmp += *f++ * *v--;
683                 tmp += *f++ * *v--;
684                 tmp += *f++ * *v--;
685                 tmp += *f++ * *v--;
686                 tmp += *f++ * *v;
687                 v += 15;
688                 tmp += *f++ * *v--;
689                 tmp += *f++ * *v--;
690                 tmp += *f++ * *v--;
691                 tmp += *f++ * *v--;
692                 tmp += *f++ * *v--;
693                 tmp += *f++ * *v--;
694                 tmp += *f++ * *v--;
695                 if((tmp += *f++ * *v) > 32767)
696                     **pcm = 0x7FFF;
697                 else
698                     if(tmp < -32768)
699                         **pcm = 0x8000;
700                     else
701                         **pcm = (s16)tmp;
702                 *pcm += jump;
703                 v += 15;
704             }
705             break;
706         case 8:
707             v = b->actual + 8;
708             for(i=0; i<32; i++) {
709                 tmp = *f++ * *v--;
710                 tmp += *f++ * *v--;
711                 tmp += *f++ * *v--;
712                 tmp += *f++ * *v--;
713                 tmp += *f++ * *v--;
714                 tmp += *f++ * *v--;
715                 tmp += *f++ * *v--;
716                 tmp += *f++ * *v--;
717                 tmp += *f++ * *v;
718                 v += 15;
719                 tmp += *f++ * *v--;
720                 tmp += *f++ * *v--;
721                 tmp += *f++ * *v--;
722                 tmp += *f++ * *v--;
723                 tmp += *f++ * *v--;
724                 tmp += *f++ * *v--;
725                 if((tmp += *f++ * *v) > 32767)
726                     **pcm = 0x7FFF;
727                 else
728                     if(tmp < -32768)
729                         **pcm = 0x8000;
730                     else
731                         **pcm = (s16)tmp;
732                 *pcm += jump;
733                 v += 15;
734             }
735             break;
736         case 9:
737             v = b->actual + 9;
738             for(i=0; i<32; i++) {
739                 tmp = *f++ * *v--;
740                 tmp += *f++ * *v--;
741                 tmp += *f++ * *v--;
742                 tmp += *f++ * *v--;
743                 tmp += *f++ * *v--;
744                 tmp += *f++ * *v--;
745                 tmp += *f++ * *v--;
746                 tmp += *f++ * *v--;
747                 tmp += *f++ * *v--;
748                 tmp += *f++ * *v;
749                 v += 15;
750                 tmp += *f++ * *v--;
751                 tmp += *f++ * *v--;
752                 tmp += *f++ * *v--;
753                 tmp += *f++ * *v--;
754                 tmp += *f++ * *v--;
755                 if((tmp += *f++ * *v) > 32767)
756                     **pcm = 0x7FFF;
757                 else
758                     if(tmp < -32768)
759                         **pcm = 0x8000;
760                     else
761                         **pcm = (s16)tmp;
762                 *pcm += jump;
763                 v += 15;
764             }
765             break;
766         case 10:
767             v = b->actual + 10;
768             for(i=0; i<32; i++) {
769                 tmp = *f++ * *v--;
770                 tmp += *f++ * *v--;
771                 tmp += *f++ * *v--;
772                 tmp += *f++ * *v--;
773                 tmp += *f++ * *v--;
774                 tmp += *f++ * *v--;
775                 tmp += *f++ * *v--;
776                 tmp += *f++ * *v--;
777                 tmp += *f++ * *v--;
778                 tmp += *f++ * *v--;
779                 tmp += *f++ * *v;
780                 v += 15;
781                 tmp += *f++ * *v--;
782                 tmp += *f++ * *v--;
783                 tmp += *f++ * *v--;
784                 tmp += *f++ * *v--;
785                 if((tmp += *f++ * *v) > 32767)
786                     **pcm = 0x7FFF;
787                 else
788                     if(tmp < -32768)
789                         **pcm = 0x8000;
790                     else
791                         **pcm = (s16)tmp;
792                 *pcm += jump;
793                 v += 15;
794             }
795             break;
796         case 11:
797             v = b->actual + 11;
798             for(i=0; i<32; i++) {
799                 tmp = *f++ * *v--;
800                 tmp += *f++ * *v--;
801                 tmp += *f++ * *v--;
802                 tmp += *f++ * *v--;
803                 tmp += *f++ * *v--;
804                 tmp += *f++ * *v--;
805                 tmp += *f++ * *v--;
806                 tmp += *f++ * *v--;
807                 tmp += *f++ * *v--;
808                 tmp += *f++ * *v--;
809                 tmp += *f++ * *v--;
810                 tmp += *f++ * *v;
811                 v += 15;
812                 tmp += *f++ * *v--;
813                 tmp += *f++ * *v--;
814                 tmp += *f++ * *v--;
815                 if((tmp += *f++ * *v) > 32767)
816                     **pcm = 0x7FFF;
817                 else
818                     if(tmp < -32768)
819                         **pcm = 0x8000;
820                     else
821                         **pcm = (s16)tmp;
822                 *pcm += jump;
823                 v += 15;
824             }
825             break;
826         case 12:
827             v = b->actual + 12;
828             for(i=0; i<32; i++) {
829                 tmp = *f++ * *v--;
830                 tmp += *f++ * *v--;
831                 tmp += *f++ * *v--;
832                 tmp += *f++ * *v--;
833                 tmp += *f++ * *v--;
834                 tmp += *f++ * *v--;
835                 tmp += *f++ * *v--;
836                 tmp += *f++ * *v--;
837                 tmp += *f++ * *v--;
838                 tmp += *f++ * *v--;
839                 tmp += *f++ * *v--;
840                 tmp += *f++ * *v--;
841                 tmp += *f++ * *v;
842                 v += 15;
843                 tmp += *f++ * *v--;
844                 tmp += *f++ * *v--;
845                 if((tmp += *f++ * *v) > 32767)
846                     **pcm = 0x7FFF;
847                 else
848                     if(tmp < -32768)
849                         **pcm = 0x8000;
850                     else
851                         **pcm = (s16)tmp;
852                 *pcm += jump;
853                 v += 15;
854             }
855             break;
856         case 13:
857             v = b->actual + 13;
858             for(i=0; i<32; i++) {
859                 tmp = *f++ * *v--;
860                 tmp += *f++ * *v--;
861                 tmp += *f++ * *v--;
862                 tmp += *f++ * *v--;
863                 tmp += *f++ * *v--;
864                 tmp += *f++ * *v--;
865                 tmp += *f++ * *v--;
866                 tmp += *f++ * *v--;
867                 tmp += *f++ * *v--;
868                 tmp += *f++ * *v--;
869                 tmp += *f++ * *v--;
870                 tmp += *f++ * *v--;
871                 tmp += *f++ * *v--;
872                 tmp += *f++ * *v;
873                 v += 15;
874                 tmp += *f++ * *v--;
875                 if((tmp += *f++ * *v) > 32767)
876                     **pcm = 0x7FFF;
877                 else
878                     if(tmp < -32768)
879                         **pcm = 0x8000;
880                     else
881                         **pcm = (s16)tmp;
882                 *pcm += jump;
883                 v += 15;
884             }
885             break;
886         case 14:
887             v = b->actual + 14;
888             for(i=0; i<32; i++) {
889                 tmp = *f++ * *v--;
890                 tmp += *f++ * *v--;
891                 tmp += *f++ * *v--;
892                 tmp += *f++ * *v--;
893                 tmp += *f++ * *v--;
894                 tmp += *f++ * *v--;
895                 tmp += *f++ * *v--;
896                 tmp += *f++ * *v--;
897                 tmp += *f++ * *v--;
898                 tmp += *f++ * *v--;
899                 tmp += *f++ * *v--;
900                 tmp += *f++ * *v--;
901                 tmp += *f++ * *v--;
902                 tmp += *f++ * *v--;
903                 tmp += *f++ * *v;
904                 v += 15;
905                 if((tmp += *f++ * *v) > 32767)
906                     **pcm = 0x7FFF;
907                 else
908                     if(tmp < -32768)
909                         **pcm = 0x8000;
910                     else
911                         **pcm = (s16)tmp;
912                 *pcm += jump;
913                 v += 15;
914             }
915             break;
916         case 15:
917             v = b->actual + 15;
918             for(i=0; i<32; i++) {
919                 tmp = *f++ * *v--;
920                 tmp += *f++ * *v--;
921                 tmp += *f++ * *v--;
922                 tmp += *f++ * *v--;
923                 tmp += *f++ * *v--;
924                 tmp += *f++ * *v--;
925                 tmp += *f++ * *v--;
926                 tmp += *f++ * *v--;
927                 tmp += *f++ * *v--;
928                 tmp += *f++ * *v--;
929                 tmp += *f++ * *v--;
930                 tmp += *f++ * *v--;
931                 tmp += *f++ * *v--;
932                 tmp += *f++ * *v--;
933                 tmp += *f++ * *v--;
934                 if((tmp += *f++ * *v) > 32767)
935                     **pcm = 0x7FFF;
936                 else
937                     if(tmp < -32768)
938                         **pcm = 0x8000;
939                     else
940                         **pcm = (s16)tmp;
941                 *pcm += jump;
942                 v += 31;
943             }
944             break;
945     }
946
947     /* Set the next position in the filter bank */
948     b->pos++;
949     b->pos &= 15;
950     b->actual = (b->actual == b->v1 ? b->v2 : b->v1);
951 }