Version 0.1.1 from FTP
[asterisk/asterisk.git] / codecs / mp3 / src / csbtb.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 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 /****  csbtb.c  ***************************************************
28 include to csbt.c
29
30 MPEG audio decoder, dct and window - byte (8 pcm bit output)
31 portable C
32
33 ******************************************************************/
34 /*============================================================*/
35 /*============================================================*/
36 void windowB(MPEG *m, float *, int , unsigned char *pcm);
37 void windowB_dual(MPEG *m, float *, int , unsigned char *pcm);
38 void windowB16(MPEG *m, float *, int , unsigned char *pcm);
39 void windowB16_dual(MPEG *m, float *, int , unsigned char *pcm);
40 void windowB8(MPEG *m, float *, int , unsigned char *pcm);
41 void windowB8_dual(MPEG *m, float *, int , unsigned char *pcm);
42
43 /*============================================================*/
44 void sbtB_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
45 {
46    int i;
47
48    for (i = 0; i < n; i++)
49    {
50       fdct32(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
51       windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
52       sample += 64;
53       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
54       pcm += 32;
55    }
56
57 }
58 /*------------------------------------------------------------*/
59 void sbtB_dual(MPEG *m, float *sample, unsigned char *pcm, int n)
60 {
61    int i;
62
63    for (i = 0; i < n; i++)
64    {
65       fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
66       fdct32_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
67       windowB_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
68       windowB_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
69       sample += 64;
70       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
71       pcm += 64;
72    }
73
74
75 }
76 /*------------------------------------------------------------*/
77 /* convert dual to mono */
78 void sbtB_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
79 {
80    int i;
81
82    for (i = 0; i < n; i++)
83    {
84       fdct32_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
85       windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
86       sample += 64;
87       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
88       pcm += 32;
89    }
90
91 }
92 /*------------------------------------------------------------*/
93 /* convert dual to left */
94 void sbtB_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n)
95 {
96    int i;
97
98    for (i = 0; i < n; i++)
99    {
100       fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
101       windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
102       sample += 64;
103       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
104       pcm += 32;
105    }
106 }
107 /*------------------------------------------------------------*/
108 /* convert dual to right */
109 void sbtB_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n)
110 {
111    int i;
112
113    sample++;                    /* point to right chan */
114    for (i = 0; i < n; i++)
115    {
116       fdct32_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
117       windowB(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
118       sample += 64;
119       m->csbt.vb_ptr = (m->csbt.vb_ptr - 32) & 511;
120       pcm += 32;
121    }
122 }
123 /*------------------------------------------------------------*/
124 /*---------------- 16 pt sbt's  -------------------------------*/
125 /*------------------------------------------------------------*/
126 void sbtB16_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
127 {
128    int i;
129
130    for (i = 0; i < n; i++)
131    {
132       fdct16(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
133       windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
134       sample += 64;
135       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
136       pcm += 16;
137    }
138
139
140 }
141 /*------------------------------------------------------------*/
142 void sbtB16_dual(MPEG *m, float *sample, unsigned char *pcm, int n)
143 {
144    int i;
145
146    for (i = 0; i < n; i++)
147    {
148       fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
149       fdct16_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
150       windowB16_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
151       windowB16_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
152       sample += 64;
153       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
154       pcm += 32;
155    }
156 }
157 /*------------------------------------------------------------*/
158 void sbtB16_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
159 {
160    int i;
161
162    for (i = 0; i < n; i++)
163    {
164       fdct16_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
165       windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
166       sample += 64;
167       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
168       pcm += 16;
169    }
170 }
171 /*------------------------------------------------------------*/
172 void sbtB16_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n)
173 {
174    int i;
175
176    for (i = 0; i < n; i++)
177    {
178       fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
179       windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
180       sample += 64;
181       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
182       pcm += 16;
183    }
184 }
185 /*------------------------------------------------------------*/
186 void sbtB16_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n)
187 {
188    int i;
189
190    sample++;
191    for (i = 0; i < n; i++)
192    {
193       fdct16_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
194       windowB16(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
195       sample += 64;
196       m->csbt.vb_ptr = (m->csbt.vb_ptr - 16) & 255;
197       pcm += 16;
198    }
199 }
200 /*------------------------------------------------------------*/
201 /*---------------- 8 pt sbt's  -------------------------------*/
202 /*------------------------------------------------------------*/
203 void sbtB8_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
204 {
205    int i;
206
207    for (i = 0; i < n; i++)
208    {
209       fdct8(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
210       windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
211       sample += 64;
212       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
213       pcm += 8;
214    }
215
216 }
217 /*------------------------------------------------------------*/
218 void sbtB8_dual(MPEG *m, float *sample, unsigned char *pcm, int n)
219 {
220    int i;
221
222    for (i = 0; i < n; i++)
223    {
224       fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
225       fdct8_dual(m,sample + 1, m->csbt.vbuf2 + m->csbt.vb_ptr);
226       windowB8_dual(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
227       windowB8_dual(m,m->csbt.vbuf2, m->csbt.vb_ptr, pcm + 1);
228       sample += 64;
229       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
230       pcm += 16;
231    }
232 }
233 /*------------------------------------------------------------*/
234 void sbtB8_dual_mono(MPEG *m, float *sample, unsigned char *pcm, int n)
235 {
236    int i;
237
238    for (i = 0; i < n; i++)
239    {
240       fdct8_dual_mono(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
241       windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
242       sample += 64;
243       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
244       pcm += 8;
245    }
246 }
247 /*------------------------------------------------------------*/
248 void sbtB8_dual_left(MPEG *m, float *sample, unsigned char *pcm, int n)
249 {
250    int i;
251
252    for (i = 0; i < n; i++)
253    {
254       fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
255       windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
256       sample += 64;
257       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
258       pcm += 8;
259    }
260 }
261 /*------------------------------------------------------------*/
262 void sbtB8_dual_right(MPEG *m, float *sample, unsigned char *pcm, int n)
263 {
264    int i;
265
266    sample++;
267    for (i = 0; i < n; i++)
268    {
269       fdct8_dual(m,sample, m->csbt.vbuf + m->csbt.vb_ptr);
270       windowB8(m,m->csbt.vbuf, m->csbt.vb_ptr, pcm);
271       sample += 64;
272       m->csbt.vb_ptr = (m->csbt.vb_ptr - 8) & 127;
273       pcm += 8;
274    }
275 }
276 /*------------------------------------------------------------*/