📄 decode.c
字号:
/*
* $Id: decode.c,v 1.1.1.1 2004/12/22 10:02:27 zyu Exp $
*/
/*
* Mpeg Layer-1,2,3 audio decoder
* ------------------------------
* copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
* See also 'README'
*
*/
#include "mpg123.h"
#include "mpglib.h"
/*
#define WRITE_SAMPLE(samples,sum,clip) \
{ \
if( (sum) > 32767) { stmp = 0x7fff; (clip)++; } \
else if( (sum) < -32768) { stmp = -0x8000; (clip)++; } \
else { stmp = sum; } \
ctmp = (unsigned char *)(samples); \
*ctmp++ = (stmp>>8)&0xff; \
*ctmp = (stmp)&0xff; \
}
*/
#define WRITE_SAMPLE(samples,sum,clip) \
{ \
ctmp = (unsigned char *)(samples); \
*ctmp++ = (sum>>8)&0xff; \
*ctmp = (sum)&0xff; \
}
/*
#define WRITE_SAMPLE(samples,sum,clip) \
*samples = sum;
*/
/*
* Modified by DSA 2003.11.11 ok
*/
#define MMA_CALC(vout,vin1,vin2,mode) *mmabufxar = (int)(vin1);\
*mmabufzar = (int)(vout);\
*mmamoder = ((mode) & ~0x3ff) | (((int)(vin2) >> 2) & 0x3ff);
/*void MMA_CALC(real *vout, real *vin1, real *vin2, int mode)
{
*mmabufxar = (int)(vin1);
*mmabufzar = (int)(vout);
*mmamoder = ((mode) & ~0x3ff) | (((int)(vin2) >> 2) & 0x3ff);
}*/
int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
{
short samples_tmp[64];
short *tmp1 = samples_tmp;
int i,ret;
int pnt1 = 0;
ret = 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 ret;
}
#if 0
int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
{
register const int step = 2;
int bo;
short *samples = (short *) (out + *pnt);
unsigned char *ctmp;
real bufs[0x40];
real *b1 = bufs;
real *b2 = &bufs[0x20];
register real *costab;
real *b0,(*buf)[0x110];
int clip = 0;
int bo1;
real *out0, *out1;
real *vout, *vin1, *vin2;
int mode;
real tmp;
bo = gmp.synth_bo;
if(!channel) {
bo--;
bo &= 0xf;
buf = gmp.synth_buffs[0];
}
else {
samples++;
buf = gmp.synth_buffs[1];
}
if(bo & 0x1) {
b0 = buf[0];
bo1 = bo;
// dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
out0 = buf[1]+((bo+1)&0xf);
out1 = buf[0]+bo;
}
else {
b0 = buf[1];
bo1 = bo+1;
// dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
out0 = buf[0]+bo;
out1 = buf[1]+bo+1;
}
{
{
costab = pnts[0];
b1[0x00] = bandPtr[0x00] + bandPtr[0x1F];
b1[0x1F] = bandPtr[0x00] - bandPtr[0x1F];
b1[0x01] = bandPtr[0x01] + bandPtr[0x1E];
b1[0x1E] = bandPtr[0x01] - bandPtr[0x1E];
b1[0x02] = bandPtr[0x02] + bandPtr[0x1D];
b1[0x1D] = bandPtr[0x02] - bandPtr[0x1D];
b1[0x03] = bandPtr[0x03] + bandPtr[0x1C];
b1[0x1C] = bandPtr[0x03] - bandPtr[0x1C];
b1[0x04] = bandPtr[0x04] + bandPtr[0x1B];
b1[0x1B] = bandPtr[0x04] - bandPtr[0x1B];
b1[0x05] = bandPtr[0x05] + bandPtr[0x1A];
b1[0x1A] = bandPtr[0x05] - bandPtr[0x1A];
b1[0x06] = bandPtr[0x06] + bandPtr[0x19];
b1[0x19] = bandPtr[0x06] - bandPtr[0x19];
b1[0x07] = bandPtr[0x07] + bandPtr[0x18];
b1[0x18] = bandPtr[0x07] - bandPtr[0x18];
b1[0x08] = bandPtr[0x08] + bandPtr[0x17];
b1[0x17] = bandPtr[0x08] - bandPtr[0x17];
b1[0x09] = bandPtr[0x09] + bandPtr[0x16];
b1[0x16] = bandPtr[0x09] - bandPtr[0x16];
b1[0x0A] = bandPtr[0x0A] + bandPtr[0x15];
b1[0x15] = bandPtr[0x0A] - bandPtr[0x15];
b1[0x0B] = bandPtr[0x0B] + bandPtr[0x14];
b1[0x14] = bandPtr[0x0B] - bandPtr[0x14];
b1[0x0C] = bandPtr[0x0C] + bandPtr[0x13];
b1[0x13] = bandPtr[0x0C] - bandPtr[0x13];
b1[0x0D] = bandPtr[0x0D] + bandPtr[0x12];
b1[0x12] = bandPtr[0x0D] - bandPtr[0x12];
b1[0x0E] = bandPtr[0x0E] + bandPtr[0x11];
b1[0x11] = bandPtr[0x0E] - bandPtr[0x11];
b1[0x0F] = bandPtr[0x0F] + bandPtr[0x10];
b1[0x10] = bandPtr[0x0F] - bandPtr[0x10];
// mma(&b1[0x10], &b1[0x10], costab, 0x8083f000);
vout = &b1[0x10];
vin1 = &b1[0x10];
vin2 = costab;
mode = 0x8083f000;
MMA_CALC(vout,vin1,vin2,mode);
}
{
costab = pnts[1];
b2[0x00] = b1[0x00] + b1[0x0F];
b2[0x0F] = b1[0x00] - b1[0x0F];
b2[0x01] = b1[0x01] + b1[0x0E];
b2[0x0E] = b1[0x01] - b1[0x0E];
b2[0x02] = b1[0x02] + b1[0x0D];
b2[0x0D] = b1[0x02] - b1[0x0D];
b2[0x03] = b1[0x03] + b1[0x0C];
b2[0x0C] = b1[0x03] - b1[0x0C];
b2[0x04] = b1[0x04] + b1[0x0B];
b2[0x0B] = b1[0x04] - b1[0x0B];
b2[0x05] = b1[0x05] + b1[0x0A];
b2[0x0A] = b1[0x05] - b1[0x0A];
b2[0x06] = b1[0x06] + b1[0x09];
b2[0x09] = b1[0x06] - b1[0x09];
b2[0x07] = b1[0x07] + b1[0x08];
b2[0x08] = b1[0x07] - b1[0x08];
b2[0x10] = b1[0x10] + b1[0x1F];
b2[0x1F] = b1[0x1F] - b1[0x10];
b2[0x11] = b1[0x11] + b1[0x1E];
b2[0x1E] = b1[0x1E] - b1[0x11];
b2[0x12] = b1[0x12] + b1[0x1D];
b2[0x1D] = b1[0x1D] - b1[0x12];
b2[0x13] = b1[0x13] + b1[0x1C];
b2[0x1C] = b1[0x1C] - b1[0x13];
b2[0x14] = b1[0x14] + b1[0x1B];
b2[0x1B] = b1[0x1B] - b1[0x14];
b2[0x15] = b1[0x15] + b1[0x1A];
b2[0x1A] = b1[0x1A] - b1[0x15];
b2[0x16] = b1[0x16] + b1[0x19];
b2[0x19] = b1[0x19] - b1[0x16];
b2[0x17] = b1[0x17] + b1[0x18];
b2[0x18] = b1[0x18] - b1[0x17];
// mma(&b2[0x08], &b2[0x08], costab, 0x8083ec00);
vout = &b2[0x08];
vin1 = &b2[0x08];
vin2 = costab;
mode = 0x8083ec00;
MMA_CALC(vout,vin1,vin2,mode);
}
{
costab = pnts[2];
b1[0x00] = b2[0x00] + b2[0x07];
b1[0x07] = b2[0x00] - b2[0x07];
b1[0x01] = b2[0x01] + b2[0x06];
b1[0x06] = b2[0x01] - b2[0x06];
b1[0x02] = b2[0x02] + b2[0x05];
b1[0x05] = b2[0x02] - b2[0x05];
b1[0x03] = b2[0x03] + b2[0x04];
b1[0x04] = b2[0x03] - b2[0x04];
b1[0x08] = b2[0x08] + b2[0x0F];
b1[0x0F] = b2[0x0F] - b2[0x08];
b1[0x09] = b2[0x09] + b2[0x0E];
b1[0x0E] = b2[0x0E] - b2[0x09];
b1[0x0A] = b2[0x0A] + b2[0x0D];
b1[0x0D] = b2[0x0D] - b2[0x0A];
b1[0x0B] = b2[0x0B] + b2[0x0C];
b1[0x0C] = b2[0x0C] - b2[0x0B];
b1[0x10] = b2[0x10] + b2[0x17];
b1[0x17] = b2[0x10] - b2[0x17];
b1[0x11] = b2[0x11] + b2[0x16];
b1[0x16] = b2[0x11] - b2[0x16];
b1[0x12] = b2[0x12] + b2[0x15];
b1[0x15] = b2[0x12] - b2[0x15];
b1[0x13] = b2[0x13] + b2[0x14];
b1[0x14] = b2[0x13] - b2[0x14];
b1[0x18] = b2[0x18] + b2[0x1F];
b1[0x1F] = b2[0x1F] - b2[0x18];
b1[0x19] = b2[0x19] + b2[0x1E];
b1[0x1E] = b2[0x1E] - b2[0x19];
b1[0x1A] = b2[0x1A] + b2[0x1D];
b1[0x1D] = b2[0x1D] - b2[0x1A];
b1[0x1B] = b2[0x1B] + b2[0x1C];
b1[0x1C] = b2[0x1C] - b2[0x1B];
// mma(&b1[0x04], &b1[0x04], costab, 0x8083e800);
vout = &b1[0x04];
vin1 = &b1[0x04];
vin2 = costab;
mode = 0x8083e800;
MMA_CALC(vout,vin1,vin2,mode);
}
{
costab = pnts[3];
b2[0x00] = b1[0x00] + b1[0x03];
b2[0x03] = b1[0x00] - b1[0x03];
b2[0x01] = b1[0x01] + b1[0x02];
b2[0x02] = b1[0x01] - b1[0x02];
b2[0x04] = b1[0x04] + b1[0x07];
b2[0x07] = b1[0x07] - b1[0x04];
b2[0x05] = b1[0x05] + b1[0x06];
b2[0x06] = b1[0x06] - b1[0x05];
b2[0x08] = b1[0x08] + b1[0x0B];
b2[0x0B] = b1[0x08] - b1[0x0B];
b2[0x09] = b1[0x09] + b1[0x0A];
b2[0x0A] = b1[0x09] - b1[0x0A];
b2[0x0C] = b1[0x0C] + b1[0x0F];
b2[0x0F] = b1[0x0F] - b1[0x0C];
b2[0x0D] = b1[0x0D] + b1[0x0E];
b2[0x0E] = b1[0x0E] - b1[0x0D];
b2[0x10] = b1[0x10] + b1[0x13];
b2[0x13] = b1[0x10] - b1[0x13];
b2[0x11] = b1[0x11] + b1[0x12];
b2[0x12] = b1[0x11] - b1[0x12];
b2[0x14] = b1[0x14] + b1[0x17];
b2[0x17] = b1[0x17] - b1[0x14];
b2[0x15] = b1[0x15] + b1[0x16];
b2[0x16] = b1[0x16] - b1[0x15];
b2[0x18] = b1[0x18] + b1[0x1B];
b2[0x1B] = b1[0x18] - b1[0x1B];
b2[0x19] = b1[0x19] + b1[0x1A];
b2[0x1A] = b1[0x19] - b1[0x1A];
b2[0x1C] = b1[0x1C] + b1[0x1F];
b2[0x1F] = b1[0x1F] - b1[0x1C];
b2[0x1D] = b1[0x1D] + b1[0x1E];
b2[0x1E] = b1[0x1E] - b1[0x1D];
// mma(&b2[0x02], &b2[0x02], costab, 0x8083e400);
vout = &b2[0x02];
vin1 = &b2[0x02];
vin2 = costab;
mode = 0x8083e400;
MMA_CALC(vout,vin1,vin2,mode);
}
{
costab = pnts[4];
b1[0x00] = b2[0x00] + b2[0x01];
b1[0x01] = b2[0x00] - b2[0x01];
b1[0x02] = b2[0x02] + b2[0x03];
b1[0x03] = b2[0x03] - b2[0x02];
b1[0x04] = b2[0x04] + b2[0x05];
b1[0x05] = b2[0x04] - b2[0x05];
b1[0x06] = b2[0x06] + b2[0x07];
b1[0x07] = b2[0x07] - b2[0x06];
b1[0x08] = b2[0x08] + b2[0x09];
b1[0x09] = b2[0x08] - b2[0x09];
b1[0x0A] = b2[0x0A] + b2[0x0B];
b1[0x0B] = b2[0x0B] - b2[0x0A];
b1[0x0C] = b2[0x0C] + b2[0x0D];
b1[0x0D] = b2[0x0C] - b2[0x0D];
b1[0x0E] = b2[0x0E] + b2[0x0F];
b1[0x0F] = b2[0x0F] - b2[0x0E];
b1[0x10] = b2[0x10] + b2[0x11];
b1[0x11] = b2[0x10] - b2[0x11];
b1[0x12] = b2[0x12] + b2[0x13];
b1[0x13] = b2[0x13] - b2[0x12];
b1[0x14] = b2[0x14] + b2[0x15];
b1[0x15] = b2[0x14] - b2[0x15];
b1[0x16] = b2[0x16] + b2[0x17];
b1[0x17] = b2[0x17] - b2[0x16];
b1[0x18] = b2[0x18] + b2[0x19];
b1[0x19] = b2[0x18] - b2[0x19];
b1[0x1A] = b2[0x1A] + b2[0x1B];
b1[0x1B] = b2[0x1B] - b2[0x1A];
b1[0x1C] = b2[0x1C] + b2[0x1D];
b1[0x1D] = b2[0x1C] - b2[0x1D];
b1[0x1E] = b2[0x1E] + b2[0x1F];
b1[0x1F] = b2[0x1F] - b2[0x1E];
// mma(&b1[0x01], &b1[0x01], costab, 0x8083e000);
vout = &b1[0x01];
vin1 = &b1[0x01];
vin2 = costab;
mode = 0x8083e000;
MMA_CALC(vout,vin1,vin2,mode);
b1[0x02] += b1[0x03];
b1[0x06] += b1[0x07];
b1[0x04] += b1[0x06];
b1[0x06] += b1[0x05];
b1[0x05] += b1[0x07];
b1[0x0A] += b1[0x0B];
b1[0x0E] += b1[0x0F];
b1[0x0C] += b1[0x0E];
b1[0x0E] += b1[0x0D];
b1[0x0D] += b1[0x0F];
b1[0x12] += b1[0x13];
b1[0x16] += b1[0x17];
b1[0x14] += b1[0x16];
b1[0x16] += b1[0x15];
b1[0x15] += b1[0x17];
b1[0x1A] += b1[0x1B];
b1[0x1E] += b1[0x1F];
b1[0x1C] += b1[0x1E];
b1[0x1E] += b1[0x1D];
b1[0x1D] += b1[0x1F];
}
out0[0x10*16] = b1[0x00];
out0[0x10*12] = b1[0x04];
out0[0x10* 8] = b1[0x02];
out0[0x10* 4] = b1[0x06];
out0[0x10* 0] = b1[0x01];
out1[0x10* 0] = b1[0x01];
out1[0x10* 4] = b1[0x05];
out1[0x10* 8] = b1[0x03];
out1[0x10*12] = b1[0x07];
b1[0x08] += b1[0x0C];
out0[0x10*14] = b1[0x08];
b1[0x0C] += b1[0x0a];
out0[0x10*10] = b1[0x0C];
b1[0x0A] += b1[0x0E];
out0[0x10* 6] = b1[0x0A];
b1[0x0E] += b1[0x09];
out0[0x10* 2] = b1[0x0E];
b1[0x09] += b1[0x0D];
out1[0x10* 2] = b1[0x09];
b1[0x0D] += b1[0x0B];
out1[0x10* 6] = b1[0x0D];
b1[0x0B] += b1[0x0F];
out1[0x10*10] = b1[0x0B];
out1[0x10*14] = b1[0x0F];
b1[0x18] += b1[0x1C];
out0[0x10*15] = b1[0x10] + b1[0x18];
out0[0x10*13] = b1[0x18] + b1[0x14];
b1[0x1C] += b1[0x1a];
out0[0x10*11] = b1[0x14] + b1[0x1C];
out0[0x10* 9] = b1[0x1C] + b1[0x12];
b1[0x1A] += b1[0x1E];
out0[0x10* 7] = b1[0x12] + b1[0x1A];
out0[0x10* 5] = b1[0x1A] + b1[0x16];
b1[0x1E] += b1[0x19];
out0[0x10* 3] = b1[0x16] + b1[0x1E];
out0[0x10* 1] = b1[0x1E] + b1[0x11];
b1[0x19] += b1[0x1D];
out1[0x10* 1] = b1[0x11] + b1[0x19];
out1[0x10* 3] = b1[0x19] + b1[0x15];
b1[0x1D] += b1[0x1B];
out1[0x10* 5] = b1[0x15] + b1[0x1D];
out1[0x10* 7] = b1[0x1D] + b1[0x13];
b1[0x1B] += b1[0x1F];
out1[0x10* 9] = b1[0x13] + b1[0x1B];
out1[0x10*11] = b1[0x1B] + b1[0x17];
out1[0x10*13] = b1[0x17] + b1[0x1F];
out1[0x10*15] = b1[0x1F];
}
gmp.synth_bo = bo;
{
register int j;
real bx = (16 - bo1) & 0xf;
real *window = decwin;
real sum, sum1;
for (j=16;j;j--,b0+=0x10,window+=0x10,samples+=step)
{
if (bx) {
*mmabufzar = (int)∑
*mmabufxar = (int)b0;
*mmamoder = (0xc0c00800 + ((bo1-1)<<14)) | (((int)(window+bx) >> 2) & 0x3ff);
*mmabufzar = (int)&sum1;
*mmabufxar = (int)(b0+bo1);
*mmamoder = (0xc0c00800 + ((bx-1)<<14)) | (((int)(window) >> 2) & 0x3ff);
if (bo1&1) sum -= sum1;
else sum += sum1;
} else {
*mmabufzar = (int)∑
*mmabufxar = (int)b0;
*mmamoder = 0xc0c3c800 | (((int)(window) >> 2) & 0x3ff);
}
WRITE_SAMPLE(samples,sum,clip);
}
{
extern real b0x[16];
b0x[0] = b0[0];
b0x[2] = b0[2];
b0x[4] = b0[4];
b0x[6] = b0[6];
b0x[8] = b0[8];
b0x[10] = b0[10];
b0x[12] = b0[12];
b0x[14] = b0[14];
*mmabufzar = (int)∑
*mmabufxar = (int)b0x;
*mmamoder = 0xc0c3c800 | (((int)(window+bx) >> 2) & 0x3ff);
WRITE_SAMPLE(samples,sum,clip);
b0-=0x10,window-=0x10,samples+=step;
}
for (j=15;j;j--,b0-=0x10,window-=0x10,samples+=step)
{
if (bo1) {
*mmabufzar = (int)∑
*mmabufxar = (int)b0;
*mmamoder = (0xc0c00400 + ((bo1-1)<<14)) | (((int)(window) >> 2) & 0x3ff);
*mmabufzar = (int)&sum1;
*mmabufxar = (int)(b0+bo1);
*mmamoder = (0xc0c00400 + ((bx-1)<<14)) | (((int)(window+bo1) >> 2) & 0x3ff);
sum += sum1;
} else {
*mmabufzar = (int)∑
*mmabufxar = (int)b0;
*mmamoder = 0xc0c3c400 | (((int)(window) >> 2) & 0x3ff);
}
WRITE_SAMPLE(samples,-sum,clip);
}
}
*pnt += 128;
return clip;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -