mirror of
https://github.com/reactos/reactos.git
synced 2025-04-26 00:20:34 +00:00
- Add mp3 codec from Wine
svn path=/trunk/; revision=40039
This commit is contained in:
parent
341c5b2e5f
commit
628321cb61
20 changed files with 4579 additions and 0 deletions
|
@ -63,6 +63,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midi",0x00000000,
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msadpcm",0x00000000,"c:\reactos\system32\msadp32.acm"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msadpcm",0x00000000,"c:\reactos\system32\msadp32.acm"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msg711",0x00000000,"c:\reactos\system32\msg711.acm"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msg711",0x00000000,"c:\reactos\system32\msg711.acm"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.imaadpcm",0x00000000,"c:\reactos\system32\imaadp32.acm"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.imaadpcm",0x00000000,"c:\reactos\system32\imaadp32.acm"
|
||||||
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.winemp3",0x00000000,"c:\reactos\system32\winemp3.acm"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.cvid",0x00000000,"c:\reactos\system32\iccvid.dll"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.cvid",0x00000000,"c:\reactos\system32\iccvid.dll"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.mrle",0x00000000,"c:\reactos\system32\msrle32.dll"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.mrle",0x00000000,"c:\reactos\system32\msrle32.dll"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.msvc",0x00000000,"c:\reactos\system32\msvidc32.dll"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.msvc",0x00000000,"c:\reactos\system32\msvidc32.dll"
|
||||||
|
|
|
@ -68,6 +68,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","midi",0x00000000,
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msadpcm",0x00000000,"c:\reactos\system32\msadp32.acm"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msadpcm",0x00000000,"c:\reactos\system32\msadp32.acm"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msg711",0x00000000,"c:\reactos\system32\msg711.acm"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.msg711",0x00000000,"c:\reactos\system32\msg711.acm"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.imaadpcm",0x00000000,"c:\reactos\system32\imaadp32.acm"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.imaadpcm",0x00000000,"c:\reactos\system32\imaadp32.acm"
|
||||||
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","msacm.winemp3",0x00000000,"c:\reactos\system32\winemp3.acm"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.cvid",0x00000000,"c:\reactos\system32\iccvid.dll"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.cvid",0x00000000,"c:\reactos\system32\iccvid.dll"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.mrle",0x00000000,"c:\reactos\system32\msrle32.dll"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.mrle",0x00000000,"c:\reactos\system32\msrle32.dll"
|
||||||
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.msvc",0x00000000,"c:\reactos\system32\msvidc32.dll"
|
HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32","vidc.msvc",0x00000000,"c:\reactos\system32\msvidc32.dll"
|
||||||
|
|
|
@ -420,6 +420,7 @@ dll\win32\usp10\usp10.dll 1
|
||||||
dll\win32\uxtheme\uxtheme.dll 1
|
dll\win32\uxtheme\uxtheme.dll 1
|
||||||
dll\win32\vdmdbg\vdmdbg.dll 1
|
dll\win32\vdmdbg\vdmdbg.dll 1
|
||||||
dll\win32\version\version.dll 1
|
dll\win32\version\version.dll 1
|
||||||
|
dll\win32\winemp3.acm\winemp3.acm 1
|
||||||
dll\win32\winfax\winfax.dll 1
|
dll\win32\winfax\winfax.dll 1
|
||||||
dll\win32\winhttp\winhttp.dll 1
|
dll\win32\winhttp\winhttp.dll 1
|
||||||
dll\win32\wininet\wininet.dll 1
|
dll\win32\wininet\wininet.dll 1
|
||||||
|
|
|
@ -565,6 +565,9 @@
|
||||||
<directory name="wdmaud.drv">
|
<directory name="wdmaud.drv">
|
||||||
<xi:include href="wdmaud.drv/wdmaud.rbuild" />
|
<xi:include href="wdmaud.drv/wdmaud.rbuild" />
|
||||||
</directory>
|
</directory>
|
||||||
|
<directory name="winemp3.acm">
|
||||||
|
<xi:include href="winemp3.acm/winemp3.acm.rbuild" />
|
||||||
|
</directory>
|
||||||
<directory name="winfax">
|
<directory name="winfax">
|
||||||
<xi:include href="winfax/winfax.rbuild" />
|
<xi:include href="winfax/winfax.rbuild" />
|
||||||
</directory>
|
</directory>
|
||||||
|
|
261
reactos/dll/win32/winemp3.acm/common.c
Normal file
261
reactos/dll/win32/winemp3.acm/common.c
Normal file
|
@ -0,0 +1,261 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#ifdef HAVE_SYS_STAT_H
|
||||||
|
# include <sys/stat.h>
|
||||||
|
#endif
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "mpg123.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(mpeg3);
|
||||||
|
|
||||||
|
static const struct parameter param = { 1 , 1 , 0 , 0 };
|
||||||
|
|
||||||
|
static const 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,} }
|
||||||
|
};
|
||||||
|
|
||||||
|
static const 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
|
||||||
|
|
||||||
|
static 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* decode a header and write the information
|
||||||
|
* into the frame structure
|
||||||
|
*/
|
||||||
|
int decode_header(struct frame *fr,unsigned long newhead)
|
||||||
|
{
|
||||||
|
if(head_check(newhead) == FALSE)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
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(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)
|
||||||
|
{
|
||||||
|
FIXME("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;
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
FIXME("Layer 1 not supported!\n");
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
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;
|
||||||
|
break;
|
||||||
|
#else
|
||||||
|
FIXME("Layer 2 not supported!\n");
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
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:
|
||||||
|
FIXME("Unknown layer type: %d\n", fr->lay);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
void print_header(struct frame *fr)
|
||||||
|
{
|
||||||
|
static const char * const modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
|
||||||
|
static const char * const layers[4] = { "Unknown" , "I", "II", "III" };
|
||||||
|
|
||||||
|
FIXME("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);
|
||||||
|
FIXME("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);
|
||||||
|
FIXME("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 const char * const modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
|
||||||
|
static const char * const layers[4] = { "Unknown" , "I", "II", "III" };
|
||||||
|
|
||||||
|
FIXME("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;
|
||||||
|
}
|
329
reactos/dll/win32/winemp3.acm/dct64_i386.c
Normal file
329
reactos/dll/win32/winemp3.acm/dct64_i386.c
Normal file
|
@ -0,0 +1,329 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* Discrete Cosine Transform (DCT) for subband synthesis
|
||||||
|
* optimized for machines with no auto-increment.
|
||||||
|
* The performance is highly compiler dependent. Maybe
|
||||||
|
* the dct64.c version for 'normal' processor may be faster
|
||||||
|
* even for Intel processors.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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);
|
||||||
|
}
|
164
reactos/dll/win32/winemp3.acm/decode_i386.c
Normal file
164
reactos/dll/win32/winemp3.acm/decode_i386.c
Normal file
|
@ -0,0 +1,164 @@
|
||||||
|
/*
|
||||||
|
* Mpeg Layer-1,2,3 audio decoder
|
||||||
|
* ------------------------------
|
||||||
|
* copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved.
|
||||||
|
* See also 'README'
|
||||||
|
*
|
||||||
|
* Slightly optimized for machines without autoincrement/decrement.
|
||||||
|
* The performance is highly compiler dependent. Maybe
|
||||||
|
* the decode.c version for 'normal' processor may be faster
|
||||||
|
* even for Intel processors.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "mpg123.h"
|
||||||
|
#include "mpglib.h"
|
||||||
|
|
||||||
|
/* 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(struct mpstr *mp,real *bandPtr,unsigned char *samples,int *pnt)
|
||||||
|
{
|
||||||
|
short samples_tmp[64];
|
||||||
|
short *tmp1 = samples_tmp;
|
||||||
|
int i,ret;
|
||||||
|
int pnt1 = 0;
|
||||||
|
|
||||||
|
ret = synth_1to1(mp,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(struct mpstr *mp,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 = mp->synth_bo;
|
||||||
|
|
||||||
|
if(!channel) {
|
||||||
|
bo--;
|
||||||
|
bo &= 0xf;
|
||||||
|
buf = mp->synth_buffs[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
samples++;
|
||||||
|
buf = mp->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);
|
||||||
|
}
|
||||||
|
|
||||||
|
mp->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;
|
||||||
|
}
|
346
reactos/dll/win32/winemp3.acm/huffman.h
Normal file
346
reactos/dll/win32/winemp3.acm/huffman.h
Normal file
|
@ -0,0 +1,346 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* huffman tables ... recalculated to work with my optimized
|
||||||
|
* decoder scheme (MH)
|
||||||
|
*
|
||||||
|
* probably we could save a few bytes of memory, because the
|
||||||
|
* smaller tables are often part of a bigger table
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct newhuff
|
||||||
|
{
|
||||||
|
unsigned int linbits;
|
||||||
|
const short *table;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const short tab0[] =
|
||||||
|
{
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
static const short tab1[] =
|
||||||
|
{
|
||||||
|
-5, -3, -1, 17, 1, 16, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static const short tab2[] =
|
||||||
|
{
|
||||||
|
-15, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 17, -1, 1,
|
||||||
|
16, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static const short tab3[] =
|
||||||
|
{
|
||||||
|
-13, -11, -9, -5, -3, -1, 34, 2, 18, -1, 33, 32, 16, 17, -1,
|
||||||
|
1, 0
|
||||||
|
};
|
||||||
|
|
||||||
|
static const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const 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 const struct newhuff htc[] =
|
||||||
|
{
|
||||||
|
{ /* 1 , 1 , */ 0 , tab_c0 } ,
|
||||||
|
{ /* 1 , 1 , */ 0 , tab_c1 }
|
||||||
|
};
|
254
reactos/dll/win32/winemp3.acm/interface.c
Normal file
254
reactos/dll/win32/winemp3.acm/interface.c
Normal file
|
@ -0,0 +1,254 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
#include "mpg123.h"
|
||||||
|
#include "mpglib.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(mpeg3);
|
||||||
|
|
||||||
|
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;
|
||||||
|
mp->fr.mp = mp;
|
||||||
|
|
||||||
|
if(!init) {
|
||||||
|
init = 1;
|
||||||
|
make_decode_tables(32767);
|
||||||
|
init_layer2();
|
||||||
|
init_layer3(SBLIMIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
return !0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ClearMP3Buffer(struct mpstr *mp)
|
||||||
|
{
|
||||||
|
struct buf *b,*bn;
|
||||||
|
|
||||||
|
b = mp->tail;
|
||||||
|
while(b) {
|
||||||
|
HeapFree(GetProcessHeap(), 0, b->pnt);
|
||||||
|
bn = b->next;
|
||||||
|
HeapFree(GetProcessHeap(), 0, b);
|
||||||
|
b = bn;
|
||||||
|
}
|
||||||
|
mp->tail = NULL;
|
||||||
|
mp->head = NULL;
|
||||||
|
mp->bsize = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct buf *addbuf(struct mpstr *mp,const unsigned char *buf,int size)
|
||||||
|
{
|
||||||
|
struct buf *nbuf;
|
||||||
|
|
||||||
|
nbuf = HeapAlloc(GetProcessHeap(), 0, sizeof(struct buf));
|
||||||
|
if(!nbuf) {
|
||||||
|
WARN("Out of memory!\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
nbuf->pnt = HeapAlloc(GetProcessHeap(), 0, size);
|
||||||
|
if(!nbuf->pnt) {
|
||||||
|
HeapFree(GetProcessHeap(), 0, nbuf);
|
||||||
|
WARN("Out of memory!\n");
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeapFree(GetProcessHeap(), 0, buf->pnt);
|
||||||
|
HeapFree(GetProcessHeap(), 0, 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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,const unsigned char *in,int isize,unsigned char *out,
|
||||||
|
int osize,int *done)
|
||||||
|
{
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if(osize < 4608) {
|
||||||
|
ERR("Output buffer too small\n");
|
||||||
|
return MP3_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(in) {
|
||||||
|
if(addbuf(mp,in,isize) == NULL) {
|
||||||
|
return MP3_ERR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* First decode header */
|
||||||
|
if(mp->framesize == 0) {
|
||||||
|
int ret;
|
||||||
|
if(mp->bsize < 4) {
|
||||||
|
return MP3_NEED_MORE;
|
||||||
|
}
|
||||||
|
read_head(mp);
|
||||||
|
while (!(ret = decode_header(&mp->fr,mp->header)) && mp->bsize)
|
||||||
|
{
|
||||||
|
mp->header = mp->header << 8;
|
||||||
|
mp->header |= read_buf_byte(mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
return MP3_NEED_MORE;
|
||||||
|
}
|
||||||
|
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,out,done);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
do_layer2(&mp->fr,out,done);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
do_layer3(&mp->fr,out,done);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
mp->fsizeold = mp->framesize;
|
||||||
|
mp->framesize = 0;
|
||||||
|
|
||||||
|
return MP3_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int set_pointer(struct mpstr *mp, long backstep)
|
||||||
|
{
|
||||||
|
unsigned char *bsbufold;
|
||||||
|
if(mp->fsizeold < 0 && backstep > 0) {
|
||||||
|
/* This is not a bug if we just did seeking, the first frame is dropped then */
|
||||||
|
WARN("Can't step back %ld!\n",backstep);
|
||||||
|
return MP3_ERR;
|
||||||
|
}
|
||||||
|
bsbufold = mp->bsspace[mp->bsnum] + 512;
|
||||||
|
wordpointer -= backstep;
|
||||||
|
if (backstep)
|
||||||
|
memcpy(wordpointer,bsbufold+mp->fsizeold-backstep,backstep);
|
||||||
|
bitindex = 0;
|
||||||
|
return MP3_OK;
|
||||||
|
}
|
175
reactos/dll/win32/winemp3.acm/l2tables.h
Normal file
175
reactos/dll/win32/winemp3.acm/l2tables.h
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct al_table
|
||||||
|
{
|
||||||
|
short bits;
|
||||||
|
short d;
|
||||||
|
};
|
||||||
|
|
||||||
|
static const 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} };
|
||||||
|
|
||||||
|
static const 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} };
|
||||||
|
|
||||||
|
static const 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} };
|
||||||
|
|
||||||
|
static const 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} };
|
||||||
|
|
||||||
|
static const 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} };
|
159
reactos/dll/win32/winemp3.acm/layer1.c
Normal file
159
reactos/dll/win32/winemp3.acm/layer1.c
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
/*
|
||||||
|
* Mpeg Layer-1 audio decoder
|
||||||
|
* --------------------------
|
||||||
|
* copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
|
||||||
|
* This file has been copied from mpglib.
|
||||||
|
* near unoptimzed ...
|
||||||
|
*
|
||||||
|
* may have a few bugs after last optimization ...
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "mpg123.h"
|
||||||
|
|
||||||
|
static 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static 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(fr->mp,fraction[single],pcm_sample,pcm_point);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int p1 = *pcm_point;
|
||||||
|
clip += synth_1to1(fr->mp,fraction[0],0,pcm_sample,&p1);
|
||||||
|
clip += synth_1to1(fr->mp,fraction[1],1,pcm_sample,pcm_point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return clip;
|
||||||
|
}
|
301
reactos/dll/win32/winemp3.acm/layer2.c
Normal file
301
reactos/dll/win32/winemp3.acm/layer2.c
Normal file
|
@ -0,0 +1,301 @@
|
||||||
|
/*
|
||||||
|
* Mpeg Layer-2 audio decoder
|
||||||
|
* --------------------------
|
||||||
|
* copyright (c) 1995 by Michael Hipp, All rights reserved. See also 'README'
|
||||||
|
* This file has been copied from mpglib.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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 const 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 const 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 const 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static 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;
|
||||||
|
const 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static 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;
|
||||||
|
const 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 = 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 = 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 const 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 const struct al_table *tables[5] =
|
||||||
|
{ alloc_0, alloc_1, alloc_2, alloc_3 , alloc_4 };
|
||||||
|
static const 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(fr->mp,fraction[0][j],pcm_sample,pcm_point);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int p1 = *pcm_point;
|
||||||
|
clip += synth_1to1(fr->mp,fraction[0][j],0,pcm_sample,&p1);
|
||||||
|
clip += synth_1to1(fr->mp,fraction[1][j],1,pcm_sample,pcm_point);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return clip;
|
||||||
|
}
|
1610
reactos/dll/win32/winemp3.acm/layer3.c
Normal file
1610
reactos/dll/win32/winemp3.acm/layer3.c
Normal file
File diff suppressed because it is too large
Load diff
622
reactos/dll/win32/winemp3.acm/mpegl3.c
Normal file
622
reactos/dll/win32/winemp3.acm/mpegl3.c
Normal file
|
@ -0,0 +1,622 @@
|
||||||
|
/*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "wingdi.h"
|
||||||
|
#include "winuser.h"
|
||||||
|
#include "winnls.h"
|
||||||
|
#include "mmsystem.h"
|
||||||
|
#include "mmreg.h"
|
||||||
|
#include "msacm.h"
|
||||||
|
#include "msacmdrv.h"
|
||||||
|
#include "mpg123.h"
|
||||||
|
#include "mpglib.h"
|
||||||
|
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(mpeg3);
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MPEG3_drvOpen
|
||||||
|
*/
|
||||||
|
static LRESULT MPEG3_drvOpen(LPCSTR str)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MPEG3_drvClose
|
||||||
|
*/
|
||||||
|
static LRESULT MPEG3_drvClose(DWORD_PTR 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 const 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},
|
||||||
|
{1, 8, 48000}, {2, 8, 48000}, {1, 16, 48000}, {2, 16, 48000},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const 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},
|
||||||
|
{1, 0, 48000}, {2, 0, 48000},
|
||||||
|
};
|
||||||
|
|
||||||
|
#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;
|
||||||
|
const 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 || !fmts[i].nBits))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0xFFFFFFFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DWORD get_num_buffered_bytes(struct mpstr *mp)
|
||||||
|
{
|
||||||
|
DWORD numBuff = 0;
|
||||||
|
struct buf * p = mp->tail;
|
||||||
|
while (p) {
|
||||||
|
numBuff += p->size - p->pos;
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
|
return numBuff;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
DWORD buffered_before;
|
||||||
|
DWORD buffered_during;
|
||||||
|
DWORD buffered_after;
|
||||||
|
|
||||||
|
/* Skip leading ID v3 header */
|
||||||
|
if (amd->mp.fsizeold == -1 && !strncmp("ID3", (char*)src, 3))
|
||||||
|
{
|
||||||
|
UINT length = 10;
|
||||||
|
const char *header = (char *)src;
|
||||||
|
|
||||||
|
TRACE("Found ID3 v2.%d.%d\n", header[3], header[4]);
|
||||||
|
length += (header[6] & 0x7F) << 21;
|
||||||
|
length += (header[7] & 0x7F) << 14;
|
||||||
|
length += (header[8] & 0x7F) << 7;
|
||||||
|
length += (header[9] & 0x7F);
|
||||||
|
TRACE("Length: %u\n", length);
|
||||||
|
*nsrc = length;
|
||||||
|
*ndst = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buffered_before = get_num_buffered_bytes(&amd->mp);
|
||||||
|
ret = decodeMP3(&amd->mp, src, *nsrc, dst, *ndst, &size);
|
||||||
|
buffered_during = get_num_buffered_bytes(&amd->mp);
|
||||||
|
if (ret != MP3_OK)
|
||||||
|
{
|
||||||
|
if (ret == MP3_ERR)
|
||||||
|
FIXME("Error occurred during decoding!\n");
|
||||||
|
*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;
|
||||||
|
|
||||||
|
buffered_after = get_num_buffered_bytes(&amd->mp);
|
||||||
|
TRACE("before %d put %d during %d after %d\n", buffered_before, *nsrc, buffered_during, buffered_after);
|
||||||
|
|
||||||
|
*nsrc -= buffered_after;
|
||||||
|
ClearMP3Buffer(&amd->mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* 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 = NULL;
|
||||||
|
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 const WCHAR szPcm[]={'P','C','M',0};
|
||||||
|
static const 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 %08x\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 %08x\n", afd->dwFormatTag);
|
||||||
|
return MMSYSERR_INVALPARAM;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("Unsupported query %08x\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)
|
||||||
|
{
|
||||||
|
ClearMP3Buffer(&aad->mp);
|
||||||
|
InitMP3(&aad->mp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* 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_PTR)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)
|
||||||
|
{
|
||||||
|
ClearMP3Buffer(&((AcmMpeg3Data*)adsi->dwDriver)->mp);
|
||||||
|
HeapFree(GetProcessHeap(), 0, (void*)adsi->dwDriver);
|
||||||
|
return MMSYSERR_NOERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* 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 * 12;
|
||||||
|
}
|
||||||
|
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 / 12;
|
||||||
|
}
|
||||||
|
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 / 12;
|
||||||
|
}
|
||||||
|
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 * 12;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return MMSYSERR_NOTSUPPORTED;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN("Unsupported query %08x\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 (%08x), 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_PTR dwDevID, HDRVR hDriv, UINT wMsg,
|
||||||
|
LPARAM dwParam1, LPARAM dwParam2)
|
||||||
|
{
|
||||||
|
TRACE("(%08lx %p %04x %08lx %08lx);\n",
|
||||||
|
dwDevID, 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);
|
||||||
|
}
|
||||||
|
}
|
166
reactos/dll/win32/winemp3.acm/mpg123.h
Normal file
166
reactos/dll/win32/winemp3.acm/mpg123.h
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
#ifndef TRUE
|
||||||
|
#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
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
const struct al_table *alloc;
|
||||||
|
|
||||||
|
struct mpstr *mp;
|
||||||
|
};
|
||||||
|
|
||||||
|
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(struct mpstr *,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 (struct mpstr *,real *,int,unsigned char *,int *);
|
||||||
|
extern int synth_1to1_mono (struct mpstr *,real *,unsigned char *,int *);
|
||||||
|
|
||||||
|
extern void init_layer3(int);
|
||||||
|
extern void init_layer2(void);
|
||||||
|
extern void make_decode_tables(long scale);
|
||||||
|
extern void dct64(real *,real *,real *);
|
||||||
|
|
||||||
|
extern unsigned char *conv16to8;
|
||||||
|
extern real muls[27][64];
|
||||||
|
extern real decwin[512+32];
|
||||||
|
extern real *pnts[5];
|
69
reactos/dll/win32/winemp3.acm/mpglib.h
Normal file
69
reactos/dll/win32/winemp3.acm/mpglib.h
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
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,const unsigned char *inmemory,int inmemsize,
|
||||||
|
unsigned char *outmemory,int outmemsize,int *done);
|
||||||
|
void ClearMP3Buffer(struct mpstr *mp);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
95
reactos/dll/win32/winemp3.acm/tabinit.c
Normal file
95
reactos/dll/win32/winemp3.acm/tabinit.c
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Michael Hipp and other authors of the mpglib project.
|
||||||
|
*
|
||||||
|
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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 const 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;
|
||||||
|
}
|
||||||
|
}
|
20
reactos/dll/win32/winemp3.acm/winemp3.acm.rbuild
Normal file
20
reactos/dll/win32/winemp3.acm/winemp3.acm.rbuild
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<module name="winemp3.acm" type="win32dll" installbase="system32" installname="winemp3.acm" allowwarnings="true" entrypoint="0">
|
||||||
|
<importlibrary definition="winemp3.acm.spec" />
|
||||||
|
<include base="winemp3.acm">.</include>
|
||||||
|
<include base="ReactOS">include/reactos/wine</include>
|
||||||
|
<define name="__WINESRC__" />
|
||||||
|
<file>common.c</file>
|
||||||
|
<file>dct64_i386.c</file>
|
||||||
|
<file>decode_i386.c</file>
|
||||||
|
<file>interface.c</file>
|
||||||
|
<file>layer1.c</file>
|
||||||
|
<file>layer2.c</file>
|
||||||
|
<file>layer3.c</file>
|
||||||
|
<file>mpegl3.c</file>
|
||||||
|
<file>tabinit.c</file>
|
||||||
|
<library>wine</library>
|
||||||
|
<library>winmm</library>
|
||||||
|
<library>user32</library>
|
||||||
|
<library>kernel32</library>
|
||||||
|
<library>ntdll</library>
|
||||||
|
</module>
|
1
reactos/dll/win32/winemp3.acm/winemp3.acm.spec
Normal file
1
reactos/dll/win32/winemp3.acm/winemp3.acm.spec
Normal file
|
@ -0,0 +1 @@
|
||||||
|
@ stdcall -private DriverProc(long long long long long) MPEG3_DriverProc
|
|
@ -154,6 +154,7 @@ reactos/dll/win32/urlmon # Autosync
|
||||||
reactos/dll/win32/usp10 # Autosync
|
reactos/dll/win32/usp10 # Autosync
|
||||||
reactos/dll/win32/uxtheme # Autosync
|
reactos/dll/win32/uxtheme # Autosync
|
||||||
reactos/dll/win32/version # Autosync
|
reactos/dll/win32/version # Autosync
|
||||||
|
reactos/dll/win32/winemp3.acm # Autosync
|
||||||
reactos/dll/win32/wininet # Autosync
|
reactos/dll/win32/wininet # Autosync
|
||||||
reactos/dll/win32/winhttp # Autosync
|
reactos/dll/win32/winhttp # Autosync
|
||||||
reactos/dll/win32/winmm # Forked at Wine-20050628
|
reactos/dll/win32/winmm # Forked at Wine-20050628
|
||||||
|
|
Loading…
Reference in a new issue