decode_i386.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. //mpeg 1,2,3层声音解码
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <string.h>
  5. #include "mpg123.h"
  6. #include "mpglib.h"
  7. extern struct mpstr *gmp;
  8. #define WRITE_SAMPLE(samples,sum,clip) 
  9.   if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } 
  10.   else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } 
  11.   else { *(samples) = sum; }
  12. int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
  13. {
  14.   short samples_tmp[64];
  15.   short *tmp1 = samples_tmp;
  16.   int i,ret;
  17.   int pnt1 = 0;
  18.   ret = synth_1to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
  19.   samples += *pnt;
  20.   for(i=0;i<32;i++) {
  21.     *( (short *) samples) = *tmp1;
  22.     samples += 2;
  23.     tmp1 += 2;
  24.   }
  25.   *pnt += 64;
  26.   return ret;
  27. }
  28. int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
  29. {
  30.   static const int step = 2;
  31.   int bo;
  32.   short *samples = (short *) (out + *pnt);
  33.   real *b0,(*buf)[0x110];
  34.   int clip = 0; 
  35.   int bo1;
  36.   bo = gmp->synth_bo;
  37.   if(!channel) {
  38.     bo--;
  39.     bo &= 0xf;
  40.     buf = gmp->synth_buffs[0];
  41.   }
  42.   else {
  43.     samples++;
  44.     buf = gmp->synth_buffs[1];
  45.   }
  46.   if(bo & 0x1) {
  47.     b0 = buf[0];
  48.     bo1 = bo;
  49.     dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
  50.   }
  51.   else {
  52.     b0 = buf[1];
  53.     bo1 = bo+1;
  54.     dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
  55.   }
  56.   gmp->synth_bo = bo;
  57.   
  58.   {
  59.     register int j;
  60.     real *window = decwin + 16 - bo1;
  61.     for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step)
  62.     {
  63.       real sum;
  64.       sum  = window[0x0] * b0[0x0];
  65.       sum -= window[0x1] * b0[0x1];
  66.       sum += window[0x2] * b0[0x2];
  67.       sum -= window[0x3] * b0[0x3];
  68.       sum += window[0x4] * b0[0x4];
  69.       sum -= window[0x5] * b0[0x5];
  70.       sum += window[0x6] * b0[0x6];
  71.       sum -= window[0x7] * b0[0x7];
  72.       sum += window[0x8] * b0[0x8];
  73.       sum -= window[0x9] * b0[0x9];
  74.       sum += window[0xA] * b0[0xA];
  75.       sum -= window[0xB] * b0[0xB];
  76.       sum += window[0xC] * b0[0xC];
  77.       sum -= window[0xD] * b0[0xD];
  78.       sum += window[0xE] * b0[0xE];
  79.       sum -= window[0xF] * b0[0xF];
  80.       WRITE_SAMPLE(samples,sum,clip);
  81.     }
  82.     {
  83.       real sum;
  84.       sum  = window[0x0] * b0[0x0];
  85.       sum += window[0x2] * b0[0x2];
  86.       sum += window[0x4] * b0[0x4];
  87.       sum += window[0x6] * b0[0x6];
  88.       sum += window[0x8] * b0[0x8];
  89.       sum += window[0xA] * b0[0xA];
  90.       sum += window[0xC] * b0[0xC];
  91.       sum += window[0xE] * b0[0xE];
  92.       WRITE_SAMPLE(samples,sum,clip);
  93.       b0-=0x10,window-=0x20,samples+=step;
  94.     }
  95.     window += bo1<<1;
  96.     for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step)
  97.     {
  98.       real sum;
  99.       sum = -window[-0x1] * b0[0x0];
  100.       sum -= window[-0x2] * b0[0x1];
  101.       sum -= window[-0x3] * b0[0x2];
  102.       sum -= window[-0x4] * b0[0x3];
  103.       sum -= window[-0x5] * b0[0x4];
  104.       sum -= window[-0x6] * b0[0x5];
  105.       sum -= window[-0x7] * b0[0x6];
  106.       sum -= window[-0x8] * b0[0x7];
  107.       sum -= window[-0x9] * b0[0x8];
  108.       sum -= window[-0xA] * b0[0x9];
  109.       sum -= window[-0xB] * b0[0xA];
  110.       sum -= window[-0xC] * b0[0xB];
  111.       sum -= window[-0xD] * b0[0xC];
  112.       sum -= window[-0xE] * b0[0xD];
  113.       sum -= window[-0xF] * b0[0xE];
  114.       sum -= window[-0x0] * b0[0xF];
  115.       WRITE_SAMPLE(samples,sum,clip);
  116.     }
  117.   }
  118.   *pnt += 128;
  119.   return clip;
  120. }