Mercurial > audlegacy
comparison Plugins/Input/mpg123/decode_2to1.c @ 61:fa848bd484d8 trunk
[svn] Move plugins to Plugins/
author | nenolod |
---|---|
date | Fri, 28 Oct 2005 22:58:11 -0700 |
parents | |
children | 05d824e30afd |
comparison
equal
deleted
inserted
replaced
60:1771f253e1b2 | 61:fa848bd484d8 |
---|---|
1 | |
2 /* | |
3 * Mpeg Layer-1,2,3 audio decoder | |
4 * ------------------------------ | |
5 * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README' | |
6 * version for slower machines .. decodes only every second sample | |
7 * sounds like 24000,22050 or 16000 kHz .. (depending on original sample freq.) | |
8 * | |
9 */ | |
10 | |
11 #include <stdlib.h> | |
12 #include <math.h> | |
13 #include <string.h> | |
14 | |
15 #include "mpg123.h" | |
16 | |
17 #define WRITE_SAMPLE(samples,sum,clip) \ | |
18 if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ | |
19 else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ | |
20 else { *(samples) = sum; } | |
21 | |
22 int | |
23 mpg123_synth_2to1_8bit(real * bandPtr, int channel, | |
24 unsigned char *samples, int *pnt) | |
25 { | |
26 short samples_tmp[32]; | |
27 short *tmp1 = samples_tmp + channel; | |
28 int i, ret; | |
29 int pnt1 = 0; | |
30 | |
31 ret = | |
32 mpg123_synth_2to1(bandPtr, channel, (unsigned char *) samples_tmp, | |
33 &pnt1); | |
34 samples += channel + *pnt; | |
35 | |
36 for (i = 0; i < 16; i++) { | |
37 *samples = (*tmp1 >> 8) ^ 128; | |
38 samples += 2; | |
39 tmp1 += 2; | |
40 } | |
41 *pnt += 32; | |
42 | |
43 return ret; | |
44 } | |
45 | |
46 int | |
47 mpg123_synth_2to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt) | |
48 { | |
49 short samples_tmp[32]; | |
50 short *tmp1 = samples_tmp; | |
51 int i, ret; | |
52 int pnt1 = 0; | |
53 | |
54 ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); | |
55 samples += *pnt; | |
56 | |
57 for (i = 0; i < 16; i++) { | |
58 *samples++ = (*tmp1 >> 8) ^ 128; | |
59 tmp1 += 2; | |
60 } | |
61 *pnt += 16; | |
62 | |
63 return ret; | |
64 } | |
65 | |
66 #if 0 | |
67 int | |
68 mpg123_synth_2to1_8bit_mono2stereo(real * bandPtr, | |
69 unsigned char *samples, int *pnt) | |
70 { | |
71 short samples_tmp[32]; | |
72 short *tmp1 = samples_tmp; | |
73 int i, ret; | |
74 int pnt1 = 0; | |
75 | |
76 ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); | |
77 samples += *pnt; | |
78 | |
79 for (i = 0; i < 16; i++) { | |
80 *samples++ = (*tmp1 >> 8) ^ 128; | |
81 *samples++ = (*tmp1 >> 8) ^ 128; | |
82 tmp1 += 2; | |
83 } | |
84 *pnt += 32; | |
85 | |
86 return ret; | |
87 } | |
88 #endif | |
89 | |
90 int | |
91 mpg123_synth_2to1_mono(real * bandPtr, unsigned char *samples, int *pnt) | |
92 { | |
93 short samples_tmp[32]; | |
94 short *tmp1 = samples_tmp; | |
95 int i, ret; | |
96 int pnt1 = 0; | |
97 | |
98 ret = mpg123_synth_2to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); | |
99 samples += *pnt; | |
100 | |
101 for (i = 0; i < 16; i++) { | |
102 *((short *) samples) = *tmp1; | |
103 samples += 2; | |
104 tmp1 += 2; | |
105 } | |
106 *pnt += 32; | |
107 | |
108 return ret; | |
109 } | |
110 | |
111 #if 0 | |
112 int | |
113 mpg123_synth_2to1_mono2stereo(real * bandPtr, unsigned char *samples, | |
114 int *pnt) | |
115 { | |
116 int i, ret; | |
117 | |
118 ret = mpg123_synth_2to1(bandPtr, 0, samples, pnt); | |
119 samples = samples + *pnt - 64; | |
120 | |
121 for (i = 0; i < 16; i++) { | |
122 ((short *) samples)[1] = ((short *) samples)[0]; | |
123 samples += 4; | |
124 } | |
125 | |
126 return ret; | |
127 } | |
128 #endif | |
129 | |
130 int | |
131 mpg123_synth_2to1(real * bandPtr, int channel, unsigned char *out, int *pnt) | |
132 { | |
133 static real buffs[2][2][0x110]; | |
134 static const int step = 2; | |
135 static int bo = 1; | |
136 short *samples = (short *) (out + *pnt); | |
137 | |
138 real *b0, (*buf)[0x110]; | |
139 int clip = 0; | |
140 int bo1; | |
141 | |
142 /* if(param.equalizer) | |
143 do_equalizer(bandPtr,channel); */ | |
144 | |
145 if (!channel) { | |
146 bo--; | |
147 bo &= 0xf; | |
148 buf = buffs[0]; | |
149 } | |
150 else { | |
151 samples++; | |
152 buf = buffs[1]; | |
153 } | |
154 | |
155 if (bo & 0x1) { | |
156 b0 = buf[0]; | |
157 bo1 = bo; | |
158 mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr); | |
159 } | |
160 else { | |
161 b0 = buf[1]; | |
162 bo1 = bo + 1; | |
163 mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr); | |
164 } | |
165 | |
166 { | |
167 register int j; | |
168 real *window = mpg123_decwin + 16 - bo1; | |
169 | |
170 for (j = 8; j; j--, b0 += 0x10, window += 0x30) { | |
171 real sum; | |
172 | |
173 sum = *window++ * *b0++; | |
174 sum -= *window++ * *b0++; | |
175 sum += *window++ * *b0++; | |
176 sum -= *window++ * *b0++; | |
177 sum += *window++ * *b0++; | |
178 sum -= *window++ * *b0++; | |
179 sum += *window++ * *b0++; | |
180 sum -= *window++ * *b0++; | |
181 sum += *window++ * *b0++; | |
182 sum -= *window++ * *b0++; | |
183 sum += *window++ * *b0++; | |
184 sum -= *window++ * *b0++; | |
185 sum += *window++ * *b0++; | |
186 sum -= *window++ * *b0++; | |
187 sum += *window++ * *b0++; | |
188 sum -= *window++ * *b0++; | |
189 | |
190 WRITE_SAMPLE(samples, sum, clip); | |
191 samples += step; | |
192 #if 0 | |
193 WRITE_SAMPLE(samples, sum, clip); | |
194 samples += step; | |
195 #endif | |
196 } | |
197 | |
198 { | |
199 real sum; | |
200 | |
201 sum = window[0x0] * b0[0x0]; | |
202 sum += window[0x2] * b0[0x2]; | |
203 sum += window[0x4] * b0[0x4]; | |
204 sum += window[0x6] * b0[0x6]; | |
205 sum += window[0x8] * b0[0x8]; | |
206 sum += window[0xA] * b0[0xA]; | |
207 sum += window[0xC] * b0[0xC]; | |
208 sum += window[0xE] * b0[0xE]; | |
209 WRITE_SAMPLE(samples, sum, clip); | |
210 samples += step; | |
211 #if 0 | |
212 WRITE_SAMPLE(samples, sum, clip); | |
213 samples += step; | |
214 #endif | |
215 b0 -= 0x20, window -= 0x40; | |
216 } | |
217 window += bo1 << 1; | |
218 | |
219 for (j = 7; j; j--, b0 -= 0x30, window -= 0x30) { | |
220 real sum; | |
221 | |
222 sum = -*(--window) * *b0++; | |
223 sum -= *(--window) * *b0++; | |
224 sum -= *(--window) * *b0++; | |
225 sum -= *(--window) * *b0++; | |
226 sum -= *(--window) * *b0++; | |
227 sum -= *(--window) * *b0++; | |
228 sum -= *(--window) * *b0++; | |
229 sum -= *(--window) * *b0++; | |
230 sum -= *(--window) * *b0++; | |
231 sum -= *(--window) * *b0++; | |
232 sum -= *(--window) * *b0++; | |
233 sum -= *(--window) * *b0++; | |
234 sum -= *(--window) * *b0++; | |
235 sum -= *(--window) * *b0++; | |
236 sum -= *(--window) * *b0++; | |
237 sum -= *(--window) * *b0++; | |
238 | |
239 WRITE_SAMPLE(samples, sum, clip); | |
240 samples += step; | |
241 #if 0 | |
242 WRITE_SAMPLE(samples, sum, clip); | |
243 samples += step; | |
244 #endif | |
245 } | |
246 } | |
247 | |
248 *pnt += 64; | |
249 | |
250 return clip; | |
251 } |