home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 June B / Pcwk6b98.iso / Mpeg3 / Dos / MP3 / MPG12304.EXE / LAYER1.C < prev    next >
C/C++ Source or Header  |  1997-04-06  |  4KB  |  154 lines

  1. /* 
  2.  * Mpeg Layer-1 audio decoder 
  3.  * --------------------------
  4.  * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
  5.  * near unoptimzed ...
  6.  *
  7.  * may have a few bugs after last optimization ... 
  8.  *
  9.  */
  10.  
  11. #include "mpg123.h"
  12.  
  13. void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr)
  14. {
  15.   unsigned int *ba=balloc;
  16.   unsigned int *sca = (unsigned int *) scale_index;
  17.  
  18.   if(fr->stereo) {
  19.     int i;
  20.     int jsbound = fr->jsbound;
  21.     for (i=0;i<jsbound;i++) { 
  22.       *ba++ = getbits(4);
  23.       *ba++ = getbits(4);
  24.     }
  25.     for (i=jsbound;i<SBLIMIT;i++)
  26.       *ba++ = getbits(4);
  27.  
  28.     ba = balloc;
  29.  
  30.     for (i=0;i<jsbound;i++) {
  31.       if ((*ba++))
  32.         *sca++ = getbits(6);
  33.       if ((*ba++))
  34.         *sca++ = getbits(6);
  35.     }
  36.     for (i=jsbound;i<SBLIMIT;i++)
  37.       if ((*ba++)) {
  38.         *sca++ =  getbits(6);
  39.         *sca++ =  getbits(6);
  40.       }
  41.   }
  42.   else {
  43.     int i;
  44.     for (i=0;i<SBLIMIT;i++)
  45.       *ba++ = getbits(4);
  46.     ba = balloc;
  47.     for (i=0;i<SBLIMIT;i++)
  48.       if ((*ba++))
  49.         *sca++ = getbits(6);
  50.   }
  51. }
  52.  
  53. void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT],
  54.     unsigned int scale_index[2][SBLIMIT],struct frame *fr)
  55. {
  56.   int i,n;
  57.   int smpb[2*SBLIMIT]; /* values: 0-65535 */
  58.   int *sample;
  59.   register unsigned int *ba;
  60.   register unsigned int *sca = (unsigned int *) scale_index;
  61.  
  62.   if(fr->stereo) {
  63.     int jsbound = fr->jsbound;
  64.     register real *f0 = fraction[0];
  65.     register real *f1 = fraction[1];
  66.     ba = balloc;
  67.     for (sample=smpb,i=0;i<jsbound;i++)  {
  68.       if ((n = *ba++))
  69.         *sample++ = getbits(n+1);
  70.       if ((n = *ba++))
  71.         *sample++ = getbits(n+1);
  72.     }
  73.     for (i=jsbound;i<SBLIMIT;i++) 
  74.       if ((n = *ba++))
  75.         *sample++ = getbits(n+1);
  76.  
  77.     ba = balloc;
  78.     for (sample=smpb,i=0;i<jsbound;i++) {
  79.       if((n=*ba++))
  80.         *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  81.       else
  82.         *f0++ = 0.0;
  83.       if((n=*ba++))
  84.         *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  85.       else
  86.         *f1++ = 0.0;
  87.     }
  88.     for (sample=smpb,i=jsbound;i<SBLIMIT;i++) {
  89.       if ((n=*ba++)) {
  90.         real samp = ( ((-1)<<n) + (*sample++) + 1);
  91.         *f0++ = samp * muls[n+1][*sca++];
  92.         *f1++ = samp * muls[n+1][*sca++];
  93.       }
  94.       else
  95.         *f0++ = *f1++ = 0.0;
  96.     }
  97.   }
  98.   else {
  99.     register real *f0 = fraction[0];
  100.     ba = balloc;
  101.     for (sample=smpb,i=0;i<SBLIMIT;i++)
  102.       if ((n = *ba++))
  103.         *sample++ = getbits(n+1);
  104.     ba = balloc;
  105.     for (sample=smpb,i=0;i<SBLIMIT;i++) {
  106.       if((n=*ba++))
  107.         *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
  108.       else
  109.         *f0++ = 0.0;
  110.     }
  111.   }
  112. }
  113.  
  114. int do_layer1(struct frame *fr,int outmode,struct audio_info_struct *ai)
  115. {
  116.   int clip=0;
  117.   int i,stereo = fr->stereo;
  118.   unsigned int balloc[2*SBLIMIT];
  119.   unsigned int scale_index[2][SBLIMIT];
  120.   real fraction[2][SBLIMIT];
  121.   int single = fr->single;
  122.  
  123.   if(stereo == 1 || single == 3)
  124.     single = 0;
  125.  
  126.   I_step_one(balloc,scale_index,fr);
  127.  
  128.   for (i=0;i<SCALE_BLOCK;i++)
  129.   {
  130.     I_step_two(fraction,balloc,scale_index,fr);
  131.  
  132.     if(single >= 0)
  133.     {
  134.       int k;
  135.       short *pcm = pcm_sample+pcm_point;
  136.       clip += (fr->synth)( (real *) fraction[single],0,pcm);
  137.       for(k=0;k<32;k++,pcm+=2)
  138.         pcm[1] = pcm[0];
  139.     }
  140.     else {
  141.         clip += (fr->synth)( (real *) fraction[0],0,pcm_sample+pcm_point);
  142.         clip += (fr->synth)( (real *) fraction[1],1,pcm_sample+pcm_point);
  143.     }
  144.     pcm_point+=64;
  145.  
  146.     if(pcm_point == audiobufsize)
  147.       audio_flush(outmode,ai);
  148.   }
  149.  
  150.   return clip;
  151. }
  152.  
  153.  
  154.