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