MS ACM MP3 decoder

Eric Pouech eric.pouech at wanadoo.fr
Mon May 20 14:50:56 CDT 2002


this patch implements an ACM MP3 decoder (only, no coder)
it is based on the mpglib (which is now LGPL, and which is
included in the patch)

(Alexandre, as for the two other patches, please regenerate
the dlls/make_dlls file)

A+
-------------- next part --------------
Name:          mp3acm
ChangeLog:     implemented a MP3 decoder (based on mpglib)
License:       X11
GenDate:       2002/05/20 19:43:34 UTC
ModifiedFiles: configure.ac
AddedFiles:    dlls/msacm/winemp3/.cvsignore dlls/msacm/winemp3/Makefile.in dlls/msacm/winemp3/common.c dlls/msacm/winemp3/dct64_i386.c dlls/msacm/winemp3/decode_i386.c dlls/msacm/winemp3/huffman.h dlls/msacm/winemp3/interface.c dlls/msacm/winemp3/l2tables.h dlls/msacm/winemp3/layer1.c dlls/msacm/winemp3/layer2.c dlls/msacm/winemp3/layer3.c dlls/msacm/winemp3/mpg123.h dlls/msacm/winemp3/mpegl3.c dlls/msacm/winemp3/mpglib.h dlls/msacm/winemp3/tabinit.c
===================================================================
RCS file: /home/cvs/cvsroot/wine/wine/configure.ac,v
retrieving revision 1.40
diff -u -u -r1.40 configure.ac
--- configure.ac	14 May 2002 23:18:24 -0000	1.40
+++ configure.ac	20 May 2002 07:23:38 -0000
@@ -1327,15 +1328,16 @@
 dlls/mpr/Makefile
 dlls/msacm/Makefile
 dlls/msacm/imaadp32/Makefile
 dlls/msacm/msg711/Makefile
