Version 0.1.1 from FTP
[asterisk/asterisk.git] / codecs / mp3 / src / cwinb.c
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-1999 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$
25 ____________________________________________________________________________*/
26
27 /****  cwin.c  ***************************************************
28
29 include to cwinm.c
30
31 MPEG audio decoder, float window routines - 8 bit output
32 portable C
33
34 ******************************************************************/
35 /*-------------------------------------------------------------------------*/
36
37
38 #ifdef ASM_X86
39 extern void windowB_asm(float *a, int b, unsigned char *c);
40 extern void windowB_dual_asm(float *a, int b, unsigned char *c);
41 extern void windowB16_asm(float *a, int b, unsigned char *c);
42 extern void windowB16_dual_asm(float *a, int b, unsigned char *c);
43 extern void windowB8_asm(float *a, int b, unsigned char *c);
44 extern void windowB8_dual_asm(float *a, int b, unsigned char *c);
45 #endif /* ASM_X86 */
46
47 void windowB(float *vbuf, int vb_ptr, unsigned char *pcm)
48 {
49 #ifdef ASM_X86
50    windowB_asm(vbuf, vb_ptr, pcm);
51 #else
52    int i, j;
53    int si, bx;
54    float *coef;
55    float sum;
56    long tmp;
57
58    si = vb_ptr + 16;
59    bx = (si + 32) & 511;
60    coef = wincoef;
61
62 /*-- first 16 --*/
63    for (i = 0; i < 16; i++)
64    {
65       sum = 0.0F;
66       for (j = 0; j < 8; j++)
67       {
68          sum += (*coef++) * vbuf[si];
69          si = (si + 64) & 511;
70          sum -= (*coef++) * vbuf[bx];
71          bx = (bx + 64) & 511;
72       }
73       si++;
74       bx--;
75       tmp = (long) sum;
76       if (tmp > 32767)
77          tmp = 32767;
78       else if (tmp < -32768)
79          tmp = -32768;
80       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
81    }
82 /*--  special case --*/
83    sum = 0.0F;
84    for (j = 0; j < 8; j++)
85    {
86       sum += (*coef++) * vbuf[bx];
87       bx = (bx + 64) & 511;
88    }
89    tmp = (long) sum;
90    if (tmp > 32767)
91       tmp = 32767;
92    else if (tmp < -32768)
93       tmp = -32768;
94    *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
95 /*-- last 15 --*/
96    coef = wincoef + 255;        /* back pass through coefs */
97    for (i = 0; i < 15; i++)
98    {
99       si--;
100       bx++;
101       sum = 0.0F;
102       for (j = 0; j < 8; j++)
103       {
104          sum += (*coef--) * vbuf[si];
105          si = (si + 64) & 511;
106          sum += (*coef--) * vbuf[bx];
107          bx = (bx + 64) & 511;
108       }
109       tmp = (long) sum;
110       if (tmp > 32767)
111          tmp = 32767;
112       else if (tmp < -32768)
113          tmp = -32768;
114       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
115    }
116 #endif
117 }
118 /*------------------------------------------------------------*/
119 void windowB_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
120 {
121 #ifdef ASM_X86
122    windowB_dual_asm(vbuf, vb_ptr, pcm);
123 #else
124    int i, j;                    /* dual window interleaves output */
125    int si, bx;
126    float *coef;
127    float sum;
128    long tmp;
129
130    si = vb_ptr + 16;
131    bx = (si + 32) & 511;
132    coef = wincoef;
133
134 /*-- first 16 --*/
135    for (i = 0; i < 16; i++)
136    {
137       sum = 0.0F;
138       for (j = 0; j < 8; j++)
139       {
140          sum += (*coef++) * vbuf[si];
141          si = (si + 64) & 511;
142          sum -= (*coef++) * vbuf[bx];
143          bx = (bx + 64) & 511;
144       }
145       si++;
146       bx--;
147       tmp = (long) sum;
148       if (tmp > 32767)
149          tmp = 32767;
150       else if (tmp < -32768)
151          tmp = -32768;
152       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
153       pcm += 2;
154    }
155 /*--  special case --*/
156    sum = 0.0F;
157    for (j = 0; j < 8; j++)
158    {
159       sum += (*coef++) * vbuf[bx];
160       bx = (bx + 64) & 511;
161    }
162    tmp = (long) sum;
163    if (tmp > 32767)
164       tmp = 32767;
165    else if (tmp < -32768)
166       tmp = -32768;
167    *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
168    pcm += 2;
169 /*-- last 15 --*/
170    coef = wincoef + 255;        /* back pass through coefs */
171    for (i = 0; i < 15; i++)
172    {
173       si--;
174       bx++;
175       sum = 0.0F;
176       for (j = 0; j < 8; j++)
177       {
178          sum += (*coef--) * vbuf[si];
179          si = (si + 64) & 511;
180          sum += (*coef--) * vbuf[bx];
181          bx = (bx + 64) & 511;
182       }
183       tmp = (long) sum;
184       if (tmp > 32767)
185          tmp = 32767;
186       else if (tmp < -32768)
187          tmp = -32768;
188       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
189       pcm += 2;
190    }
191 #endif
192 }
193 /*------------------------------------------------------------*/
194 /*------------------- 16 pt window ------------------------------*/
195 void windowB16(float *vbuf, int vb_ptr, unsigned char *pcm)
196 {
197 #ifdef ASM_X86
198    windowB16_asm(vbuf, vb_ptr, pcm);
199 #else
200    int i, j;
201    unsigned char si, bx;
202    float *coef;
203    float sum;
204    long tmp;
205
206    si = vb_ptr + 8;
207    bx = si + 16;
208    coef = wincoef;
209
210 /*-- first 8 --*/
211    for (i = 0; i < 8; i++)
212    {
213       sum = 0.0F;
214       for (j = 0; j < 8; j++)
215       {
216          sum += (*coef++) * vbuf[si];
217          si += 32;
218          sum -= (*coef++) * vbuf[bx];
219          bx += 32;
220       }
221       si++;
222       bx--;
223       coef += 16;
224       tmp = (long) sum;
225       if (tmp > 32767)
226          tmp = 32767;
227       else if (tmp < -32768)
228          tmp = -32768;
229       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
230    }
231 /*--  special case --*/
232    sum = 0.0F;
233    for (j = 0; j < 8; j++)
234    {
235       sum += (*coef++) * vbuf[bx];
236       bx += 32;
237    }
238    tmp = (long) sum;
239    if (tmp > 32767)
240       tmp = 32767;
241    else if (tmp < -32768)
242       tmp = -32768;
243    *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
244 /*-- last 7 --*/
245    coef = wincoef + 255;        /* back pass through coefs */
246    for (i = 0; i < 7; i++)
247    {
248       coef -= 16;
249       si--;
250       bx++;
251       sum = 0.0F;
252       for (j = 0; j < 8; j++)
253       {
254          sum += (*coef--) * vbuf[si];
255          si += 32;
256          sum += (*coef--) * vbuf[bx];
257          bx += 32;
258       }
259       tmp = (long) sum;
260       if (tmp > 32767)
261          tmp = 32767;
262       else if (tmp < -32768)
263          tmp = -32768;
264       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
265    }
266 #endif
267 }
268 /*--------------- 16 pt dual window (interleaved output) -----------------*/
269 void windowB16_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
270 {
271 #ifdef ASM_X86
272    windowB16_dual_asm(vbuf, vb_ptr, pcm);
273 #else
274    int i, j;
275    unsigned char si, bx;
276    float *coef;
277    float sum;
278    long tmp;
279
280    si = vb_ptr + 8;
281    bx = si + 16;
282    coef = wincoef;
283
284 /*-- first 8 --*/
285    for (i = 0; i < 8; i++)
286    {
287       sum = 0.0F;
288       for (j = 0; j < 8; j++)
289       {
290          sum += (*coef++) * vbuf[si];
291          si += 32;
292          sum -= (*coef++) * vbuf[bx];
293          bx += 32;
294       }
295       si++;
296       bx--;
297       coef += 16;
298       tmp = (long) sum;
299       if (tmp > 32767)
300          tmp = 32767;
301       else if (tmp < -32768)
302          tmp = -32768;
303       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
304       pcm += 2;
305    }
306 /*--  special case --*/
307    sum = 0.0F;
308    for (j = 0; j < 8; j++)
309    {
310       sum += (*coef++) * vbuf[bx];
311       bx += 32;
312    }
313    tmp = (long) sum;
314    if (tmp > 32767)
315       tmp = 32767;
316    else if (tmp < -32768)
317       tmp = -32768;
318    *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
319    pcm += 2;
320 /*-- last 7 --*/
321    coef = wincoef + 255;        /* back pass through coefs */
322    for (i = 0; i < 7; i++)
323    {
324       coef -= 16;
325       si--;
326       bx++;
327       sum = 0.0F;
328       for (j = 0; j < 8; j++)
329       {
330          sum += (*coef--) * vbuf[si];
331          si += 32;
332          sum += (*coef--) * vbuf[bx];
333          bx += 32;
334       }
335       tmp = (long) sum;
336       if (tmp > 32767)
337          tmp = 32767;
338       else if (tmp < -32768)
339          tmp = -32768;
340       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
341       pcm += 2;
342    }
343 #endif
344 }
345 /*------------------- 8 pt window ------------------------------*/
346 void windowB8(float *vbuf, int vb_ptr, unsigned char *pcm)
347 {
348 #ifdef ASM_X86
349    windowB8_asm(vbuf, vb_ptr, pcm);
350 #else
351    int i, j;
352    int si, bx;
353    float *coef;
354    float sum;
355    long tmp;
356
357    si = vb_ptr + 4;
358    bx = (si + 8) & 127;
359    coef = wincoef;
360
361 /*-- first 4 --*/
362    for (i = 0; i < 4; i++)
363    {
364       sum = 0.0F;
365       for (j = 0; j < 8; j++)
366       {
367          sum += (*coef++) * vbuf[si];
368          si = (si + 16) & 127;
369          sum -= (*coef++) * vbuf[bx];
370          bx = (bx + 16) & 127;
371       }
372       si++;
373       bx--;
374       coef += 48;
375       tmp = (long) sum;
376       if (tmp > 32767)
377          tmp = 32767;
378       else if (tmp < -32768)
379          tmp = -32768;
380       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
381    }
382 /*--  special case --*/
383    sum = 0.0F;
384    for (j = 0; j < 8; j++)
385    {
386       sum += (*coef++) * vbuf[bx];
387       bx = (bx + 16) & 127;
388    }
389    tmp = (long) sum;
390    if (tmp > 32767)
391       tmp = 32767;
392    else if (tmp < -32768)
393       tmp = -32768;
394    *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
395 /*-- last 3 --*/
396    coef = wincoef + 255;        /* back pass through coefs */
397    for (i = 0; i < 3; i++)
398    {
399       coef -= 48;
400       si--;
401       bx++;
402       sum = 0.0F;
403       for (j = 0; j < 8; j++)
404       {
405          sum += (*coef--) * vbuf[si];
406          si = (si + 16) & 127;
407          sum += (*coef--) * vbuf[bx];
408          bx = (bx + 16) & 127;
409       }
410       tmp = (long) sum;
411       if (tmp > 32767)
412          tmp = 32767;
413       else if (tmp < -32768)
414          tmp = -32768;
415       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
416    }
417 #endif
418 }
419 /*--------------- 8 pt dual window (interleaved output) -----------------*/
420 void windowB8_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
421 {
422 #ifdef ASM_X86
423    windowB8_dual_asm(vbuf, vb_ptr, pcm);
424 #else
425    int i, j;
426    int si, bx;
427    float *coef;
428    float sum;
429    long tmp;
430
431    si = vb_ptr + 4;
432    bx = (si + 8) & 127;
433    coef = wincoef;
434
435 /*-- first 4 --*/
436    for (i = 0; i < 4; i++)
437    {
438       sum = 0.0F;
439       for (j = 0; j < 8; j++)
440       {
441          sum += (*coef++) * vbuf[si];
442          si = (si + 16) & 127;
443          sum -= (*coef++) * vbuf[bx];
444          bx = (bx + 16) & 127;
445       }
446       si++;
447       bx--;
448       coef += 48;
449       tmp = (long) sum;
450       if (tmp > 32767)
451          tmp = 32767;
452       else if (tmp < -32768)
453          tmp = -32768;
454       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
455       pcm += 2;
456    }
457 /*--  special case --*/
458    sum = 0.0F;
459    for (j = 0; j < 8; j++)
460    {
461       sum += (*coef++) * vbuf[bx];
462       bx = (bx + 16) & 127;
463    }
464    tmp = (long) sum;
465    if (tmp > 32767)
466       tmp = 32767;
467    else if (tmp < -32768)
468       tmp = -32768;
469    *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
470    pcm += 2;
471 /*-- last 3 --*/
472    coef = wincoef + 255;        /* back pass through coefs */
473    for (i = 0; i < 3; i++)
474    {
475       coef -= 48;
476       si--;
477       bx++;
478       sum = 0.0F;
479       for (j = 0; j < 8; j++)
480       {
481          sum += (*coef--) * vbuf[si];
482          si = (si + 16) & 127;
483          sum += (*coef--) * vbuf[bx];
484          bx = (bx + 16) & 127;
485       }
486       tmp = (long) sum;
487       if (tmp > 32767)
488          tmp = 32767;
489       else if (tmp < -32768)
490          tmp = -32768;
491       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
492       pcm += 2;
493    }
494 #endif
495 }
496 /*------------------------------------------------------------*/