61
|
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 }
|