+dlls/msacm/winemp3/Makefile
 dlls/msdmo/Makefile
 dlls/msimg32/Makefile
 dlls/msisys/Makefile
 dlls/msnet32/Makefile
 dlls/msvcrt/Makefile
 dlls/msvcrt20/Makefile
 dlls/msvideo/Makefile
 dlls/netapi32/Makefile
 dlls/ntdll/Makefile
 dlls/odbc32/Makefile
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/.cvsignore	Mon May 20 08:45:37 2002
@@ -0,0 +1,3 @@
+Makefile
+winemp3.acm.dbg.c
+winemp3.acm.spec.c
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/Makefile.in	Sun May 19 17:48:52 2002
@@ -0,0 +1,24 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = winemp3.acm
+IMPORTS   = winmm kernel32
+DELAYIMPORTS=user32
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = mpegl3.c \
+	 common.c \
+	 dct64_i386.c \
+	 decode_i386.c \
+	 interface.c \
+	 layer1.c \
+	 layer2.c \
+	 layer3.c \
+	 tabinit.c
+
+ at MAKE_DLL_RULES@
+
+### Dependencies:
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/common.c	Sun May 19 17:16:38 2002
@@ -0,0 +1,241 @@
+#include <ctype.h>
+#include <stdlib.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "mpg123.h"
+
+struct parameter param = { 1 , 1 , 0 , 0 };
+
+int tabsel_123[2][3][16] = {
+   { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
+     {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
+     {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
+
+   { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
+     {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
+     {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
+};
+
+long freqs[9] = { 44100, 48000, 32000,
+                  22050, 24000, 16000 ,
+                  11025 , 12000 , 8000 };
+
+int bitindex;
+unsigned char *wordpointer;
+unsigned char *pcm_sample;
+int pcm_point = 0;
+
+
+#define HDRCMPMASK 0xfffffd00
+
+#if 0
+int head_check(unsigned long head)
+{
+    if( (head & 0xffe00000) != 0xffe00000)
+	return FALSE;
+    if(!((head>>17)&3))
+	return FALSE;
+    if( ((head>>12)&0xf) == 0xf)
+	return FALSE;
+    if( ((head>>10)&0x3) == 0x3 )
+	return FALSE;
+    return TRUE;
+}
+#endif
+
+
+/*
+ * the code a header and write the information
+ * into the frame structure
+ */
+int decode_header(struct frame *fr,unsigned long newhead)
+{
+    if( newhead & (1<<20) ) {
+      fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
+      fr->mpeg25 = 0;
+    }
+    else {
+      fr->lsf = 1;
+      fr->mpeg25 = 1;
+    }
+    
+    fr->lay = 4-((newhead>>17)&3);
+    if( ((newhead>>10)&0x3) == 0x3) {
+      fprintf(stderr,"Stream error\n");
+      exit(1);
+    }
+    if(fr->mpeg25) {
+      fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
+    }
+    else
+      fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
+    fr->error_protection = ((newhead>>16)&0x1)^0x1;
+
+    if(fr->mpeg25) /* allow Bitrate change for 2.5 ... */
+      fr->bitrate_index = ((newhead>>12)&0xf);
+
+    fr->bitrate_index = ((newhead>>12)&0xf);
+    fr->padding   = ((newhead>>9)&0x1);
+    fr->extension = ((newhead>>8)&0x1);
+    fr->mode      = ((newhead>>6)&0x3);
+    fr->mode_ext  = ((newhead>>4)&0x3);
+    fr->copyright = ((newhead>>3)&0x1);
+    fr->original  = ((newhead>>2)&0x1);
+    fr->emphasis  = newhead & 0x3;
+
+    fr->stereo    = (fr->mode == MPG_MD_MONO) ? 1 : 2;
+
+    if(!fr->bitrate_index)
+    {
+      fprintf(stderr,"Free format not supported.\n");
+      return (0);
+    }
+
+    switch(fr->lay)
+    {
+      case 1:
+#ifdef LAYER1
+#if 0
+        fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? 
+                         (fr->mode_ext<<2)+4 : 32;
+#endif
+        fr->framesize  = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
+        fr->framesize /= freqs[fr->sampling_frequency];
+        fr->framesize  = ((fr->framesize+fr->padding)<<2)-4;
+#else
+        fprintf(stderr,"Not supported!\n");
+#endif
+        break;
+      case 2:
+#ifdef LAYER2
+#if 0
+        fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
+                         (fr->mode_ext<<2)+4 : fr->II_sblimit;
+#endif
+        fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
+        fr->framesize /= freqs[fr->sampling_frequency];
+        fr->framesize += fr->padding - 4;
+#else
+        fprintf(stderr,"Not supported!\n");
+#endif
+        break;
+      case 3:
+#if 0
+        fr->do_layer = do_layer3;
+        if(fr->lsf)
+          ssize = (fr->stereo == 1) ? 9 : 17;
+        else
+          ssize = (fr->stereo == 1) ? 17 : 32;
+#endif
+
+#if 0
+        if(fr->error_protection)
+          ssize += 2;
+#endif
+          fr->framesize  = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
+          fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf);
+          fr->framesize = fr->framesize + fr->padding - 4;
+        break; 
+      default:
+        fprintf(stderr,"Sorry, unknown layer type.\n"); 
+        return (0);
+    }
+    return 1;
+}
+
+#if 0
+void print_header(struct frame *fr)
+{
+	static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
+	static char *layers[4] = { "Unknown" , "I", "II", "III" };
+
+	fprintf(stderr,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n", 
+		fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
+		layers[fr->lay],freqs[fr->sampling_frequency],
+		modes[fr->mode],fr->mode_ext,fr->framesize+4);
+	fprintf(stderr,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
+		fr->stereo,fr->copyright?"Yes":"No",
+		fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
+		fr->emphasis);
+	fprintf(stderr,"Bitrate: %d Kbits/s, Extension value: %d\n",
+		tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],fr->extension);
+}
+
+void print_header_compact(struct frame *fr)
+{
+	static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
+	static char *layers[4] = { "Unknown" , "I", "II", "III" };
+ 
+	fprintf(stderr,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
+		fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
+		layers[fr->lay],
+		tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
+		freqs[fr->sampling_frequency], modes[fr->mode]);
+}
+
+#endif
+
+unsigned int getbits(int number_of_bits)
+{
+  unsigned long rval;
+
+  if(!number_of_bits)
+    return 0;
+
+  {
+    rval = wordpointer[0];
+    rval <<= 8;
+    rval |= wordpointer[1];
+    rval <<= 8;
+    rval |= wordpointer[2];
+    rval <<= bitindex;
+    rval &= 0xffffff;
+
+    bitindex += number_of_bits;
+
+    rval >>= (24-number_of_bits);
+
+    wordpointer += (bitindex>>3);
+    bitindex &= 7;
+  }
+  return rval;
+}
+
+unsigned int getbits_fast(int number_of_bits)
+{
+  unsigned long rval;
+
+  {
+    rval = wordpointer[0];
+    rval <<= 8;	
+    rval |= wordpointer[1];
+    rval <<= bitindex;
+    rval &= 0xffff;
+    bitindex += number_of_bits;
+
+    rval >>= (16-number_of_bits);
+
+    wordpointer += (bitindex>>3);
+    bitindex &= 7;
+  }
+  return rval;
+}
+
+unsigned int get1bit(void)
+{
+  unsigned char rval;
+  rval = *wordpointer << bitindex;
+
+  bitindex++;
+  wordpointer += (bitindex>>3);
+  bitindex &= 7;
+
+  return rval>>7;
+}
+
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/dct64_i386.c	Sun May 19 17:16:38 2002
@@ -0,0 +1,315 @@
+
+/*
+ * Discrete Cosine Tansform (DCT) for subband synthesis
+ * optimized for machines with no auto-increment. 
+ * The performance is highly compiler dependend. Maybe
+ * the dct64.c version for 'normal' processor may be faster
+ * even for Intel processors.
+ */
+
+#include "mpg123.h"
+
+static void dct64_1(real *out0,real *out1,real *b1,real *b2,real *samples)
+{
+
+ {
+  register real *costab = pnts[0];
+
+  b1[0x00] = samples[0x00] + samples[0x1F];
+  b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0];
+
+  b1[0x01] = samples[0x01] + samples[0x1E];
+  b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1];
+
+  b1[0x02] = samples[0x02] + samples[0x1D];
+  b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2];
+
+  b1[0x03] = samples[0x03] + samples[0x1C];
+  b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3];
+
+  b1[0x04] = samples[0x04] + samples[0x1B];
+  b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4];
+
+  b1[0x05] = samples[0x05] + samples[0x1A];
+  b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5];
+
+  b1[0x06] = samples[0x06] + samples[0x19];
+  b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6];
+
+  b1[0x07] = samples[0x07] + samples[0x18];
+  b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7];
+
+  b1[0x08] = samples[0x08] + samples[0x17];
+  b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8];
+
+  b1[0x09] = samples[0x09] + samples[0x16];
+  b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9];
+
+  b1[0x0A] = samples[0x0A] + samples[0x15];
+  b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA];
+
+  b1[0x0B] = samples[0x0B] + samples[0x14];
+  b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB];
+
+  b1[0x0C] = samples[0x0C] + samples[0x13];
+  b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC];
+
+  b1[0x0D] = samples[0x0D] + samples[0x12];
+  b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD];
+
+  b1[0x0E] = samples[0x0E] + samples[0x11];
+  b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE];
+
+  b1[0x0F] = samples[0x0F] + samples[0x10];
+  b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF];
+ }
+
+
+ {
+  register real *costab = pnts[1];
+
+  b2[0x00] = b1[0x00] + b1[0x0F]; 
+  b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0];
+  b2[0x01] = b1[0x01] + b1[0x0E]; 
+  b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1];
+  b2[0x02] = b1[0x02] + b1[0x0D]; 
+  b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2];
+  b2[0x03] = b1[0x03] + b1[0x0C]; 
+  b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3];
+  b2[0x04] = b1[0x04] + b1[0x0B]; 
+  b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4];
+  b2[0x05] = b1[0x05] + b1[0x0A]; 
+  b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5];
+  b2[0x06] = b1[0x06] + b1[0x09]; 
+  b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6];
+  b2[0x07] = b1[0x07] + b1[0x08]; 
+  b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7];
+
+  b2[0x10] = b1[0x10] + b1[0x1F];
+  b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0];
+  b2[0x11] = b1[0x11] + b1[0x1E];
+  b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1];
+  b2[0x12] = b1[0x12] + b1[0x1D];
+  b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2];
+  b2[0x13] = b1[0x13] + b1[0x1C];
+  b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3];
+  b2[0x14] = b1[0x14] + b1[0x1B];
+  b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4];
+  b2[0x15] = b1[0x15] + b1[0x1A];
+  b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5];
+  b2[0x16] = b1[0x16] + b1[0x19];
+  b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6];
+  b2[0x17] = b1[0x17] + b1[0x18];
+  b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7];
+ }
+
+ {
+  register real *costab = pnts[2];
+
+  b1[0x00] = b2[0x00] + b2[0x07];
+  b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0];
+  b1[0x01] = b2[0x01] + b2[0x06];
+  b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1];
+  b1[0x02] = b2[0x02] + b2[0x05];
+  b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2];
+  b1[0x03] = b2[0x03] + b2[0x04];
+  b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3];
+
+  b1[0x08] = b2[0x08] + b2[0x0F];
+  b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0];
+  b1[0x09] = b2[0x09] + b2[0x0E];
+  b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1];
+  b1[0x0A] = b2[0x0A] + b2[0x0D];
+  b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2];
+  b1[0x0B] = b2[0x0B] + b2[0x0C];
+  b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3];
+
+  b1[0x10] = b2[0x10] + b2[0x17];
+  b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0];
+  b1[0x11] = b2[0x11] + b2[0x16];
+  b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1];
+  b1[0x12] = b2[0x12] + b2[0x15];
+  b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2];
+  b1[0x13] = b2[0x13] + b2[0x14];
+  b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3];
+
+  b1[0x18] = b2[0x18] + b2[0x1F];
+  b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0];
+  b1[0x19] = b2[0x19] + b2[0x1E];
+  b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1];
+  b1[0x1A] = b2[0x1A] + b2[0x1D];
+  b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2];
+  b1[0x1B] = b2[0x1B] + b2[0x1C];
+  b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3];
+ }
+
+ {
+  register real const cos0 = pnts[3][0];
+  register real const cos1 = pnts[3][1];
+
+  b2[0x00] = b1[0x00] + b1[0x03];
+  b2[0x03] = (b1[0x00] - b1[0x03]) * cos0;
+  b2[0x01] = b1[0x01] + b1[0x02];
+  b2[0x02] = (b1[0x01] - b1[0x02]) * cos1;
+
+  b2[0x04] = b1[0x04] + b1[0x07];
+  b2[0x07] = (b1[0x07] - b1[0x04]) * cos0;
+  b2[0x05] = b1[0x05] + b1[0x06];
+  b2[0x06] = (b1[0x06] - b1[0x05]) * cos1;
+
+  b2[0x08] = b1[0x08] + b1[0x0B];
+  b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0;
+  b2[0x09] = b1[0x09] + b1[0x0A];
+  b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1;
+  
+  b2[0x0C] = b1[0x0C] + b1[0x0F];
+  b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0;
+  b2[0x0D] = b1[0x0D] + b1[0x0E];
+  b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1;
+
+  b2[0x10] = b1[0x10] + b1[0x13];
+  b2[0x13] = (b1[0x10] - b1[0x13]) * cos0;
+  b2[0x11] = b1[0x11] + b1[0x12];
+  b2[0x12] = (b1[0x11] - b1[0x12]) * cos1;
+
+  b2[0x14] = b1[0x14] + b1[0x17];
+  b2[0x17] = (b1[0x17] - b1[0x14]) * cos0;
+  b2[0x15] = b1[0x15] + b1[0x16];
+  b2[0x16] = (b1[0x16] - b1[0x15]) * cos1;
+
+  b2[0x18] = b1[0x18] + b1[0x1B];
+  b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0;
+  b2[0x19] = b1[0x19] + b1[0x1A];
+  b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1;
+
+  b2[0x1C] = b1[0x1C] + b1[0x1F];
+  b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0;
+  b2[0x1D] = b1[0x1D] + b1[0x1E];
+  b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1;
+ }
+
+ {
+  register real const cos0 = pnts[4][0];
+
+  b1[0x00] = b2[0x00] + b2[0x01];
+  b1[0x01] = (b2[0x00] - b2[0x01]) * cos0;
+  b1[0x02] = b2[0x02] + b2[0x03];
+  b1[0x03] = (b2[0x03] - b2[0x02]) * cos0;
+  b1[0x02] += b1[0x03];
+
+  b1[0x04] = b2[0x04] + b2[0x05];
+  b1[0x05] = (b2[0x04] - b2[0x05]) * cos0;
+  b1[0x06] = b2[0x06] + b2[0x07];
+  b1[0x07] = (b2[0x07] - b2[0x06]) * cos0;
+  b1[0x06] += b1[0x07];
+  b1[0x04] += b1[0x06];
+  b1[0x06] += b1[0x05];
+  b1[0x05] += b1[0x07];
+
+  b1[0x08] = b2[0x08] + b2[0x09];
+  b1[0x09] = (b2[0x08] - b2[0x09]) * cos0;
+  b1[0x0A] = b2[0x0A] + b2[0x0B];
+  b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0;
+  b1[0x0A] += b1[0x0B];
+
+  b1[0x0C] = b2[0x0C] + b2[0x0D];
+  b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0;
+  b1[0x0E] = b2[0x0E] + b2[0x0F];
+  b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0;
+  b1[0x0E] += b1[0x0F];
+  b1[0x0C] += b1[0x0E];
+  b1[0x0E] += b1[0x0D];
+  b1[0x0D] += b1[0x0F];
+
+  b1[0x10] = b2[0x10] + b2[0x11];
+  b1[0x11] = (b2[0x10] - b2[0x11]) * cos0;
+  b1[0x12] = b2[0x12] + b2[0x13];
+  b1[0x13] = (b2[0x13] - b2[0x12]) * cos0;
+  b1[0x12] += b1[0x13];
+
+  b1[0x14] = b2[0x14] + b2[0x15];
+  b1[0x15] = (b2[0x14] - b2[0x15]) * cos0;
+  b1[0x16] = b2[0x16] + b2[0x17];
+  b1[0x17] = (b2[0x17] - b2[0x16]) * cos0;
+  b1[0x16] += b1[0x17];
+  b1[0x14] += b1[0x16];
+  b1[0x16] += b1[0x15];
+  b1[0x15] += b1[0x17];
+
+  b1[0x18] = b2[0x18] + b2[0x19];
+  b1[0x19] = (b2[0x18] - b2[0x19]) * cos0;
+  b1[0x1A] = b2[0x1A] + b2[0x1B];
+  b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0;
+  b1[0x1A] += b1[0x1B];
+
+  b1[0x1C] = b2[0x1C] + b2[0x1D];
+  b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0;
+  b1[0x1E] = b2[0x1E] + b2[0x1F];
+  b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0;
+  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];
+}
+
+/*
+ * the call via dct64 is a trick to force GCC to use
+ * (new) registers for the b1,b2 pointer to the bufs[xx] field
+ */
+void dct64(real *a,real *b,real *c)
+{
+  real bufs[0x40];
+  dct64_1(a,b,bufs,bufs+0x20,c);
+}
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/decode_i386.c	Sun May 19 17:16:38 2002
@@ -0,0 +1,153 @@
+/* 
+ * Mpeg Layer-1,2,3 audio decoder 
+ * ------------------------------
+ * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
+ * See also 'README'
+ *
+ * slighlty optimized for machines without autoincrement/decrement.
+ * The performance is highly compiler dependend. Maybe
+ * the decode.c version for 'normal' processor may be faster
+ * even for Intel processors.
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "mpg123.h"
+#include "mpglib.h"
+
+extern struct mpstr *gmp;
+
+ /* old WRITE_SAMPLE */
+#define WRITE_SAMPLE(samples,sum,clip) \
+  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
+  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
+  else { *(samples) = sum; }
+
+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;
+}
+
+
+int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
+{
+  static const int step = 2;
+  int bo;
+  short *samples = (short *) (out + *pnt);
+
+  real *b0,(*buf)[0x110];
+  int clip = 0; 
+  int bo1;
+
+  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);
+  }
+  else {
+    b0 = buf[1];
+    bo1 = bo+1;
+    dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
+  }
+
+  gmp->synth_bo = bo;
+  
+  {
+    register int j;
+    real *window = decwin + 16 - bo1;
+
+    for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step)
+    {
+      real sum;
+      sum  = window[0x0] * b0[0x0];
+      sum -= window[0x1] * b0[0x1];
+      sum += window[0x2] * b0[0x2];
+      sum -= window[0x3] * b0[0x3];
+      sum += window[0x4] * b0[0x4];
+      sum -= window[0x5] * b0[0x5];
+      sum += window[0x6] * b0[0x6];
+      sum -= window[0x7] * b0[0x7];
+      sum += window[0x8] * b0[0x8];
+      sum -= window[0x9] * b0[0x9];
+      sum += window[0xA] * b0[0xA];
+      sum -= window[0xB] * b0[0xB];
+      sum += window[0xC] * b0[0xC];
+      sum -= window[0xD] * b0[0xD];
+      sum += window[0xE] * b0[0xE];
+      sum -= window[0xF] * b0[0xF];
+
+      WRITE_SAMPLE(samples,sum,clip);
+    }
+
+    {
+      real sum;
+      sum  = window[0x0] * b0[0x0];
+      sum += window[0x2] * b0[0x2];
+      sum += window[0x4] * b0[0x4];
+      sum += window[0x6] * b0[0x6];
+      sum += window[0x8] * b0[0x8];
+      sum += window[0xA] * b0[0xA];
+      sum += window[0xC] * b0[0xC];
+      sum += window[0xE] * b0[0xE];
+      WRITE_SAMPLE(samples,sum,clip);
+      b0-=0x10,window-=0x20,samples+=step;
+    }
+    window += bo1<<1;
+
+    for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step)
+    {
+      real sum;
+      sum = -window[-0x1] * b0[0x0];
+      sum -= window[-0x2] * b0[0x1];
+      sum -= window[-0x3] * b0[0x2];
+      sum -= window[-0x4] * b0[0x3];
+      sum -= window[-0x5] * b0[0x4];
+      sum -= window[-0x6] * b0[0x5];
+      sum -= window[-0x7] * b0[0x6];
+      sum -= window[-0x8] * b0[0x7];
+      sum -= window[-0x9] * b0[0x8];
+      sum -= window[-0xA] * b0[0x9];
+      sum -= window[-0xB] * b0[0xA];
+      sum -= window[-0xC] * b0[0xB];
+      sum -= window[-0xD] * b0[0xC];
+      sum -= window[-0xE] * b0[0xD];
+      sum -= window[-0xF] * b0[0xE];
+      sum -= window[-0x0] * b0[0xF];
+
+      WRITE_SAMPLE(samples,sum,clip);
+    }
+  }
+  *pnt += 128;
+
+  return clip;
+}
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/huffman.h	Sun May 19 17:16:38 2002
@@ -0,0 +1,332 @@
+/*
+ * huffman tables ... recalcualted to work with my optimzed
+ * decoder scheme (MH)
+ * 
+ * probably we could save a few bytes of memory, because the 
+ * smaller tables are often the part of a bigger table
+ */
+
+struct newhuff 
+{
+  unsigned int linbits;
+  short *table;
+};
+
+static short tab0[] = 
+{ 
+   0
+};
+
+static short tab1[] =
+{
+  -5,  -3,  -1,  17,   1,  16,   0
+};
+
+static short tab2[] =
+{
+ -15, -11,  -9,  -5,  -3,  -1,  34,   2,  18,  -1,  33,  32,  17,  -1,   1,
+  16,   0
+};
+
+static short tab3[] =
+{
+ -13, -11,  -9,  -5,  -3,  -1,  34,   2,  18,  -1,  33,  32,  16,  17,  -1,
+   1,   0
+};
+
+static short tab5[] =
+{
+ -29, -25, -23, -15,  -7,  -5,  -3,  -1,  51,  35,  50,  49,  -3,  -1,  19,
+   3,  -1,  48,  34,  -3,  -1,  18,  33,  -1,   2,  32,  17,  -1,   1,  16,
+   0
+};
+
+static short tab6[] =
+{
+ -25, -19, -13,  -9,  -5,  -3,  -1,  51,   3,  35,  -1,  50,  48,  -1,  19,
+  49,  -3,  -1,  34,   2,  18,  -3,  -1,  33,  32,   1,  -1,  17,  -1,  16,
+   0
+};
+
+static short tab7[] =
+{
+ -69, -65, -57, -39, -29, -17, -11,  -7,  -3,  -1,  85,  69,  -1,  84,  83,
+  -1,  53,  68,  -3,  -1,  37,  82,  21,  -5,  -1,  81,  -1,   5,  52,  -1,
+  80,  -1,  67,  51,  -5,  -3,  -1,  36,  66,  20,  -1,  65,  64, -11,  -7,
+  -3,  -1,   4,  35,  -1,  50,   3,  -1,  19,  49,  -3,  -1,  48,  34,  18,
+  -5,  -1,  33,  -1,   2,  32,  17,  -1,   1,  16,   0
+};
+
+static short tab8[] =
+{
+ -65, -63, -59, -45, -31, -19, -13,  -7,  -5,  -3,  -1,  85,  84,  69,  83,
+  -3,  -1,  53,  68,  37,  -3,  -1,  82,   5,  21,  -5,  -1,  81,  -1,  52,
+  67,  -3,  -1,  80,  51,  36,  -5,  -3,  -1,  66,  20,  65,  -3,  -1,   4,
+  64,  -1,  35,  50,  -9,  -7,  -3,  -1,  19,  49,  -1,   3,  48,  34,  -1,
+   2,  32,  -1,  18,  33,  17,  -3,  -1,   1,  16,   0
+};
+
+static short tab9[] =
+{
+ -63, -53, -41, -29, -19, -11,  -5,  -3,  -1,  85,  69,  53,  -1,  83,  -1,
+  84,   5,  -3,  -1,  68,  37,  -1,  82,  21,  -3,  -1,  81,  52,  -1,  67,
+  -1,  80,   4,  -7,  -3,  -1,  36,  66,  -1,  51,  64,  -1,  20,  65,  -5,
+  -3,  -1,  35,  50,  19,  -1,  49,  -1,   3,  48,  -5,  -3,  -1,  34,   2,
+  18,  -1,  33,  32,  -3,  -1,  17,   1,  -1,  16,   0
+};
+
+static short tab10[] =
+{
+-125,-121,-111, -83, -55, -35, -21, -13,  -7,  -3,  -1, 119, 103,  -1, 118,
+  87,  -3,  -1, 117, 102,  71,  -3,  -1, 116,  86,  -1, 101,  55,  -9,  -3,
+  -1, 115,  70,  -3,  -1,  85,  84,  99,  -1,  39, 114, -11,  -5,  -3,  -1,
+ 100,   7, 112,  -1,  98,  -1,  69,  53,  -5,  -1,   6,  -1,  83,  68,  23,
+ -17,  -5,  -1, 113,  -1,  54,  38,  -5,  -3,  -1,  37,  82,  21,  -1,  81,
+  -1,  52,  67,  -3,  -1,  22,  97,  -1,  96,  -1,   5,  80, -19, -11,  -7,
+  -3,  -1,  36,  66,  -1,  51,   4,  -1,  20,  65,  -3,  -1,  64,  35,  -1,
+  50,   3,  -3,  -1,  19,  49,  -1,  48,  34,  -7,  -3,  -1,  18,  33,  -1,
+   2,  32,  17,  -1,   1,  16,   0
+};
+
+static short tab11[] =
+{
+-121,-113, -89, -59, -43, -27, -17,  -7,  -3,  -1, 119, 103,  -1, 118, 117,
+  -3,  -1, 102,  71,  -1, 116,  -1,  87,  85,  -5,  -3,  -1,  86, 101,  55,
+  -1, 115,  70,  -9,  -7,  -3,  -1,  69,  84,  -1,  53,  83,  39,  -1, 114,
+  -1, 100,   7,  -5,  -1, 113,  -1,  23, 112,  -3,  -1,  54,  99,  -1,  96,
+  -1,  68,  37, -13,  -7,  -5,  -3,  -1,  82,   5,  21,  98,  -3,  -1,  38,
+   6,  22,  -5,  -1,  97,  -1,  81,  52,  -5,  -1,  80,  -1,  67,  51,  -1,
+  36,  66, -15, -11,  -7,  -3,  -1,  20,  65,  -1,   4,  64,  -1,  35,  50,
+  -1,  19,  49,  -5,  -3,  -1,   3,  48,  34,  33,  -5,  -1,  18,  -1,   2,
+  32,  17,  -3,  -1,   1,  16,   0
+};
+
+static short tab12[] =
+{
+-115, -99, -73, -45, -27, -17,  -9,  -5,  -3,  -1, 119, 103, 118,  -1,  87,
+ 117,  -3,  -1, 102,  71,  -1, 116, 101,  -3,  -1,  86,  55,  -3,  -1, 115,
+  85,  39,  -7,  -3,  -1, 114,  70,  -1, 100,  23,  -5,  -1, 113,  -1,   7,
+ 112,  -1,  54,  99, -13,  -9,  -3,  -1,  69,  84,  -1,  68,  -1,   6,   5,
+  -1,  38,  98,  -5,  -1,  97,  -1,  22,  96,  -3,  -1,  53,  83,  -1,  37,
+  82, -17,  -7,  -3,  -1,  21,  81,  -1,  52,  67,  -5,  -3,  -1,  80,   4,
+  36,  -1,  66,  20,  -3,  -1,  51,  65,  -1,  35,  50, -11,  -7,  -5,  -3,
+  -1,  64,   3,  48,  19,  -1,  49,  34,  -1,  18,  33,  -7,  -5,  -3,  -1,
+   2,  32,   0,  17,  -1,   1,  16
+};
+
+static short tab13[] =
+{
+-509,-503,-475,-405,-333,-265,-205,-153,-115, -83, -53, -35, -21, -13,  -9,
+  -7,  -5,  -3,  -1, 254, 252, 253, 237, 255,  -1, 239, 223,  -3,  -1, 238,
+ 207,  -1, 222, 191,  -9,  -3,  -1, 251, 206,  -1, 220,  -1, 175, 233,  -1,
+ 236, 221,  -9,  -5,  -3,  -1, 250, 205, 190,  -1, 235, 159,  -3,  -1, 249,
+ 234,  -1, 189, 219, -17,  -9,  -3,  -1, 143, 248,  -1, 204,  -1, 174, 158,
+  -5,  -1, 142,  -1, 127, 126, 247,  -5,  -1, 218,  -1, 173, 188,  -3,  -1,
+ 203, 246, 111, -15,  -7,  -3,  -1, 232,  95,  -1, 157, 217,  -3,  -1, 245,
+ 231,  -1, 172, 187,  -9,  -3,  -1,  79, 244,  -3,  -1, 202, 230, 243,  -1,
+  63,  -1, 141, 216, -21,  -9,  -3,  -1,  47, 242,  -3,  -1, 110, 156,  15,
+  -5,  -3,  -1, 201,  94, 171,  -3,  -1, 125, 215,  78, -11,  -5,  -3,  -1,
+ 200, 214,  62,  -1, 185,  -1, 155, 170,  -1,  31, 241, -23, -13,  -5,  -1,
+ 240,  -1, 186, 229,  -3,  -1, 228, 140,  -1, 109, 227,  -5,  -1, 226,  -1,
+  46,  14,  -1,  30, 225, -15,  -7,  -3,  -1, 224,  93,  -1, 213, 124,  -3,
+  -1, 199,  77,  -1, 139, 184,  -7,  -3,  -1, 212, 154,  -1, 169, 108,  -1,
+ 198,  61, -37, -21,  -9,  -5,  -3,  -1, 211, 123,  45,  -1, 210,  29,  -5,
+  -1, 183,  -1,  92, 197,  -3,  -1, 153, 122, 195,  -7,  -5,  -3,  -1, 167,
+ 151,  75, 209,  -3,  -1,  13, 208,  -1, 138, 168, -11,  -7,  -3,  -1,  76,
+ 196,  -1, 107, 182,  -1,  60,  44,  -3,  -1, 194,  91,  -3,  -1, 181, 137,
+  28, -43, -23, -11,  -5,  -1, 193,  -1, 152,  12,  -1, 192,  -1, 180, 106,
+  -5,  -3,  -1, 166, 121,  59,  -1, 179,  -1, 136,  90, -11,  -5,  -1,  43,
+  -1, 165, 105,  -1, 164,  -1, 120, 135,  -5,  -1, 148,  -1, 119, 118, 178,
+ -11,  -3,  -1,  27, 177,  -3,  -1,  11, 176,  -1, 150,  74,  -7,  -3,  -1,
+  58, 163,  -1,  89, 149,  -1,  42, 162, -47, -23,  -9,  -3,  -1,  26, 161,
+  -3,  -1,  10, 104, 160,  -5,  -3,  -1, 134,  73, 147,  -3,  -1,  57,  88,
+  -1, 133, 103,  -9,  -3,  -1,  41, 146,  -3,  -1,  87, 117,  56,  -5,  -1,
+ 131,  -1, 102,  71,  -3,  -1, 116,  86,  -1, 101, 115, -11,  -3,  -1,  25,
+ 145,  -3,  -1,   9, 144,  -1,  72, 132,  -7,  -5,  -1, 114,  -1,  70, 100,
+  40,  -1, 130,  24, -41, -27, -11,  -5,  -3,  -1,  55,  39,  23,  -1, 113,
+  -1,  85,   7,  -7,  -3,  -1, 112,  54,  -1,  99,  69,  -3,  -1,  84,  38,
+  -1,  98,  53,  -5,  -1, 129,  -1,   8, 128,  -3,  -1,  22,  97,  -1,   6,
+  96, -13,  -9,  -5,  -3,  -1,  83,  68,  37,  -1,  82,   5,  -1,  21,  81,
+  -7,  -3,  -1,  52,  67,  -1,  80,  36,  -3,  -1,  66,  51,  20, -19, -11,
+  -5,  -1,  65,  -1,   4,  64,  -3,  -1,  35,  50,  19,  -3,  -1,  49,   3,
+  -1,  48,  34,  -3,  -1,  18,  33,  -1,   2,  32,  -3,  -1,  17,   1,  16,
+   0
+};
+
+static short tab15[] =
+{
+-495,-445,-355,-263,-183,-115, -77, -43, -27, -13,  -7,  -3,  -1, 255, 239,
+  -1, 254, 223,  -1, 238,  -1, 253, 207,  -7,  -3,  -1, 252, 222,  -1, 237,
+ 191,  -1, 251,  -1, 206, 236,  -7,  -3,  -1, 221, 175,  -1, 250, 190,  -3,
+  -1, 235, 205,  -1, 220, 159, -15,  -7,  -3,  -1, 249, 234,  -1, 189, 219,
+  -3,  -1, 143, 248,  -1, 204, 158,  -7,  -3,  -1, 233, 127,  -1, 247, 173,
+  -3,  -1, 218, 188,  -1, 111,  -1, 174,  15, -19, -11,  -3,  -1, 203, 246,
+  -3,  -1, 142, 232,  -1,  95, 157,  -3,  -1, 245, 126,  -1, 231, 172,  -9,
+  -3,  -1, 202, 187,  -3,  -1, 217, 141,  79,  -3,  -1, 244,  63,  -1, 243,
+ 216, -33, -17,  -9,  -3,  -1, 230,  47,  -1, 242,  -1, 110, 240,  -3,  -1,
+  31, 241,  -1, 156, 201,  -7,  -3,  -1,  94, 171,  -1, 186, 229,  -3,  -1,
+ 125, 215,  -1,  78, 228, -15,  -7,  -3,  -1, 140, 200,  -1,  62, 109,  -3,
+  -1, 214, 227,  -1, 155, 185,  -7,  -3,  -1,  46, 170,  -1, 226,  30,  -5,
+  -1, 225,  -1,  14, 224,  -1,  93, 213, -45, -25, -13,  -7,  -3,  -1, 124,
+ 199,  -1,  77, 139,  -1, 212,  -1, 184, 154,  -7,  -3,  -1, 169, 108,  -1,
+ 198,  61,  -1, 211, 210,  -9,  -5,  -3,  -1,  45,  13,  29,  -1, 123, 183,
+  -5,  -1, 209,  -1,  92, 208,  -1, 197, 138, -17,  -7,  -3,  -1, 168,  76,
+  -1, 196, 107,  -5,  -1, 182,  -1, 153,  12,  -1,  60, 195,  -9,  -3,  -1,
+ 122, 167,  -1, 166,  -1, 192,  11,  -1, 194,  -1,  44,  91, -55, -29, -15,
+  -7,  -3,  -1, 181,  28,  -1, 137, 152,  -3,  -1, 193,  75,  -1, 180, 106,
+  -5,  -3,  -1,  59, 121, 179,  -3,  -1, 151, 136,  -1,  43,  90, -11,  -5,
+  -1, 178,  -1, 165,  27,  -1, 177,  -1, 176, 105,  -7,  -3,  -1, 150,  74,
+  -1, 164, 120,  -3,  -1, 135,  58, 163, -17,  -7,  -3,  -1,  89, 149,  -1,
+  42, 162,  -3,  -1,  26, 161,  -3,  -1,  10, 160, 104,  -7,  -3,  -1, 134,
+  73,  -1, 148,  57,  -5,  -1, 147,  -1, 119,   9,  -1,  88, 133, -53, -29,
+ -13,  -7,  -3,  -1,  41, 103,  -1, 118, 146,  -1, 145,  -1,  25, 144,  -7,
+  -3,  -1,  72, 132,  -1,  87, 117,  -3,  -1,  56, 131,  -1, 102,  71,  -7,
+  -3,  -1,  40, 130,  -1,  24, 129,  -7,  -3,  -1, 116,   8,  -1, 128,  86,
+  -3,  -1, 101,  55,  -1, 115,  70, -17,  -7,  -3,  -1,  39, 114,  -1, 100,
+  23,  -3,  -1,  85, 113,  -3,  -1,   7, 112,  54,  -7,  -3,  -1,  99,  69,
+  -1,  84,  38,  -3,  -1,  98,  22,  -3,  -1,   6,  96,  53, -33, -19,  -9,
+  -5,  -1,  97,  -1,  83,  68,  -1,  37,  82,  -3,  -1,  21,  81,  -3,  -1,
+   5,  80,  52,  -7,  -3,  -1,  67,  36,  -1,  66,  51,  -1,  65,  -1,  20,
+   4,  -9,  -3,  -1,  35,  50,  -3,  -1,  64,   3,  19,  -3,  -1,  49,  48,
+  34,  -9,  -7,  -3,  -1,  18,  33,  -1,   2,  32,  17,  -3,  -1,   1,  16,
+   0
+};
+
+static short tab16[] =
+{
+-509,-503,-461,-323,-103, -37, -27, -15,  -7,  -3,  -1, 239, 254,  -1, 223,
+ 253,  -3,  -1, 207, 252,  -1, 191, 251,  -5,  -1, 175,  -1, 250, 159,  -3,
+  -1, 249, 248, 143,  -7,  -3,  -1, 127, 247,  -1, 111, 246, 255,  -9,  -5,
+  -3,  -1,  95, 245,  79,  -1, 244, 243, -53,  -1, 240,  -1,  63, -29, -19,
+ -13,  -7,  -5,  -1, 206,  -1, 236, 221, 222,  -1, 233,  -1, 234, 217,  -1,
+ 238,  -1, 237, 235,  -3,  -1, 190, 205,  -3,  -1, 220, 219, 174, -11,  -5,
+  -1, 204,  -1, 173, 218,  -3,  -1, 126, 172, 202,  -5,  -3,  -1, 201, 125,
+  94, 189, 242, -93,  -5,  -3,  -1,  47,  15,  31,  -1, 241, -49, -25, -13,
+  -5,  -1, 158,  -1, 188, 203,  -3,  -1, 142, 232,  -1, 157, 231,  -7,  -3,
+  -1, 187, 141,  -1, 216, 110,  -1, 230, 156, -13,  -7,  -3,  -1, 171, 186,
+  -1, 229, 215,  -1,  78,  -1, 228, 140,  -3,  -1, 200,  62,  -1, 109,  -1,
+ 214, 155, -19, -11,  -5,  -3,  -1, 185, 170, 225,  -1, 212,  -1, 184, 169,
+  -5,  -1, 123,  -1, 183, 208, 227,  -7,  -3,  -1,  14, 224,  -1,  93, 213,
+  -3,  -1, 124, 199,  -1,  77, 139, -75, -45, -27, -13,  -7,  -3,  -1, 154,
+ 108,  -1, 198,  61,  -3,  -1,  92, 197,  13,  -7,  -3,  -1, 138, 168,  -1,
+ 153,  76,  -3,  -1, 182, 122,  60, -11,  -5,  -3,  -1,  91, 137,  28,  -1,
+ 192,  -1, 152, 121,  -1, 226,  -1,  46,  30, -15,  -7,  -3,  -1, 211,  45,
+  -1, 210, 209,  -5,  -1,  59,  -1, 151, 136,  29,  -7,  -3,  -1, 196, 107,
+  -1, 195, 167,  -1,  44,  -1, 194, 181, -23, -13,  -7,  -3,  -1, 193,  12,
+  -1,  75, 180,  -3,  -1, 106, 166, 179,  -5,  -3,  -1,  90, 165,  43,  -1,
+ 178,  27, -13,  -5,  -1, 177,  -1,  11, 176,  -3,  -1, 105, 150,  -1,  74,
+ 164,  -5,  -3,  -1, 120, 135, 163,  -3,  -1,  58,  89,  42, -97, -57, -33,
+ -19, -11,  -5,  -3,  -1, 149, 104, 161,  -3,  -1, 134, 119, 148,  -5,  -3,
+  -1,  73,  87, 103, 162,  -5,  -1,  26,  -1,  10, 160,  -3,  -1,  57, 147,
+  -1,  88, 133,  -9,  -3,  -1,  41, 146,  -3,  -1, 118,   9,  25,  -5,  -1,
+ 145,  -1, 144,  72,  -3,  -1, 132, 117,  -1,  56, 131, -21, -11,  -5,  -3,
+  -1, 102,  40, 130,  -3,  -1,  71, 116,  24,  -3,  -1, 129, 128,  -3,  -1,
+   8,  86,  55,  -9,  -5,  -1, 115,  -1, 101,  70,  -1,  39, 114,  -5,  -3,
+  -1, 100,  85,   7,  23, -23, -13,  -5,  -1, 113,  -1, 112,  54,  -3,  -1,
+  99,  69,  -1,  84,  38,  -3,  -1,  98,  22,  -1,  97,  -1,   6,  96,  -9,
+  -5,  -1,  83,  -1,  53,  68,  -1,  37,  82,  -1,  81,  -1,  21,   5, -33,
+ -23, -13,  -7,  -3,  -1,  52,  67,  -1,  80,  36,  -3,  -1,  66,  51,  20,
+  -5,  -1,  65,  -1,   4,  64,  -1,  35,  50,  -3,  -1,  19,  49,  -3,  -1,
+   3,  48,  34,  -3,  -1,  18,  33,  -1,   2,  32,  -3,  -1,  17,   1,  16,
+   0
+};
+
+static short tab24[] =
+{
+-451,-117, -43, -25, -15,  -7,  -3,  -1, 239, 254,  -1, 223, 253,  -3,  -1,
+ 207, 252,  -1, 191, 251,  -5,  -1, 250,  -1, 175, 159,  -1, 249, 248,  -9,
+  -5,  -3,  -1, 143, 127, 247,  -1, 111, 246,  -3,  -1,  95, 245,  -1,  79,
+ 244, -71,  -7,  -3,  -1,  63, 243,  -1,  47, 242,  -5,  -1, 241,  -1,  31,
+ 240, -25,  -9,  -1,  15,  -3,  -1, 238, 222,  -1, 237, 206,  -7,  -3,  -1,
+ 236, 221,  -1, 190, 235,  -3,  -1, 205, 220,  -1, 174, 234, -15,  -7,  -3,
+  -1, 189, 219,  -1, 204, 158,  -3,  -1, 233, 173,  -1, 218, 188,  -7,  -3,
+  -1, 203, 142,  -1, 232, 157,  -3,  -1, 217, 126,  -1, 231, 172, 255,-235,
+-143, -77, -45, -25, -15,  -7,  -3,  -1, 202, 187,  -1, 141, 216,  -5,  -3,
+  -1,  14, 224,  13, 230,  -5,  -3,  -1, 110, 156, 201,  -1,  94, 186,  -9,
+  -5,  -1, 229,  -1, 171, 125,  -1, 215, 228,  -3,  -1, 140, 200,  -3,  -1,
+  78,  46,  62, -15,  -7,  -3,  -1, 109, 214,  -1, 227, 155,  -3,  -1, 185,
+ 170,  -1, 226,  30,  -7,  -3,  -1, 225,  93,  -1, 213, 124,  -3,  -1, 199,
+  77,  -1, 139, 184, -31, -15,  -7,  -3,  -1, 212, 154,  -1, 169, 108,  -3,
+  -1, 198,  61,  -1, 211,  45,  -7,  -3,  -1, 210,  29,  -1, 123, 183,  -3,
+  -1, 209,  92,  -1, 197, 138, -17,  -7,  -3,  -1, 168, 153,  -1,  76, 196,
+  -3,  -1, 107, 182,  -3,  -1, 208,  12,  60,  -7,  -3,  -1, 195, 122,  -1,
+ 167,  44,  -3,  -1, 194,  91,  -1, 181,  28, -57, -35, -19,  -7,  -3,  -1,
+ 137, 152,  -1, 193,  75,  -5,  -3,  -1, 192,  11,  59,  -3,  -1, 176,  10,
+  26,  -5,  -1, 180,  -1, 106, 166,  -3,  -1, 121, 151,  -3,  -1, 160,   9,
+ 144,  -9,  -3,  -1, 179, 136,  -3,  -1,  43,  90, 178,  -7,  -3,  -1, 165,
+  27,  -1, 177, 105,  -1, 150, 164, -17,  -9,  -5,  -3,  -1,  74, 120, 135,
+  -1,  58, 163,  -3,  -1,  89, 149,  -1,  42, 162,  -7,  -3,  -1, 161, 104,
+  -1, 134, 119,  -3,  -1,  73, 148,  -1,  57, 147, -63, -31, -15,  -7,  -3,
+  -1,  88, 133,  -1,  41, 103,  -3,  -1, 118, 146,  -1,  25, 145,  -7,  -3,
+  -1,  72, 132,  -1,  87, 117,  -3,  -1,  56, 131,  -1, 102,  40, -17,  -7,
+  -3,  -1, 130,  24,  -1,  71, 116,  -5,  -1, 129,  -1,   8, 128,  -1,  86,
+ 101,  -7,  -5,  -1,  23,  -1,   7, 112, 115,  -3,  -1,  55,  39, 114, -15,
+  -7,  -3,  -1,  70, 100,  -1,  85, 113,  -3,  -1,  54,  99,  -1,  69,  84,
+  -7,  -3,  -1,  38,  98,  -1,  22,  97,  -5,  -3,  -1,   6,  96,  53,  -1,
+  83,  68, -51, -37, -23, -15,  -9,  -3,  -1,  37,  82,  -1,  21,  -1,   5,
+  80,  -1,  81,  -1,  52,  67,  -3,  -1,  36,  66,  -1,  51,  20,  -9,  -5,
+  -1,  65,  -1,   4,  64,  -1,  35,  50,  -1,  19,  49,  -7,  -5,  -3,  -1,
+   3,  48,  34,  18,  -1,  33,  -1,   2,  32,  -3,  -1,  17,   1,  -1,  16,
+   0
+};
+
+static short tab_c0[] =
+{
+ -29, -21, -13,  -7,  -3,  -1,  11,  15,  -1,  13,  14,  -3,  -1,   7,   5,
+   9,  -3,  -1,   6,   3,  -1,  10,  12,  -3,  -1,   2,   1,  -1,   4,   8,
+   0
+};
+
+static short tab_c1[] =
+{
+ -15,  -7,  -3,  -1,  15,  14,  -1,  13,  12,  -3,  -1,  11,  10,  -1,   9,
+   8,  -7,  -3,  -1,   7,   6,  -1,   5,   4,  -3,  -1,   3,   2,  -1,   1,
+   0
+};
+
+
+
+static struct newhuff ht[] = 
+{
+ { /* 0 */ 0 , tab0  } ,
+ { /* 2 */ 0 , tab1  } ,
+ { /* 3 */ 0 , tab2  } ,
+ { /* 3 */ 0 , tab3  } ,
+ { /* 0 */ 0 , tab0  } ,
+ { /* 4 */ 0 , tab5  } ,
+ { /* 4 */ 0 , tab6  } ,
+ { /* 6 */ 0 , tab7  } ,
+ { /* 6 */ 0 , tab8  } ,
+ { /* 6 */ 0 , tab9  } ,
+ { /* 8 */ 0 , tab10 } ,
+ { /* 8 */ 0 , tab11 } ,
+ { /* 8 */ 0 , tab12 } ,
+ { /* 16 */ 0 , tab13 } ,
+ { /* 0  */ 0 , tab0  } ,
+ { /* 16 */ 0 , tab15 } ,
+
+ { /* 16 */ 1 , tab16 } ,
+ { /* 16 */ 2 , tab16 } ,
+ { /* 16 */ 3 , tab16 } ,
+ { /* 16 */ 4 , tab16 } ,
+ { /* 16 */ 6 , tab16 } ,
+ { /* 16 */ 8 , tab16 } ,
+ { /* 16 */ 10, tab16 } ,
+ { /* 16 */ 13, tab16 } ,
+ { /* 16 */ 4 , tab24 } ,
+ { /* 16 */ 5 , tab24 } ,
+ { /* 16 */ 6 , tab24 } ,
+ { /* 16 */ 7 , tab24 } ,
+ { /* 16 */ 8 , tab24 } ,
+ { /* 16 */ 9 , tab24 } ,
+ { /* 16 */ 11, tab24 } ,
+ { /* 16 */ 13, tab24 }
+};
+
+static struct newhuff htc[] = 
+{
+ { /* 1 , 1 , */ 0 , tab_c0 } ,
+ { /* 1 , 1 , */ 0 , tab_c1 }
+};
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/interface.c	Sun May 19 17:51:58 2002
@@ -0,0 +1,229 @@
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "mpg123.h"
+#include "mpglib.h"
+
+/* Global mp .. it's a hack */
+struct mpstr *gmp;
+
+
+BOOL InitMP3(struct mpstr *mp) 
+{
+	static int init = 0;
+
+	memset(mp,0,sizeof(struct mpstr));
+
+	mp->framesize = 0;
+	mp->fsizeold = -1;
+	mp->bsize = 0;
+	mp->head = mp->tail = NULL;
+	mp->fr.single = -1;
+	mp->bsnum = 0;
+	mp->synth_bo = 1;
+
+	if(!init) {
+		init = 1;
+		make_decode_tables(32767);
+		init_layer2();
+		init_layer3(SBLIMIT);
+	}
+
+	return !0;
+}
+
+void ExitMP3(struct mpstr *mp)
+{
+	struct buf *b,*bn;
+	
+	b = mp->tail;
+	while(b) {
+		free(b->pnt);
+		bn = b->next;
+		free(b);
+		b = bn;
+	}
+}
+
+static struct buf *addbuf(struct mpstr *mp,char *buf,int size)
+{
+	struct buf *nbuf;
+
+	nbuf = malloc( sizeof(struct buf) );
+	if(!nbuf) {
+		fprintf(stderr,"Out of memory!\n");
+		return NULL;
+	}
+	nbuf->pnt = malloc(size);
+	if(!nbuf->pnt) {
+		free(nbuf);
+		return NULL;
+	}
+	nbuf->size = size;
+	memcpy(nbuf->pnt,buf,size);
+	nbuf->next = NULL;
+	nbuf->prev = mp->head;
+	nbuf->pos = 0;
+
+	if(!mp->tail) {
+		mp->tail = nbuf;
+	}
+	else {
+	  mp->head->next = nbuf;
+	}
+
+	mp->head = nbuf;
+	mp->bsize += size;
+
+	return nbuf;
+}
+
+static void remove_buf(struct mpstr *mp)
+{
+  struct buf *buf = mp->tail;
+  
+  mp->tail = buf->next;
+  if(mp->tail)
+    mp->tail->prev = NULL;
+  else {
+    mp->tail = mp->head = NULL;
+  }
+  
+  free(buf->pnt);
+  free(buf);
+
+}
+
+static int read_buf_byte(struct mpstr *mp)
+{
+	unsigned int b;
+
+	int pos;
+
+	pos = mp->tail->pos;
+	while(pos >= mp->tail->size) {
+		remove_buf(mp);
+		pos = mp->tail->pos;
+		if(!mp->tail) {
+			fprintf(stderr,"Fatal error!\n");
+			exit(1);
+		}
+	}
+
+	b = mp->tail->pnt[pos];
+	mp->bsize--;
+	mp->tail->pos++;
+	
+
+	return b;
+}
+
+static void read_head(struct mpstr *mp)
+{
+	unsigned long head;
+
+	head = read_buf_byte(mp);
+	head <<= 8;
+	head |= read_buf_byte(mp);
+	head <<= 8;
+	head |= read_buf_byte(mp);
+	head <<= 8;
+	head |= read_buf_byte(mp);
+
+	mp->header = head;
+}
+
+int decodeMP3(struct mpstr *mp,char *in,int isize,char *out,
+		int osize,int *done)
+{
+	int len;
+
+	gmp = mp;
+
+	if(osize < 4608) {
+		fprintf(stderr,"To less out space\n");
+		return MP3_ERR;
+	}
+
+	if(in) {
+		if(addbuf(mp,in,isize) == NULL) {
+			return MP3_ERR;
+		}
+	}
+
+	/* First decode header */
+	if(mp->framesize == 0) {
+		if(mp->bsize < 4) {
+			return MP3_NEED_MORE;
+		}
+		read_head(mp);
+		decode_header(&mp->fr,mp->header);
+		mp->framesize = mp->fr.framesize;
+	}
+
+	if(mp->fr.framesize > mp->bsize)
+		return MP3_NEED_MORE;
+
+	wordpointer = mp->bsspace[mp->bsnum] + 512;
+	mp->bsnum = (mp->bsnum + 1) & 0x1;
+	bitindex = 0;
+
+	len = 0;
+	while(len < mp->framesize) {
+		int nlen;
+		int blen = mp->tail->size - mp->tail->pos;
+		if( (mp->framesize - len) <= blen) {
+                  nlen = mp->framesize-len;
+		}
+		else {
+                  nlen = blen;
+                }
+		memcpy(wordpointer+len,mp->tail->pnt+mp->tail->pos,nlen);
+                len += nlen;
+                mp->tail->pos += nlen;
+		mp->bsize -= nlen;
+                if(mp->tail->pos == mp->tail->size) {
+                   remove_buf(mp);
+                }
+	}
+
+	*done = 0;
+	if(mp->fr.error_protection)
+           getbits(16);
+        switch(mp->fr.lay) {
+          case 1:
+	    do_layer1(&mp->fr,(unsigned char *) out,done);
+            break;
+          case 2:
+	    do_layer2(&mp->fr,(unsigned char *) out,done);
+            break;
+          case 3:
+	    do_layer3(&mp->fr,(unsigned char *) out,done);
+            break;
+        }
+
+	mp->fsizeold = mp->framesize;
+	mp->framesize = 0;
+
+	return MP3_OK;
+}
+
+int set_pointer(long backstep)
+{
+  unsigned char *bsbufold;
+  if(gmp->fsizeold < 0 && backstep > 0) {
+    fprintf(stderr,"Can't step back %ld!\n",backstep);
+    return MP3_ERR;
+  }
+  bsbufold = gmp->bsspace[gmp->bsnum] + 512;
+  wordpointer -= backstep;
+  if (backstep)
+    memcpy(wordpointer,bsbufold+gmp->fsizeold-backstep,backstep);
+  bitindex = 0;
+  return MP3_OK;
+}
+
+
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/l2tables.h	Sun May 19 17:16:38 2002
@@ -0,0 +1,160 @@
+/*
+ * Layer 2 Alloc tables .. 
+ * most other tables are calculated on program start (which is (of course)
+ * not ISO-conform) .. 
+ * Layer-3 huffman table is in huffman.h
+ */
+
+struct al_table
+{
+  short bits;
+  short d;
+};
+
+struct al_table alloc_0[] = {
+	{4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511},
+	{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767},
+	{4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511},
+	{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767},
+	{4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511},
+	{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767} };
+
+struct al_table alloc_1[] = {
+	{4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511},
+	{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767},
+	{4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511},
+	{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767},
+	{4,0},{5,3},{3,-3},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},{10,-511},
+	{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+	{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{3,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767},
+	{2,0},{5,3},{7,5},{16,-32767} };
+
+struct al_table alloc_2[] = {
+	{4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},
+	{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},
+	{4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},
+	{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63} };
+
+struct al_table alloc_3[] = {
+	{4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},
+	{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},
+	{4,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},{9,-255},
+	{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},{15,-16383},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63} };
+
+struct al_table alloc_4[] = {
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+		{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+		{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+		{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},
+	{4,0},{5,3},{7,5},{3,-3},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},{8,-127},
+		{9,-255},{10,-511},{11,-1023},{12,-2047},{13,-4095},{14,-8191},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{3,0},{5,3},{7,5},{10,9},{4,-7},{5,-15},{6,-31},{7,-63},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+	{2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9},
+    {2,0},{5,3},{7,5},{10,9}  };
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/layer1.c	Sun May 19 17:16:38 2002
@@ -0,0 +1,147 @@
+/* 
+ * Mpeg Layer-1 audio decoder 
+ * --------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ * near unoptimzed ...
+ *
+ * may have a few bugs after last optimization ... 
+ *
+ */
+
+#include "mpg123.h"
+
+void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr)
+{
+  unsigned int *ba=balloc;
+  unsigned int *sca = (unsigned int *) scale_index;
+
+  if(fr->stereo) {
+    int i;
+    int jsbound = fr->jsbound;
+    for (i=0;i<jsbound;i++) { 
+      *ba++ = getbits(4);
+      *ba++ = getbits(4);
+    }
+    for (i=jsbound;i<SBLIMIT;i++)
+      *ba++ = getbits(4);
+
+    ba = balloc;
+
+    for (i=0;i<jsbound;i++) {
+      if ((*ba++))
+        *sca++ = getbits(6);
+      if ((*ba++))
+        *sca++ = getbits(6);
+    }
+    for (i=jsbound;i<SBLIMIT;i++)
+      if ((*ba++)) {
+        *sca++ =  getbits(6);
+        *sca++ =  getbits(6);
+      }
+  }
+  else {
+    int i;
+    for (i=0;i<SBLIMIT;i++)
+      *ba++ = getbits(4);
+    ba = balloc;
+    for (i=0;i<SBLIMIT;i++)
+      if ((*ba++))
+        *sca++ = getbits(6);
+  }
+}
+
+void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT],
+	unsigned int scale_index[2][SBLIMIT],struct frame *fr)
+{
+  int i,n;
+  int smpb[2*SBLIMIT]; /* values: 0-65535 */
+  int *sample;
+  register unsigned int *ba;
+  register unsigned int *sca = (unsigned int *) scale_index;
+
+  if(fr->stereo) {
+    int jsbound = fr->jsbound;
+    register real *f0 = fraction[0];
+    register real *f1 = fraction[1];
+    ba = balloc;
+    for (sample=smpb,i=0;i<jsbound;i++)  {
+      if ((n = *ba++))
+        *sample++ = getbits(n+1);
+      if ((n = *ba++))
+        *sample++ = getbits(n+1);
+    }
+    for (i=jsbound;i<SBLIMIT;i++) 
+      if ((n = *ba++))
+        *sample++ = getbits(n+1);
+
+    ba = balloc;
+    for (sample=smpb,i=0;i<jsbound;i++) {
+      if((n=*ba++))
+        *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
+      else
+        *f0++ = 0.0;
+      if((n=*ba++))
+        *f1++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
+      else
+        *f1++ = 0.0;
+    }
+    for (i=jsbound;i<SBLIMIT;i++) {
+      if ((n=*ba++)) {
+        real samp = ( ((-1)<<n) + (*sample++) + 1);
+        *f0++ = samp * muls[n+1][*sca++];
+        *f1++ = samp * muls[n+1][*sca++];
+      }
+      else
+        *f0++ = *f1++ = 0.0;
+    }
+  }
+  else {
+    register real *f0 = fraction[0];
+    ba = balloc;
+    for (sample=smpb,i=0;i<SBLIMIT;i++)
+      if ((n = *ba++))
+        *sample++ = getbits(n+1);
+    ba = balloc;
+    for (sample=smpb,i=0;i<SBLIMIT;i++) {
+      if((n=*ba++))
+        *f0++ = (real) ( ((-1)<<n) + (*sample++) + 1) * muls[n+1][*sca++];
+      else
+        *f0++ = 0.0;
+    }
+  }
+}
+
+int do_layer1(struct frame *fr,unsigned char *pcm_sample,int *pcm_point)
+{
+  int clip=0;
+  int i,stereo = fr->stereo;
+  unsigned int balloc[2*SBLIMIT];
+  unsigned int scale_index[2][SBLIMIT];
+  real fraction[2][SBLIMIT];
+  int single = fr->single;
+
+  fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
+
+  if(stereo == 1 || single == 3)
+    single = 0;
+
+  I_step_one(balloc,scale_index,fr);
+
+  for (i=0;i<SCALE_BLOCK;i++)
+  {
+    I_step_two(fraction,balloc,scale_index,fr);
+
+      if(single >= 0) {
+        clip += synth_1to1_mono( (real*)fraction[single],pcm_sample,pcm_point);
+      }
+      else {
+        int p1 = *pcm_point;
+        clip += synth_1to1( (real*)fraction[0],0,pcm_sample,&p1);
+        clip += synth_1to1( (real*)fraction[1],1,pcm_sample,pcm_point);
+      }
+  }
+
+  return clip;
+}
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/layer2.c	Sun May 19 17:16:38 2002
@@ -0,0 +1,288 @@
+/* 
+ * Mpeg Layer-2 audio decoder 
+ * --------------------------
+ * copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
+ *
+ */
+
+#include "mpg123.h"
+#include "l2tables.h"
+
+static int grp_3tab[32 * 3] = { 0, };   /* used: 27 */
+static int grp_5tab[128 * 3] = { 0, };  /* used: 125 */
+static int grp_9tab[1024 * 3] = { 0, }; /* used: 729 */
+
+real muls[27][64];	/* also used by layer 1 */
+
+void init_layer2(void)
+{
+  static double mulmul[27] = {
+    0.0 , -2.0/3.0 , 2.0/3.0 ,
+    2.0/7.0 , 2.0/15.0 , 2.0/31.0, 2.0/63.0 , 2.0/127.0 , 2.0/255.0 ,
+    2.0/511.0 , 2.0/1023.0 , 2.0/2047.0 , 2.0/4095.0 , 2.0/8191.0 ,
+    2.0/16383.0 , 2.0/32767.0 , 2.0/65535.0 ,
+    -4.0/5.0 , -2.0/5.0 , 2.0/5.0, 4.0/5.0 ,
+    -8.0/9.0 , -4.0/9.0 , -2.0/9.0 , 2.0/9.0 , 4.0/9.0 , 8.0/9.0 };
+  static int base[3][9] = {
+     { 1 , 0, 2 , } ,
+     { 17, 18, 0 , 19, 20 , } ,
+     { 21, 1, 22, 23, 0, 24, 25, 2, 26 } };
+  int i,j,k,l,len;
+  real *table;
+  static int tablen[3] = { 3 , 5 , 9 };
+  static int *itable,*tables[3] = { grp_3tab , grp_5tab , grp_9tab };
+
+  for(i=0;i<3;i++)
+  {
+    itable = tables[i];
+    len = tablen[i];
+    for(j=0;j<len;j++)
+      for(k=0;k<len;k++)
+        for(l=0;l<len;l++)
+        {
+          *itable++ = base[i][l];
+          *itable++ = base[i][k];
+          *itable++ = base[i][j];
+        }
+  }
+
+  for(k=0;k<27;k++)
+  {
+    double m=mulmul[k];
+    table = muls[k];
+    for(j=3,i=0;i<63;i++,j--)
+      *table++ = m * pow(2.0,(double) j / 3.0);
+    *table++ = 0.0;
+  }
+}
+
+
+void II_step_one(unsigned int *bit_alloc,int *scale,struct frame *fr)
+{
+    int stereo = fr->stereo-1;
+    int sblimit = fr->II_sblimit;
+    int jsbound = fr->jsbound;
+    int sblimit2 = fr->II_sblimit<<stereo;
+    struct al_table *alloc1 = fr->alloc;
+    int i;
+    static unsigned int scfsi_buf[64];
+    unsigned int *scfsi,*bita;
+    int sc,step;
+
+    bita = bit_alloc;
+    if(stereo)
+    {
+      for (i=jsbound;i;i--,alloc1+=(1<<step))
+      {
+        *bita++ = (char) getbits(step=alloc1->bits);
+        *bita++ = (char) getbits(step);
+      }
+      for (i=sblimit-jsbound;i;i--,alloc1+=(1<<step))
+      {
+        bita[0] = (char) getbits(step=alloc1->bits);
+        bita[1] = bita[0];
+        bita+=2;
+      }
+      bita = bit_alloc;
+      scfsi=scfsi_buf;
+      for (i=sblimit2;i;i--)
+        if (*bita++)
+          *scfsi++ = (char) getbits_fast(2);
+    }
+    else /* mono */
+    {
+      for (i=sblimit;i;i--,alloc1+=(1<<step))
+        *bita++ = (char) getbits(step=alloc1->bits);
+      bita = bit_alloc;
+      scfsi=scfsi_buf;
+      for (i=sblimit;i;i--)
+        if (*bita++)
+          *scfsi++ = (char) getbits_fast(2);
+    }
+
+    bita = bit_alloc;
+    scfsi=scfsi_buf;
+    for (i=sblimit2;i;i--) 
+      if (*bita++)
+        switch (*scfsi++) 
+        {
+          case 0: 
+                *scale++ = getbits_fast(6);
+                *scale++ = getbits_fast(6);
+                *scale++ = getbits_fast(6);
+                break;
+          case 1 : 
+                *scale++ = sc = getbits_fast(6);
+                *scale++ = sc;
+                *scale++ = getbits_fast(6);
+                break;
+          case 2: 
+                *scale++ = sc = getbits_fast(6);
+                *scale++ = sc;
+                *scale++ = sc;
+                break;
+          default:              /* case 3 */
+                *scale++ = getbits_fast(6);
+                *scale++ = sc = getbits_fast(6);
+                *scale++ = sc;
+                break;
+        }
+
+}
+
+void II_step_two(unsigned int *bit_alloc,real fraction[2][4][SBLIMIT],int *scale,struct frame *fr,int x1)
+{
+    int i,j,k,ba;
+    int stereo = fr->stereo;
+    int sblimit = fr->II_sblimit;
+    int jsbound = fr->jsbound;
+    struct al_table *alloc2,*alloc1 = fr->alloc;
+    unsigned int *bita=bit_alloc;
+    int d1,step;
+
+    for (i=0;i<jsbound;i++,alloc1+=(1<<step))
+    {
+      step = alloc1->bits;
+      for (j=0;j<stereo;j++)
+      {
+        if ( (ba=*bita++) ) 
+        {
+          k=(alloc2 = alloc1+ba)->bits;
+          if( (d1=alloc2->d) < 0) 
+          {
+            real cm=muls[k][scale[x1]];
+            fraction[j][0][i] = ((real) ((int)getbits(k) + d1)) * cm;
+            fraction[j][1][i] = ((real) ((int)getbits(k) + d1)) * cm;
+            fraction[j][2][i] = ((real) ((int)getbits(k) + d1)) * cm;
+          }        
+          else 
+          {
+            static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab };
+            unsigned int idx,*tab,m=scale[x1];
+            idx = (unsigned int) getbits(k);
+            tab = (unsigned int *) (table[d1] + idx + idx + idx);
+            fraction[j][0][i] = muls[*tab++][m];
+            fraction[j][1][i] = muls[*tab++][m];
+            fraction[j][2][i] = muls[*tab][m];  
+          }
+          scale+=3;
+        }
+        else
+          fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
+      }
+    }
+
+    for (i=jsbound;i<sblimit;i++,alloc1+=(1<<step))
+    {
+      step = alloc1->bits;
+      bita++;	/* channel 1 and channel 2 bitalloc are the same */
+      if ( (ba=*bita++) )
+      {
+        k=(alloc2 = alloc1+ba)->bits;
+        if( (d1=alloc2->d) < 0)
+        {
+          real cm;
+          cm=muls[k][scale[x1+3]];
+          fraction[1][0][i] = (fraction[0][0][i] = (real) ((int)getbits(k) + d1) ) * cm;
+          fraction[1][1][i] = (fraction[0][1][i] = (real) ((int)getbits(k) + d1) ) * cm;
+          fraction[1][2][i] = (fraction[0][2][i] = (real) ((int)getbits(k) + d1) ) * cm;
+          cm=muls[k][scale[x1]];
+          fraction[0][0][i] *= cm; fraction[0][1][i] *= cm; fraction[0][2][i] *= cm;
+        }
+        else
+        {
+          static int *table[] = { 0,0,0,grp_3tab,0,grp_5tab,0,0,0,grp_9tab };
+          unsigned int idx,*tab,m1,m2;
+          m1 = scale[x1]; m2 = scale[x1+3];
+          idx = (unsigned int) getbits(k);
+          tab = (unsigned int *) (table[d1] + idx + idx + idx);
+          fraction[0][0][i] = muls[*tab][m1]; fraction[1][0][i] = muls[*tab++][m2];
+          fraction[0][1][i] = muls[*tab][m1]; fraction[1][1][i] = muls[*tab++][m2];
+          fraction[0][2][i] = muls[*tab][m1]; fraction[1][2][i] = muls[*tab][m2];
+        }
+        scale+=6;
+      }
+      else {
+        fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] =
+        fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0.0;
+      }
+/* 
+   should we use individual scalefac for channel 2 or
+   is the current way the right one , where we just copy channel 1 to
+   channel 2 ?? 
+   The current 'strange' thing is, that we throw away the scalefac
+   values for the second channel ...!!
+-> changed .. now we use the scalefac values of channel one !! 
+*/
+    }
+
+    for(i=sblimit;i<SBLIMIT;i++)
+      for (j=0;j<stereo;j++)
+        fraction[j][0][i] = fraction[j][1][i] = fraction[j][2][i] = 0.0;
+
+}
+
+static void II_select_table(struct frame *fr)
+{
+  static int translate[3][2][16] =
+   { { { 0,2,2,2,2,2,2,0,0,0,1,1,1,1,1,0 } ,
+       { 0,2,2,0,0,0,1,1,1,1,1,1,1,1,1,0 } } ,
+     { { 0,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0 } ,
+       { 0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0 } } ,
+     { { 0,3,3,3,3,3,3,0,0,0,1,1,1,1,1,0 } ,
+       { 0,3,3,0,0,0,1,1,1,1,1,1,1,1,1,0 } } };
+
+  int table,sblim;
+  static struct al_table *tables[5] =
+       { alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
+  static int sblims[5] = { 27 , 30 , 8, 12 , 30 };
+
+  if(fr->lsf)
+    table = 4;
+  else
+    table = translate[fr->sampling_frequency][2-fr->stereo][fr->bitrate_index];
+  sblim = sblims[table];
+
+  fr->alloc      = tables[table];
+  fr->II_sblimit = sblim;
+}
+
+int do_layer2(struct frame *fr,unsigned char *pcm_sample,int *pcm_point)
+{
+  int clip=0;
+  int i,j;
+  int stereo = fr->stereo;
+  real fraction[2][4][SBLIMIT]; /* pick_table clears unused subbands */
+  unsigned int bit_alloc[64];
+  int scale[192];
+  int single = fr->single;
+
+  II_select_table(fr);
+  fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ?
+     (fr->mode_ext<<2)+4 : fr->II_sblimit;
+
+  if(stereo == 1 || single == 3)
+    single = 0;
+
+  II_step_one(bit_alloc, scale, fr);
+
+  for (i=0;i<SCALE_BLOCK;i++) 
+  {
+    II_step_two(bit_alloc,fraction,scale,fr,i>>2);
+    for (j=0;j<3;j++) {
+      if(single >= 0) {
+        clip += synth_1to1_mono(fraction[0][j],pcm_sample,pcm_point);
+      }
+      else {
+        int p1 = *pcm_point;
+        clip += synth_1to1(fraction[0][j],0,pcm_sample,&p1);
+        clip += synth_1to1(fraction[1][j],1,pcm_sample,pcm_point);
+      }
+
+    }
+  }
+
+  return clip;
+}
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/layer3.c	Sun May 19 17:16:39 2002
@@ -0,0 +1,2010 @@
+/* 
+ * Mpeg Layer-3 audio decoder 
+ * --------------------------
+ * copyright (c) 1995,1996,1997 by Michael Hipp.
+ * All rights reserved. See also 'README'
+ */ 
+
+#include <stdlib.h>
+#include "mpg123.h"
+#include "mpglib.h"
+#include "huffman.h"
+
+extern struct mpstr *gmp;
+
+#define MPEG1
+
+
+static real ispow[8207];
+static real aa_ca[8],aa_cs[8];
+static real COS1[12][6];
+static real win[4][36];
+static real win1[4][36];
+static real gainpow2[256+118+4];
+static real COS9[9];
+static real COS6_1,COS6_2;
+static real tfcos36[9];
+static real tfcos12[3];
+
+struct bandInfoStruct {
+  short longIdx[23];
+  short longDiff[22];
+  short shortIdx[14];
+  short shortDiff[13];
+};
+
+int longLimit[9][23];
+int shortLimit[9][14];
+
+struct bandInfoStruct bandInfo[9] = { 
+
+/* MPEG 1.0 */
+ { {0,4,8,12,16,20,24,30,36,44,52,62,74, 90,110,134,162,196,238,288,342,418,576},
+   {4,4,4,4,4,4,6,6,8, 8,10,12,16,20,24,28,34,42,50,54, 76,158},
+   {0,4*3,8*3,12*3,16*3,22*3,30*3,40*3,52*3,66*3, 84*3,106*3,136*3,192*3},
+   {4,4,4,4,6,8,10,12,14,18,22,30,56} } ,
+
+ { {0,4,8,12,16,20,24,30,36,42,50,60,72, 88,106,128,156,190,230,276,330,384,576},
+   {4,4,4,4,4,4,6,6,6, 8,10,12,16,18,22,28,34,40,46,54, 54,192},
+   {0,4*3,8*3,12*3,16*3,22*3,28*3,38*3,50*3,64*3, 80*3,100*3,126*3,192*3},
+   {4,4,4,4,6,6,10,12,14,16,20,26,66} } ,
+
+ { {0,4,8,12,16,20,24,30,36,44,54,66,82,102,126,156,194,240,296,364,448,550,576} ,
+   {4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102, 26} ,
+   {0,4*3,8*3,12*3,16*3,22*3,30*3,42*3,58*3,78*3,104*3,138*3,180*3,192*3} ,
+   {4,4,4,4,6,8,12,16,20,26,34,42,12} }  ,
+
+/* MPEG 2.0 */
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
+   {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 } ,
+   {0,4*3,8*3,12*3,18*3,24*3,32*3,42*3,56*3,74*3,100*3,132*3,174*3,192*3} ,
+   {4,4,4,6,6,8,10,14,18,26,32,42,18 } } ,
+
+ { {0,6,12,18,24,30,36,44,54,66,80,96,114,136,162,194,232,278,330,394,464,540,576},
+   {6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,52,64,70,76,36 } ,
+   {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,136*3,180*3,192*3} ,
+   {4,4,4,6,8,10,12,14,18,24,32,44,12 } } ,
+
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576},
+   {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54 },
+   {0,4*3,8*3,12*3,18*3,26*3,36*3,48*3,62*3,80*3,104*3,134*3,174*3,192*3},
+   {4,4,4,6,8,10,12,14,18,24,30,40,18 } } ,
+/* MPEG 2.5 */
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
+   {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
+   {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
+   {4,4,4,6,8,10,12,14,18,24,30,40,18} },
+ { {0,6,12,18,24,30,36,44,54,66,80,96,116,140,168,200,238,284,336,396,464,522,576} ,
+   {6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54},
+   {0,12,24,36,54,78,108,144,186,240,312,402,522,576},
+   {4,4,4,6,8,10,12,14,18,24,30,40,18} },
+ { {0,12,24,36,48,60,72,88,108,132,160,192,232,280,336,400,476,566,568,570,572,574,576},
+   {12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2},
+   {0, 24, 48, 72,108,156,216,288,372,480,486,492,498,576},
+   {8,8,8,12,16,20,24,28,36,2,2,2,26} } ,
+};
+
+static int mapbuf0[9][152];
+static int mapbuf1[9][156];
+static int mapbuf2[9][44];
+static int *map[9][3];
+static int *mapend[9][3];
+
+static unsigned int n_slen2[512]; /* MPEG 2.0 slen for 'normal' mode */
+static unsigned int i_slen2[256]; /* MPEG 2.0 slen for intensity stereo */
+
+static real tan1_1[16],tan2_1[16],tan1_2[16],tan2_2[16];
+static real pow1_1[2][16],pow2_1[2][16],pow1_2[2][16],pow2_2[2][16];
+
+/* 
+ * init tables for layer-3 
+ */
+void init_layer3(int down_sample_sblimit)
+{
+  int i,j,k,l;
+
+  for(i=-256;i<118+4;i++)
+    gainpow2[i+256] = pow((double)2.0,-0.25 * (double) (i+210) );
+
+  for(i=0;i<8207;i++)
+    ispow[i] = pow((double)i,(double)4.0/3.0);
+
+  for (i=0;i<8;i++)
+  {
+    static double Ci[8]={-0.6,-0.535,-0.33,-0.185,-0.095,-0.041,-0.0142,-0.0037};
+    double sq=sqrt(1.0+Ci[i]*Ci[i]);
+    aa_cs[i] = 1.0/sq;
+    aa_ca[i] = Ci[i]/sq;
+  }
+
+  for(i=0;i<18;i++)
+  {
+    win[0][i]    = win[1][i]    = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+0) +1) ) / cos ( M_PI * (double) (2*(i+0) +19) / 72.0 );
+    win[0][i+18] = win[3][i+18] = 0.5 * sin( M_PI / 72.0 * (double) (2*(i+18)+1) ) / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
+  }
+  for(i=0;i<6;i++)
+  {
+    win[1][i+18] = 0.5 / cos ( M_PI * (double) (2*(i+18)+19) / 72.0 );
+    win[3][i+12] = 0.5 / cos ( M_PI * (double) (2*(i+12)+19) / 72.0 );
+    win[1][i+24] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+13) ) / cos ( M_PI * (double) (2*(i+24)+19) / 72.0 );
+    win[1][i+30] = win[3][i] = 0.0;
+    win[3][i+6 ] = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) )  / cos ( M_PI * (double) (2*(i+6 )+19) / 72.0 );
+  }
+
+  for(i=0;i<9;i++)
+    COS9[i] = cos( M_PI / 18.0 * (double) i);
+
+  for(i=0;i<9;i++)
+    tfcos36[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 36.0 );
+  for(i=0;i<3;i++)
+    tfcos12[i] = 0.5 / cos ( M_PI * (double) (i*2+1) / 12.0 );
+
+  COS6_1 = cos( M_PI / 6.0 * (double) 1);
+  COS6_2 = cos( M_PI / 6.0 * (double) 2);
+
+  for(i=0;i<12;i++)
+  {
+    win[2][i]  = 0.5 * sin( M_PI / 24.0 * (double) (2*i+1) ) / cos ( M_PI * (double) (2*i+7) / 24.0 );
+    for(j=0;j<6;j++)
+      COS1[i][j] = cos( M_PI / 24.0 * (double) ((2*i+7)*(2*j+1)) );
+  }
+
+  for(j=0;j<4;j++) {
+    static int len[4] = { 36,36,12,36 };
+    for(i=0;i<len[j];i+=2)
+      win1[j][i] = + win[j][i];
+    for(i=1;i<len[j];i+=2)
+      win1[j][i] = - win[j][i];
+  }
+
+  for(i=0;i<16;i++)
+  {
+    double t = tan( (double) i * M_PI / 12.0 );
+    tan1_1[i] = t / (1.0+t);
+    tan2_1[i] = 1.0 / (1.0 + t);
+    tan1_2[i] = M_SQRT2 * t / (1.0+t);
+    tan2_2[i] = M_SQRT2 / (1.0 + t);
+
+    for(j=0;j<2;j++) {
+      double base = pow(2.0,-0.25*(j+1.0));
+      double p1=1.0,p2=1.0;
+      if(i > 0) {
+        if( i & 1 )
+          p1 = pow(base,(i+1.0)*0.5);
+        else
+          p2 = pow(base,i*0.5);
+      }
+      pow1_1[j][i] = p1;
+      pow2_1[j][i] = p2;
+      pow1_2[j][i] = M_SQRT2 * p1;
+      pow2_2[j][i] = M_SQRT2 * p2;
+    }
+  }
+
+  for(j=0;j<9;j++)
+  {
+   struct bandInfoStruct *bi = &bandInfo[j];
+   int *mp;
+   int cb,lwin;
+   short *bdf;
+
+   mp = map[j][0] = mapbuf0[j];
+   bdf = bi->longDiff;
+   for(i=0,cb = 0; cb < 8 ; cb++,i+=*bdf++) {
+     *mp++ = (*bdf) >> 1;
+     *mp++ = i;
+     *mp++ = 3;
+     *mp++ = cb;
+   }
+   bdf = bi->shortDiff+3;
+   for(cb=3;cb<13;cb++) {
+     int l = (*bdf++) >> 1;
+     for(lwin=0;lwin<3;lwin++) {
+       *mp++ = l;
+       *mp++ = i + lwin;
+       *mp++ = lwin;
+       *mp++ = cb;
+     }
+     i += 6*l;
+   }
+   mapend[j][0] = mp;
+
+   mp = map[j][1] = mapbuf1[j];
+   bdf = bi->shortDiff+0;
+   for(i=0,cb=0;cb<13;cb++) {
+     int l = (*bdf++) >> 1;
+     for(lwin=0;lwin<3;lwin++) {
+       *mp++ = l;
+       *mp++ = i + lwin;
+       *mp++ = lwin;
+       *mp++ = cb;
+     }
+     i += 6*l;
+   }
+   mapend[j][1] = mp;
+
+   mp = map[j][2] = mapbuf2[j];
+   bdf = bi->longDiff;
+   for(cb = 0; cb < 22 ; cb++) {
+     *mp++ = (*bdf++) >> 1;
+     *mp++ = cb;
+   }
+   mapend[j][2] = mp;
+
+  }
+
+  for(j=0;j<9;j++) {
+    for(i=0;i<23;i++) {
+      longLimit[j][i] = (bandInfo[j].longIdx[i] - 1 + 8) / 18 + 1;
+      if(longLimit[j][i] > (down_sample_sblimit) )
+        longLimit[j][i] = down_sample_sblimit;
+    }
+    for(i=0;i<14;i++) {
+      shortLimit[j][i] = (bandInfo[j].shortIdx[i] - 1) / 18 + 1;
+      if(shortLimit[j][i] > (down_sample_sblimit) )
+        shortLimit[j][i] = down_sample_sblimit;
+    }
+  }
+
+  for(i=0;i<5;i++) {
+    for(j=0;j<6;j++) {
+      for(k=0;k<6;k++) {
+        int n = k + j * 6 + i * 36;
+        i_slen2[n] = i|(j<<3)|(k<<6)|(3<<12);
+      }
+    }
+  }
+  for(i=0;i<4;i++) {
+    for(j=0;j<4;j++) {
+      for(k=0;k<4;k++) {
+        int n = k + j * 4 + i * 16;
+        i_slen2[n+180] = i|(j<<3)|(k<<6)|(4<<12);
+      }
+    }
+  }
+  for(i=0;i<4;i++) {
+    for(j=0;j<3;j++) {
+      int n = j + i * 3;
+      i_slen2[n+244] = i|(j<<3) | (5<<12);
+      n_slen2[n+500] = i|(j<<3) | (2<<12) | (1<<15);
+    }
+  }
+
+  for(i=0;i<5;i++) {
+    for(j=0;j<5;j++) {
+      for(k=0;k<4;k++) {
+        for(l=0;l<4;l++) {
+          int n = l + k * 4 + j * 16 + i * 80;
+          n_slen2[n] = i|(j<<3)|(k<<6)|(l<<9)|(0<<12);
+        }
+      }
+    }
+  }
+  for(i=0;i<5;i++) {
+    for(j=0;j<5;j++) {
+      for(k=0;k<4;k++) {
+        int n = k + j * 4 + i * 20;
+        n_slen2[n+400] = i|(j<<3)|(k<<6)|(1<<12);
+      }
+    }
+  }
+}
+
+/*
+ * read additional side information
+ */
+#ifdef MPEG1 
+static int III_get_side_info_1(struct III_sideinfo *si,int stereo,
+ int ms_stereo,long sfreq,int single)
+{
+   int ch, gr;
+   int powdiff = (single == 3) ? 4 : 0;
+
+   si->main_data_begin = getbits(9);
+   if (stereo == 1)
+     si->private_bits = getbits_fast(5);
+   else 
+     si->private_bits = getbits_fast(3);
+
+   for (ch=0; ch<stereo; ch++) {
+       si->ch[ch].gr[0].scfsi = -1;
+       si->ch[ch].gr[1].scfsi = getbits_fast(4);
+   }
+
+   for (gr=0; gr<2; gr++) 
+   {
+     for (ch=0; ch<stereo; ch++) 
+     {
+       register struct gr_info_s *gr_info = &(si->ch[ch].gr[gr]);
+
+       gr_info->part2_3_length = getbits(12);
+       gr_info->big_values = getbits_fast(9);
+       if(gr_info->big_values > 288) {
+          fprintf(stderr,"big_values too large!\n");
+          gr_info->big_values = 288;
+       }
+       gr_info->pow2gain = gainpow2+256 - getbits_fast(8) + powdiff;
+       if(ms_stereo)
+         gr_info->pow2gain += 2;
+       gr_info->scalefac_compress = getbits_fast(4);
+/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
+       if(get1bit()) 
+       {
+         int i;
+         gr_info->block_type = getbits_fast(2);
+         gr_info->mixed_block_flag = get1bit();
+         gr_info->table_select[0] = getbits_fast(5);
+         gr_info->table_select[1] = getbits_fast(5);
+         /*
+          * table_select[2] not needed, because there is no region2,
+          * but to satisfy some verifications tools we set it either.
+          */
+         gr_info->table_select[2] = 0;
+         for(i=0;i<3;i++)
+           gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
+
+         if(gr_info->block_type == 0) {
+           fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
+           return 0;
+         }
+         /* region_count/start parameters are implicit in this case. */       
+         gr_info->region1start = 36>>1;
+         gr_info->region2start = 576>>1;
+       }
+       else 
+       {
+         int i,r0c,r1c;
+         for (i=0; i<3; i++)
+           gr_info->table_select[i] = getbits_fast(5);
+         r0c = getbits_fast(4);
+         r1c = getbits_fast(3);
+         gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
+         gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
+         gr_info->block_type = 0;
+         gr_info->mixed_block_flag = 0;
+       }
+       gr_info->preflag = get1bit();
+       gr_info->scalefac_scale = get1bit();
+       gr_info->count1table_select = get1bit();
+     }
+   }
+   return !0;
+}
+#endif
+
+/*
+ * Side Info for MPEG 2.0 / LSF
+ */
+static int III_get_side_info_2(struct III_sideinfo *si,int stereo,
+ int ms_stereo,long sfreq,int single)
+{
+   int ch;
+   int powdiff = (single == 3) ? 4 : 0;
+
+   si->main_data_begin = getbits(8);
+   if (stereo == 1)
+     si->private_bits = get1bit();
+   else 
+     si->private_bits = getbits_fast(2);
+
+   for (ch=0; ch<stereo; ch++) 
+   {
+       register struct gr_info_s *gr_info = &(si->ch[ch].gr[0]);
+
+       gr_info->part2_3_length = getbits(12);
+       gr_info->big_values = getbits_fast(9);
+       if(gr_info->big_values > 288) {
+         fprintf(stderr,"big_values too large!\n");
+         gr_info->big_values = 288;
+       }
+       gr_info->pow2gain = gainpow2+256 - getbits_fast(8) + powdiff;
+       if(ms_stereo)
+         gr_info->pow2gain += 2;
+       gr_info->scalefac_compress = getbits(9);
+/* window-switching flag == 1 for block_Type != 0 .. and block-type == 0 -> win-sw-flag = 0 */
+       if(get1bit()) 
+       {
+         int i;
+         gr_info->block_type = getbits_fast(2);
+         gr_info->mixed_block_flag = get1bit();
+         gr_info->table_select[0] = getbits_fast(5);
+         gr_info->table_select[1] = getbits_fast(5);
+         /*
+          * table_select[2] not needed, because there is no region2,
+          * but to satisfy some verifications tools we set it either.
+          */
+         gr_info->table_select[2] = 0;
+         for(i=0;i<3;i++)
+           gr_info->full_gain[i] = gr_info->pow2gain + (getbits_fast(3)<<3);
+
+         if(gr_info->block_type == 0) {
+           fprintf(stderr,"Blocktype == 0 and window-switching == 1 not allowed.\n");
+           return 0;
+         }
+         /* region_count/start parameters are implicit in this case. */       
+/* check this again! */
+         if(gr_info->block_type == 2)
+           gr_info->region1start = 36>>1;
+         else if(sfreq == 8)
+/* check this for 2.5 and sfreq=8 */
+           gr_info->region1start = 108>>1;
+         else
+           gr_info->region1start = 54>>1;
+         gr_info->region2start = 576>>1;
+       }
+       else 
+       {
+         int i,r0c,r1c;
+         for (i=0; i<3; i++)
+           gr_info->table_select[i] = getbits_fast(5);
+         r0c = getbits_fast(4);
+         r1c = getbits_fast(3);
+         gr_info->region1start = bandInfo[sfreq].longIdx[r0c+1] >> 1 ;
+         gr_info->region2start = bandInfo[sfreq].longIdx[r0c+1+r1c+1] >> 1;
+         gr_info->block_type = 0;
+         gr_info->mixed_block_flag = 0;
+       }
+       gr_info->scalefac_scale = get1bit();
+       gr_info->count1table_select = get1bit();
+   }
+   return !0;
+}
+
+/*
+ * read scalefactors
+ */
+#ifdef MPEG1
+static int III_get_scale_factors_1(int *scf,struct gr_info_s *gr_info)
+{
+   static const unsigned char slen[2][16] = {
+     {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
+     {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
+   };
+   int numbits;
+   int num0 = slen[0][gr_info->scalefac_compress];
+   int num1 = slen[1][gr_info->scalefac_compress];
+
+    if (gr_info->block_type == 2) {
+      int i=18;
+      numbits = (num0 + num1) * 18;
+
+      if (gr_info->mixed_block_flag) {
+         for (i=8;i;i--)
+           *scf++ = getbits_fast(num0);
+         i = 9;
+         numbits -= num0; /* num0 * 17 + num1 * 18 */
+      }
+
+      for (;i;i--)
+        *scf++ = getbits_fast(num0);
+      for (i = 18; i; i--)
+        *scf++ = getbits_fast(num1);
+      *scf++ = 0; *scf++ = 0; *scf++ = 0; /* short[13][0..2] = 0 */
+    }
+    else {
+      int i;
+      int scfsi = gr_info->scfsi;
+
+      if(scfsi < 0) { /* scfsi < 0 => granule == 0 */
+         for(i=11;i;i--)
+           *scf++ = getbits_fast(num0);
+         for(i=10;i;i--)
+           *scf++ = getbits_fast(num1);
+         numbits = (num0 + num1) * 10 + num0;
+         *scf++ = 0;
+      }
+      else {
+        numbits = 0;
+        if(!(scfsi & 0x8)) {
+          for (i=0;i<6;i++)
+            *scf++ = getbits_fast(num0);
+          numbits += num0 * 6;
+        }
+        else {
+          scf += 6; 
+        }
+
+        if(!(scfsi & 0x4)) {
+          for (i=0;i<5;i++)
+            *scf++ = getbits_fast(num0);
+          numbits += num0 * 5;
+        }
+        else {
+          scf += 5;
+        }
+
+        if(!(scfsi & 0x2)) {
+          for(i=0;i<5;i++)
+            *scf++ = getbits_fast(num1);
+          numbits += num1 * 5;
+        }
+        else {
+          scf += 5; 
+        }
+
+        if(!(scfsi & 0x1)) {
+          for (i=0;i<5;i++)
+            *scf++ = getbits_fast(num1);
+          numbits += num1 * 5;
+        }
+        else {
+           scf += 5;
+        }
+        *scf++ = 0;  /* no l[21] in original sources */
+      }
+    }
+    return numbits;
+}
+#endif
+
+
+static int III_get_scale_factors_2(int *scf,struct gr_info_s *gr_info,int i_stereo)
+{
+  unsigned char *pnt;
+  int i,j;
+  unsigned int slen;
+  int n = 0;
+  int numbits = 0;
+
+  static unsigned char stab[3][6][4] = {
+   { { 6, 5, 5,5 } , { 6, 5, 7,3 } , { 11,10,0,0} ,
+     { 7, 7, 7,0 } , { 6, 6, 6,3 } , {  8, 8,5,0} } ,
+   { { 9, 9, 9,9 } , { 9, 9,12,6 } , { 18,18,0,0} ,
+     {12,12,12,0 } , {12, 9, 9,6 } , { 15,12,9,0} } ,
+   { { 6, 9, 9,9 } , { 6, 9,12,6 } , { 15,18,0,0} ,
+     { 6,15,12,0 } , { 6,12, 9,6 } , {  6,18,9,0} } }; 
+
+  if(i_stereo) /* i_stereo AND second channel -> do_layer3() checks this */
+    slen = i_slen2[gr_info->scalefac_compress>>1];
+  else
+    slen = n_slen2[gr_info->scalefac_compress];
+
+  gr_info->preflag = (slen>>15) & 0x1;
+
+  n = 0;  
+  if( gr_info->block_type == 2 ) {
+    n++;
+    if(gr_info->mixed_block_flag)
+      n++;
+  }
+
+  pnt = stab[n][(slen>>12)&0x7];
+
+  for(i=0;i<4;i++) {
+    int num = slen & 0x7;
+    slen >>= 3;
+    if(num) {
+      for(j=0;j<(int)(pnt[i]);j++)
+        *scf++ = getbits_fast(num);
+      numbits += pnt[i] * num;
+    }
+    else {
+      for(j=0;j<(int)(pnt[i]);j++)
+        *scf++ = 0;
+    }
+  }
+  
+  n = (n << 1) + 1;
+  for(i=0;i<n;i++)
+    *scf++ = 0;
+
+  return numbits;
+}
+
+static int pretab1[22] = {0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
+static int pretab2[22] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+/*
+ * don't forget to apply the same changes to III_dequantize_sample_ms() !!! 
+ */
+static int III_dequantize_sample(real xr[SBLIMIT][SSLIMIT],int *scf,
+   struct gr_info_s *gr_info,int sfreq,int part2bits)
+{
+  int shift = 1 + gr_info->scalefac_scale;
+  real *xrpnt = (real *) xr;
+  int l[3],l3;
+  int part2remain = gr_info->part2_3_length - part2bits;
+  int *me;
+
+  {
+    int bv       = gr_info->big_values;
+    int region1  = gr_info->region1start;
+    int region2  = gr_info->region2start;
+
+    l3 = ((576>>1)-bv)>>1;   
+/*
+ * we may lose the 'odd' bit here !! 
+ * check this later again 
+ */
+    if(bv <= region1) {
+      l[0] = bv; l[1] = 0; l[2] = 0;
+    }
+    else {
+      l[0] = region1;
+      if(bv <= region2) {
+        l[1] = bv - l[0];  l[2] = 0;
+      }
+      else {
+        l[1] = region2 - l[0]; l[2] = bv - region2;
+      }
+    }
+  }
+ 
+  if(gr_info->block_type == 2) {
+    /*
+     * decoding with short or mixed mode BandIndex table 
+     */
+    int i,max[4];
+    int step=0,lwin=0,cb=0;
+    register real v = 0.0;
+    register int *m,mc;
+
+    if(gr_info->mixed_block_flag) {
+      max[3] = -1;
+      max[0] = max[1] = max[2] = 2;
+      m = map[sfreq][0];
+      me = mapend[sfreq][0];
+    }
+    else {
+      max[0] = max[1] = max[2] = max[3] = -1;
+      /* max[3] not really needed in this case */
+      m = map[sfreq][1];
+      me = mapend[sfreq][1];
+    }
+
+    mc = 0;
+    for(i=0;i<2;i++) {
+      int lp = l[i];
+      struct newhuff *h = ht+gr_info->table_select[i];
+      for(;lp;lp--,mc--) {
+        register int x,y;
+        if( (!mc) ) {
+          mc = *m++;
+          xrpnt = ((real *) xr) + (*m++);
+          lwin = *m++;
+          cb = *m++;
+          if(lwin == 3) {
+            v = gr_info->pow2gain[(*scf++) << shift];
+            step = 1;
+          }
+          else {
+            v = gr_info->full_gain[lwin][(*scf++) << shift];
+            step = 3;
+          }
+        }
+        {
+          register short *val = h->table;
+          while((y=*val++)<0) {
+            if (get1bit())
+              val -= y;
+            part2remain--;
+          }
+          x = y >> 4;
+          y &= 0xf;
+        }
+        if(x == 15) {
+          max[lwin] = cb;
+          part2remain -= h->linbits+1;
+          x += getbits(h->linbits);
+          if(get1bit())
+            *xrpnt = -ispow[x] * v;
+          else
+            *xrpnt =  ispow[x] * v;
+        }
+        else if(x) {
+          max[lwin] = cb;
+          if(get1bit())
+            *xrpnt = -ispow[x] * v;
+          else
+            *xrpnt =  ispow[x] * v;
+          part2remain--;
+        }
+        else
+          *xrpnt = 0.0;
+        xrpnt += step;
+        if(y == 15) {
+          max[lwin] = cb;
+          part2remain -= h->linbits+1;
+          y += getbits(h->linbits);
+          if(get1bit())
+            *xrpnt = -ispow[y] * v;
+          else
+            *xrpnt =  ispow[y] * v;
+        }
+        else if(y) {
+          max[lwin] = cb;
+          if(get1bit())
+            *xrpnt = -ispow[y] * v;
+          else
+            *xrpnt =  ispow[y] * v;
+          part2remain--;
+        }
+        else
+          *xrpnt = 0.0;
+        xrpnt += step;
+      }
+    }
+    for(;l3 && (part2remain > 0);l3--) {
+      struct newhuff *h = htc+gr_info->count1table_select;
+      register short *val = h->table,a;
+
+      while((a=*val++)<0) {
+        part2remain--;
+        if(part2remain < 0) {
+          part2remain++;
+          a = 0;
+          break;
+        }
+        if (get1bit())
+          val -= a;
+      }
+
+      for(i=0;i<4;i++) {
+        if(!(i & 1)) {
+          if(!mc) {
+            mc = *m++;
+            xrpnt = ((real *) xr) + (*m++);
+            lwin = *m++;
+            cb = *m++;
+            if(lwin == 3) {
+              v = gr_info->pow2gain[(*scf++) << shift];
+              step = 1;
+            }
+            else {
+              v = gr_info->full_gain[lwin][(*scf++) << shift];
+              step = 3;
+            }
+          }
+          mc--;
+        }
+        if( (a & (0x8>>i)) ) {
+          max[lwin] = cb;
+          part2remain--;
+          if(part2remain < 0) {
+            part2remain++;
+            break;
+          }
+          if(get1bit()) 
+            *xrpnt = -v;
+          else
+            *xrpnt = v;
+        }
+        else
+          *xrpnt = 0.0;
+        xrpnt += step;
+      }
+    }
+ 
+    while( m < me ) {
+      if(!mc) {
+        mc = *m++;
+        xrpnt = ((real *) xr) + *m++;
+        if( (*m++) == 3)
+          step = 1;
+        else
+          step = 3;
+        m++; /* cb */
+      }
+      mc--;
+      *xrpnt = 0.0;
+      xrpnt += step;
+      *xrpnt = 0.0;
+      xrpnt += step;
+/* we could add a little opt. here:
+ * if we finished a band for window 3 or a long band
+ * further bands could copied in a simple loop without a
+ * special 'map' decoding
+ */
+    }
+
+    gr_info->maxband[0] = max[0]+1;
+    gr_info->maxband[1] = max[1]+1;
+    gr_info->maxband[2] = max[2]+1;
+    gr_info->maxbandl = max[3]+1;
+
+    {
+      int rmax = max[0] > max[1] ? max[0] : max[1];
+      rmax = (rmax > max[2] ? rmax : max[2]) + 1;
+      gr_info->maxb = rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3]+1];
+    }
+
+  }
+  else {
+	/*
+     * decoding with 'long' BandIndex table (block_type != 2)
+     */
+    int *pretab = gr_info->preflag ? pretab1 : pretab2;
+    int i,max = -1;
+    int cb = 0;
+    register int *m = map[sfreq][2];
+    register real v = 0.0;
+    register int mc = 0;
+#if 0
+    me = mapend[sfreq][2];
+#endif
+
+	/*
+     * long hash table values
+     */
+    for(i=0;i<3;i++) {
+      int lp = l[i];
+      struct newhuff *h = ht+gr_info->table_select[i];
+
+      for(;lp;lp--,mc--) {
+        int x,y;
+
+        if(!mc) {
+          mc = *m++;
+          v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+          cb = *m++;
+        }
+        {
+          register short *val = h->table;
+          while((y=*val++)<0) {
+            if (get1bit())
+              val -= y;
+            part2remain--;
+          }
+          x = y >> 4;
+          y &= 0xf;
+        }
+        if (x == 15) {
+          max = cb;
+          part2remain -= h->linbits+1;
+          x += getbits(h->linbits);
+          if(get1bit())
+            *xrpnt++ = -ispow[x] * v;
+          else
+            *xrpnt++ =  ispow[x] * v;
+        }
+        else if(x) {
+          max = cb;
+          if(get1bit())
+            *xrpnt++ = -ispow[x] * v;
+          else
+            *xrpnt++ =  ispow[x] * v;
+          part2remain--;
+        }
+        else
+          *xrpnt++ = 0.0;
+
+        if (y == 15) {
+          max = cb;
+          part2remain -= h->linbits+1;
+          y += getbits(h->linbits);
+          if(get1bit())
+            *xrpnt++ = -ispow[y] * v;
+          else
+            *xrpnt++ =  ispow[y] * v;
+        }
+        else if(y) {
+          max = cb;
+          if(get1bit())
+            *xrpnt++ = -ispow[y] * v;
+          else
+            *xrpnt++ =  ispow[y] * v;
+          part2remain--;
+        }
+        else
+          *xrpnt++ = 0.0;
+      }
+    }
+
+	/*
+     * short (count1table) values
+     */
+    for(;l3 && (part2remain > 0);l3--) {
+      struct newhuff *h = htc+gr_info->count1table_select;
+      register short *val = h->table,a;
+
+      while((a=*val++)<0) {
+        part2remain--;
+        if(part2remain < 0) {
+          part2remain++;
+          a = 0;
+          break;
+        }
+        if (get1bit())
+          val -= a;
+      }
+
+      for(i=0;i<4;i++) {
+        if(!(i & 1)) {
+          if(!mc) {
+            mc = *m++;
+            cb = *m++;
+            v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+          }
+          mc--;
+        }
+        if ( (a & (0x8>>i)) ) {
+          max = cb;
+          part2remain--;
+          if(part2remain < 0) {
+            part2remain++;
+            break;
+          }
+          if(get1bit())
+            *xrpnt++ = -v;
+          else
+            *xrpnt++ = v;
+        }
+        else
+          *xrpnt++ = 0.0;
+      }
+    }
+
+	/* 
+     * zero part
+     */
+    for(i=(&xr[SBLIMIT][0]-xrpnt)>>1;i;i--) {
+      *xrpnt++ = 0.0;
+      *xrpnt++ = 0.0;
+    }
+
+    gr_info->maxbandl = max+1;
+    gr_info->maxb = longLimit[sfreq][gr_info->maxbandl];
+  }
+
+  while( part2remain > 16 ) {
+    getbits(16); /* Dismiss stuffing Bits */
+    part2remain -= 16;
+  }
+  if(part2remain > 0)
+    getbits(part2remain);
+  else if(part2remain < 0) {
+    fprintf(stderr,"mpg123: Can't rewind stream by %d bits!\n",-part2remain);
+    return 1; /* -> error */
+  }
+  return 0;
+}
+
+#if 0
+static int III_dequantize_sample_ms(real xr[2][SBLIMIT][SSLIMIT],int *scf,
+   struct gr_info_s *gr_info,int sfreq,int part2bits)
+{
+  int shift = 1 + gr_info->scalefac_scale;
+  real *xrpnt = (real *) xr[1];
+  real *xr0pnt = (real *) xr[0];
+  int l[3],l3;
+  int part2remain = gr_info->part2_3_length - part2bits;
+  int *me;
+
+  {
+    int bv       = gr_info->big_values;
+    int region1  = gr_info->region1start;
+    int region2  = gr_info->region2start;
+
+    l3 = ((576>>1)-bv)>>1;   
+/*
+ * we may lose the 'odd' bit here !! 
+ * check this later gain 
+ */
+    if(bv <= region1) {
+      l[0] = bv; l[1] = 0; l[2] = 0;
+    }
+    else {
+      l[0] = region1;
+      if(bv <= region2) {
+        l[1] = bv - l[0];  l[2] = 0;
+      }
+      else {
+        l[1] = region2 - l[0]; l[2] = bv - region2;
+      }
+    }
+  }
+ 
+  if(gr_info->block_type == 2) {
+    int i,max[4];
+    int step=0,lwin=0,cb=0;
+    register real v = 0.0;
+    register int *m,mc = 0;
+
+    if(gr_info->mixed_block_flag) {
+      max[3] = -1;
+      max[0] = max[1] = max[2] = 2;
+      m = map[sfreq][0];
+      me = mapend[sfreq][0];
+    }
+    else {
+      max[0] = max[1] = max[2] = max[3] = -1;
+      /* max[3] not really needed in this case */
+      m = map[sfreq][1];
+      me = mapend[sfreq][1];
+    }
+
+    for(i=0;i<2;i++) {
+      int lp = l[i];
+      struct newhuff *h = ht+gr_info->table_select[i];
+      for(;lp;lp--,mc--) {
+        int x,y;
+
+        if(!mc) {
+          mc = *m++;
+          xrpnt = ((real *) xr[1]) + *m;
+          xr0pnt = ((real *) xr[0]) + *m++;
+          lwin = *m++;
+          cb = *m++;
+          if(lwin == 3) {
+            v = gr_info->pow2gain[(*scf++) << shift];
+            step = 1;
+          }
+          else {
+            v = gr_info->full_gain[lwin][(*scf++) << shift];
+            step = 3;
+          }
+        }
+        {
+          register short *val = h->table;
+          while((y=*val++)<0) {
+            if (get1bit())
+              val -= y;
+            part2remain--;
+          }
+          x = y >> 4;
+          y &= 0xf;
+        }
+        if(x == 15) {
+          max[lwin] = cb;
+          part2remain -= h->linbits+1;
+          x += getbits(h->linbits);
+          if(get1bit()) {
+            real a = ispow[x] * v;
+            *xrpnt = *xr0pnt + a;
+            *xr0pnt -= a;
+          }
+          else {
+            real a = ispow[x] * v;
+            *xrpnt = *xr0pnt - a;
+            *xr0pnt += a;
+          }
+        }
+        else if(x) {
+          max[lwin] = cb;
+          if(get1bit()) {
+            real a = ispow[x] * v;
+            *xrpnt = *xr0pnt + a;
+            *xr0pnt -= a;
+          }
+          else {
+            real a = ispow[x] * v;
+            *xrpnt = *xr0pnt - a;
+            *xr0pnt += a;
+          }
+          part2remain--;
+        }
+        else
+          *xrpnt = *xr0pnt;
+        xrpnt += step;
+        xr0pnt += step;
+
+        if(y == 15) {
+          max[lwin] = cb;
+          part2remain -= h->linbits+1;
+          y += getbits(h->linbits);
+          if(get1bit()) {
+            real a = ispow[y] * v;
+            *xrpnt = *xr0pnt + a;
+            *xr0pnt -= a;
+          }
+          else {
+            real a = ispow[y] * v;
+            *xrpnt = *xr0pnt - a;
+            *xr0pnt += a;
+          }
+        }
+        else if(y) {
+          max[lwin] = cb;
+          if(get1bit()) {
+            real a = ispow[y] * v;
+            *xrpnt = *xr0pnt + a;
+            *xr0pnt -= a;
+          }
+          else {
+            real a = ispow[y] * v;
+            *xrpnt = *xr0pnt - a;
+            *xr0pnt += a;
+          }
+          part2remain--;
+        }
+        else
+          *xrpnt = *xr0pnt;
+        xrpnt += step;
+        xr0pnt += step;
+      }
+    }
+
+    for(;l3 && (part2remain > 0);l3--) {
+      struct newhuff *h = htc+gr_info->count1table_select;
+      register short *val = h->table,a;
+
+      while((a=*val++)<0) {
+        part2remain--;
+        if(part2remain < 0) {
+          part2remain++;
+          a = 0;
+          break;
+        }
+        if (get1bit())
+          val -= a;
+      }
+
+      for(i=0;i<4;i++) {
+        if(!(i & 1)) {
+          if(!mc) {
+            mc = *m++;
+            xrpnt = ((real *) xr[1]) + *m;
+            xr0pnt = ((real *) xr[0]) + *m++;
+            lwin = *m++;
+            cb = *m++;
+            if(lwin == 3) {
+              v = gr_info->pow2gain[(*scf++) << shift];
+              step = 1;
+            }
+            else {
+              v = gr_info->full_gain[lwin][(*scf++) << shift];
+              step = 3;
+            }
+          }
+          mc--;
+        }
+        if( (a & (0x8>>i)) ) {
+          max[lwin] = cb;
+          part2remain--;
+          if(part2remain < 0) {
+            part2remain++;
+            break;
+          }
+          if(get1bit()) {
+            *xrpnt = *xr0pnt + v;
+            *xr0pnt -= v;
+          }
+          else {
+            *xrpnt = *xr0pnt - v;
+            *xr0pnt += v;
+          }
+        }
+        else
+          *xrpnt = *xr0pnt;
+        xrpnt += step;
+        xr0pnt += step;
+      }
+    }
+ 
+    while( m < me ) {
+      if(!mc) {
+        mc = *m++;
+        xrpnt = ((real *) xr[1]) + *m;
+        xr0pnt = ((real *) xr[0]) + *m++;
+        if(*m++ == 3)
+          step = 1;
+        else
+          step = 3;
+        m++; /* cb */
+      }
+      mc--;
+      *xrpnt = *xr0pnt;
+      xrpnt += step;
+      xr0pnt += step;
+      *xrpnt = *xr0pnt;
+      xrpnt += step;
+      xr0pnt += step;
+/* we could add a little opt. here:
+ * if we finished a band for window 3 or a long band
+ * further bands could copied in a simple loop without a
+ * special 'map' decoding
+ */
+    }
+
+    gr_info->maxband[0] = max[0]+1;
+    gr_info->maxband[1] = max[1]+1;
+    gr_info->maxband[2] = max[2]+1;
+    gr_info->maxbandl = max[3]+1;
+
+    {
+      int rmax = max[0] > max[1] ? max[0] : max[1];
+      rmax = (rmax > max[2] ? rmax : max[2]) + 1;
+      gr_info->maxb = rmax ? shortLimit[sfreq][rmax] : longLimit[sfreq][max[3]+1];
+    }
+  }
+  else {
+    int *pretab = gr_info->preflag ? pretab1 : pretab2;
+    int i,max = -1;
+    int cb = 0;
+    register int mc=0,*m = map[sfreq][2];
+    register real v = 0.0;
+#if 0
+    me = mapend[sfreq][2];
+#endif
+
+    for(i=0;i<3;i++) {
+      int lp = l[i];
+      struct newhuff *h = ht+gr_info->table_select[i];
+
+      for(;lp;lp--,mc--) {
+        int x,y;
+        if(!mc) {
+          mc = *m++;
+          cb = *m++;
+          v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+        }
+        {
+          register short *val = h->table;
+          while((y=*val++)<0) {
+            if (get1bit())
+              val -= y;
+            part2remain--;
+          }
+          x = y >> 4;
+          y &= 0xf;
+        }
+        if (x == 15) {
+          max = cb;
+          part2remain -= h->linbits+1;
+          x += getbits(h->linbits);
+          if(get1bit()) {
+            real a = ispow[x] * v;
+            *xrpnt++ = *xr0pnt + a;
+            *xr0pnt++ -= a;
+          }
+          else {
+            real a = ispow[x] * v;
+            *xrpnt++ = *xr0pnt - a;
+            *xr0pnt++ += a;
+          }
+        }
+        else if(x) {
+          max = cb;
+          if(get1bit()) {
+            real a = ispow[x] * v;
+            *xrpnt++ = *xr0pnt + a;
+            *xr0pnt++ -= a;
+          }
+          else {
+            real a = ispow[x] * v;
+            *xrpnt++ = *xr0pnt - a;
+            *xr0pnt++ += a;
+          }
+          part2remain--;
+        }
+        else
+          *xrpnt++ = *xr0pnt++;
+
+        if (y == 15) {
+          max = cb;
+          part2remain -= h->linbits+1;
+          y += getbits(h->linbits);
+          if(get1bit()) {
+            real a = ispow[y] * v;
+            *xrpnt++ = *xr0pnt + a;
+            *xr0pnt++ -= a;
+          }
+          else {
+            real a = ispow[y] * v;
+            *xrpnt++ = *xr0pnt - a;
+            *xr0pnt++ += a;
+          }
+        }
+        else if(y) {
+          max = cb;
+          if(get1bit()) {
+            real a = ispow[y] * v;
+            *xrpnt++ = *xr0pnt + a;
+            *xr0pnt++ -= a;
+          }
+          else {
+            real a = ispow[y] * v;
+            *xrpnt++ = *xr0pnt - a;
+            *xr0pnt++ += a;
+          }
+          part2remain--;
+        }
+        else
+          *xrpnt++ = *xr0pnt++;
+      }
+    }
+
+    for(;l3 && (part2remain > 0);l3--) {
+      struct newhuff *h = htc+gr_info->count1table_select;
+      register short *val = h->table,a;
+
+      while((a=*val++)<0) {
+        part2remain--;
+        if(part2remain < 0) {
+          part2remain++;
+          a = 0;
+          break;
+        }
+        if (get1bit())
+          val -= a;
+      }
+
+      for(i=0;i<4;i++) {
+        if(!(i & 1)) {
+          if(!mc) {
+            mc = *m++;
+            cb = *m++;
+            v = gr_info->pow2gain[((*scf++) + (*pretab++)) << shift];
+          }
+          mc--;
+        }
+        if ( (a & (0x8>>i)) ) {
+          max = cb;
+          part2remain--;
+          if(part2remain <= 0) {
+            part2remain++;
+            break;
+          }
+          if(get1bit()) {
+            *xrpnt++ = *xr0pnt + v;
+            *xr0pnt++ -= v;
+          }
+          else {
+            *xrpnt++ = *xr0pnt - v;
+            *xr0pnt++ += v;
+          }
+        }
+        else
+          *xrpnt++ = *xr0pnt++;
+      }
+    }
+    for(i=(&xr[1][SBLIMIT][0]-xrpnt)>>1;i;i--) {
+      *xrpnt++ = *xr0pnt++;
+      *xrpnt++ = *xr0pnt++;
+    }
+
+    gr_info->maxbandl = max+1;
+    gr_info->maxb = longLimit[sfreq][gr_info->maxbandl];
+  }
+
+  while ( part2remain > 16 ) {
+    getbits(16); /* Dismiss stuffing Bits */
+    part2remain -= 16;
+  }
+  if(part2remain > 0 )
+    getbits(part2remain);
+  else if(part2remain < 0) {
+    fprintf(stderr,"mpg123_ms: Can't rewind stream by %d bits!\n",-part2remain);
+    return 1; /* -> error */
+  }
+  return 0;
+}
+#endif
+
+/* 
+ * III_stereo: calculate real channel values for Joint-I-Stereo-mode
+ */
+static void III_i_stereo(real xr_buf[2][SBLIMIT][SSLIMIT],int *scalefac,
+   struct gr_info_s *gr_info,int sfreq,int ms_stereo,int lsf)
+{
+      real (*xr)[SBLIMIT*SSLIMIT] = (real (*)[SBLIMIT*SSLIMIT] ) xr_buf;
+      struct bandInfoStruct *bi = &bandInfo[sfreq];
+      real *tab1,*tab2;
+
+      if(lsf) {
+        int p = gr_info->scalefac_compress & 0x1;
+	    if(ms_stereo) {
+          tab1 = pow1_2[p]; tab2 = pow2_2[p];
+        }
+        else {
+          tab1 = pow1_1[p]; tab2 = pow2_1[p];
+        }
+      }
+      else {
+        if(ms_stereo) {
+          tab1 = tan1_2; tab2 = tan2_2;
+        }
+        else {
+          tab1 = tan1_1; tab2 = tan2_1;
+        }
+      }
+
+      if (gr_info->block_type == 2)
+      {
+         int lwin,do_l = 0;
+         if( gr_info->mixed_block_flag )
+           do_l = 1;
+
+         for (lwin=0;lwin<3;lwin++) /* process each window */
+         {
+             /* get first band with zero values */
+           int is_p,sb,idx,sfb = gr_info->maxband[lwin];  /* sfb is minimal 3 for mixed mode */
+           if(sfb > 3)
+             do_l = 0;
+
+           for(;sfb<12;sfb++)
+           {
+             is_p = scalefac[sfb*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */ 
+             if(is_p != 7) {
+               real t1,t2;
+               sb = bi->shortDiff[sfb];
+               idx = bi->shortIdx[sfb] + lwin;
+               t1 = tab1[is_p]; t2 = tab2[is_p];
+               for (; sb > 0; sb--,idx+=3)
+               {
+                 real v = xr[0][idx];
+                 xr[0][idx] = v * t1;
+                 xr[1][idx] = v * t2;
+               }
+             }
+           }
+
+#if 1
+/* in the original: copy 10 to 11 , here: copy 11 to 12 
+maybe still wrong??? (copy 12 to 13?) */
+           is_p = scalefac[11*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
+           sb = bi->shortDiff[12];
+           idx = bi->shortIdx[12] + lwin;
+#else
+           is_p = scalefac[10*3+lwin-gr_info->mixed_block_flag]; /* scale: 0-15 */
+           sb = bi->shortDiff[11];
+           idx = bi->shortIdx[11] + lwin;
+#endif
+           if(is_p != 7)
+           {
+             real t1,t2;
+             t1 = tab1[is_p]; t2 = tab2[is_p];
+             for ( ; sb > 0; sb--,idx+=3 )
+             {  
+               real v = xr[0][idx];
+               xr[0][idx] = v * t1;
+               xr[1][idx] = v * t2;
+             }
+           }
+         } /* end for(lwin; .. ; . ) */
+
+         if (do_l)
+         {
+/* also check l-part, if ALL bands in the three windows are 'empty'
+ * and mode = mixed_mode 
+ */
+           int sfb = gr_info->maxbandl;
+           int idx = bi->longIdx[sfb];
+
+           for ( ; sfb<8; sfb++ )
+           {
+             int sb = bi->longDiff[sfb];
+             int is_p = scalefac[sfb]; /* scale: 0-15 */
+             if(is_p != 7) {
+               real t1,t2;
+               t1 = tab1[is_p]; t2 = tab2[is_p];
+               for ( ; sb > 0; sb--,idx++)
+               {
+                 real v = xr[0][idx];
+                 xr[0][idx] = v * t1;
+                 xr[1][idx] = v * t2;
+               }
+             }
+             else 
+               idx += sb;
+           }
+         }     
+      } 
+      else /* ((gr_info->block_type != 2)) */
+      {
+        int sfb = gr_info->maxbandl;
+        int is_p,idx = bi->longIdx[sfb];
+        for ( ; sfb<21; sfb++)
+        {
+          int sb = bi->longDiff[sfb];
+          is_p = scalefac[sfb]; /* scale: 0-15 */
+          if(is_p != 7) {
+            real t1,t2;
+            t1 = tab1[is_p]; t2 = tab2[is_p];
+            for ( ; sb > 0; sb--,idx++)
+            {
+               real v = xr[0][idx];
+               xr[0][idx] = v * t1;
+               xr[1][idx] = v * t2;
+            }
+          }
+          else
+            idx += sb;
+        }
+
+        is_p = scalefac[20]; /* copy l-band 20 to l-band 21 */
+        if(is_p != 7)
+        {
+          int sb;
+          real t1 = tab1[is_p],t2 = tab2[is_p]; 
+
+          for ( sb = bi->longDiff[21]; sb > 0; sb--,idx++ )
+          {
+            real v = xr[0][idx];
+            xr[0][idx] = v * t1;
+            xr[1][idx] = v * t2;
+          }
+        }
+      } /* ... */
+}
+
+static void III_antialias(real xr[SBLIMIT][SSLIMIT],struct gr_info_s *gr_info)
+{
+   int sblim;
+
+   if(gr_info->block_type == 2)
+   {
+      if(!gr_info->mixed_block_flag) 
+        return;
+      sblim = 1; 
+   }
+   else {
+     sblim = gr_info->maxb-1;
+   }
+
+   /* 31 alias-reduction operations between each pair of sub-bands */
+   /* with 8 butterflies between each pair                         */
+
+   {
+     int sb;
+     real *xr1=(real *) xr[1];
+
+     for(sb=sblim;sb;sb--,xr1+=10)
+     {
+       int ss;
+       real *cs=aa_cs,*ca=aa_ca;
+       real *xr2 = xr1;
+
+       for(ss=7;ss>=0;ss--)
+       {       /* upper and lower butterfly inputs */
+         register real bu = *--xr2,bd = *xr1;
+         *xr2   = (bu * (*cs)   ) - (bd * (*ca)   );
+         *xr1++ = (bd * (*cs++) ) + (bu * (*ca++) );
+       }
+     }
+  }
+}
+
+/*
+ DCT insipired by Jeff Tsay's DCT from the maplay package
+ this is an optimized version with manual unroll.
+
+ References:
+ [1] S. Winograd: "On Computing the Discrete Fourier Transform",
+     Mathematics of Computation, Volume 32, Number 141, January 1978,
+     Pages 175-199
+*/
+
+static void dct36(real *inbuf,real *o1,real *o2,real *wintab,real *tsbuf)
+{
+  {
+    register real *in = inbuf;
+
+    in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14];
+    in[14]+=in[13]; in[13]+=in[12]; in[12]+=in[11];
+    in[11]+=in[10]; in[10]+=in[9];  in[9] +=in[8];
+    in[8] +=in[7];  in[7] +=in[6];  in[6] +=in[5];
+    in[5] +=in[4];  in[4] +=in[3];  in[3] +=in[2];
+    in[2] +=in[1];  in[1] +=in[0];
+
+    in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
+    in[9] +=in[7];  in[7] +=in[5];  in[5] +=in[3];  in[3] +=in[1];
+
+
+  {
+
+#define MACRO0(v) { \
+    real tmp; \
+    out2[9+(v)] = (tmp = sum0 + sum1) * w[27+(v)]; \
+    out2[8-(v)] = tmp * w[26-(v)];  } \
+    sum0 -= sum1; \
+    ts[SBLIMIT*(8-(v))] = out1[8-(v)] + sum0 * w[8-(v)]; \
+    ts[SBLIMIT*(9+(v))] = out1[9+(v)] + sum0 * w[9+(v)]; 
+#define MACRO1(v) { \
+	real sum0,sum1; \
+    sum0 = tmp1a + tmp2a; \
+	sum1 = (tmp1b + tmp2b) * tfcos36[(v)]; \
+	MACRO0(v); }
+#define MACRO2(v) { \
+    real sum0,sum1; \
+    sum0 = tmp2a - tmp1a; \
+    sum1 = (tmp2b - tmp1b) * tfcos36[(v)]; \
+	MACRO0(v); }
+
+    register const real *c = COS9;
+    register real *out2 = o2;
+	register real *w = wintab;
+	register real *out1 = o1;
+	register real *ts = tsbuf;
+
+    real ta33,ta66,tb33,tb66;
+
+    ta33 = in[2*3+0] * c[3];
+    ta66 = in[2*6+0] * c[6];
+    tb33 = in[2*3+1] * c[3];
+    tb66 = in[2*6+1] * c[6];
+
+    { 
+      real tmp1a,tmp2a,tmp1b,tmp2b;
+      tmp1a =             in[2*1+0] * c[1] + ta33 + in[2*5+0] * c[5] + in[2*7+0] * c[7];
+      tmp1b =             in[2*1+1] * c[1] + tb33 + in[2*5+1] * c[5] + in[2*7+1] * c[7];
+      tmp2a = in[2*0+0] + in[2*2+0] * c[2] + in[2*4+0] * c[4] + ta66 + in[2*8+0] * c[8];
+      tmp2b = in[2*0+1] + in[2*2+1] * c[2] + in[2*4+1] * c[4] + tb66 + in[2*8+1] * c[8];
+
+      MACRO1(0);
+      MACRO2(8);
+    }
+
+    {
+      real tmp1a,tmp2a,tmp1b,tmp2b;
+      tmp1a = ( in[2*1+0] - in[2*5+0] - in[2*7+0] ) * c[3];
+      tmp1b = ( in[2*1+1] - in[2*5+1] - in[2*7+1] ) * c[3];
+      tmp2a = ( in[2*2+0] - in[2*4+0] - in[2*8+0] ) * c[6] - in[2*6+0] + in[2*0+0];
+      tmp2b = ( in[2*2+1] - in[2*4+1] - in[2*8+1] ) * c[6] - in[2*6+1] + in[2*0+1];
+
+      MACRO1(1);
+      MACRO2(7);
+    }
+
+    {
+      real tmp1a,tmp2a,tmp1b,tmp2b;
+      tmp1a =             in[2*1+0] * c[5] - ta33 - in[2*5+0] * c[7] + in[2*7+0] * c[1];
+      tmp1b =             in[2*1+1] * c[5] - tb33 - in[2*5+1] * c[7] + in[2*7+1] * c[1];
+      tmp2a = in[2*0+0] - in[2*2+0] * c[8] - in[2*4+0] * c[2] + ta66 + in[2*8+0] * c[4];
+      tmp2b = in[2*0+1] - in[2*2+1] * c[8] - in[2*4+1] * c[2] + tb66 + in[2*8+1] * c[4];
+
+      MACRO1(2);
+      MACRO2(6);
+    }
+
+    {
+      real tmp1a,tmp2a,tmp1b,tmp2b;
+      tmp1a =             in[2*1+0] * c[7] - ta33 + in[2*5+0] * c[1] - in[2*7+0] * c[5];
+      tmp1b =             in[2*1+1] * c[7] - tb33 + in[2*5+1] * c[1] - in[2*7+1] * c[5];
+      tmp2a = in[2*0+0] - in[2*2+0] * c[4] + in[2*4+0] * c[8] + ta66 - in[2*8+0] * c[2];
+      tmp2b = in[2*0+1] - in[2*2+1] * c[4] + in[2*4+1] * c[8] + tb66 - in[2*8+1] * c[2];
+
+      MACRO1(3);
+      MACRO2(5);
+    }
+
+	{
+		real sum0,sum1;
+    	sum0 =  in[2*0+0] - in[2*2+0] + in[2*4+0] - in[2*6+0] + in[2*8+0];
+    	sum1 = (in[2*0+1] - in[2*2+1] + in[2*4+1] - in[2*6+1] + in[2*8+1] ) * tfcos36[4];
+		MACRO0(4);
+	}
+  }
+
+  }
+}
+
+/*
+ * new DCT12
+ */
+static void dct12(real *in,real *rawout1,real *rawout2,register real *wi,register real *ts)
+{
+#define DCT12_PART1 \
+             in5 = in[5*3];  \
+     in5 += (in4 = in[4*3]); \
+     in4 += (in3 = in[3*3]); \
+     in3 += (in2 = in[2*3]); \
+     in2 += (in1 = in[1*3]); \
+     in1 += (in0 = in[0*3]); \
+                             \
+     in5 += in3; in3 += in1; \
+                             \
+     in2 *= COS6_1; \
+     in3 *= COS6_1; \
+
+#define DCT12_PART2 \
+     in0 += in4 * COS6_2; \
+                          \
+     in4 = in0 + in2;     \
+     in0 -= in2;          \
+                          \
+     in1 += in5 * COS6_2; \
+                          \
+     in5 = (in1 + in3) * tfcos12[0]; \
+     in1 = (in1 - in3) * tfcos12[2]; \
+                         \
+     in3 = in4 + in5;    \
+     in4 -= in5;         \
+                         \
+     in2 = in0 + in1;    \
+     in0 -= in1;
+
+
+   {
+     real in0,in1,in2,in3,in4,in5;
+     register real *out1 = rawout1;
+     ts[SBLIMIT*0] = out1[0]; ts[SBLIMIT*1] = out1[1]; ts[SBLIMIT*2] = out1[2];
+     ts[SBLIMIT*3] = out1[3]; ts[SBLIMIT*4] = out1[4]; ts[SBLIMIT*5] = out1[5];
+ 
+     DCT12_PART1
+
+     {
+       real tmp0,tmp1 = (in0 - in4);
+       {
+         real tmp2 = (in1 - in5) * tfcos12[1];
+         tmp0 = tmp1 + tmp2;
+         tmp1 -= tmp2;
+       }
+       ts[(17-1)*SBLIMIT] = out1[17-1] + tmp0 * wi[11-1];
+       ts[(12+1)*SBLIMIT] = out1[12+1] + tmp0 * wi[6+1];
+       ts[(6 +1)*SBLIMIT] = out1[6 +1] + tmp1 * wi[1];
+       ts[(11-1)*SBLIMIT] = out1[11-1] + tmp1 * wi[5-1];
+     }
+
+     DCT12_PART2
+
+     ts[(17-0)*SBLIMIT] = out1[17-0] + in2 * wi[11-0];
+     ts[(12+0)*SBLIMIT] = out1[12+0] + in2 * wi[6+0];
+     ts[(12+2)*SBLIMIT] = out1[12+2] + in3 * wi[6+2];
+     ts[(17-2)*SBLIMIT] = out1[17-2] + in3 * wi[11-2];
+
+     ts[(6+0)*SBLIMIT]  = out1[6+0] + in0 * wi[0];
+     ts[(11-0)*SBLIMIT] = out1[11-0] + in0 * wi[5-0];
+     ts[(6+2)*SBLIMIT]  = out1[6+2] + in4 * wi[2];
+     ts[(11-2)*SBLIMIT] = out1[11-2] + in4 * wi[5-2];
+  }
+
+  in++;
+
+  {
+     real in0,in1,in2,in3,in4,in5;
+     register real *out2 = rawout2;
+ 
+     DCT12_PART1
+
+     {
+       real tmp0,tmp1 = (in0 - in4);
+       {
+         real tmp2 = (in1 - in5) * tfcos12[1];
+         tmp0 = tmp1 + tmp2;
+         tmp1 -= tmp2;
+       }
+       out2[5-1] = tmp0 * wi[11-1];
+       out2[0+1] = tmp0 * wi[6+1];
+       ts[(12+1)*SBLIMIT] += tmp1 * wi[1];
+       ts[(17-1)*SBLIMIT] += tmp1 * wi[5-1];
+     }
+
+     DCT12_PART2
+
+     out2[5-0] = in2 * wi[11-0];
+     out2[0+0] = in2 * wi[6+0];
+     out2[0+2] = in3 * wi[6+2];
+     out2[5-2] = in3 * wi[11-2];
+
+     ts[(12+0)*SBLIMIT] += in0 * wi[0];
+     ts[(17-0)*SBLIMIT] += in0 * wi[5-0];
+     ts[(12+2)*SBLIMIT] += in4 * wi[2];
+     ts[(17-2)*SBLIMIT] += in4 * wi[5-2];
+  }
+
+  in++; 
+
+  {
+     real in0,in1,in2,in3,in4,in5;
+     register real *out2 = rawout2;
+     out2[12]=out2[13]=out2[14]=out2[15]=out2[16]=out2[17]=0.0;
+
+     DCT12_PART1
+
+     {
+       real tmp0,tmp1 = (in0 - in4);
+       {
+         real tmp2 = (in1 - in5) * tfcos12[1];
+         tmp0 = tmp1 + tmp2;
+         tmp1 -= tmp2;
+       }
+       out2[11-1] = tmp0 * wi[11-1];
+       out2[6 +1] = tmp0 * wi[6+1];
+       out2[0+1] += tmp1 * wi[1];
+       out2[5-1] += tmp1 * wi[5-1];
+     }
+
+     DCT12_PART2
+
+     out2[11-0] = in2 * wi[11-0];
+     out2[6 +0] = in2 * wi[6+0];
+     out2[6 +2] = in3 * wi[6+2];
+     out2[11-2] = in3 * wi[11-2];
+
+     out2[0+0] += in0 * wi[0];
+     out2[5-0] += in0 * wi[5-0];
+     out2[0+2] += in4 * wi[2];
+     out2[5-2] += in4 * wi[5-2];
+  }
+}
+
+/*
+ * III_hybrid
+ */
+static void III_hybrid(real fsIn[SBLIMIT][SSLIMIT],real tsOut[SSLIMIT][SBLIMIT],
+   int ch,struct gr_info_s *gr_info)
+{
+   real *tspnt = (real *) tsOut;
+   real (*block)[2][SBLIMIT*SSLIMIT] = gmp->hybrid_block;
+   int *blc = gmp->hybrid_blc;
+   real *rawout1,*rawout2;
+   int bt;
+   int sb = 0;
+
+   {
+     int b = blc[ch];
+     rawout1=block[b][ch];
+     b=-b+1;
+     rawout2=block[b][ch];
+     blc[ch] = b;
+   }
+
+  
+   if(gr_info->mixed_block_flag) {
+     sb = 2;
+     dct36(fsIn[0],rawout1,rawout2,win[0],tspnt);
+     dct36(fsIn[1],rawout1+18,rawout2+18,win1[0],tspnt+1);
+     rawout1 += 36; rawout2 += 36; tspnt += 2;
+   }
+ 
+   bt = gr_info->block_type;
+   if(bt == 2) {
+     for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
+       dct12(fsIn[sb],rawout1,rawout2,win[2],tspnt);
+       dct12(fsIn[sb+1],rawout1+18,rawout2+18,win1[2],tspnt+1);
+     }
+   }
+   else {
+     for (; sb<gr_info->maxb; sb+=2,tspnt+=2,rawout1+=36,rawout2+=36) {
+       dct36(fsIn[sb],rawout1,rawout2,win[bt],tspnt);
+       dct36(fsIn[sb+1],rawout1+18,rawout2+18,win1[bt],tspnt+1);
+     }
+   }
+
+   for(;sb<SBLIMIT;sb++,tspnt++) {
+     int i;
+     for(i=0;i<SSLIMIT;i++) {
+       tspnt[i*SBLIMIT] = *rawout1++;
+       *rawout2++ = 0.0;
+     }
+   }
+}
+
+/*
+ * main layer3 handler
+ */
+int do_layer3(struct frame *fr,unsigned char *pcm_sample,int *pcm_point)
+{
+  int gr, ch, ss,clip=0;
+  int scalefacs[2][39]; /* max 39 for short[13][3] mode, mixed: 38, long: 22 */
+  struct III_sideinfo sideinfo;
+  int stereo = fr->stereo;
+  int single = fr->single;
+  int ms_stereo,i_stereo;
+  int sfreq = fr->sampling_frequency;
+  int stereo1,granules;
+
+  if(stereo == 1) { /* stream is mono */
+    stereo1 = 1;
+    single = 0;
+  }
+  else if(single >= 0) /* stream is stereo, but force to mono */
+    stereo1 = 1;
+  else
+    stereo1 = 2;
+
+  if(fr->mode == MPG_MD_JOINT_STEREO) {
+    ms_stereo = fr->mode_ext & 0x2;
+    i_stereo  = fr->mode_ext & 0x1;
+  }
+  else
+    ms_stereo = i_stereo = 0;
+
+  if(fr->lsf) {
+    granules = 1;
+    if(!III_get_side_info_2(&sideinfo,stereo,ms_stereo,sfreq,single))
+      return -1;
+  }
+  else {
+    granules = 2;
+#ifdef MPEG1
+    if(!III_get_side_info_1(&sideinfo,stereo,ms_stereo,sfreq,single))
+      return -1;
+#else
+    fprintf(stderr,"Not supported\n");
+#endif
+  }
+
+  if(set_pointer(sideinfo.main_data_begin) == MP3_ERR)
+    return -1;
+
+  for (gr=0;gr<granules;gr++) 
+  {
+    real hybridIn[2][SBLIMIT][SSLIMIT];
+    real hybridOut[2][SSLIMIT][SBLIMIT];
+
+    {
+      struct gr_info_s *gr_info = &(sideinfo.ch[0].gr[gr]);
+      long part2bits;
+      if(fr->lsf)
+        part2bits = III_get_scale_factors_2(scalefacs[0],gr_info,0);
+      else {
+#ifdef MPEG1
+        part2bits = III_get_scale_factors_1(scalefacs[0],gr_info);
+#else
+	fprintf(stderr,"Not supported\n");
+#endif
+      }
+      if(III_dequantize_sample(hybridIn[0], scalefacs[0],gr_info,sfreq,part2bits))
+        return clip;
+    }
+    if(stereo == 2) {
+      struct gr_info_s *gr_info = &(sideinfo.ch[1].gr[gr]);
+      long part2bits;
+      if(fr->lsf) 
+        part2bits = III_get_scale_factors_2(scalefacs[1],gr_info,i_stereo);
+      else {
+#ifdef MPEG1
+        part2bits = III_get_scale_factors_1(scalefacs[1],gr_info);
+#else
+	fprintf(stderr,"Not supported\n");
+#endif
+      }
+
+      if(III_dequantize_sample(hybridIn[1],scalefacs[1],gr_info,sfreq,part2bits))
+          return clip;
+
+      if(ms_stereo) {
+        int i;
+        for(i=0;i<SBLIMIT*SSLIMIT;i++) {
+          real tmp0,tmp1;
+          tmp0 = ((real *) hybridIn[0])[i];
+          tmp1 = ((real *) hybridIn[1])[i];
+          ((real *) hybridIn[0])[i] = tmp0 + tmp1;
+          ((real *) hybridIn[1])[i] = tmp0 - tmp1;  
+        }
+      }
+
+      if(i_stereo)
+        III_i_stereo(hybridIn,scalefacs[1],gr_info,sfreq,ms_stereo,fr->lsf);
+
+      if(ms_stereo || i_stereo || (single == 3) ) {
+        if(gr_info->maxb > sideinfo.ch[0].gr[gr].maxb) 
+          sideinfo.ch[0].gr[gr].maxb = gr_info->maxb;
+        else
+          gr_info->maxb = sideinfo.ch[0].gr[gr].maxb;
+      }
+
+      switch(single) {
+        case 3:
+          {
+            register int i;
+            register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
+            for(i=0;i<SSLIMIT*gr_info->maxb;i++,in0++)
+              *in0 = (*in0 + *in1++); /* *0.5 done by pow-scale */ 
+          }
+          break;
+        case 1:
+          {
+            register int i;
+            register real *in0 = (real *) hybridIn[0],*in1 = (real *) hybridIn[1];
+            for(i=0;i<SSLIMIT*gr_info->maxb;i++)
+              *in0++ = *in1++;
+          }
+          break;
+      }
+    }
+
+    for(ch=0;ch<stereo1;ch++) {
+      struct gr_info_s *gr_info = &(sideinfo.ch[ch].gr[gr]);
+      III_antialias(hybridIn[ch],gr_info);
+      III_hybrid(hybridIn[ch], hybridOut[ch], ch,gr_info);
+    }
+
+    for(ss=0;ss<SSLIMIT;ss++) {
+      if(single >= 0) {
+        clip += synth_1to1_mono(hybridOut[0][ss],pcm_sample,pcm_point);
+      }
+      else {
+        int p1 = *pcm_point;
+        clip += synth_1to1(hybridOut[0][ss],0,pcm_sample,&p1);
+        clip += synth_1to1(hybridOut[1][ss],1,pcm_sample,pcm_point);
+      }
+    }
+  }
+  
+  return clip;
+}
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/mpg123.h	Sun May 19 17:16:39 2002
@@ -0,0 +1,193 @@
+#include        <stdio.h>
+#include        <string.h>
+#include        <signal.h>
+
+#ifndef WIN32
+#include        <sys/signal.h>
+#include        <unistd.h>
+#endif
+
+#include        <math.h>
+
+#ifdef _WIN32
+# undef WIN32
+# define WIN32
+
+# define M_PI       3.14159265358979323846
+# define M_SQRT2	1.41421356237309504880
+# define REAL_IS_FLOAT
+# define NEW_DCT9
+
+# define random rand
+# define srandom srand
+
+#endif
+
+#ifdef REAL_IS_FLOAT
+#  define real float
+#elif defined(REAL_IS_LONG_DOUBLE)
+#  define real long double
+#else
+#  define real double
+#endif
+
+#ifdef __GNUC__
+#define INLINE inline
+#else
+#define INLINE
+#endif
+
+/* AUDIOBUFSIZE = n*64 with n=1,2,3 ...  */
+#define		AUDIOBUFSIZE		16384
+
+#ifndef FALSE
+#define         FALSE                   0
+#endif
+#ifndef FALSE
+#define         TRUE                    1
+#endif
+
+#define         SBLIMIT                 32
+#define         SSLIMIT                 18
+
+#define         SCALE_BLOCK             12
+
+
+#define         MPG_MD_STEREO           0
+#define         MPG_MD_JOINT_STEREO     1
+#define         MPG_MD_DUAL_CHANNEL     2
+#define         MPG_MD_MONO             3
+
+#define MAXFRAMESIZE 1792
+
+
+/* Pre Shift fo 16 to 8 bit converter table */
+#define AUSHIFT (3)
+
+struct frame {
+    int stereo;
+    int jsbound;
+    int single;
+    int lsf;
+    int mpeg25;
+    int header_change;
+    int lay;
+    int error_protection;
+    int bitrate_index;
+    int sampling_frequency;
+    int padding;
+    int extension;
+    int mode;
+    int mode_ext;
+    int copyright;
+    int original;
+    int emphasis;
+    int framesize; /* computed framesize */
+
+    /* layer2 stuff */
+    int II_sblimit;
+    void *alloc;
+};
+
+struct parameter {
+	int quiet;	/* shut up! */
+	int tryresync;  /* resync stream after error */
+	int verbose;    /* verbose level */
+	int checkrange;
+};
+
+extern unsigned int   get1bit(void);
+extern unsigned int   getbits(int);
+extern unsigned int   getbits_fast(int);
+extern int set_pointer(long);
+
+extern unsigned char *wordpointer;
+extern int bitindex;
+
+extern void make_decode_tables(long scaleval);
+extern int do_layer3(struct frame *fr,unsigned char *,int *);
+extern int do_layer2(struct frame *fr,unsigned char *,int *);
+extern int do_layer1(struct frame *fr,unsigned char *,int *);
+extern int decode_header(struct frame *fr,unsigned long newhead);
+
+
+
+struct gr_info_s {
+      int scfsi;
+      unsigned part2_3_length;
+      unsigned big_values;
+      unsigned scalefac_compress;
+      unsigned block_type;
+      unsigned mixed_block_flag;
+      unsigned table_select[3];
+      unsigned subblock_gain[3];
+      unsigned maxband[3];
+      unsigned maxbandl;
+      unsigned maxb;
+      unsigned region1start;
+      unsigned region2start;
+      unsigned preflag;
+      unsigned scalefac_scale;
+      unsigned count1table_select;
+      real *full_gain[3];
+      real *pow2gain;
+};
+
+struct III_sideinfo
+{
+  unsigned main_data_begin;
+  unsigned private_bits;
+  struct {
+    struct gr_info_s gr[2];
+  } ch[2];
+};
+
+extern int synth_1to1 (real *,int,unsigned char *,int *);
+extern int synth_1to1_8bit (real *,int,unsigned char *,int *);
+extern int synth_1to1_mono (real *,unsigned char *,int *);
+extern int synth_1to1_mono2stereo (real *,unsigned char *,int *);
+extern int synth_1to1_8bit_mono (real *,unsigned char *,int *);
+extern int synth_1to1_8bit_mono2stereo (real *,unsigned char *,int *);
+
+extern int synth_2to1 (real *,int,unsigned char *,int *);
+extern int synth_2to1_8bit (real *,int,unsigned char *,int *);
+extern int synth_2to1_mono (real *,unsigned char *,int *);
+extern int synth_2to1_mono2stereo (real *,unsigned char *,int *);
+extern int synth_2to1_8bit_mono (real *,unsigned char *,int *);
+extern int synth_2to1_8bit_mono2stereo (real *,unsigned char *,int *);
+
+extern int synth_4to1 (real *,int,unsigned char *,int *);
+extern int synth_4to1_8bit (real *,int,unsigned char *,int *);
+extern int synth_4to1_mono (real *,unsigned char *,int *);
+extern int synth_4to1_mono2stereo (real *,unsigned char *,int *);
+extern int synth_4to1_8bit_mono (real *,unsigned char *,int *);
+extern int synth_4to1_8bit_mono2stereo (real *,unsigned char *,int *);
+
+extern int synth_ntom (real *,int,unsigned char *,int *);
+extern int synth_ntom_8bit (real *,int,unsigned char *,int *);
+extern int synth_ntom_mono (real *,unsigned char *,int *);
+extern int synth_ntom_mono2stereo (real *,unsigned char *,int *);
+extern int synth_ntom_8bit_mono (real *,unsigned char *,int *);
+extern int synth_ntom_8bit_mono2stereo (real *,unsigned char *,int *);
+
+extern void rewindNbits(int bits);
+extern int  hsstell(void);
+extern int get_songlen(struct frame *fr,int no);
+
+extern void init_layer3(int);
+extern void init_layer2(void);
+extern void make_decode_tables(long scale);
+extern void make_conv16to8_table(int);
+extern void dct64(real *,real *,real *);
+
+extern void synth_ntom_set_step(long,long);
+
+extern unsigned char *conv16to8;
+extern long freqs[9];
+extern real muls[27][64];
+extern real decwin[512+32];
+extern real *pnts[5];
+
+extern struct parameter param;
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/mpegl3.c	Sun May 19 18:49:45 2002
@@ -0,0 +1,607 @@
+/*
+ * MPEG Layer 3 handling
+ *
+ *      Copyright (C) 2002		Eric Pouech
+ *
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <assert.h>
+#include <string.h>
+#include "winnls.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "msacm.h"
+#include "mmreg.h"
+#include "../msacmdrv.h"
+#include "mpg123.h"
+#include "mpglib.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(mpeg3);
+
+/***********************************************************************
+ *           MPEG3_drvOpen
+ */
+static	DWORD	MPEG3_drvOpen(LPCSTR str)
+{
+    return 1;
+}
+
+/***********************************************************************
+ *           MPEG3_drvClose
+ */
+static	DWORD	MPEG3_drvClose(DWORD dwDevID)
+{
+    return 1;
+}
+
+typedef struct tagAcmMpeg3Data 
+{
+    void (*convert)(PACMDRVSTREAMINSTANCE adsi, 
+		    const unsigned char*, LPDWORD, unsigned char*, LPDWORD);
+    struct mpstr mp;
+} AcmMpeg3Data;
+
+/* table to list all supported formats... those are the basic ones. this
+ * also helps given a unique index to each of the supported formats
+ */
+typedef	struct 
+{
+    int		nChannels;
+    int		nBits;
+    int		rate;
+} Format;
+
+static Format PCM_Formats[] = 
+{
+    {1,  8,  8000}, {2,  8,  8000}, {1, 16,  8000}, {2, 16,  8000},
+    {1,  8, 11025}, {2,  8, 11025}, {1, 16, 11025}, {2, 16, 11025},
+    {1,  8, 22050}, {2,  8, 22050}, {1, 16, 22050}, {2, 16, 22050},
+    {1,  8, 44100}, {2,  8, 44100}, {1, 16, 44100}, {2, 16, 44100},
+};
+
+static Format MPEG3_Formats[] = 
+{
+    {1,  0,  8000}, {2,	0,  8000},  {1,  0, 11025}, {2,	 0, 11025}, 
+    {1,  0, 22050}, {2,	0, 22050},  {1,  0, 44100}, {2,	 0, 44100},
+};
+
+#define	NUM_PCM_FORMATS		(sizeof(PCM_Formats) / sizeof(PCM_Formats[0]))
+#define	NUM_MPEG3_FORMATS	(sizeof(MPEG3_Formats) / sizeof(MPEG3_Formats[0]))
+
+/***********************************************************************
+ *           MPEG3_GetFormatIndex
+ */
+static	DWORD	MPEG3_GetFormatIndex(LPWAVEFORMATEX wfx)
+{
+    int 	i, hi;
+    Format*	fmts;
+    
+    switch (wfx->wFormatTag) 
+    {
+    case WAVE_FORMAT_PCM:
+	hi = NUM_PCM_FORMATS;
+	fmts = PCM_Formats;
+	break;
+    case WAVE_FORMAT_MPEGLAYER3:
+	hi = NUM_MPEG3_FORMATS;
+	fmts = MPEG3_Formats;
+	break;
+    default:
+	return 0xFFFFFFFF;
+    }
+    
+    for (i = 0; i < hi; i++) 
+    {
+	if (wfx->nChannels == fmts[i].nChannels &&
+	    wfx->nSamplesPerSec == fmts[i].rate &&
+	    wfx->wBitsPerSample == fmts[i].nBits)
+	    return i;
+    }
+    
+    return 0xFFFFFFFF;
+}
+
+/***********************************************************************
+ *           R16
+ *
+ * Read a 16 bit sample (correctly handles endianess)
+ */
+static inline short  R16(const unsigned char* src)
+{
+    return (short)((unsigned short)src[0] | ((unsigned short)src[1] << 8));
+}
+
+/***********************************************************************
+ *           W16
+ *
+ * Write a 16 bit sample (correctly handles endianess)
+ */
+static inline void  W16(unsigned char* dst, short s)
+{
+    dst[0] = LOBYTE(s);
+    dst[1] = HIBYTE(s);
+}
+
+static void mp3_horse(PACMDRVSTREAMINSTANCE adsi,
+                      const unsigned char* src, LPDWORD nsrc,
+                      unsigned char* dst, LPDWORD ndst)
+{
+    AcmMpeg3Data*       amd = (AcmMpeg3Data*)adsi->dwDriver;
+    int                 size, ret;
+    DWORD               dpos = 0;
+
+    ret = decodeMP3(&amd->mp, (unsigned char*)src, *nsrc, dst, *ndst, &size);
+    if (ret != MP3_OK)
+    {
+        *ndst = *nsrc = 0;
+        return;
+    }
+    do {
+        dpos += size;
+        if (*ndst - dpos < 4608) break;
+        ret = decodeMP3(&amd->mp, NULL, 0, 
+                        dst + dpos, *ndst - dpos, &size);
+    } while (ret == MP3_OK);
+    *ndst = dpos;
+}
+
+/***********************************************************************
+ *           MPEG3_DriverDetails
+ *
+ */
+static	LRESULT MPEG3_DriverDetails(PACMDRIVERDETAILSW add)
+{
+    add->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
+    add->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
+    add->wMid = 0xFF;
+    add->wPid = 0x00;
+    add->vdwACM = 0x01000000;
+    add->vdwDriver = 0x01000000;
+    add->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+    add->cFormatTags = 2; /* PCM, MPEG3 */
+    add->cFilterTags = 0;
+    add->hicon = (HICON)0;
+    MultiByteToWideChar( CP_ACP, 0, "WINE-MPEG3", -1,
+                         add->szShortName, sizeof(add->szShortName)/sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, "Wine MPEG3 decoder", -1,
+                         add->szLongName, sizeof(add->szLongName)/sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, "Brought to you by the Wine team (based on mpglib by Michael Hipp)...", -1,
+                         add->szCopyright, sizeof(add->szCopyright)/sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, "Refer to LICENSE file", -1,
+                         add->szLicensing, sizeof(add->szLicensing)/sizeof(WCHAR) );
+    add->szFeatures[0] = 0;
+    
+    return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ *           MPEG3_FormatTagDetails
+ *
+ */
+static	LRESULT	MPEG3_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery)
+{
+    static WCHAR szPcm[]={'P','C','M',0};
+    static WCHAR szMpeg3[]={'M','P','e','g','3',0};
+    
+    switch (dwQuery) 
+    {
+    case ACM_FORMATTAGDETAILSF_INDEX:
+	if (aftd->dwFormatTagIndex >= 2) return ACMERR_NOTPOSSIBLE;
+	break;
+    case ACM_FORMATTAGDETAILSF_LARGESTSIZE:
+	if (aftd->dwFormatTag == WAVE_FORMAT_UNKNOWN) 
+        {
+            aftd->dwFormatTagIndex = 1; /* WAVE_FORMAT_MPEGLAYER3 is bigger than PCM */
+	    break;
+	}
+	/* fall thru */
+    case ACM_FORMATTAGDETAILSF_FORMATTAG: 
+	switch (aftd->dwFormatTag) 
+        {
+	case WAVE_FORMAT_PCM:		aftd->dwFormatTagIndex = 0; break;
+	case WAVE_FORMAT_MPEGLAYER3:    aftd->dwFormatTagIndex = 1; break;
+	default:			return ACMERR_NOTPOSSIBLE;
+	}
+	break;
+    default:
+	WARN("Unsupported query %08lx\n", dwQuery);
+	return MMSYSERR_NOTSUPPORTED;
+    }
+    
+    aftd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+    switch (aftd->dwFormatTagIndex) 
+    {
+    case 0:
+	aftd->dwFormatTag = WAVE_FORMAT_PCM;
+	aftd->cbFormatSize = sizeof(PCMWAVEFORMAT);
+	aftd->cStandardFormats = NUM_PCM_FORMATS;
+        lstrcpyW(aftd->szFormatTag, szPcm);
+        break;
+    case 1:
+	aftd->dwFormatTag = WAVE_FORMAT_MPEGLAYER3;
+	aftd->cbFormatSize = sizeof(MPEGLAYER3WAVEFORMAT);
+	aftd->cStandardFormats = NUM_MPEG3_FORMATS;
+        lstrcpyW(aftd->szFormatTag, szMpeg3);
+	break;
+    }
+    return MMSYSERR_NOERROR;
+}
+
+static void fill_in_wfx(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate)
+{
+    MPEGLAYER3WAVEFORMAT*   mp3wfx = (MPEGLAYER3WAVEFORMAT*)wfx;
+
+    wfx->nAvgBytesPerSec = bit_rate / 8;
+    if (cbwfx >= sizeof(WAVEFORMATEX))
+        wfx->cbSize = sizeof(MPEGLAYER3WAVEFORMAT) - sizeof(WAVEFORMATEX);
+    if (cbwfx >= sizeof(MPEGLAYER3WAVEFORMAT))
+    {
+        mp3wfx->wID = MPEGLAYER3_ID_MPEG;
+        mp3wfx->fdwFlags = MPEGLAYER3_FLAG_PADDING_OFF;
+        mp3wfx->nBlockSize = (bit_rate * 144) / wfx->nSamplesPerSec;
+        mp3wfx->nFramesPerBlock = 1;
+        mp3wfx->nCodecDelay = 0x0571;
+    }
+}
+
+/***********************************************************************
+ *           MPEG3_FormatDetails
+ *
+ */
+static	LRESULT	MPEG3_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery)
+{
+    switch (dwQuery) 
+    {
+    case ACM_FORMATDETAILSF_FORMAT:
+	if (MPEG3_GetFormatIndex(afd->pwfx) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
+	break;
+    case ACM_FORMATDETAILSF_INDEX:
+	afd->pwfx->wFormatTag = afd->dwFormatTag;
+	switch (afd->dwFormatTag) 
+        {
+	case WAVE_FORMAT_PCM:
+	    if (afd->dwFormatIndex >= NUM_PCM_FORMATS) return ACMERR_NOTPOSSIBLE;
+	    afd->pwfx->nChannels = PCM_Formats[afd->dwFormatIndex].nChannels;
+	    afd->pwfx->nSamplesPerSec = PCM_Formats[afd->dwFormatIndex].rate;
+	    afd->pwfx->wBitsPerSample = PCM_Formats[afd->dwFormatIndex].nBits;
+	    /* native MSACM uses a PCMWAVEFORMAT structure, so cbSize is not accessible
+	     * afd->pwfx->cbSize = 0; 
+	     */
+	    afd->pwfx->nBlockAlign = 
+		(afd->pwfx->nChannels * afd->pwfx->wBitsPerSample) / 8;
+	    afd->pwfx->nAvgBytesPerSec = 
+		afd->pwfx->nSamplesPerSec * afd->pwfx->nBlockAlign;
+	    break;
+	case WAVE_FORMAT_MPEGLAYER3:
+	    if (afd->dwFormatIndex >= NUM_MPEG3_FORMATS) return ACMERR_NOTPOSSIBLE;
+	    afd->pwfx->nChannels = MPEG3_Formats[afd->dwFormatIndex].nChannels;
+	    afd->pwfx->nSamplesPerSec = MPEG3_Formats[afd->dwFormatIndex].rate;
+	    afd->pwfx->wBitsPerSample = MPEG3_Formats[afd->dwFormatIndex].nBits;
+	    afd->pwfx->nBlockAlign = 1;
+            fill_in_wfx(afd->cbwfx, afd->pwfx, 192000);
+	    break;
+	default:
+	    WARN("Unsupported tag %08lx\n", afd->dwFormatTag);
+	    return MMSYSERR_INVALPARAM;
+	}
+	break;
+    default:
+	WARN("Unsupported query %08lx\n", dwQuery);
+	return MMSYSERR_NOTSUPPORTED;	
+    }
+    afd->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+    afd->szFormat[0] = 0; /* let MSACM format this for us... */
+    
+    return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ *           MPEG3_FormatSuggest
+ *
+ */
+static	LRESULT	MPEG3_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
+{
+    /* some tests ... */
+    if (adfs->cbwfxSrc < sizeof(PCMWAVEFORMAT) ||
+	adfs->cbwfxDst < sizeof(PCMWAVEFORMAT) ||
+	MPEG3_GetFormatIndex(adfs->pwfxSrc) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
+    /* FIXME: should do those tests against the real size (according to format tag */
+
+    /* If no suggestion for destination, then copy source value */
+    if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS))
+	adfs->pwfxDst->nChannels = adfs->pwfxSrc->nChannels;
+    if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC))
+        adfs->pwfxDst->nSamplesPerSec = adfs->pwfxSrc->nSamplesPerSec;
+
+    if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE)) 
+    {
+	if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) 
+            adfs->pwfxDst->wBitsPerSample = 4;
+        else
+            adfs->pwfxDst->wBitsPerSample = 16;
+    }
+    if (!(adfs->fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG)) 
+    {
+	if (adfs->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM) 
+            adfs->pwfxDst->wFormatTag = WAVE_FORMAT_MPEGLAYER3;
+        else
+            adfs->pwfxDst->wFormatTag = WAVE_FORMAT_PCM;
+    }
+        
+    /* check if result is ok */
+    if (MPEG3_GetFormatIndex(adfs->pwfxDst) == 0xFFFFFFFF) return ACMERR_NOTPOSSIBLE;
+
+    /* recompute other values */
+    switch (adfs->pwfxDst->wFormatTag)
+    {
+    case WAVE_FORMAT_PCM:
+        adfs->pwfxDst->nBlockAlign = (adfs->pwfxDst->nChannels * adfs->pwfxDst->wBitsPerSample) / 8;
+        adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign;
+        break;
+    case WAVE_FORMAT_MPEGLAYER3:
+        adfs->pwfxDst->nBlockAlign = 1;
+        fill_in_wfx(adfs->cbwfxDst, adfs->pwfxDst, 192000);
+        break;
+    default:
+        FIXME("\n");
+        break;
+    }
+
+    return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ *           MPEG3_Reset
+ *
+ */
+static	void	MPEG3_Reset(PACMDRVSTREAMINSTANCE adsi, AcmMpeg3Data* aad)
+{
+}
+
+/***********************************************************************
+ *           MPEG3_StreamOpen
+ *
+ */
+static	LRESULT	MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
+{
+    AcmMpeg3Data*	aad;
+
+    assert(!(adsi->fdwOpen & ACM_STREAMOPENF_ASYNC));
+    
+    if (MPEG3_GetFormatIndex(adsi->pwfxSrc) == 0xFFFFFFFF ||
+	MPEG3_GetFormatIndex(adsi->pwfxDst) == 0xFFFFFFFF)
+	return ACMERR_NOTPOSSIBLE;
+    
+    aad = HeapAlloc(GetProcessHeap(), 0, sizeof(AcmMpeg3Data));
+    if (aad == 0) return MMSYSERR_NOMEM;
+    
+    adsi->dwDriver = (DWORD)aad;
+    
+    if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
+	adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) 
+    {
+	goto theEnd;
+    }
+    else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
+             adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) 
+    {
+	/* resampling or mono <=> stereo not available 
+         * MPEG3 algo only define 16 bit per sample output
+         */
+	if (adsi->pwfxSrc->nSamplesPerSec != adsi->pwfxDst->nSamplesPerSec ||
+	    adsi->pwfxSrc->nChannels != adsi->pwfxDst->nChannels ||
+            adsi->pwfxDst->wBitsPerSample != 16)
+	    goto theEnd;
+        aad->convert = mp3_horse;
+        InitMP3(&aad->mp);
+    }
+    /* no encoding yet
+    else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
+             adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) 
+    */
+    else goto theEnd;
+    MPEG3_Reset(adsi, aad);
+
+    return MMSYSERR_NOERROR;
+    
+ theEnd:
+    HeapFree(GetProcessHeap(), 0, aad);
+    adsi->dwDriver = 0L;
+    return MMSYSERR_NOTSUPPORTED;
+}
+
+/***********************************************************************
+ *           MPEG3_StreamClose
+ *
+ */
+static	LRESULT	MPEG3_StreamClose(PACMDRVSTREAMINSTANCE adsi)
+{
+    ExitMP3(&((AcmMpeg3Data*)adsi->dwDriver)->mp);
+    HeapFree(GetProcessHeap(), 0, (void*)adsi->dwDriver);
+    return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ *           MPEG3_round
+ *
+ */
+static	inline DWORD	MPEG3_round(DWORD a, DWORD b, DWORD c)
+{
+    assert(a && b && c);
+    /* to be sure, always return an entire number of c... */
+    return ((double)a * (double)b + (double)c - 1) / (double)c;
+}
+
+/***********************************************************************
+ *           MPEG3_StreamSize
+ *
+ */
+static	LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE adss)
+{
+    switch (adss->fdwSize) 
+    {
+    case ACM_STREAMSIZEF_DESTINATION:
+	/* cbDstLength => cbSrcLength */
+	if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
+	    adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) 
+        {
+	    /* don't take block overhead into account, doesn't matter too much */
+	    adss->cbSrcLength = adss->cbDstLength * 4;
+	}
+        else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
+                 adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) 
+        {
+	    FIXME("misses the block header overhead\n");
+	    adss->cbSrcLength = 256 + adss->cbDstLength / 4;
+	}
+        else 
+        {
+	    return MMSYSERR_NOTSUPPORTED;
+	}
+	break;
+    case ACM_STREAMSIZEF_SOURCE:
+	/* cbSrcLength => cbDstLength */
+	if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM &&
+	    adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) 
+        {
+	    FIXME("misses the block header overhead\n");
+	    adss->cbDstLength = 256 + adss->cbSrcLength / 4;
+	} 
+        else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 &&
+                 adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) 
+        {
+	    /* don't take block overhead into account, doesn't matter too much */
+	    adss->cbDstLength = adss->cbSrcLength * 4;
+	}
+        else 
+        {
+	    return MMSYSERR_NOTSUPPORTED;
+	}
+	break;
+    default:
+	WARN("Unsupported query %08lx\n", adss->fdwSize);
+	return MMSYSERR_NOTSUPPORTED;	
+    }
+    return MMSYSERR_NOERROR;
+}
+
+/***********************************************************************
+ *           MPEG3_StreamConvert
+ *
+ */
+static LRESULT MPEG3_StreamConvert(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMHEADER adsh)
+{
+    AcmMpeg3Data*	aad = (AcmMpeg3Data*)adsi->dwDriver;
+    DWORD		nsrc = adsh->cbSrcLength;
+    DWORD		ndst = adsh->cbDstLength;
+    
+    if (adsh->fdwConvert & 
+	~(ACM_STREAMCONVERTF_BLOCKALIGN|
+	  ACM_STREAMCONVERTF_END|
+	  ACM_STREAMCONVERTF_START)) 
+    {
+	FIXME("Unsupported fdwConvert (%08lx), ignoring it\n", adsh->fdwConvert);
+    }
+    /* ACM_STREAMCONVERTF_BLOCKALIGN
+     *	currently all conversions are block aligned, so do nothing for this flag
+     * ACM_STREAMCONVERTF_END
+     *	no pending data, so do nothing for this flag
+     */
+    if ((adsh->fdwConvert & ACM_STREAMCONVERTF_START)) 
+    {
+	MPEG3_Reset(adsi, aad);
+    }
+
+    aad->convert(adsi, adsh->pbSrc, &nsrc, adsh->pbDst, &ndst);
+    adsh->cbSrcLengthUsed = nsrc;
+    adsh->cbDstLengthUsed = ndst;
+    
+    return MMSYSERR_NOERROR;
+}
+
+/**************************************************************************
+ * 			MPEG3_DriverProc			[exported]
+ */
+LRESULT CALLBACK	MPEG3_DriverProc(DWORD dwDevID, HDRVR hDriv, UINT wMsg, 
+					 LPARAM dwParam1, LPARAM dwParam2)
+{
+    TRACE("(%08lx %08lx %04x %08lx %08lx);\n", 
+	  dwDevID, (DWORD)hDriv, wMsg, dwParam1, dwParam2);
+    
+    switch (wMsg) 
+    {
+    case DRV_LOAD:		return 1;
+    case DRV_FREE:		return 1;
+    case DRV_OPEN:		return MPEG3_drvOpen((LPSTR)dwParam1);
+    case DRV_CLOSE:		return MPEG3_drvClose(dwDevID);
+    case DRV_ENABLE:		return 1;	
+    case DRV_DISABLE:		return 1;
+    case DRV_QUERYCONFIGURE:	return 1;
+    case DRV_CONFIGURE:		MessageBoxA(0, "MPEG3 filter !", "Wine Driver", MB_OK); return 1;
+    case DRV_INSTALL:		return DRVCNF_RESTART;
+    case DRV_REMOVE:		return DRVCNF_RESTART;
+	
+    case ACMDM_DRIVER_NOTIFY:
+	/* no caching from other ACM drivers is done so far */
+	return MMSYSERR_NOERROR;
+	
+    case ACMDM_DRIVER_DETAILS:
+	return MPEG3_DriverDetails((PACMDRIVERDETAILSW)dwParam1);
+	
+    case ACMDM_FORMATTAG_DETAILS:
+	return MPEG3_FormatTagDetails((PACMFORMATTAGDETAILSW)dwParam1, dwParam2);
+	
+    case ACMDM_FORMAT_DETAILS:
+	return MPEG3_FormatDetails((PACMFORMATDETAILSW)dwParam1, dwParam2);
+	
+    case ACMDM_FORMAT_SUGGEST:
+	return MPEG3_FormatSuggest((PACMDRVFORMATSUGGEST)dwParam1);
+	
+    case ACMDM_STREAM_OPEN:
+	return MPEG3_StreamOpen((PACMDRVSTREAMINSTANCE)dwParam1);
+	
+    case ACMDM_STREAM_CLOSE:
+	return MPEG3_StreamClose((PACMDRVSTREAMINSTANCE)dwParam1);
+	
+    case ACMDM_STREAM_SIZE:
+	return MPEG3_StreamSize((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMSIZE)dwParam2);
+	
+    case ACMDM_STREAM_CONVERT:
+	return MPEG3_StreamConvert((PACMDRVSTREAMINSTANCE)dwParam1, (PACMDRVSTREAMHEADER)dwParam2);
+	
+    case ACMDM_HARDWARE_WAVE_CAPS_INPUT:
+    case ACMDM_HARDWARE_WAVE_CAPS_OUTPUT:
+	/* this converter is not a hardware driver */
+    case ACMDM_FILTERTAG_DETAILS:
+    case ACMDM_FILTER_DETAILS:
+	/* this converter is not a filter */
+    case ACMDM_STREAM_RESET:
+	/* only needed for asynchronous driver... we aren't, so just say it */
+	return MMSYSERR_NOTSUPPORTED;
+    case ACMDM_STREAM_PREPARE:
+    case ACMDM_STREAM_UNPREPARE:
+	/* nothing special to do here... so don't do anything */
+	return MMSYSERR_NOERROR;
+	
+    default:
+	return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+    }
+    return 0;
+}
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/mpglib.h	Sun May 19 17:16:39 2002
@@ -0,0 +1,54 @@
+
+struct buf {
+        unsigned char *pnt;
+	long size;
+	long pos;
+        struct buf *next;
+        struct buf *prev;
+};
+
+struct framebuf {
+	struct buf *buf;
+	long pos;
+	struct frame *next;
+	struct frame *prev;
+};
+
+struct mpstr {
+	struct buf *head,*tail;
+	int bsize;
+	int framesize;
+        int fsizeold;
+	struct frame fr;
+        unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */
+	real hybrid_block[2][2][SBLIMIT*SSLIMIT];
+	int hybrid_blc[2];
+	unsigned long header;
+	int bsnum;
+	real synth_buffs[2][2][0x110];
+        int  synth_bo;
+};
+
+#ifndef BOOL
+#define BOOL int
+#endif
+
+#define MP3_ERR -1
+#define MP3_OK  0
+#define MP3_NEED_MORE 1
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+BOOL InitMP3(struct mpstr *mp);
+int decodeMP3(struct mpstr *mp,char *inmemory,int inmemsize,
+     char *outmemory,int outmemsize,int *done);
+void ExitMP3(struct mpstr *mp);
+
+#ifdef __cplusplus
+}
+#endif
+
+
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ dlls/msacm/winemp3/tabinit.c	Sun May 19 17:16:39 2002
@@ -0,0 +1,80 @@
+
+#include <stdlib.h>
+
+#include "mpg123.h"
+
+real decwin[512+32];
+static real cos64[16],cos32[8],cos16[4],cos8[2],cos4[1];
+real *pnts[] = { cos64,cos32,cos16,cos8,cos4 };
+
+#if 0
+static unsigned char *conv16to8_buf = NULL;
+unsigned char *conv16to8;
+#endif
+
+static long intwinbase[] = {
+     0,    -1,    -1,    -1,    -1,    -1,    -1,    -2,    -2,    -2,
+    -2,    -3,    -3,    -4,    -4,    -5,    -5,    -6,    -7,    -7,
+    -8,    -9,   -10,   -11,   -13,   -14,   -16,   -17,   -19,   -21,
+   -24,   -26,   -29,   -31,   -35,   -38,   -41,   -45,   -49,   -53,
+   -58,   -63,   -68,   -73,   -79,   -85,   -91,   -97,  -104,  -111,
+  -117,  -125,  -132,  -139,  -147,  -154,  -161,  -169,  -176,  -183,
+  -190,  -196,  -202,  -208,  -213,  -218,  -222,  -225,  -227,  -228,
+  -228,  -227,  -224,  -221,  -215,  -208,  -200,  -189,  -177,  -163,
+  -146,  -127,  -106,   -83,   -57,   -29,     2,    36,    72,   111,
+   153,   197,   244,   294,   347,   401,   459,   519,   581,   645,
+   711,   779,   848,   919,   991,  1064,  1137,  1210,  1283,  1356,
+  1428,  1498,  1567,  1634,  1698,  1759,  1817,  1870,  1919,  1962,
+  2001,  2032,  2057,  2075,  2085,  2087,  2080,  2063,  2037,  2000,
+  1952,  1893,  1822,  1739,  1644,  1535,  1414,  1280,  1131,   970,
+   794,   605,   402,   185,   -45,  -288,  -545,  -814, -1095, -1388,
+ -1692, -2006, -2330, -2663, -3004, -3351, -3705, -4063, -4425, -4788,
+ -5153, -5517, -5879, -6237, -6589, -6935, -7271, -7597, -7910, -8209,
+ -8491, -8755, -8998, -9219, -9416, -9585, -9727, -9838, -9916, -9959,
+ -9966, -9935, -9863, -9750, -9592, -9389, -9139, -8840, -8492, -8092,
+ -7640, -7134, -6574, -5959, -5288, -4561, -3776, -2935, -2037, -1082,
+   -70,   998,  2122,  3300,  4533,  5818,  7154,  8540,  9975, 11455,
+ 12980, 14548, 16155, 17799, 19478, 21189, 22929, 24694, 26482, 28289,
+ 30112, 31947, 33791, 35640, 37489, 39336, 41176, 43006, 44821, 46617,
+ 48390, 50137, 51853, 53534, 55178, 56778, 58333, 59838, 61289, 62684,
+ 64019, 65290, 66494, 67629, 68692, 69679, 70590, 71420, 72169, 72835,
+ 73415, 73908, 74313, 74630, 74856, 74992, 75038 };
+
+void make_decode_tables(long scaleval)
+{
+  int i,j,k,kr,divv;
+  real *table,*costab;
+
+  
+  for(i=0;i<5;i++)
+  {
+    kr=0x10>>i; divv=0x40>>i;
+    costab = pnts[i];
+    for(k=0;k<kr;k++)
+      costab[k] = 1.0 / (2.0 * cos(M_PI * ((double) k * 2.0 + 1.0) / (double) divv));
+  }
+
+  table = decwin;
+  scaleval = -scaleval;
+  for(i=0,j=0;i<256;i++,j++,table+=32)
+  {
+    if(table < decwin+512+16)
+      table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval;
+    if(i % 32 == 31)
+      table -= 1023;
+    if(i % 64 == 63)
+      scaleval = - scaleval;
+  }
+
+  for( /* i=256 */ ;i<512;i++,j--,table+=32)
+  {
+    if(table < decwin+512+16)
+      table[16] = table[0] = (double) intwinbase[j] / 65536.0 * (double) scaleval;
+    if(i % 32 == 31)
+      table -= 1023;
+    if(i % 64 == 63)
+      scaleval = - scaleval;
+  }
+}
+
+


More information about the wine-patches mailing list