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 }