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

  1. /* 
  2.  * Mpeg Layer-1,2,3 audio decoder 
  3.  * ------------------------------
  4.  * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
  5.  * See also 'README'
  6.  * slighlty optimized for machines without autoincrement/decrement
  7.  *
  8.  */
  9.  
  10. #include <stdlib.h>
  11. #include <math.h>
  12. #include <string.h>
  13.  
  14. #include "mpg123.h"
  15.  
  16. static void tr(real *here,real *samples);
  17.  
  18. #define WRITE_SAMPLE(samples,sum,clip) \
  19.   if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
  20.   else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
  21.   else { *(samples) = sum; }
  22.  
  23. int synth_1to1(real *bandPtr,int channel,short *samples)
  24. {
  25.   static real buf1[0x200],buf0[0x200];
  26.   static int boc[2]={1,1};
  27.   static real *buffs[2] = { buf0,buf1 };
  28.   static const int step = 2;
  29.  
  30.   int bo;
  31.   int clip = 0; 
  32.   real *buf = buffs[channel];
  33.  
  34.   samples += channel;
  35.  
  36.   bo = boc[channel];
  37.   bo--;
  38.   bo &= 0xf;
  39.   boc[channel] = bo;
  40.  
  41.   tr(buf+(bo<<5),bandPtr); /* writes values from buf[0] to buf[3f] */
  42.  
  43.   if(bo & 0x1) {
  44.     register int j;
  45.     register real *window,*b0,*b1,sum;
  46.     window = decwin + 16 - bo;
  47.  
  48.     b0 = buf + 15;
  49.     b1 = buf + 15;
  50.     for (j=16;j;j--,b0++,b1--,window+=32,samples+=step)
  51.     {
  52.       sum  = window[0] * b0[0x000];
  53.       sum -= window[1] * b1[0x020];
  54.       sum += window[2] * b0[0x040];
  55.       sum -= window[3] * b1[0x060];
  56.       sum += window[4] * b0[0x080];
  57.       sum -= window[5] * b1[0x0a0];
  58.       sum += window[6] * b0[0x0c0];
  59.       sum -= window[7] * b1[0x0e0];
  60.       sum += window[8] * b0[0x100];
  61.       sum -= window[9] * b1[0x120];
  62.       sum += window[10] * b0[0x140];
  63.       sum -= window[11] * b1[0x160];
  64.       sum += window[12] * b0[0x180];
  65.       sum -= window[13] * b1[0x1a0];
  66.       sum += window[14] * b0[0x1c0];
  67.       sum -= window[15] * b1[0x1e0];
  68.  
  69.       WRITE_SAMPLE(samples,sum,clip);
  70.     }
  71.  
  72.     {
  73.       sum  = window[0] * b0[0x000];
  74.       sum += window[2] * b0[0x040];
  75.       sum += window[4] * b0[0x080];
  76.       sum += window[6] * b0[0x0c0];
  77.       sum += window[8] * b0[0x100];
  78.       sum += window[10] * b0[0x140];
  79.       sum += window[12] * b0[0x180];
  80.       sum += window[14] * b0[0x1c0];
  81.       WRITE_SAMPLE(samples,sum,clip);
  82.       b0--,b1++,window-=32,samples+=step;
  83.     }
  84.     window += bo<<1;
  85.  
  86.     for (j=15;j;j--,b0--,b1++,window-=32,samples+=step)
  87.     {
  88.       sum  = -window[-1] * b0[0x000];
  89.       sum -= window[-2] * b1[0x020];
  90.       sum -= window[-3] * b0[0x040];
  91.       sum -= window[-4] * b1[0x060];
  92.       sum -= window[-5] * b0[0x080];
  93.       sum -= window[-6] * b1[0x0a0];
  94.       sum -= window[-7] * b0[0x0c0];
  95.       sum -= window[-8] * b1[0x0e0];
  96.       sum -= window[-9] * b0[0x100];
  97.       sum -= window[-10] * b1[0x120];
  98.       sum -= window[-11] * b0[0x140];
  99.       sum -= window[-12] * b1[0x160];
  100.       sum -= window[-13] * b0[0x180];
  101.       sum -= window[-14] * b1[0x1a0];
  102.       sum -= window[-15] * b0[0x1c0];
  103.       sum -= window[-16] * b1[0x1e0];
  104.  
  105.       WRITE_SAMPLE(samples,sum,clip);
  106.     }
  107.   }
  108.   else {
  109.     register int j;
  110.     register real *window,*b0,*b1,sum;
  111.     window = decwin + 16 - bo;
  112.  
  113.     b0 = buf + 15;
  114.     b1 = buf + 15;
  115.     for (j=16;j;j--,b0--,b1++,window+=32,samples+=step) 
  116.     {
  117.       sum = -window[0] * b0[0x000];
  118.       sum += window[1] * b1[0x020];
  119.       sum -= window[2] * b0[0x040];
  120.       sum += window[3] * b1[0x060];
  121.       sum -= window[4] * b0[0x080];
  122.       sum += window[5] * b1[0x0a0];
  123.       sum -= window[6] * b0[0x0c0];
  124.       sum += window[7] * b1[0x0e0];
  125.       sum -= window[8] * b0[0x100];
  126.       sum += window[9] * b1[0x120];
  127.       sum -= window[10] * b0[0x140];
  128.       sum += window[11] * b1[0x160];
  129.       sum -= window[12] * b0[0x180];
  130.       sum += window[13] * b1[0x1a0];
  131.       sum -= window[14] * b0[0x1c0];
  132.       sum += window[15] * b1[0x1e0];
  133.  
  134.       WRITE_SAMPLE(samples,sum,clip);
  135.     }
  136.     {
  137.       sum  = window[1] * b1[0x020];
  138.       sum += window[3] * b1[0x060];
  139.       sum += window[5] * b1[0x0a0];
  140.       sum += window[7] * b1[0x0e0];
  141.       sum += window[9] * b1[0x120];
  142.       sum += window[11] * b1[0x160];
  143.       sum += window[13] * b1[0x1a0];
  144.       sum += window[15] * b1[0x1e0];
  145.       WRITE_SAMPLE(samples,sum,clip);
  146.       b0++,b1--,window-=32,samples+=step;
  147.     }
  148.  
  149.     window += bo<<1;
  150.  
  151.     for (j=15;j;j--,b0++,b1--,window-=32,samples+=step)
  152.     {
  153.       sum  = -window[-1] * b0[0x000];
  154.       sum -= window[-2] * b1[0x020];
  155.       sum -= window[-3] * b0[0x040];
  156.       sum -= window[-4] * b1[0x060];
  157.       sum -= window[-5] * b0[0x080];
  158.       sum -= window[-6] * b1[0x0a0];
  159.       sum -= window[-7] * b0[0x0c0];
  160.       sum -= window[-8] * b1[0x0e0];
  161.       sum -= window[-9] * b0[0x100];
  162.       sum -= window[-10] * b1[0x120];
  163.       sum -= window[-11] * b0[0x140];
  164.       sum -= window[-12] * b1[0x160];
  165.       sum -= window[-13] * b0[0x180];
  166.       sum -= window[-14] * b1[0x1a0];
  167.       sum -= window[-15] * b0[0x1c0];
  168.       sum -= window[-16] * b1[0x1e0];
  169.  
  170.       WRITE_SAMPLE(samples,sum,clip);
  171.     }
  172.   }
  173.  
  174.   return(clip);
  175. }
  176.  
  177. /*
  178.  * -funroll-loops (for gcc) will remove the loops for better performance
  179.  * using loops in the source-code enhances readabillity
  180.  */
  181.  
  182. static void tr(real *here,real *samples)
  183. {
  184.   real bufs[64];
  185.  
  186.  {
  187.   register int i,j;
  188.   register real *b1,*b2,*bs,*costab;
  189.  
  190.   b1 = samples;
  191.   bs = bufs;
  192.   costab = pnts[0]+16;
  193.   b2 = b1 + 32;
  194.  
  195.   for(i=15;i>=0;i--)
  196.     *bs++ = (*b1++ + *--b2); 
  197.   for(i=15;i>=0;i--)
  198.     *bs++ = (*--b2 - *b1++) * *--costab;
  199.  
  200.   b1 = bufs;
  201.   costab = pnts[1]+8;
  202.   b2 = b1 + 16;
  203.  
  204.   {
  205.     for(i=7;i>=0;i--)
  206.       *bs++ = (*b1++ + *--b2); 
  207.     for(i=7;i>=0;i--)
  208.       *bs++ = (*--b2 - *b1++) * *--costab; 
  209.     b2 += 32;
  210.     costab += 8;
  211.     for(i=7;i>=0;i--)
  212.       *bs++ = (*b1++ + *--b2); 
  213.     for(i=7;i>=0;i--)
  214.       *bs++ = (*b1++ - *--b2) * *--costab; 
  215.     b2 += 32;
  216.   }
  217.  
  218.   bs = bufs;
  219.   costab = pnts[2];
  220.   b2 = b1 + 8;
  221.  
  222.   for(j=2;j;j--)
  223.   {
  224.     for(i=3;i>=0;i--)
  225.       *bs++ = (*b1++ + *--b2); 
  226.     for(i=3;i>=0;i--)
  227.       *bs++ = (*--b2 - *b1++) * costab[i]; 
  228.     b2 += 16;
  229.     for(i=3;i>=0;i--)
  230.       *bs++ = (*b1++ + *--b2); 
  231.     for(i=3;i>=0;i--)
  232.       *bs++ = (*b1++ - *--b2) * costab[i]; 
  233.     b2 += 16;
  234.   }
  235.  
  236.   b1 = bufs;
  237.   costab = pnts[3];
  238.   b2 = b1 + 4;
  239.  
  240.   for(j=4;j;j--)
  241.   {
  242.     *bs++ = (*b1++ + *--b2); 
  243.     *bs++ = (*b1++ + *--b2);
  244.     *bs++ = (*--b2 - *b1++) * costab[1]; 
  245.     *bs++ = (*--b2 - *b1++) * costab[0];
  246.     b2 += 8;
  247.     *bs++ = (*b1++ + *--b2); 
  248.     *bs++ = (*b1++ + *--b2);
  249.     *bs++ = (*b1++ - *--b2) * costab[1]; 
  250.     *bs++ = (*b1++ - *--b2) * costab[0];
  251.     b2 += 8;
  252.   }
  253.   bs = bufs;
  254.   costab = pnts[4];
  255.   b2 = b1 + 2;
  256.  
  257.   for(j=8;j;j--)
  258.   {
  259.     *bs++ = (*b1++ + *--b2);
  260.     *bs++ = (*--b2 - *b1++) * (*costab);
  261.     b2 += 4;
  262.     *bs++ = (*b1++ + *--b2);
  263.     *bs++ = (*b1++ - *--b2) * (*costab);
  264.     b2 += 4;
  265.   }
  266.  
  267.  }
  268.  
  269.  
  270.  {
  271.   register real *b1;
  272.   register int i;
  273.  
  274.   for(b1=bufs,i=8;i;i--,b1+=4)
  275.     b1[2] += b1[3];
  276.  
  277.   for(b1=bufs,i=4;i;i--,b1+=8)
  278.   {
  279.     b1[4] += b1[6];
  280.     b1[6] += b1[5];
  281.     b1[5] += b1[7];
  282.   }
  283.  
  284.   for(b1=bufs,i=2;i;i--,b1+=16)
  285.   {
  286.     b1[8]  += b1[12];
  287.     b1[12] += b1[10];
  288.     b1[10] += b1[14];
  289.     b1[14] += b1[9];
  290.     b1[9]  += b1[13];
  291.     b1[13] += b1[11];
  292.     b1[11] += b1[15];
  293.   }
  294. #if 0
  295.   {
  296.     b1 = bufs+16;
  297.     b1[0]  += b1[8];
  298.     b1[8]  += b1[4];
  299.     b1[4]  += b1[12];
  300.     b1[12] += b1[2];
  301.     b1[2]  += b1[10];
  302.     b1[10] += b1[6];
  303.     b1[6]  += b1[14];
  304.     b1[14] += b1[1];
  305.     b1[1]  += b1[9];
  306.     b1[9]  += b1[5];
  307.     b1[5]  += b1[13];
  308.     b1[13] += b1[3];
  309.     b1[3]  += b1[11];
  310.     b1[11] += b1[7];
  311.     b1[7]  += b1[15];
  312.   }
  313. #endif
  314.  }
  315.  
  316.   here[31] = bufs[0]; here[15] = bufs[1]; here[23] = bufs[2]; here[ 7] = bufs[3];
  317.   here[27] = bufs[4]; here[11] = bufs[5]; here[19] = bufs[6]; here[ 3] = bufs[7];
  318.   here[29] = bufs[8]; here[13] = bufs[9]; here[21] = bufs[10]; here[ 5] = bufs[11];
  319.   here[25] = bufs[12]; here[ 9] = bufs[13]; here[17] = bufs[14]; here[ 1] = bufs[15];
  320. #if 0
  321.   here[30] = bufs[16]; here[14] = bufs[17]; here[22] = bufs[18]; here[ 6] = bufs[19];
  322.   here[26] = bufs[20]; here[10] = bufs[21]; here[18] = bufs[22]; here[ 2] = bufs[23];
  323.   here[28] = bufs[24]; here[12] = bufs[25]; here[20] = bufs[26]; here[ 4] = bufs[27];
  324.   here[24] = bufs[28]; here[ 8] = bufs[29]; here[16] = bufs[30]; here[ 0] = bufs[31];
  325. #else
  326.   here[30] = bufs[16+0]+bufs[16+8];  here[14] = bufs[16+1]+bufs[16+9];
  327.   here[22] = bufs[16+2]+bufs[16+10]; here[ 6] = bufs[16+3]+bufs[16+11];
  328.   here[26] = bufs[16+4]+bufs[16+12]; here[10] = bufs[16+5]+bufs[16+13];
  329.   here[18] = bufs[16+6]+bufs[16+14]; here[ 2] = bufs[16+7]+bufs[16+15];
  330.   here[28] = bufs[16+8]+bufs[16+4];  here[12] = bufs[16+9]+bufs[16+5];
  331.   here[20] = bufs[16+10]+bufs[16+6]; here[ 4] = bufs[16+11]+bufs[16+7];
  332.   here[24] = bufs[16+12]+bufs[16+2]; here[ 8] = bufs[16+13]+bufs[16+3];
  333.   here[16] = bufs[16+14]+bufs[16+1]; here[ 0] = bufs[16+15];
  334. #endif
  335.  
  336. }
  337.  
  338.  
  339.