2
* Mpeg Layer-1,2,3 audio decoder
3
* ------------------------------
4
* copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
6
* version for slower machines .. decodes only every fourth sample
7
* dunno why it sounds THIS annoying (maybe we should adapt the window?)
8
* absolutely not optimized for this operation
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; }
22
int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
24
short samples_tmp[16];
25
short *tmp1 = samples_tmp + channel;
29
ret = synth_4to1(bandPtr,channel,(unsigned char *) samples_tmp,&pnt1);
30
samples += channel + *pnt;
33
*samples = conv16to8[*tmp1>>AUSHIFT];
42
int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
44
short samples_tmp[16];
45
short *tmp1 = samples_tmp;
49
ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
53
*samples++ = conv16to8[*tmp1>>AUSHIFT];
62
int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
64
short samples_tmp[16];
65
short *tmp1 = samples_tmp;
69
ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
73
*samples++ = conv16to8[*tmp1>>AUSHIFT];
74
*samples++ = conv16to8[*tmp1>>AUSHIFT];
82
int synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
84
short samples_tmp[16];
85
short *tmp1 = samples_tmp;
89
ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
93
*( (short *)samples) = *tmp1;
102
int synth_4to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
106
ret = synth_4to1(bandPtr,0,samples,pnt);
107
samples = samples + *pnt - 32;
110
((short *)samples)[1] = ((short *)samples)[0];
117
int synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
119
static real buffs[2][2][0x110];
120
static const int step = 2;
122
short *samples = (short *) (out + *pnt);
124
real *b0,(*buf)[0x110];
129
do_equalizer(bandPtr,channel);
144
dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
149
dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
154
real *window = decwin + 16 - bo1;
156
for (j=4;j;j--,b0+=0x30,window+=0x70)
159
sum = *window++ * *b0++;
160
sum -= *window++ * *b0++;
161
sum += *window++ * *b0++;
162
sum -= *window++ * *b0++;
163
sum += *window++ * *b0++;
164
sum -= *window++ * *b0++;
165
sum += *window++ * *b0++;
166
sum -= *window++ * *b0++;
167
sum += *window++ * *b0++;
168
sum -= *window++ * *b0++;
169
sum += *window++ * *b0++;
170
sum -= *window++ * *b0++;
171
sum += *window++ * *b0++;
172
sum -= *window++ * *b0++;
173
sum += *window++ * *b0++;
174
sum -= *window++ * *b0++;
176
WRITE_SAMPLE(samples,sum,clip); samples += step;
178
WRITE_SAMPLE(samples,sum,clip); samples += step;
179
WRITE_SAMPLE(samples,sum,clip); samples += step;
180
WRITE_SAMPLE(samples,sum,clip); samples += step;
186
sum = window[0x0] * b0[0x0];
187
sum += window[0x2] * b0[0x2];
188
sum += window[0x4] * b0[0x4];
189
sum += window[0x6] * b0[0x6];
190
sum += window[0x8] * b0[0x8];
191
sum += window[0xA] * b0[0xA];
192
sum += window[0xC] * b0[0xC];
193
sum += window[0xE] * b0[0xE];
194
WRITE_SAMPLE(samples,sum,clip); samples += step;
196
WRITE_SAMPLE(samples,sum,clip); samples += step;
197
WRITE_SAMPLE(samples,sum,clip); samples += step;
198
WRITE_SAMPLE(samples,sum,clip); samples += step;
200
b0-=0x40,window-=0x80;
204
for (j=3;j;j--,b0-=0x50,window-=0x70)
207
sum = -*(--window) * *b0++;
208
sum -= *(--window) * *b0++;
209
sum -= *(--window) * *b0++;
210
sum -= *(--window) * *b0++;
211
sum -= *(--window) * *b0++;
212
sum -= *(--window) * *b0++;
213
sum -= *(--window) * *b0++;
214
sum -= *(--window) * *b0++;
215
sum -= *(--window) * *b0++;
216
sum -= *(--window) * *b0++;
217
sum -= *(--window) * *b0++;
218
sum -= *(--window) * *b0++;
219
sum -= *(--window) * *b0++;
220
sum -= *(--window) * *b0++;
221
sum -= *(--window) * *b0++;
222
sum -= *(--window) * *b0++;
224
WRITE_SAMPLE(samples,sum,clip); samples += step;
226
WRITE_SAMPLE(samples,sum,clip); samples += step;
227
WRITE_SAMPLE(samples,sum,clip); samples += step;
228
WRITE_SAMPLE(samples,sum,clip); samples += step;