⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.c

📁 MP3的代码很实用 MP3的代码很实用
💻 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)&sum;
	*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)&sum;
	*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)&sum;
	*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)&sum;
	*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)&sum;
	*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 + -