www.pudn.com > mediator15src.zip > decode.c
/*
* Mpeg Layer-1,2,3 audio decoder
* ------------------------------
* copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
* See also 'README'
*
*/
#include "mpg123.h"
#define WRITE_SAMPLE(samples,sum) \
if( (sum) > 32767.0) { *(samples) = 0x7fff; } \
else if( (sum) < -32768.0) { *(samples) = -0x8000; } \
else { *(samples) = (short)sum; }
void synth_1to1_mono(float *bandPtr, unsigned char *samples, int *pnt)
{
short samples_tmp[64];
short *tmp1 = samples_tmp;
int i;
int pnt1 = 0;
synth_1to1(bandPtr, 0, (unsigned char *)samples_tmp, &pnt1);
samples += *pnt;
for(i = 0; i < 32; i++) {
*((short *)samples) = *tmp1;
samples += 2;
tmp1 += 2;
}
*pnt += 64;
return;
}
int bo;
void synth_1to1(float *bandPtr, int channel, unsigned char *out, int *pnt)
{
static float buffs[2][2][0x110];
static const int step = 2;
short *samples = (short *)(out + *pnt);
float *b0, (*buf)[0x110];
int bo1;
if(!channel) {
bo--;
bo &= 0xf;
buf = buffs[0];
}
else {
samples++;
buf = buffs[1];
}
if (bo & 0x1) {
b0 = buf[0];
bo1 = bo;
dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr);
}
else {
b0 = buf[1];
bo1 = bo + 1;
dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr);
}
{
register int j;
float *window = decwin + 16 - bo1;
for (j = 16; j; j--, window += 0x10, samples += step)
{
float sum;
sum = *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
sum += *window++ * *b0++;
sum -= *window++ * *b0++;
WRITE_SAMPLE(samples, sum);
}
{
float sum;
sum = window[0x0] * b0[0x0];
sum += window[0x2] * b0[0x2];
sum += window[0x4] * b0[0x4];
sum += window[0x6] * b0[0x6];
sum += window[0x8] * b0[0x8];
sum += window[0xA] * b0[0xA];
sum += window[0xC] * b0[0xC];
sum += window[0xE] * b0[0xE];
WRITE_SAMPLE(samples, sum);
b0 -= 0x10, window -= 0x20, samples += step;
}
window += bo1 << 1;
for (j = 15; j; j--, b0 -= 0x20, window -= 0x10, samples += step)
{
float sum;
sum = -*(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
sum -= *(--window) * *b0++;
WRITE_SAMPLE(samples, sum);
}
}
*pnt += 128;
return;
}