1 /*____________________________________________________________________________
2 
3 	FreeAmp - The Free MP3 Player
4 
5         MP3 Decoder originally Copyright (C) 1995-1997 Xing Technology
6         Corp.  http://www.xingtech.com
7 
8 	Portions Copyright (C) 1998 Emusic.com
9 
10 	This program is free software; you can redistribute it and/or modify
11 	it under the terms of the GNU General Public License as published by
12 	the Free Software Foundation; either version 2 of the License, or
13 	(at your option) any later version.
14 
15 	This program is distributed in the hope that it will be useful,
16 	but WITHOUT ANY WARRANTY; without even the implied warranty of
17 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 	GNU General Public License for more details.
19 
20 	You should have received a copy of the GNU General Public License
21 	along with this program; if not, write to the Free Software
22 	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 
24 	$Id: iwinQ.c,v 1.3 2000/10/13 14:29:02 ijr Exp $
25 ____________________________________________________________________________*/
26 
27 /*----- iwinq.c ---------------------------------------------------
28 
29 portable c
30 mpeg1/2 Layer II audio decode
31 
32 conditional include to iwinm.c
33 
34 quick integer window
35 
36 mods 1/8/97 warnings
37 
38 --------------------------------------------------------------*/
39 /*--------------------------------------------------------------------*/
i_window(WININT * vbuf,int vb_ptr,short * pcm)40 void i_window(WININT * vbuf, int vb_ptr, short *pcm)
41 {
42    int i, j;
43    unsigned int si, bx;
44    WINCOEF *coef;
45    INT32 sum;
46 
47 /*-- first 16 --*/
48    si = (vb_ptr + (16 + 3 * 64)) & 511;
49    bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
50    coef = iwincoef;
51    for (i = 0; i < 16; i++)
52    {
53       sum = -WINMULT(vbuf[bx], (*coef++));
54       for (j = 0; j < 3; j++)
55       {
56 	 bx = (bx + 64) & 511;
57 	 sum += WINMULT(vbuf[si], (*coef++));
58 	 si = (si + 64) & 511;
59 	 sum -= WINMULT(vbuf[bx], (*coef++));
60       }
61       si = (si + (5 * 64 + 1)) & 511;
62       bx = (bx + (64 + 4 * 64 - 1)) & 511;
63       sum >>= WINBITS;
64       if (sum > 32767)
65 	 sum = 32767;
66       else if (sum < -32768)
67 	 sum = -32768;
68       *pcm++ = (short) sum;
69    }
70 /*--  special case --*/
71    bx = (bx + (512 - 64)) & 511;
72    sum = WINMULT(vbuf[bx], (*coef++));
73    for (j = 0; j < 3; j++)
74    {
75       bx = (bx + 64) & 511;
76       sum += WINMULT(vbuf[bx], (*coef++));
77    }
78    sum >>= WINBITS;
79    if (sum > 32767)
80       sum = 32767;
81    else if (sum < -32768)
82       sum = -32768;
83    *pcm++ = (short) sum;
84 
85 /*-- last 15 --*/
86    coef = iwincoef + 111;	/* back pass through coefs */
87    si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
88    bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
89    for (i = 0; i < 15; i++)
90    {
91       sum = WINMULT(vbuf[si], (*coef--));
92       for (j = 0; j < 3; j++)
93       {
94 	 si = (si + 64) & 511;
95 	 sum += WINMULT(vbuf[bx], (*coef--));
96 	 bx = (bx + 64) & 511;
97 	 sum += WINMULT(vbuf[si], (*coef--));
98       }
99       si = (si + (64 - 1 + 4 * 64)) & 511;
100       bx = (bx + (5 * 64 + 1)) & 511;
101       sum >>= WINBITS;
102       if (sum > 32767)
103 	 sum = 32767;
104       else if (sum < -32768)
105 	 sum = -32768;
106       *pcm++ = (short) sum;
107    }
108 }
109 /*------------------------------------------------------------*/
i_window_dual(WININT * vbuf,int vb_ptr,short * pcm)110 void i_window_dual(WININT * vbuf, int vb_ptr, short *pcm)
111 {
112 /* dual window interleaves output */
113    int i, j;
114    unsigned int si, bx;
115    WINCOEF *coef;
116    INT32 sum;
117 
118 /*-- first 16 --*/
119    si = (vb_ptr + (16 + 3 * 64)) & 511;
120    bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
121    coef = iwincoef;
122    for (i = 0; i < 16; i++)
123    {
124       sum = -WINMULT(vbuf[bx], (*coef++));
125       for (j = 0; j < 3; j++)
126       {
127 	 bx = (bx + 64) & 511;
128 	 sum += WINMULT(vbuf[si], (*coef++));
129 	 si = (si + 64) & 511;
130 	 sum -= WINMULT(vbuf[bx], (*coef++));
131       }
132       si = (si + (5 * 64 + 1)) & 511;
133       bx = (bx + (64 + 4 * 64 - 1)) & 511;
134       sum >>= WINBITS;
135       if (sum > 32767)
136 	 sum = 32767;
137       else if (sum < -32768)
138 	 sum = -32768;
139       *pcm = (short) sum;
140       pcm += 2;
141    }
142 /*--  special case --*/
143    bx = (bx + (512 - 64)) & 511;
144    sum = WINMULT(vbuf[bx], (*coef++));
145    for (j = 0; j < 3; j++)
146    {
147       bx = (bx + 64) & 511;
148       sum += WINMULT(vbuf[bx], (*coef++));
149    }
150    sum >>= WINBITS;
151    if (sum > 32767)
152       sum = 32767;
153    else if (sum < -32768)
154       sum = -32768;
155    *pcm = (short) sum;
156    pcm += 2;
157 
158 /*-- last 15 --*/
159    coef = iwincoef + 111;	/* back pass through coefs */
160    si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
161    bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
162    for (i = 0; i < 15; i++)
163    {
164       sum = WINMULT(vbuf[si], (*coef--));
165       for (j = 0; j < 3; j++)
166       {
167 	 si = (si + 64) & 511;
168 	 sum += WINMULT(vbuf[bx], (*coef--));
169 	 bx = (bx + 64) & 511;
170 	 sum += WINMULT(vbuf[si], (*coef--));
171       }
172       si = (si + (64 - 1 + 4 * 64)) & 511;
173       bx = (bx + (5 * 64 + 1)) & 511;
174       sum >>= WINBITS;
175       if (sum > 32767)
176 	 sum = 32767;
177       else if (sum < -32768)
178 	 sum = -32768;
179       *pcm = (short) sum;
180       pcm += 2;
181    }
182 }
183 /*------------------------------------------------------------*/
i_window_dual_right(WININT * vbuf,int vb_ptr,short * pcm)184 void i_window_dual_right(WININT * vbuf, int vb_ptr, short *pcm)
185 {
186 /* right identical to dual, for asm  */
187 /* dual window interleaves output */
188    int i, j;
189    unsigned int si, bx;
190    WINCOEF *coef;
191    INT32 sum;
192 
193 /*-- first 16 --*/
194    si = (vb_ptr + (16 + 3 * 64)) & 511;
195    bx = (si + (32 + 512 - 3 * 64 + 2 * 64)) & 511;
196    coef = iwincoef;
197    for (i = 0; i < 16; i++)
198    {
199       sum = -WINMULT(vbuf[bx], (*coef++));
200       for (j = 0; j < 3; j++)
201       {
202 	 bx = (bx + 64) & 511;
203 	 sum += WINMULT(vbuf[si], (*coef++));
204 	 si = (si + 64) & 511;
205 	 sum -= WINMULT(vbuf[bx], (*coef++));
206       }
207       si = (si + (5 * 64 + 1)) & 511;
208       bx = (bx + (64 + 4 * 64 - 1)) & 511;
209       sum >>= WINBITS;
210       if (sum > 32767)
211 	 sum = 32767;
212       else if (sum < -32768)
213 	 sum = -32768;
214       *pcm = (short) sum;
215       pcm += 2;
216    }
217 /*--  special case --*/
218    bx = (bx + (512 - 64)) & 511;
219    sum = WINMULT(vbuf[bx], (*coef++));
220    for (j = 0; j < 3; j++)
221    {
222       bx = (bx + 64) & 511;
223       sum += WINMULT(vbuf[bx], (*coef++));
224    }
225    sum >>= WINBITS;
226    if (sum > 32767)
227       sum = 32767;
228    else if (sum < -32768)
229       sum = -32768;
230    *pcm = (short) sum;
231    pcm += 2;
232 
233 /*-- last 15 --*/
234    coef = iwincoef + 111;	/* back pass through coefs */
235    si = (si + (512 - 3 * 64 + 2 * 64 - 1)) & 511;
236    bx = (bx + (64 + 3 * 64 + 2 * 64 + 1)) & 511;
237    for (i = 0; i < 15; i++)
238    {
239       sum = WINMULT(vbuf[si], (*coef--));
240       for (j = 0; j < 3; j++)
241       {
242 	 si = (si + 64) & 511;
243 	 sum += WINMULT(vbuf[bx], (*coef--));
244 	 bx = (bx + 64) & 511;
245 	 sum += WINMULT(vbuf[si], (*coef--));
246       }
247       si = (si + (64 - 1 + 4 * 64)) & 511;
248       bx = (bx + (5 * 64 + 1)) & 511;
249       sum >>= WINBITS;
250       if (sum > 32767)
251 	 sum = 32767;
252       else if (sum < -32768)
253 	 sum = -32768;
254       *pcm = (short) sum;
255       pcm += 2;
256    }
257 }
258 /*------------------------------------------------------------*/
259 /*------------------------------------------------------------*/
260 /*------------------- 16 pt window ------------------------------*/
i_window16(WININT * vbuf,int vb_ptr,short * pcm)261 void i_window16(WININT * vbuf, int vb_ptr, short *pcm)
262 {
263    int i, j;
264    unsigned char si, bx;
265    WINCOEF *coef;
266    INT32 sum;
267 
268 
269 /*-- first 8 --*/
270    si = (unsigned char) (vb_ptr + 8 + 3 * 32);
271    bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
272    coef = iwincoef;
273    for (i = 0; i < 8; i++)
274    {
275       sum = -WINMULT(vbuf[bx], (*coef++));
276       for (j = 0; j < 3; j++)
277       {
278 	 bx += 32;
279 	 sum += WINMULT(vbuf[si], (*coef++));
280 	 si += 32;
281 	 sum -= WINMULT(vbuf[bx], (*coef++));
282       }
283       si += (5 * 32 + 1);
284       bx += (32 + 4 * 32 - 1);
285       coef += 7;
286       sum >>= WINBITS;
287       if (sum > 32767)
288 	 sum = 32767;
289       else if (sum < -32768)
290 	 sum = -32768;
291       *pcm++ = (short) sum;
292    }
293 /*--  special case --*/
294    bx += (256 - 32);
295    sum = WINMULT(vbuf[bx], (*coef++));
296    for (j = 0; j < 3; j++)
297    {
298       bx += 32;
299       sum += WINMULT(vbuf[bx], (*coef++));
300    }
301    sum >>= WINBITS;
302    if (sum > 32767)
303       sum = 32767;
304    else if (sum < -32768)
305       sum = -32768;
306    *pcm++ = (short) sum;
307 
308 /*-- last 7 --*/
309    coef = iwincoef + (111 - 7);	/* back pass through coefs */
310    si += (256 + -3 * 32 + 2 * 32 - 1);
311    bx += (32 + 3 * 32 + 2 * 32 + 1);
312    for (i = 0; i < 7; i++)
313    {
314       sum = WINMULT(vbuf[si], (*coef--));
315       for (j = 0; j < 3; j++)
316       {
317 	 si += 32;
318 	 sum += WINMULT(vbuf[bx], (*coef--));
319 	 bx += 32;
320 	 sum += WINMULT(vbuf[si], (*coef--));
321       }
322       si += (32 - 1 + 4 * 32);
323       bx += (5 * 32 + 1);
324       coef -= 7;
325       sum >>= WINBITS;
326       if (sum > 32767)
327 	 sum = 32767;
328       else if (sum < -32768)
329 	 sum = -32768;
330       *pcm++ = (short) sum;
331    }
332 }
333 /*--------------- 16 pt dual window (interleaved output) -----------------*/
i_window16_dual(WININT * vbuf,int vb_ptr,short * pcm)334 void i_window16_dual(WININT * vbuf, int vb_ptr, short *pcm)
335 {
336    int i, j;
337    unsigned char si, bx;
338    WINCOEF *coef;
339    INT32 sum;
340 
341 
342 /*-- first 8 --*/
343    si = (unsigned char) (vb_ptr + 8 + 3 * 32);
344    bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
345    coef = iwincoef;
346    for (i = 0; i < 8; i++)
347    {
348       sum = -WINMULT(vbuf[bx], (*coef++));
349       for (j = 0; j < 3; j++)
350       {
351 	 bx += 32;
352 	 sum += WINMULT(vbuf[si], (*coef++));
353 	 si += 32;
354 	 sum -= WINMULT(vbuf[bx], (*coef++));
355       }
356       si += (5 * 32 + 1);
357       bx += (32 + 4 * 32 - 1);
358       coef += 7;
359       sum >>= WINBITS;
360       if (sum > 32767)
361 	 sum = 32767;
362       else if (sum < -32768)
363 	 sum = -32768;
364       *pcm = (short) sum;
365       pcm += 2;
366    }
367 /*--  special case --*/
368    bx += (256 - 32);
369    sum = WINMULT(vbuf[bx], (*coef++));
370    for (j = 0; j < 3; j++)
371    {
372       bx += 32;
373       sum += WINMULT(vbuf[bx], (*coef++));
374    }
375    sum >>= WINBITS;
376    if (sum > 32767)
377       sum = 32767;
378    else if (sum < -32768)
379       sum = -32768;
380    *pcm = (short) sum;
381    pcm += 2;
382 
383 /*-- last 7 --*/
384    coef = iwincoef + (111 - 7);	/* back pass through coefs */
385    si += (256 + -3 * 32 + 2 * 32 - 1);
386    bx += (32 + 3 * 32 + 2 * 32 + 1);
387    for (i = 0; i < 7; i++)
388    {
389       sum = WINMULT(vbuf[si], (*coef--));
390       for (j = 0; j < 3; j++)
391       {
392 	 si += 32;
393 	 sum += WINMULT(vbuf[bx], (*coef--));
394 	 bx += 32;
395 	 sum += WINMULT(vbuf[si], (*coef--));
396       }
397       si += (32 - 1 + 4 * 32);
398       bx += (5 * 32 + 1);
399       coef -= 7;
400       sum >>= WINBITS;
401       if (sum > 32767)
402 	 sum = 32767;
403       else if (sum < -32768)
404 	 sum = -32768;
405       *pcm = (short) sum;
406       pcm += 2;
407    }
408 }
409 /*--------------- 16 pt dual window (interleaved output) -----------------*/
i_window16_dual_right(WININT * vbuf,int vb_ptr,short * pcm)410 void i_window16_dual_right(WININT * vbuf, int vb_ptr, short *pcm)
411 {
412 /* right identical to dual, for asm */
413    int i, j;
414    unsigned char si, bx;
415    WINCOEF *coef;
416    INT32 sum;
417 
418 
419 /*-- first 8 --*/
420    si = (unsigned char) (vb_ptr + 8 + 3 * 32);
421    bx = (unsigned char) (si + (16 + 256 - 3 * 32 + 2 * 32));
422    coef = iwincoef;
423    for (i = 0; i < 8; i++)
424    {
425       sum = -WINMULT(vbuf[bx], (*coef++));
426       for (j = 0; j < 3; j++)
427       {
428 	 bx += 32;
429 	 sum += WINMULT(vbuf[si], (*coef++));
430 	 si += 32;
431 	 sum -= WINMULT(vbuf[bx], (*coef++));
432       }
433       si += (5 * 32 + 1);
434       bx += (32 + 4 * 32 - 1);
435       coef += 7;
436       sum >>= WINBITS;
437       if (sum > 32767)
438 	 sum = 32767;
439       else if (sum < -32768)
440 	 sum = -32768;
441       *pcm = (short) sum;
442       pcm += 2;
443    }
444 /*--  special case --*/
445    bx += (256 - 32);
446    sum = WINMULT(vbuf[bx], (*coef++));
447    for (j = 0; j < 3; j++)
448    {
449       bx += 32;
450       sum += WINMULT(vbuf[bx], (*coef++));
451    }
452    sum >>= WINBITS;
453    if (sum > 32767)
454       sum = 32767;
455    else if (sum < -32768)
456       sum = -32768;
457    *pcm = (short) sum;
458    pcm += 2;
459 
460 /*-- last 7 --*/
461    coef = iwincoef + (111 - 7);	/* back pass through coefs */
462    si += (256 + -3 * 32 + 2 * 32 - 1);
463    bx += (32 + 3 * 32 + 2 * 32 + 1);
464    for (i = 0; i < 7; i++)
465    {
466       sum = WINMULT(vbuf[si], (*coef--));
467       for (j = 0; j < 3; j++)
468       {
469 	 si += 32;
470 	 sum += WINMULT(vbuf[bx], (*coef--));
471 	 bx += 32;
472 	 sum += WINMULT(vbuf[si], (*coef--));
473       }
474       si += (32 - 1 + 4 * 32);
475       bx += (5 * 32 + 1);
476       coef -= 7;
477       sum >>= WINBITS;
478       if (sum > 32767)
479 	 sum = 32767;
480       else if (sum < -32768)
481 	 sum = -32768;
482       *pcm = (short) sum;
483       pcm += 2;
484    }
485 }
486 /*------------------------------------------------------------*/
487 /*------------------- 8 pt window ------------------------------*/
i_window8(WININT * vbuf,int vb_ptr,short * pcm)488 void i_window8(WININT * vbuf, int vb_ptr, short *pcm)
489 {
490    int i, j;
491    unsigned int si, bx;
492    WINCOEF *coef;
493    INT32 sum;
494 
495 /*-- first 4 --*/
496    si = (vb_ptr + (4 + 3 * 16)) & 127;
497    bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
498    coef = iwincoef;
499    for (i = 0; i < 4; i++)
500    {
501       sum = -WINMULT(vbuf[bx], (*coef++));
502       for (j = 0; j < 3; j++)
503       {
504 	 bx = (bx + 16) & 127;
505 	 sum += WINMULT(vbuf[si], (*coef++));
506 	 si = (si + 16) & 127;
507 	 sum -= WINMULT(vbuf[bx], (*coef++));
508       }
509       si = (si + (5 * 16 + 1)) & 127;
510       bx = (bx + (16 + 4 * 16 - 1)) & 127;
511       coef += (3 * 7);
512       sum >>= WINBITS;
513       if (sum > 32767)
514 	 sum = 32767;
515       else if (sum < -32768)
516 	 sum = -32768;
517       *pcm++ = (short) sum;
518    }
519 /*--  special case --*/
520    bx = (bx + (128 - 16)) & 127;
521    sum = WINMULT(vbuf[bx], (*coef++));
522    for (j = 0; j < 3; j++)
523    {
524       bx = (bx + 16) & 127;
525       sum += WINMULT(vbuf[bx], (*coef++));
526    }
527    sum >>= WINBITS;
528    if (sum > 32767)
529       sum = 32767;
530    else if (sum < -32768)
531       sum = -32768;
532    *pcm++ = (short) sum;
533 
534 /*-- last 3 --*/
535    coef = iwincoef + (111 - 3 * 7);	/* back pass through coefs */
536    si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
537    bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
538    for (i = 0; i < 3; i++)
539    {
540       sum = WINMULT(vbuf[si], (*coef--));
541       for (j = 0; j < 3; j++)
542       {
543 	 si = (si + 16) & 127;
544 	 sum += WINMULT(vbuf[bx], (*coef--));
545 	 bx = (bx + 16) & 127;
546 	 sum += WINMULT(vbuf[si], (*coef--));
547       }
548       si = (si + (16 - 1 + 4 * 16)) & 127;
549       bx = (bx + (5 * 16 + 1)) & 127;
550       coef -= (3 * 7);
551       sum >>= WINBITS;
552       if (sum > 32767)
553 	 sum = 32767;
554       else if (sum < -32768)
555 	 sum = -32768;
556       *pcm++ = (short) sum;
557    }
558 }
559 /*--------------- 8 pt dual window (interleaved output) --------------*/
i_window8_dual(WININT * vbuf,int vb_ptr,short * pcm)560 void i_window8_dual(WININT * vbuf, int vb_ptr, short *pcm)
561 {
562    int i, j;
563    unsigned int si, bx;
564    WINCOEF *coef;
565    INT32 sum;
566 
567 /*-- first 4 --*/
568    si = (vb_ptr + (4 + 3 * 16)) & 127;
569    bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
570    coef = iwincoef;
571    for (i = 0; i < 4; i++)
572    {
573       sum = -WINMULT(vbuf[bx], (*coef++));
574       for (j = 0; j < 3; j++)
575       {
576 	 bx = (bx + 16) & 127;
577 	 sum += WINMULT(vbuf[si], (*coef++));
578 	 si = (si + 16) & 127;
579 	 sum -= WINMULT(vbuf[bx], (*coef++));
580       }
581       si = (si + (5 * 16 + 1)) & 127;
582       bx = (bx + (16 + 4 * 16 - 1)) & 127;
583       coef += (3 * 7);
584       sum >>= WINBITS;
585       if (sum > 32767)
586 	 sum = 32767;
587       else if (sum < -32768)
588 	 sum = -32768;
589       *pcm = (short) sum;
590       pcm += 2;
591    }
592 /*--  special case --*/
593    bx = (bx + (128 - 16)) & 127;
594    sum = WINMULT(vbuf[bx], (*coef++));
595    for (j = 0; j < 3; j++)
596    {
597       bx = (bx + 16) & 127;
598       sum += WINMULT(vbuf[bx], (*coef++));
599    }
600    sum >>= WINBITS;
601    if (sum > 32767)
602       sum = 32767;
603    else if (sum < -32768)
604       sum = -32768;
605    *pcm = (short) sum;
606    pcm += 2;
607 
608 /*-- last 3 --*/
609    coef = iwincoef + (111 - 3 * 7);	/* back pass through coefs */
610    si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
611    bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
612    for (i = 0; i < 3; i++)
613    {
614       sum = WINMULT(vbuf[si], (*coef--));
615       for (j = 0; j < 3; j++)
616       {
617 	 si = (si + 16) & 127;
618 	 sum += WINMULT(vbuf[bx], (*coef--));
619 	 bx = (bx + 16) & 127;
620 	 sum += WINMULT(vbuf[si], (*coef--));
621       }
622       si = (si + (16 - 1 + 4 * 16)) & 127;
623       bx = (bx + (5 * 16 + 1)) & 127;
624       coef -= (3 * 7);
625       sum >>= WINBITS;
626       if (sum > 32767)
627 	 sum = 32767;
628       else if (sum < -32768)
629 	 sum = -32768;
630       *pcm = (short) sum;
631       pcm += 2;
632    }
633 }
634 /*------------------------------------------------------------*/
635 /*--------------- 8 pt dual window (interleaved output) --------------*/
i_window8_dual_right(WININT * vbuf,int vb_ptr,short * pcm)636 void i_window8_dual_right(WININT * vbuf, int vb_ptr, short *pcm)
637 {
638    int i, j;
639    unsigned int si, bx;
640    WINCOEF *coef;
641    INT32 sum;
642 
643 /* right identical to dual, for asm */
644 
645 /*-- first 4 --*/
646    si = (vb_ptr + (4 + 3 * 16)) & 127;
647    bx = (si + (8 + 128 - 3 * 16 + 2 * 16)) & 127;
648    coef = iwincoef;
649    for (i = 0; i < 4; i++)
650    {
651       sum = -WINMULT(vbuf[bx], (*coef++));
652       for (j = 0; j < 3; j++)
653       {
654 	 bx = (bx + 16) & 127;
655 	 sum += WINMULT(vbuf[si], (*coef++));
656 	 si = (si + 16) & 127;
657 	 sum -= WINMULT(vbuf[bx], (*coef++));
658       }
659       si = (si + (5 * 16 + 1)) & 127;
660       bx = (bx + (16 + 4 * 16 - 1)) & 127;
661       coef += (3 * 7);
662       sum >>= WINBITS;
663       if (sum > 32767)
664 	 sum = 32767;
665       else if (sum < -32768)
666 	 sum = -32768;
667       *pcm = (short) sum;
668       pcm += 2;
669    }
670 /*--  special case --*/
671    bx = (bx + (128 - 16)) & 127;
672    sum = WINMULT(vbuf[bx], (*coef++));
673    for (j = 0; j < 3; j++)
674    {
675       bx = (bx + 16) & 127;
676       sum += WINMULT(vbuf[bx], (*coef++));
677    }
678    sum >>= WINBITS;
679    if (sum > 32767)
680       sum = 32767;
681    else if (sum < -32768)
682       sum = -32768;
683    *pcm = (short) sum;
684    pcm += 2;
685 
686 /*-- last 3 --*/
687    coef = iwincoef + (111 - 3 * 7);	/* back pass through coefs */
688    si = (si + (128 - 3 * 16 + 2 * 16 - 1)) & 127;
689    bx = (bx + (16 + 3 * 16 + 2 * 16 + 1)) & 127;
690    for (i = 0; i < 3; i++)
691    {
692       sum = WINMULT(vbuf[si], (*coef--));
693       for (j = 0; j < 3; j++)
694       {
695 	 si = (si + 16) & 127;
696 	 sum += WINMULT(vbuf[bx], (*coef--));
697 	 bx = (bx + 16) & 127;
698 	 sum += WINMULT(vbuf[si], (*coef--));
699       }
700       si = (si + (16 - 1 + 4 * 16)) & 127;
701       bx = (bx + (5 * 16 + 1)) & 127;
702       coef -= (3 * 7);
703       sum >>= WINBITS;
704       if (sum > 32767)
705 	 sum = 32767;
706       else if (sum < -32768)
707 	 sum = -32768;
708       *pcm = (short) sum;
709       pcm += 2;
710    }
711 }
712 /*--------------------------------------------------------*/
713