diff --git a/Src/Model3/DSB.cpp b/Src/Model3/DSB.cpp
index 5aba1ec..74eb582 100644
--- a/Src/Model3/DSB.cpp
+++ b/Src/Model3/DSB.cpp
@@ -39,7 +39,7 @@
*/
#include "Supermodel.h"
-
+#include "Sound/MPEG/MpegAudio.h"
/******************************************************************************
Resampler
@@ -230,30 +230,32 @@ void CDSB1::IOWrite8(UINT32 addr, UINT8 data)
if (data == 0) // stop
{
- MPEG_StopPlaying();
+ MpegDec::Stop();
return;
}
if (data == 1) // play without loop
{
//printf("====> Playing %06X (mpegEnd=%06X)\n", mpegStart, mpegEnd);
- MPEG_SetLoop(NULL, 0);
- usingLoopStart = 0; // save the settings of the MPEG currently playing
- usingLoopEnd = 0;
- usingMPEGStart = mpegStart;
- usingMPEGEnd = mpegEnd;
- MPEG_PlayMemory((const char *) &mpegROM[mpegStart], mpegEnd-mpegStart);
+
+ usingLoopStart = 0; // save the settings of the MPEG currently playing
+ usingLoopEnd = 0;
+ usingMPEGStart = mpegStart;
+ usingMPEGEnd = mpegEnd;
+
+ MpegDec::SetMemory(&mpegROM[mpegStart], mpegEnd - mpegStart, false);
return;
}
if (data == 2) // play with loop (NOTE: I don't think this actually loops b/c MPEG_PlayMemory() clears lstart)
{
//printf("====> Playing w/ loop %06X (mpegEnd=%06X, loopStart=%06X, loopEnd=%06X)\n", mpegStart, mpegEnd, loopStart, loopEnd);
- usingLoopStart = 0; // MPEG_PlayMemory() clears these settings and Z80 will set them up later
- usingLoopEnd = 0;
- usingMPEGStart = mpegStart;
- usingMPEGEnd = mpegEnd;
- MPEG_PlayMemory((const char *) &mpegROM[mpegStart], mpegEnd-mpegStart);
+ usingLoopStart = 0; // MPEG_PlayMemory() clears these settings and Z80 will set them up later
+ usingLoopEnd = 0;
+ usingMPEGStart = mpegStart;
+ usingMPEGEnd = mpegEnd;
+
+ MpegDec::SetMemory(&mpegROM[mpegStart], mpegEnd - mpegStart, false); // assume not looped for now
return;
}
break;
@@ -284,15 +286,15 @@ void CDSB1::IOWrite8(UINT32 addr, UINT8 data)
// SWA: if loop end is zero, it means "keep previous end marker"
if (loopEnd == 0)
{
- usingLoopStart = loopStart;
- usingLoopEnd = mpegEnd-loopStart;
- MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd);
+ usingLoopStart = loopStart;
+ usingLoopEnd = mpegEnd-loopStart;
+ MpegDec::UpdateMemory(&mpegROM[usingLoopStart], usingLoopEnd, true);
}
else
{
- usingLoopStart = loopStart;
- usingLoopEnd = loopEnd-loopStart;
- MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd);
+ usingLoopStart = loopStart;
+ usingLoopEnd = loopEnd-loopStart;
+ MpegDec::UpdateMemory(&mpegROM[usingLoopStart], usingLoopEnd, true);
}
}
@@ -319,11 +321,11 @@ void CDSB1::IOWrite8(UINT32 addr, UINT8 data)
}
else
{
- loopEnd = endLatch;
+ loopEnd = endLatch;
+ usingLoopStart = loopStart;
+ usingLoopEnd = loopEnd-loopStart;
+ MpegDec::UpdateMemory(&mpegROM[usingLoopStart], usingLoopEnd, true);
//printf("loopEnd = %08X\n", loopEnd);
- usingLoopStart = loopStart;
- usingLoopEnd = loopEnd-loopStart;
- MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd);
}
break;
@@ -347,22 +349,22 @@ void CDSB1::IOWrite8(UINT32 addr, UINT8 data)
UINT8 CDSB1::IORead8(UINT32 addr)
{
- int progress, end;
+ int progress;
switch ((addr&0xFF))
{
case 0xE2: // MPEG position, high byte
- MPEG_GetPlayPosition(&progress, &end);
+ progress = MpegDec::GetPosition();
progress += mpegStart; // byte address currently playing
return (progress>>16)&0xFF;
case 0xE3: // MPEG position, middle byte
- MPEG_GetPlayPosition(&progress, &end);
+ progress = MpegDec::GetPosition();
progress += mpegStart;
return (progress>>8)&0xFF;
case 0xE4: // MPEG position, low byte
- MPEG_GetPlayPosition(&progress, &end);
+ progress = MpegDec::GetPosition();
progress += mpegStart;
return progress&0xFF;
@@ -452,14 +454,13 @@ void CDSB1::RunFrame(INT16 *audioL, INT16 *audioR)
v = (UINT8) ((float) 255.0f * (float) volume /127.0f);
// Decode MPEG for this frame
- INT16 *mpegFill[2] = { &mpegL[retainedSamples], &mpegR[retainedSamples] };
- MPEG_Decode(mpegFill, 32000/60-retainedSamples+2);
+ MpegDec::DecodeAudio(&mpegL[retainedSamples], &mpegR[retainedSamples], 32000 / 60 - retainedSamples + 2);
retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, mpegL, mpegR, v, v, 44100/60, 32000/60+2, 44100, 32000);
}
void CDSB1::Reset(void)
{
- MPEG_StopPlaying();
+ MpegDec::Stop();
Resampler.Reset();
retainedSamples = 0;
@@ -478,17 +479,16 @@ void CDSB1::Reset(void)
void CDSB1::SaveState(CBlockFile *StateFile)
{
- int i, j;
UINT32 playOffset, endOffset;
UINT8 isPlaying;
StateFile->NewBlock("DSB1", __FILE__);
// MPEG playback state
- isPlaying = (UINT8) MPEG_IsPlaying();
- MPEG_GetPlayPosition(&i, &j);
- playOffset = (UINT32) i; // in case sizeof(int) != sizeof(INT32)
- endOffset = (UINT32) j;
+ isPlaying = (UINT8)MpegDec::IsLoaded();
+ playOffset = (UINT32)MpegDec::GetPosition();
+ endOffset = 0;
+
StateFile->Write(&isPlaying, sizeof(isPlaying));
StateFile->Write(&playOffset, sizeof(playOffset));
StateFile->Write(&endOffset, sizeof(endOffset));
@@ -553,13 +553,17 @@ void CDSB1::LoadState(CBlockFile *StateFile)
// Restart MPEG audio at the appropriate position
if (isPlaying)
{
- MPEG_PlayMemory((const char *) &mpegROM[usingMPEGStart], usingMPEGEnd-usingMPEGStart);
- if (usingLoopEnd != 0) // only if looping was actually enabled
- MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd);
- MPEG_SetPlayPosition(playOffset, endOffset);
+ MpegDec::SetMemory(&mpegROM[usingMPEGStart], usingMPEGEnd - usingMPEGStart, false);
+
+ if (usingLoopEnd != 0) { // only if looping was actually enabled
+ MpegDec::UpdateMemory(&mpegROM[usingLoopStart], usingLoopEnd, true);
+ }
+
+ MpegDec::SetPosition(playOffset);
+ }
+ else {
+ MpegDec::Stop();
}
- else
- MPEG_StopPlaying();
}
// Offsets of memory regions within DSB1's pool
@@ -590,9 +594,6 @@ bool CDSB1::Init(const UINT8 *progROMPtr, const UINT8 *mpegROMPtr)
// Initialize Z80 CPU
Z80.Init(this, Z80IRQCallback);
- // MPEG decoder
- if (OKAY != MPEG_Init())
- return ErrorLog("Insufficient memory to initialize MPEG decoder.");
retainedSamples = 0;
return OKAY;
@@ -607,31 +608,36 @@ CDSB1::CDSB1(const Util::Config::Node &config)
: m_config(config),
Resampler(config)
{
- progROM = NULL;
- mpegROM = NULL;
- memoryPool = NULL;
- ram = NULL;
- mpegL = NULL;
- mpegR = NULL;
+ progROM = NULL;
+ mpegROM = NULL;
+ memoryPool = NULL;
+ ram = NULL;
+ mpegL = NULL;
+ mpegR = NULL;
+
+ // must init these otherwise we end up trying to read illegal addresses
+ mpegStart = 0;
+ mpegEnd = 0;
+ mpegState = 0;
+ loopStart = 0;
+ loopEnd = 0;
DebugLog("Built DSB1 Board\n");
}
CDSB1::~CDSB1(void)
{
- MPEG_Shutdown();
-
if (memoryPool != NULL)
{
delete [] memoryPool;
memoryPool = NULL;
}
- progROM = NULL;
- mpegROM = NULL;
- ram = NULL;
- mpegL = NULL;
- mpegR = NULL;
+ progROM = NULL;
+ mpegROM = NULL;
+ ram = NULL;
+ mpegL = NULL;
+ mpegR = NULL;
DebugLog("Destroyed DSB1 Board\n");
}
@@ -703,19 +709,20 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte)
else if (byte == 0x74 || byte == 0x75) // "start play"
{
- usingLoopStart = 0;
- usingLoopEnd = 0;
- usingMPEGStart = mpegStart;
- usingMPEGEnd = mpegEnd;
- MPEG_PlayMemory((const char *) &mpegROM[mpegStart], mpegEnd-mpegStart);
- //printf("playing %X\n", mpegStart);
- mpegState = ST_IDLE;
- playing = 1;
+ usingLoopStart = 0;
+ usingLoopEnd = 0;
+ usingMPEGStart = mpegStart;
+ usingMPEGEnd = mpegEnd;
+ playing = 1;
+
+ MpegDec::SetMemory(&mpegROM[mpegStart], mpegEnd - mpegStart, false);
+
+ mpegState = ST_IDLE;
}
else if (byte == 0x84 || byte == 0x85)
{
- MPEG_StopPlaying();
+ MpegDec::Stop();
playing = 0;
}
@@ -752,13 +759,11 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte)
if (playing)
{
- //printf("Setting loop point to %x\n", mpegStart);
- usingLoopStart = mpegStart;
- usingLoopEnd = mpegEnd-mpegStart;
- MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd);
+ usingLoopStart = mpegStart;
+ usingLoopEnd = mpegEnd - mpegStart;
+ MpegDec::UpdateMemory(&mpegROM[usingLoopStart], usingLoopEnd, true);
}
- //printf("mpegStart=%x\n", mpegStart);
break;
case ST_GOT24:
mpegEnd &= 0x00FFFF;
@@ -773,21 +778,13 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte)
case ST_24_1:
mpegEnd &= 0xFFFF00;
mpegEnd |= (byte);
- //printf("mpegEnd=%x\n", mpegEnd);
- // default to full stereo
- //mixer_set_stereo_volume(0, 255, 255);
- //mixer_set_stereo_pan(0, MIXER_PAN_RIGHT, MIXER_PAN_LEFT);
stereo = StereoMode::Stereo;
mpegState = ST_IDLE;
break;
case ST_GOTA0:
- // ch 0 mono
- //mixer_set_stereo_volume(0, 0, 255);
- //printf("ch 0 mono\n");
- //mixer_set_stereo_pan(0, MIXER_PAN_CENTER, MIXER_PAN_CENTER);
- stereo = (byte != 0x00) ? StereoMode::MonoRight : StereoMode::Stereo;
+ stereo = (byte != 0x00) ? StereoMode::MonoLeft : StereoMode::Stereo;
mpegState = ST_IDLE;
break;
@@ -795,31 +792,26 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte)
mpegState = ST_IDLE;
if (byte == 0x75)
{
- usingLoopStart = 0;
- usingLoopEnd = 0;
- usingMPEGStart = mpegStart;
- usingMPEGEnd = mpegEnd;
- MPEG_PlayMemory((const char *) &mpegROM[mpegStart], mpegEnd-mpegStart);
- //printf("playing %X (from st_gota4)\n", mpegStart);
- playing = 1;
+ usingLoopStart = 0;
+ usingLoopEnd = 0;
+ usingMPEGStart = mpegStart;
+ usingMPEGEnd = mpegEnd;
+ playing = 1;
+ MpegDec::SetMemory(&mpegROM[mpegStart], mpegEnd - mpegStart, false);
}
break;
case ST_GOTA5:
mpegState = ST_IDLE;
break;
case ST_GOTB1:
- // ch 1 mono
- //printf("ch 1 mono\n");
- //mixer_set_stereo_volume(0, 255, 0);
- //mixer_set_stereo_pan(0, MIXER_PAN_CENTER, MIXER_PAN_CENTER);
- stereo = (byte != 0x00) ? StereoMode::MonoLeft : StereoMode::Stereo;
+ stereo = (byte != 0x00) ? StereoMode::MonoRight : StereoMode::Stereo;
mpegState = ST_IDLE;
break;
case ST_GOTB4:
mpegState = ST_IDLE;
if (byte == 0x96)
{
- MPEG_StopPlaying();
+ MpegDec::Stop();
playing = 0;
}
break;
@@ -1033,12 +1025,12 @@ void CDSB2::RunFrame(INT16 *audioL, INT16 *audioR)
M68KGetContext(&M68K);
// Decode MPEG for this frame
- INT16 *mpegFill[2] = { &mpegL[retainedSamples], &mpegR[retainedSamples] };
- MPEG_Decode(mpegFill, 32000/60-retainedSamples+2);
+ MpegDec::DecodeAudio(&mpegL[retainedSamples], &mpegR[retainedSamples], 32000 / 60 - retainedSamples + 2);
INT16 *leftChannelSource = nullptr;
INT16 *rightChannelSource = nullptr;
UINT8 volL=0, volR=0;
+
switch (stereo)
{
default:
@@ -1051,22 +1043,23 @@ void CDSB2::RunFrame(INT16 *audioL, INT16 *audioR)
case StereoMode::MonoLeft:
leftChannelSource = mpegL;
rightChannelSource = mpegL;
- volL = volume[1];
- volR = volume[1];
+ volL = volume[0];
+ volR = volume[0];
break;
case StereoMode::MonoRight:
leftChannelSource = mpegR;
rightChannelSource = mpegR;
- volL = volume[0];
- volR = volume[0];
+ volL = volume[1];
+ volR = volume[1];
break;
}
- retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, leftChannelSource, rightChannelSource, volL, volR, 44100/60, 32000/60+2, 44100, 32000);
+
+ retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, leftChannelSource, rightChannelSource, volL, volR, 44100/60, 32000/60+2, 44100, 32000);
}
void CDSB2::Reset(void)
{
- MPEG_StopPlaying();
+ MpegDec::Stop();
Resampler.Reset();
retainedSamples = 0;
@@ -1092,17 +1085,16 @@ void CDSB2::Reset(void)
void CDSB2::SaveState(CBlockFile *StateFile)
{
- int i, j;
UINT32 playOffset, endOffset;
UINT8 isPlaying;
StateFile->NewBlock("DSB2", __FILE__);
// MPEG playback state
- isPlaying = (UINT8) MPEG_IsPlaying();
- MPEG_GetPlayPosition(&i, &j);
- playOffset = (UINT32) i; // in case sizeof(int) != sizeof(INT32)
- endOffset = (UINT32) j;
+ isPlaying = (UINT8)MpegDec::IsLoaded();
+ playOffset = (UINT32)MpegDec::GetPosition();
+ endOffset = 0;
+
StateFile->Write(&isPlaying, sizeof(isPlaying));
StateFile->Write(&playOffset, sizeof(playOffset));
StateFile->Write(&endOffset, sizeof(endOffset));
@@ -1173,13 +1165,17 @@ void CDSB2::LoadState(CBlockFile *StateFile)
// Restart MPEG audio at the appropriate position
if (isPlaying)
{
- MPEG_PlayMemory((const char *) &mpegROM[usingMPEGStart], usingMPEGEnd-usingMPEGStart);
- if (usingLoopEnd != 0) // only if looping was actually enabled
- MPEG_SetLoop((const char *) &mpegROM[usingLoopStart], usingLoopEnd);
- MPEG_SetPlayPosition(playOffset, endOffset);
+ MpegDec::SetMemory(&mpegROM[usingMPEGStart], usingMPEGEnd - usingMPEGStart, false);
+
+ if (usingLoopEnd != 0) { // only if looping was actually enabled
+ MpegDec::UpdateMemory(&mpegROM[usingLoopStart], usingLoopEnd, true);
+ }
+
+ MpegDec::SetPosition(playOffset);
+ }
+ else {
+ MpegDec::Stop();
}
- else
- MPEG_StopPlaying();
//DEBUG
//printf("DSB2 PC=%06X\n", M68KGetPC());
@@ -1197,7 +1193,7 @@ void CDSB2::LoadState(CBlockFile *StateFile)
bool CDSB2::Init(const UINT8 *progROMPtr, const UINT8 *mpegROMPtr)
{
- float memSizeMB = (float)DSB2_MEMORY_POOL_SIZE/(float)0x100000;
+ float memSizeMB = (float)DSB2_MEMORY_POOL_SIZE/(float)0x100000;
// Receive ROM
progROM = progROMPtr;
@@ -1221,10 +1217,6 @@ bool CDSB2::Init(const UINT8 *progROMPtr, const UINT8 *mpegROMPtr)
M68KSetIRQCallback(NULL); // use default behavior (autovector, clear interrupt)
M68KGetContext(&M68K);
-
- // MPEG decoder
- if (OKAY != MPEG_Init())
- return ErrorLog("Insufficient memory to initialize MPEG decoder.");
retainedSamples = 0;
return OKAY;
@@ -1239,31 +1231,35 @@ CDSB2::CDSB2(const Util::Config::Node &config)
: m_config(config),
Resampler(config)
{
- progROM = NULL;
- mpegROM = NULL;
- memoryPool = NULL;
- ram = NULL;
- mpegL = NULL;
- mpegR = NULL;
+ progROM = NULL;
+ mpegROM = NULL;
+ memoryPool = NULL;
+ ram = NULL;
+ mpegL = NULL;
+ mpegR = NULL;
+
+ cmdLatch = 0;
+ mpegState = 0;
+ mpegStart = 0;
+ mpegEnd = 0;
+ playing = 0;
DebugLog("Built DSB2 Board\n");
}
CDSB2::~CDSB2(void)
{
- MPEG_Shutdown();
-
if (memoryPool != NULL)
{
delete [] memoryPool;
memoryPool = NULL;
}
- progROM = NULL;
- mpegROM = NULL;
- ram = NULL;
- mpegL = NULL;
- mpegR = NULL;
+ progROM = NULL;
+ mpegROM = NULL;
+ ram = NULL;
+ mpegL = NULL;
+ mpegR = NULL;
DebugLog("Destroyed DSB2 Board\n");
}
\ No newline at end of file
diff --git a/Src/Model3/DSB.h b/Src/Model3/DSB.h
index 2cb948d..10f5f8e 100644
--- a/Src/Model3/DSB.h
+++ b/Src/Model3/DSB.h
@@ -233,7 +233,7 @@ private:
UINT8 status;
UINT8 cmdLatch;
UINT8 volume; // 0x00-0x7F
- UINT8 stereo;
+ UINT8 stereo;
// Z80 CPU
CZ80 Z80;
@@ -284,12 +284,12 @@ private:
INT16 *mpegL, *mpegR;
// Stereo mode (do not change values because they are used in save states!)
- enum StereoMode: uint8_t
- {
- Stereo = 0, // both channels
- MonoLeft = 1, // mono, using left stream as source data
- MonoRight = 2 // mono, using right stream as source data
- };
+ enum class StereoMode: uint8_t
+ {
+ Stereo = 0, // both channels
+ MonoLeft = 1, // mono, using left stream as source data
+ MonoRight = 2 // mono, using right stream as source data
+ };
// DSB memory
const UINT8 *progROM; // 68K program ROM (passed in from parent object)
diff --git a/Src/Pkgs/minimp3.h b/Src/Pkgs/minimp3.h
new file mode 100644
index 0000000..a878b12
--- /dev/null
+++ b/Src/Pkgs/minimp3.h
@@ -0,0 +1,1807 @@
+#ifndef MINIMP3_H
+#define MINIMP3_H
+/*
+ https://github.com/lieff/minimp3
+ To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide.
+ This software is distributed without any warranty.
+ See .
+*/
+#include
+
+#define MINIMP3_MAX_SAMPLES_PER_FRAME (1152*2)
+
+typedef struct
+{
+ int frame_bytes, channels, hz, layer, bitrate_kbps;
+} mp3dec_frame_info_t;
+
+typedef struct
+{
+ float mdct_overlap[2][9*32], qmf_state[15*2*32];
+ int reserv, free_format_bytes;
+ unsigned char header[4], reserv_buf[511];
+} mp3dec_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+void mp3dec_init(mp3dec_t *dec);
+#ifndef MINIMP3_FLOAT_OUTPUT
+typedef int16_t mp3d_sample_t;
+#else /* MINIMP3_FLOAT_OUTPUT */
+typedef float mp3d_sample_t;
+void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples);
+#endif /* MINIMP3_FLOAT_OUTPUT */
+int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* MINIMP3_H */
+#if defined(MINIMP3_IMPLEMENTATION) && !defined(_MINIMP3_IMPLEMENTATION_GUARD)
+#define _MINIMP3_IMPLEMENTATION_GUARD
+
+#include
+#include
+
+#define MAX_FREE_FORMAT_FRAME_SIZE 2304 /* more than ISO spec's */
+#ifndef MAX_FRAME_SYNC_MATCHES
+#define MAX_FRAME_SYNC_MATCHES 10
+#endif /* MAX_FRAME_SYNC_MATCHES */
+
+#define MAX_L3_FRAME_PAYLOAD_BYTES MAX_FREE_FORMAT_FRAME_SIZE /* MUST be >= 320000/8/32000*1152 = 1440 */
+
+#define MAX_BITRESERVOIR_BYTES 511
+#define SHORT_BLOCK_TYPE 2
+#define STOP_BLOCK_TYPE 3
+#define MODE_MONO 3
+#define MODE_JOINT_STEREO 1
+#define HDR_SIZE 4
+#define HDR_IS_MONO(h) (((h[3]) & 0xC0) == 0xC0)
+#define HDR_IS_MS_STEREO(h) (((h[3]) & 0xE0) == 0x60)
+#define HDR_IS_FREE_FORMAT(h) (((h[2]) & 0xF0) == 0)
+#define HDR_IS_CRC(h) (!((h[1]) & 1))
+#define HDR_TEST_PADDING(h) ((h[2]) & 0x2)
+#define HDR_TEST_MPEG1(h) ((h[1]) & 0x8)
+#define HDR_TEST_NOT_MPEG25(h) ((h[1]) & 0x10)
+#define HDR_TEST_I_STEREO(h) ((h[3]) & 0x10)
+#define HDR_TEST_MS_STEREO(h) ((h[3]) & 0x20)
+#define HDR_GET_STEREO_MODE(h) (((h[3]) >> 6) & 3)
+#define HDR_GET_STEREO_MODE_EXT(h) (((h[3]) >> 4) & 3)
+#define HDR_GET_LAYER(h) (((h[1]) >> 1) & 3)
+#define HDR_GET_BITRATE(h) ((h[2]) >> 4)
+#define HDR_GET_SAMPLE_RATE(h) (((h[2]) >> 2) & 3)
+#define HDR_GET_MY_SAMPLE_RATE(h) (HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)
+#define HDR_IS_FRAME_576(h) ((h[1] & 14) == 2)
+#define HDR_IS_LAYER_1(h) ((h[1] & 6) == 6)
+
+#define BITS_DEQUANTIZER_OUT -1
+#define MAX_SCF (255 + BITS_DEQUANTIZER_OUT*4 - 210)
+#define MAX_SCFI ((MAX_SCF + 3) & ~3)
+
+#define MINIMP3_MIN(a, b) ((a) > (b) ? (b) : (a))
+#define MINIMP3_MAX(a, b) ((a) < (b) ? (b) : (a))
+
+#if !defined(MINIMP3_NO_SIMD)
+
+#if !defined(MINIMP3_ONLY_SIMD) && (defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__))
+/* x64 always have SSE2, arm64 always have neon, no need for generic code */
+#define MINIMP3_ONLY_SIMD
+#endif /* SIMD checks... */
+
+#if (defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))) || ((defined(__i386__) || defined(__x86_64__)) && defined(__SSE2__))
+#if defined(_MSC_VER)
+#include
+#endif /* defined(_MSC_VER) */
+#include
+#define HAVE_SSE 1
+#define HAVE_SIMD 1
+#define VSTORE _mm_storeu_ps
+#define VLD _mm_loadu_ps
+#define VSET _mm_set1_ps
+#define VADD _mm_add_ps
+#define VSUB _mm_sub_ps
+#define VMUL _mm_mul_ps
+#define VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))
+#define VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))
+#define VMUL_S(x, s) _mm_mul_ps(x, _mm_set1_ps(s))
+#define VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))
+typedef __m128 f4;
+#if defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD)
+#define minimp3_cpuid __cpuid
+#else /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */
+static __inline__ __attribute__((always_inline)) void minimp3_cpuid(int CPUInfo[], const int InfoType)
+{
+#if defined(__PIC__)
+ __asm__ __volatile__(
+#if defined(__x86_64__)
+ "push %%rbx\n"
+ "cpuid\n"
+ "xchgl %%ebx, %1\n"
+ "pop %%rbx\n"
+#else /* defined(__x86_64__) */
+ "xchgl %%ebx, %1\n"
+ "cpuid\n"
+ "xchgl %%ebx, %1\n"
+#endif /* defined(__x86_64__) */
+ : "=a" (CPUInfo[0]), "=r" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
+ : "a" (InfoType));
+#else /* defined(__PIC__) */
+ __asm__ __volatile__(
+ "cpuid"
+ : "=a" (CPUInfo[0]), "=b" (CPUInfo[1]), "=c" (CPUInfo[2]), "=d" (CPUInfo[3])
+ : "a" (InfoType));
+#endif /* defined(__PIC__)*/
+}
+#endif /* defined(_MSC_VER) || defined(MINIMP3_ONLY_SIMD) */
+static int have_simd()
+{
+#ifdef MINIMP3_ONLY_SIMD
+ return 1;
+#else /* MINIMP3_ONLY_SIMD */
+ static int g_have_simd;
+ int CPUInfo[4];
+#ifdef MINIMP3_TEST
+ static int g_counter;
+ if (g_counter++ > 100)
+ return 0;
+#endif /* MINIMP3_TEST */
+ if (g_have_simd)
+ goto end;
+ minimp3_cpuid(CPUInfo, 0);
+ g_have_simd = 1;
+ if (CPUInfo[0] > 0)
+ {
+ minimp3_cpuid(CPUInfo, 1);
+ g_have_simd = (CPUInfo[3] & (1 << 26)) + 1; /* SSE2 */
+ }
+end:
+ return g_have_simd - 1;
+#endif /* MINIMP3_ONLY_SIMD */
+}
+#elif defined(__ARM_NEON) || defined(__aarch64__)
+#include
+#define HAVE_SIMD 1
+#define VSTORE vst1q_f32
+#define VLD vld1q_f32
+#define VSET vmovq_n_f32
+#define VADD vaddq_f32
+#define VSUB vsubq_f32
+#define VMUL vmulq_f32
+#define VMAC(a, x, y) vmlaq_f32(a, x, y)
+#define VMSB(a, x, y) vmlsq_f32(a, x, y)
+#define VMUL_S(x, s) vmulq_f32(x, vmovq_n_f32(s))
+#define VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))
+typedef float32x4_t f4;
+static int have_simd()
+{ /* TODO: detect neon for !MINIMP3_ONLY_SIMD */
+ return 1;
+}
+#else /* SIMD checks... */
+#define HAVE_SIMD 0
+#ifdef MINIMP3_ONLY_SIMD
+#error MINIMP3_ONLY_SIMD used, but SSE/NEON not enabled
+#endif /* MINIMP3_ONLY_SIMD */
+#endif /* SIMD checks... */
+#else /* !defined(MINIMP3_NO_SIMD) */
+#define HAVE_SIMD 0
+#endif /* !defined(MINIMP3_NO_SIMD) */
+
+typedef struct
+{
+ const uint8_t *buf;
+ int pos, limit;
+} bs_t;
+
+typedef struct
+{
+ float scf[3*64];
+ uint8_t total_bands, stereo_bands, bitalloc[64], scfcod[64];
+} L12_scale_info;
+
+typedef struct
+{
+ uint8_t tab_offset, code_tab_width, band_count;
+} L12_subband_alloc_t;
+
+typedef struct
+{
+ const uint8_t *sfbtab;
+ uint16_t part_23_length, big_values, scalefac_compress;
+ uint8_t global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;
+ uint8_t table_select[3], region_count[3], subblock_gain[3];
+ uint8_t preflag, scalefac_scale, count1_table, scfsi;
+} L3_gr_info_t;
+
+typedef struct
+{
+ bs_t bs;
+ uint8_t maindata[MAX_BITRESERVOIR_BYTES + MAX_L3_FRAME_PAYLOAD_BYTES];
+ L3_gr_info_t gr_info[4];
+ float grbuf[2][576], scf[40], syn[18 + 15][2*32];
+ uint8_t ist_pos[2][39];
+} mp3dec_scratch_t;
+
+static void bs_init(bs_t *bs, const uint8_t *data, int bytes)
+{
+ bs->buf = data;
+ bs->pos = 0;
+ bs->limit = bytes*8;
+}
+
+static uint32_t get_bits(bs_t *bs, int n)
+{
+ uint32_t next, cache = 0, s = bs->pos & 7;
+ int shl = n + s;
+ const uint8_t *p = bs->buf + (bs->pos >> 3);
+ if ((bs->pos += n) > bs->limit)
+ return 0;
+ next = *p++ & (255 >> s);
+ while ((shl -= 8) > 0)
+ {
+ cache |= next << shl;
+ next = *p++;
+ }
+ return cache | (next >> -shl);
+}
+
+static int hdr_valid(const uint8_t *h)
+{
+ return h[0] == 0xff &&
+ ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&
+ (HDR_GET_LAYER(h) != 0) &&
+ (HDR_GET_BITRATE(h) != 15) &&
+ (HDR_GET_SAMPLE_RATE(h) != 3);
+}
+
+static int hdr_compare(const uint8_t *h1, const uint8_t *h2)
+{
+ return hdr_valid(h2) &&
+ ((h1[1] ^ h2[1]) & 0xFE) == 0 &&
+ ((h1[2] ^ h2[2]) & 0x0C) == 0 &&
+ !(HDR_IS_FREE_FORMAT(h1) ^ HDR_IS_FREE_FORMAT(h2));
+}
+
+static unsigned hdr_bitrate_kbps(const uint8_t *h)
+{
+ static const uint8_t halfrate[2][3][15] = {
+ { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } },
+ { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } },
+ };
+ return 2*halfrate[!!HDR_TEST_MPEG1(h)][HDR_GET_LAYER(h) - 1][HDR_GET_BITRATE(h)];
+}
+
+static unsigned hdr_sample_rate_hz(const uint8_t *h)
+{
+ static const unsigned g_hz[3] = { 44100, 48000, 32000 };
+ return g_hz[HDR_GET_SAMPLE_RATE(h)] >> (int)!HDR_TEST_MPEG1(h) >> (int)!HDR_TEST_NOT_MPEG25(h);
+}
+
+static unsigned hdr_frame_samples(const uint8_t *h)
+{
+ return HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)HDR_IS_FRAME_576(h));
+}
+
+static int hdr_frame_bytes(const uint8_t *h, int free_format_size)
+{
+ int frame_bytes = hdr_frame_samples(h)*hdr_bitrate_kbps(h)*125/hdr_sample_rate_hz(h);
+ if (HDR_IS_LAYER_1(h))
+ {
+ frame_bytes &= ~3; /* slot align */
+ }
+ return frame_bytes ? frame_bytes : free_format_size;
+}
+
+static int hdr_padding(const uint8_t *h)
+{
+ return HDR_TEST_PADDING(h) ? (HDR_IS_LAYER_1(h) ? 4 : 1) : 0;
+}
+
+#ifndef MINIMP3_ONLY_MP3
+static const L12_subband_alloc_t *L12_subband_alloc_table(const uint8_t *hdr, L12_scale_info *sci)
+{
+ const L12_subband_alloc_t *alloc;
+ int mode = HDR_GET_STEREO_MODE(hdr);
+ int nbands, stereo_bands = (mode == MODE_MONO) ? 0 : (mode == MODE_JOINT_STEREO) ? (HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;
+
+ if (HDR_IS_LAYER_1(hdr))
+ {
+ static const L12_subband_alloc_t g_alloc_L1[] = { { 76, 4, 32 } };
+ alloc = g_alloc_L1;
+ nbands = 32;
+ } else if (!HDR_TEST_MPEG1(hdr))
+ {
+ static const L12_subband_alloc_t g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };
+ alloc = g_alloc_L2M2;
+ nbands = 30;
+ } else
+ {
+ static const L12_subband_alloc_t g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };
+ int sample_rate_idx = HDR_GET_SAMPLE_RATE(hdr);
+ unsigned kbps = hdr_bitrate_kbps(hdr) >> (int)(mode != MODE_MONO);
+ if (!kbps) /* free-format */
+ {
+ kbps = 192;
+ }
+
+ alloc = g_alloc_L2M1;
+ nbands = 27;
+ if (kbps < 56)
+ {
+ static const L12_subband_alloc_t g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };
+ alloc = g_alloc_L2M1_lowrate;
+ nbands = sample_rate_idx == 2 ? 12 : 8;
+ } else if (kbps >= 96 && sample_rate_idx != 1)
+ {
+ nbands = 30;
+ }
+ }
+
+ sci->total_bands = (uint8_t)nbands;
+ sci->stereo_bands = (uint8_t)MINIMP3_MIN(stereo_bands, nbands);
+
+ return alloc;
+}
+
+static void L12_read_scalefactors(bs_t *bs, uint8_t *pba, uint8_t *scfcod, int bands, float *scf)
+{
+ static const float g_deq_L12[18*3] = {
+#define DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x
+ DQ(3),DQ(7),DQ(15),DQ(31),DQ(63),DQ(127),DQ(255),DQ(511),DQ(1023),DQ(2047),DQ(4095),DQ(8191),DQ(16383),DQ(32767),DQ(65535),DQ(3),DQ(5),DQ(9)
+ };
+ int i, m;
+ for (i = 0; i < bands; i++)
+ {
+ float s = 0;
+ int ba = *pba++;
+ int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;
+ for (m = 4; m; m >>= 1)
+ {
+ if (mask & m)
+ {
+ int b = get_bits(bs, 6);
+ s = g_deq_L12[ba*3 - 6 + b % 3]*(1 << 21 >> b/3);
+ }
+ *scf++ = s;
+ }
+ }
+}
+
+static void L12_read_scale_info(const uint8_t *hdr, bs_t *bs, L12_scale_info *sci)
+{
+ static const uint8_t g_bitalloc_code_tab[] = {
+ 0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,
+ 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,
+ 0,17,18, 3,19,4,5,16,
+ 0,17,18,16,
+ 0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,
+ 0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,
+ 0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16
+ };
+ const L12_subband_alloc_t *subband_alloc = L12_subband_alloc_table(hdr, sci);
+
+ int i, k = 0, ba_bits = 0;
+ const uint8_t *ba_code_tab = g_bitalloc_code_tab;
+
+ for (i = 0; i < sci->total_bands; i++)
+ {
+ uint8_t ba;
+ if (i == k)
+ {
+ k += subband_alloc->band_count;
+ ba_bits = subband_alloc->code_tab_width;
+ ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;
+ subband_alloc++;
+ }
+ ba = ba_code_tab[get_bits(bs, ba_bits)];
+ sci->bitalloc[2*i] = ba;
+ if (i < sci->stereo_bands)
+ {
+ ba = ba_code_tab[get_bits(bs, ba_bits)];
+ }
+ sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;
+ }
+
+ for (i = 0; i < 2*sci->total_bands; i++)
+ {
+ sci->scfcod[i] = sci->bitalloc[i] ? HDR_IS_LAYER_1(hdr) ? 2 : get_bits(bs, 2) : 6;
+ }
+
+ L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);
+
+ for (i = sci->stereo_bands; i < sci->total_bands; i++)
+ {
+ sci->bitalloc[2*i + 1] = 0;
+ }
+}
+
+static int L12_dequantize_granule(float *grbuf, bs_t *bs, L12_scale_info *sci, int group_size)
+{
+ int i, j, k, choff = 576;
+ for (j = 0; j < 4; j++)
+ {
+ float *dst = grbuf + group_size*j;
+ for (i = 0; i < 2*sci->total_bands; i++)
+ {
+ int ba = sci->bitalloc[i];
+ if (ba != 0)
+ {
+ if (ba < 17)
+ {
+ int half = (1 << (ba - 1)) - 1;
+ for (k = 0; k < group_size; k++)
+ {
+ dst[k] = (float)((int)get_bits(bs, ba) - half);
+ }
+ } else
+ {
+ unsigned mod = (2 << (ba - 17)) + 1; /* 3, 5, 9 */
+ unsigned code = get_bits(bs, mod + 2 - (mod >> 3)); /* 5, 7, 10 */
+ for (k = 0; k < group_size; k++, code /= mod)
+ {
+ dst[k] = (float)((int)(code % mod - mod/2));
+ }
+ }
+ }
+ dst += choff;
+ choff = 18 - choff;
+ }
+ }
+ return group_size*4;
+}
+
+static void L12_apply_scf_384(L12_scale_info *sci, const float *scf, float *dst)
+{
+ int i, k;
+ memcpy(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));
+ for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)
+ {
+ for (k = 0; k < 12; k++)
+ {
+ dst[k + 0] *= scf[0];
+ dst[k + 576] *= scf[3];
+ }
+ }
+}
+#endif /* MINIMP3_ONLY_MP3 */
+
+static int L3_read_side_info(bs_t *bs, L3_gr_info_t *gr, const uint8_t *hdr)
+{
+ static const uint8_t g_scf_long[8][23] = {
+ { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
+ { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },
+ { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
+ { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },
+ { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },
+ { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },
+ { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },
+ { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }
+ };
+ static const uint8_t g_scf_short[8][40] = {
+ { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
+ { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
+ { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
+ { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
+ { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
+ { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
+ };
+ static const uint8_t g_scf_mixed[8][40] = {
+ { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },
+ { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },
+ { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },
+ { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },
+ { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },
+ { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },
+ { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }
+ };
+
+ unsigned tables, scfsi = 0;
+ int main_data_begin, part_23_sum = 0;
+ int sr_idx = HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);
+ int gr_count = HDR_IS_MONO(hdr) ? 1 : 2;
+
+ if (HDR_TEST_MPEG1(hdr))
+ {
+ gr_count *= 2;
+ main_data_begin = get_bits(bs, 9);
+ scfsi = get_bits(bs, 7 + gr_count);
+ } else
+ {
+ main_data_begin = get_bits(bs, 8 + gr_count) >> gr_count;
+ }
+
+ do
+ {
+ if (HDR_IS_MONO(hdr))
+ {
+ scfsi <<= 4;
+ }
+ gr->part_23_length = (uint16_t)get_bits(bs, 12);
+ part_23_sum += gr->part_23_length;
+ gr->big_values = (uint16_t)get_bits(bs, 9);
+ if (gr->big_values > 288)
+ {
+ return -1;
+ }
+ gr->global_gain = (uint8_t)get_bits(bs, 8);
+ gr->scalefac_compress = (uint16_t)get_bits(bs, HDR_TEST_MPEG1(hdr) ? 4 : 9);
+ gr->sfbtab = g_scf_long[sr_idx];
+ gr->n_long_sfb = 22;
+ gr->n_short_sfb = 0;
+ if (get_bits(bs, 1))
+ {
+ gr->block_type = (uint8_t)get_bits(bs, 2);
+ if (!gr->block_type)
+ {
+ return -1;
+ }
+ gr->mixed_block_flag = (uint8_t)get_bits(bs, 1);
+ gr->region_count[0] = 7;
+ gr->region_count[1] = 255;
+ if (gr->block_type == SHORT_BLOCK_TYPE)
+ {
+ scfsi &= 0x0F0F;
+ if (!gr->mixed_block_flag)
+ {
+ gr->region_count[0] = 8;
+ gr->sfbtab = g_scf_short[sr_idx];
+ gr->n_long_sfb = 0;
+ gr->n_short_sfb = 39;
+ } else
+ {
+ gr->sfbtab = g_scf_mixed[sr_idx];
+ gr->n_long_sfb = HDR_TEST_MPEG1(hdr) ? 8 : 6;
+ gr->n_short_sfb = 30;
+ }
+ }
+ tables = get_bits(bs, 10);
+ tables <<= 5;
+ gr->subblock_gain[0] = (uint8_t)get_bits(bs, 3);
+ gr->subblock_gain[1] = (uint8_t)get_bits(bs, 3);
+ gr->subblock_gain[2] = (uint8_t)get_bits(bs, 3);
+ } else
+ {
+ gr->block_type = 0;
+ gr->mixed_block_flag = 0;
+ tables = get_bits(bs, 15);
+ gr->region_count[0] = (uint8_t)get_bits(bs, 4);
+ gr->region_count[1] = (uint8_t)get_bits(bs, 3);
+ gr->region_count[2] = 255;
+ }
+ gr->table_select[0] = (uint8_t)(tables >> 10);
+ gr->table_select[1] = (uint8_t)((tables >> 5) & 31);
+ gr->table_select[2] = (uint8_t)((tables) & 31);
+ gr->preflag = HDR_TEST_MPEG1(hdr) ? get_bits(bs, 1) : (gr->scalefac_compress >= 500);
+ gr->scalefac_scale = (uint8_t)get_bits(bs, 1);
+ gr->count1_table = (uint8_t)get_bits(bs, 1);
+ gr->scfsi = (uint8_t)((scfsi >> 12) & 15);
+ scfsi <<= 4;
+ gr++;
+ } while(--gr_count);
+
+ if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)
+ {
+ return -1;
+ }
+
+ return main_data_begin;
+}
+
+static void L3_read_scalefactors(uint8_t *scf, uint8_t *ist_pos, const uint8_t *scf_size, const uint8_t *scf_count, bs_t *bitbuf, int scfsi)
+{
+ int i, k;
+ for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)
+ {
+ int cnt = scf_count[i];
+ if (scfsi & 8)
+ {
+ memcpy(scf, ist_pos, cnt);
+ } else
+ {
+ int bits = scf_size[i];
+ if (!bits)
+ {
+ memset(scf, 0, cnt);
+ memset(ist_pos, 0, cnt);
+ } else
+ {
+ int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;
+ for (k = 0; k < cnt; k++)
+ {
+ int s = get_bits(bitbuf, bits);
+ ist_pos[k] = (s == max_scf ? -1 : s);
+ scf[k] = s;
+ }
+ }
+ }
+ ist_pos += cnt;
+ scf += cnt;
+ }
+ scf[0] = scf[1] = scf[2] = 0;
+}
+
+static float L3_ldexp_q2(float y, int exp_q2)
+{
+ static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };
+ int e;
+ do
+ {
+ e = MINIMP3_MIN(30*4, exp_q2);
+ y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));
+ } while ((exp_q2 -= e) > 0);
+ return y;
+}
+
+static void L3_decode_scalefactors(const uint8_t *hdr, uint8_t *ist_pos, bs_t *bs, const L3_gr_info_t *gr, float *scf, int ch)
+{
+ static const uint8_t g_scf_partitions[3][28] = {
+ { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 },
+ { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 },
+ { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 }
+ };
+ const uint8_t *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];
+ uint8_t scf_size[4], iscf[40];
+ int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;
+ float gain;
+
+ if (HDR_TEST_MPEG1(hdr))
+ {
+ static const uint8_t g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };
+ int part = g_scfc_decode[gr->scalefac_compress];
+ scf_size[1] = scf_size[0] = (uint8_t)(part >> 2);
+ scf_size[3] = scf_size[2] = (uint8_t)(part & 3);
+ } else
+ {
+ static const uint8_t g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };
+ int k, modprod, sfc, ist = HDR_TEST_I_STEREO(hdr) && ch;
+ sfc = gr->scalefac_compress >> ist;
+ for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)
+ {
+ for (modprod = 1, i = 3; i >= 0; i--)
+ {
+ scf_size[i] = (uint8_t)(sfc / modprod % g_mod[k + i]);
+ modprod *= g_mod[k + i];
+ }
+ }
+ scf_partition += k;
+ scfsi = -16;
+ }
+ L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);
+
+ if (gr->n_short_sfb)
+ {
+ int sh = 3 - scf_shift;
+ for (i = 0; i < gr->n_short_sfb; i += 3)
+ {
+ iscf[gr->n_long_sfb + i + 0] += gr->subblock_gain[0] << sh;
+ iscf[gr->n_long_sfb + i + 1] += gr->subblock_gain[1] << sh;
+ iscf[gr->n_long_sfb + i + 2] += gr->subblock_gain[2] << sh;
+ }
+ } else if (gr->preflag)
+ {
+ static const uint8_t g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };
+ for (i = 0; i < 10; i++)
+ {
+ iscf[11 + i] += g_preamp[i];
+ }
+ }
+
+ gain_exp = gr->global_gain + BITS_DEQUANTIZER_OUT*4 - 210 - (HDR_IS_MS_STEREO(hdr) ? 2 : 0);
+ gain = L3_ldexp_q2(1 << (MAX_SCFI/4), MAX_SCFI - gain_exp);
+ for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)
+ {
+ scf[i] = L3_ldexp_q2(gain, iscf[i] << scf_shift);
+ }
+}
+
+static const float g_pow43[129 + 16] = {
+ 0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,
+ 0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f
+};
+
+static float L3_pow_43(int x)
+{
+ float frac;
+ int sign, mult = 256;
+
+ if (x < 129)
+ {
+ return g_pow43[16 + x];
+ }
+
+ if (x < 1024)
+ {
+ mult = 16;
+ x <<= 3;
+ }
+
+ sign = 2*x & 64;
+ frac = (float)((x & 63) - sign) / ((x & ~63) + sign);
+ return g_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;
+}
+
+static void L3_huffman(float *dst, bs_t *bs, const L3_gr_info_t *gr_info, const float *scf, int layer3gr_limit)
+{
+ static const int16_t tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,
+ -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288,
+ -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288,
+ -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258,
+ -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259,
+ -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258,
+ -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258,
+ -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259,
+ -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258,
+ -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290,
+ -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259,
+ -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258,
+ -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259,
+ -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258,
+ -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 };
+ static const uint8_t tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205 };
+ static const uint8_t tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };
+ static const int16_t tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 };
+ static const uint8_t g_linbits[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 };
+
+#define PEEK_BITS(n) (bs_cache >> (32 - n))
+#define FLUSH_BITS(n) { bs_cache <<= (n); bs_sh += (n); }
+#define CHECK_BITS while (bs_sh >= 0) { bs_cache |= (uint32_t)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }
+#define BSPOS ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)
+
+ float one = 0.0f;
+ int ireg = 0, big_val_cnt = gr_info->big_values;
+ const uint8_t *sfb = gr_info->sfbtab;
+ const uint8_t *bs_next_ptr = bs->buf + bs->pos/8;
+ uint32_t bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7);
+ int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;
+ bs_next_ptr += 4;
+
+ while (big_val_cnt > 0)
+ {
+ int tab_num = gr_info->table_select[ireg];
+ int sfb_cnt = gr_info->region_count[ireg++];
+ const int16_t *codebook = tabs + tabindex[tab_num];
+ int linbits = g_linbits[tab_num];
+ do
+ {
+ np = *sfb++ / 2;
+ pairs_to_decode = MINIMP3_MIN(big_val_cnt, np);
+ one = *scf++;
+ do
+ {
+ int j, w = 5;
+ int leaf = codebook[PEEK_BITS(w)];
+ while (leaf < 0)
+ {
+ FLUSH_BITS(w);
+ w = leaf & 7;
+ leaf = codebook[PEEK_BITS(w) - (leaf >> 3)];
+ }
+ FLUSH_BITS(leaf >> 8);
+
+ for (j = 0; j < 2; j++, dst++, leaf >>= 4)
+ {
+ int lsb = leaf & 0x0F;
+ if (lsb == 15 && linbits)
+ {
+ lsb += PEEK_BITS(linbits);
+ FLUSH_BITS(linbits);
+ CHECK_BITS;
+ *dst = one*L3_pow_43(lsb)*((int32_t)bs_cache < 0 ? -1: 1);
+ } else
+ {
+ *dst = g_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;
+ }
+ FLUSH_BITS(lsb ? 1 : 0);
+ }
+ CHECK_BITS;
+ } while (--pairs_to_decode);
+ } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);
+ }
+
+ for (np = 1 - big_val_cnt;; dst += 4)
+ {
+ const uint8_t *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;
+ int leaf = codebook_count1[PEEK_BITS(4)];
+ if (!(leaf & 8))
+ {
+ leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];
+ }
+ FLUSH_BITS(leaf & 7);
+ if (BSPOS > layer3gr_limit)
+ {
+ break;
+ }
+#define RELOAD_SCALEFACTOR if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }
+#define DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((int32_t)bs_cache < 0) ? -one : one; FLUSH_BITS(1) }
+ RELOAD_SCALEFACTOR;
+ DEQ_COUNT1(0);
+ DEQ_COUNT1(1);
+ RELOAD_SCALEFACTOR;
+ DEQ_COUNT1(2);
+ DEQ_COUNT1(3);
+ CHECK_BITS;
+ }
+
+ bs->pos = layer3gr_limit;
+}
+
+static void L3_midside_stereo(float *left, int n)
+{
+ int i = 0;
+ float *right = left + 576;
+#if HAVE_SIMD
+ if (have_simd()) for (; i < n - 3; i += 4)
+ {
+ f4 vl = VLD(left + i);
+ f4 vr = VLD(right + i);
+ VSTORE(left + i, VADD(vl, vr));
+ VSTORE(right + i, VSUB(vl, vr));
+ }
+#endif /* HAVE_SIMD */
+ for (; i < n; i++)
+ {
+ float a = left[i];
+ float b = right[i];
+ left[i] = a + b;
+ right[i] = a - b;
+ }
+}
+
+static void L3_intensity_stereo_band(float *left, int n, float kl, float kr)
+{
+ int i;
+ for (i = 0; i < n; i++)
+ {
+ left[i + 576] = left[i]*kr;
+ left[i] = left[i]*kl;
+ }
+}
+
+static void L3_stereo_top_band(const float *right, const uint8_t *sfb, int nbands, int max_band[3])
+{
+ int i, k;
+
+ max_band[0] = max_band[1] = max_band[2] = -1;
+
+ for (i = 0; i < nbands; i++)
+ {
+ for (k = 0; k < sfb[i]; k += 2)
+ {
+ if (right[k] != 0 || right[k + 1] != 0)
+ {
+ max_band[i % 3] = i;
+ break;
+ }
+ }
+ right += sfb[i];
+ }
+}
+
+static void L3_stereo_process(float *left, const uint8_t *ist_pos, const uint8_t *sfb, const uint8_t *hdr, int max_band[3], int mpeg2_sh)
+{
+ static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 };
+ unsigned i, max_pos = HDR_TEST_MPEG1(hdr) ? 7 : 64;
+
+ for (i = 0; sfb[i]; i++)
+ {
+ unsigned ipos = ist_pos[i];
+ if ((int)i > max_band[i % 3] && ipos < max_pos)
+ {
+ float kl, kr, s = HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;
+ if (HDR_TEST_MPEG1(hdr))
+ {
+ kl = g_pan[2*ipos];
+ kr = g_pan[2*ipos + 1];
+ } else
+ {
+ kl = 1;
+ kr = L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);
+ if (ipos & 1)
+ {
+ kl = kr;
+ kr = 1;
+ }
+ }
+ L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);
+ } else if (HDR_TEST_MS_STEREO(hdr))
+ {
+ L3_midside_stereo(left, sfb[i]);
+ }
+ left += sfb[i];
+ }
+}
+
+static void L3_intensity_stereo(float *left, uint8_t *ist_pos, const L3_gr_info_t *gr, const uint8_t *hdr)
+{
+ int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;
+ int i, max_blocks = gr->n_short_sfb ? 3 : 1;
+
+ L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);
+ if (gr->n_long_sfb)
+ {
+ max_band[0] = max_band[1] = max_band[2] = MINIMP3_MAX(MINIMP3_MAX(max_band[0], max_band[1]), max_band[2]);
+ }
+ for (i = 0; i < max_blocks; i++)
+ {
+ int default_pos = HDR_TEST_MPEG1(hdr) ? 3 : 0;
+ int itop = n_sfb - max_blocks + i;
+ int prev = itop - max_blocks;
+ ist_pos[itop] = max_band[i] >= prev ? default_pos : ist_pos[prev];
+ }
+ L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);
+}
+
+static void L3_reorder(float *grbuf, float *scratch, const uint8_t *sfb)
+{
+ int i, len;
+ float *src = grbuf, *dst = scratch;
+
+ for (;0 != (len = *sfb); sfb += 3, src += 2*len)
+ {
+ for (i = 0; i < len; i++, src++)
+ {
+ *dst++ = src[0*len];
+ *dst++ = src[1*len];
+ *dst++ = src[2*len];
+ }
+ }
+ memcpy(grbuf, scratch, (dst - scratch)*sizeof(float));
+}
+
+static void L3_antialias(float *grbuf, int nbands)
+{
+ static const float g_aa[2][8] = {
+ {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},
+ {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}
+ };
+
+ for (; nbands > 0; nbands--, grbuf += 18)
+ {
+ int i = 0;
+#if HAVE_SIMD
+ if (have_simd()) for (; i < 8; i += 4)
+ {
+ f4 vu = VLD(grbuf + 18 + i);
+ f4 vd = VLD(grbuf + 14 - i);
+ f4 vc0 = VLD(g_aa[0] + i);
+ f4 vc1 = VLD(g_aa[1] + i);
+ vd = VREV(vd);
+ VSTORE(grbuf + 18 + i, VSUB(VMUL(vu, vc0), VMUL(vd, vc1)));
+ vd = VADD(VMUL(vu, vc1), VMUL(vd, vc0));
+ VSTORE(grbuf + 14 - i, VREV(vd));
+ }
+#endif /* HAVE_SIMD */
+#ifndef MINIMP3_ONLY_SIMD
+ for(; i < 8; i++)
+ {
+ float u = grbuf[18 + i];
+ float d = grbuf[17 - i];
+ grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];
+ grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];
+ }
+#endif /* MINIMP3_ONLY_SIMD */
+ }
+}
+
+static void L3_dct3_9(float *y)
+{
+ float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;
+
+ s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];
+ t0 = s0 + s6*0.5f;
+ s0 -= s6;
+ t4 = (s4 + s2)*0.93969262f;
+ t2 = (s8 + s2)*0.76604444f;
+ s6 = (s4 - s8)*0.17364818f;
+ s4 += s8 - s2;
+
+ s2 = s0 - s4*0.5f;
+ y[4] = s4 + s0;
+ s8 = t0 - t2 + s6;
+ s0 = t0 - t4 + t2;
+ s4 = t0 + t4 - s6;
+
+ s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];
+
+ s3 *= 0.86602540f;
+ t0 = (s5 + s1)*0.98480775f;
+ t4 = (s5 - s7)*0.34202014f;
+ t2 = (s1 + s7)*0.64278761f;
+ s1 = (s1 - s5 - s7)*0.86602540f;
+
+ s5 = t0 - s3 - t2;
+ s7 = t4 - s3 - t0;
+ s3 = t4 + s3 - t2;
+
+ y[0] = s4 - s7;
+ y[1] = s2 + s1;
+ y[2] = s0 - s3;
+ y[3] = s8 + s5;
+ y[5] = s8 - s5;
+ y[6] = s0 + s3;
+ y[7] = s2 - s1;
+ y[8] = s4 + s7;
+}
+
+static void L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)
+{
+ int i, j;
+ static const float g_twid9[18] = {
+ 0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f
+ };
+
+ for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)
+ {
+ float co[9], si[9];
+ co[0] = -grbuf[0];
+ si[0] = grbuf[17];
+ for (i = 0; i < 4; i++)
+ {
+ si[8 - 2*i] = grbuf[4*i + 1] - grbuf[4*i + 2];
+ co[1 + 2*i] = grbuf[4*i + 1] + grbuf[4*i + 2];
+ si[7 - 2*i] = grbuf[4*i + 4] - grbuf[4*i + 3];
+ co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);
+ }
+ L3_dct3_9(co);
+ L3_dct3_9(si);
+
+ si[1] = -si[1];
+ si[3] = -si[3];
+ si[5] = -si[5];
+ si[7] = -si[7];
+
+ i = 0;
+
+#if HAVE_SIMD
+ if (have_simd()) for (; i < 8; i += 4)
+ {
+ f4 vovl = VLD(overlap + i);
+ f4 vc = VLD(co + i);
+ f4 vs = VLD(si + i);
+ f4 vr0 = VLD(g_twid9 + i);
+ f4 vr1 = VLD(g_twid9 + 9 + i);
+ f4 vw0 = VLD(window + i);
+ f4 vw1 = VLD(window + 9 + i);
+ f4 vsum = VADD(VMUL(vc, vr1), VMUL(vs, vr0));
+ VSTORE(overlap + i, VSUB(VMUL(vc, vr0), VMUL(vs, vr1)));
+ VSTORE(grbuf + i, VSUB(VMUL(vovl, vw0), VMUL(vsum, vw1)));
+ vsum = VADD(VMUL(vovl, vw1), VMUL(vsum, vw0));
+ VSTORE(grbuf + 14 - i, VREV(vsum));
+ }
+#endif /* HAVE_SIMD */
+ for (; i < 9; i++)
+ {
+ float ovl = overlap[i];
+ float sum = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];
+ overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];
+ grbuf[i] = ovl*window[0 + i] - sum*window[9 + i];
+ grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];
+ }
+ }
+}
+
+static void L3_idct3(float x0, float x1, float x2, float *dst)
+{
+ float m1 = x1*0.86602540f;
+ float a1 = x0 - x2*0.5f;
+ dst[1] = x0 + x2;
+ dst[0] = a1 + m1;
+ dst[2] = a1 - m1;
+}
+
+static void L3_imdct12(float *x, float *dst, float *overlap)
+{
+ static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };
+ float co[3], si[3];
+ int i;
+
+ L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);
+ L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);
+ si[1] = -si[1];
+
+ for (i = 0; i < 3; i++)
+ {
+ float ovl = overlap[i];
+ float sum = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];
+ overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];
+ dst[i] = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];
+ dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];
+ }
+}
+
+static void L3_imdct_short(float *grbuf, float *overlap, int nbands)
+{
+ for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)
+ {
+ float tmp[18];
+ memcpy(tmp, grbuf, sizeof(tmp));
+ memcpy(grbuf, overlap, 6*sizeof(float));
+ L3_imdct12(tmp, grbuf + 6, overlap + 6);
+ L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);
+ L3_imdct12(tmp + 2, overlap, overlap + 6);
+ }
+}
+
+static void L3_change_sign(float *grbuf)
+{
+ int b, i;
+ for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)
+ for (i = 1; i < 18; i += 2)
+ grbuf[i] = -grbuf[i];
+}
+
+static void L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)
+{
+ static const float g_mdct_window[2][18] = {
+ { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f },
+ { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }
+ };
+ if (n_long_bands)
+ {
+ L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);
+ grbuf += 18*n_long_bands;
+ overlap += 9*n_long_bands;
+ }
+ if (block_type == SHORT_BLOCK_TYPE)
+ L3_imdct_short(grbuf, overlap, 32 - n_long_bands);
+ else
+ L3_imdct36(grbuf, overlap, g_mdct_window[block_type == STOP_BLOCK_TYPE], 32 - n_long_bands);
+}
+
+static void L3_save_reservoir(mp3dec_t *h, mp3dec_scratch_t *s)
+{
+ int pos = (s->bs.pos + 7)/8u;
+ int remains = s->bs.limit/8u - pos;
+ if (remains > MAX_BITRESERVOIR_BYTES)
+ {
+ pos += remains - MAX_BITRESERVOIR_BYTES;
+ remains = MAX_BITRESERVOIR_BYTES;
+ }
+ if (remains > 0)
+ {
+ memmove(h->reserv_buf, s->maindata + pos, remains);
+ }
+ h->reserv = remains;
+}
+
+static int L3_restore_reservoir(mp3dec_t *h, bs_t *bs, mp3dec_scratch_t *s, int main_data_begin)
+{
+ int frame_bytes = (bs->limit - bs->pos)/8;
+ int bytes_have = MINIMP3_MIN(h->reserv, main_data_begin);
+ memcpy(s->maindata, h->reserv_buf + MINIMP3_MAX(0, h->reserv - main_data_begin), MINIMP3_MIN(h->reserv, main_data_begin));
+ memcpy(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);
+ bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);
+ return h->reserv >= main_data_begin;
+}
+
+static void L3_decode(mp3dec_t *h, mp3dec_scratch_t *s, L3_gr_info_t *gr_info, int nch)
+{
+ int ch;
+
+ for (ch = 0; ch < nch; ch++)
+ {
+ int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;
+ L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);
+ L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);
+ }
+
+ if (HDR_TEST_I_STEREO(h->header))
+ {
+ L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);
+ } else if (HDR_IS_MS_STEREO(h->header))
+ {
+ L3_midside_stereo(s->grbuf[0], 576);
+ }
+
+ for (ch = 0; ch < nch; ch++, gr_info++)
+ {
+ int aa_bands = 31;
+ int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(HDR_GET_MY_SAMPLE_RATE(h->header) == 2);
+
+ if (gr_info->n_short_sfb)
+ {
+ aa_bands = n_long_bands - 1;
+ L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);
+ }
+
+ L3_antialias(s->grbuf[ch], aa_bands);
+ L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands);
+ L3_change_sign(s->grbuf[ch]);
+ }
+}
+
+static void mp3d_DCT_II(float *grbuf, int n)
+{
+ static const float g_sec[24] = {
+ 10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f
+ };
+ int i, k = 0;
+#if HAVE_SIMD
+ if (have_simd()) for (; k < n; k += 4)
+ {
+ f4 t[4][8], *x;
+ float *y = grbuf + k;
+
+ for (x = t[0], i = 0; i < 8; i++, x++)
+ {
+ f4 x0 = VLD(&y[i*18]);
+ f4 x1 = VLD(&y[(15 - i)*18]);
+ f4 x2 = VLD(&y[(16 + i)*18]);
+ f4 x3 = VLD(&y[(31 - i)*18]);
+ f4 t0 = VADD(x0, x3);
+ f4 t1 = VADD(x1, x2);
+ f4 t2 = VMUL_S(VSUB(x1, x2), g_sec[3*i + 0]);
+ f4 t3 = VMUL_S(VSUB(x0, x3), g_sec[3*i + 1]);
+ x[0] = VADD(t0, t1);
+ x[8] = VMUL_S(VSUB(t0, t1), g_sec[3*i + 2]);
+ x[16] = VADD(t3, t2);
+ x[24] = VMUL_S(VSUB(t3, t2), g_sec[3*i + 2]);
+ }
+ for (x = t[0], i = 0; i < 4; i++, x += 8)
+ {
+ f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;
+ xt = VSUB(x0, x7); x0 = VADD(x0, x7);
+ x7 = VSUB(x1, x6); x1 = VADD(x1, x6);
+ x6 = VSUB(x2, x5); x2 = VADD(x2, x5);
+ x5 = VSUB(x3, x4); x3 = VADD(x3, x4);
+ x4 = VSUB(x0, x3); x0 = VADD(x0, x3);
+ x3 = VSUB(x1, x2); x1 = VADD(x1, x2);
+ x[0] = VADD(x0, x1);
+ x[4] = VMUL_S(VSUB(x0, x1), 0.70710677f);
+ x5 = VADD(x5, x6);
+ x6 = VMUL_S(VADD(x6, x7), 0.70710677f);
+ x7 = VADD(x7, xt);
+ x3 = VMUL_S(VADD(x3, x4), 0.70710677f);
+ x5 = VSUB(x5, VMUL_S(x7, 0.198912367f)); /* rotate by PI/8 */
+ x7 = VADD(x7, VMUL_S(x5, 0.382683432f));
+ x5 = VSUB(x5, VMUL_S(x7, 0.198912367f));
+ x0 = VSUB(xt, x6); xt = VADD(xt, x6);
+ x[1] = VMUL_S(VADD(xt, x7), 0.50979561f);
+ x[2] = VMUL_S(VADD(x4, x3), 0.54119611f);
+ x[3] = VMUL_S(VSUB(x0, x5), 0.60134488f);
+ x[5] = VMUL_S(VADD(x0, x5), 0.89997619f);
+ x[6] = VMUL_S(VSUB(x4, x3), 1.30656302f);
+ x[7] = VMUL_S(VSUB(xt, x7), 2.56291556f);
+ }
+
+ if (k > n - 3)
+ {
+#if HAVE_SSE
+#define VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)
+#else /* HAVE_SSE */
+#define VSAVE2(i, v) vst1_f32((float32_t *)&y[i*18], vget_low_f32(v))
+#endif /* HAVE_SSE */
+ for (i = 0; i < 7; i++, y += 4*18)
+ {
+ f4 s = VADD(t[3][i], t[3][i + 1]);
+ VSAVE2(0, t[0][i]);
+ VSAVE2(1, VADD(t[2][i], s));
+ VSAVE2(2, VADD(t[1][i], t[1][i + 1]));
+ VSAVE2(3, VADD(t[2][1 + i], s));
+ }
+ VSAVE2(0, t[0][7]);
+ VSAVE2(1, VADD(t[2][7], t[3][7]));
+ VSAVE2(2, t[1][7]);
+ VSAVE2(3, t[3][7]);
+ } else
+ {
+#define VSAVE4(i, v) VSTORE(&y[i*18], v)
+ for (i = 0; i < 7; i++, y += 4*18)
+ {
+ f4 s = VADD(t[3][i], t[3][i + 1]);
+ VSAVE4(0, t[0][i]);
+ VSAVE4(1, VADD(t[2][i], s));
+ VSAVE4(2, VADD(t[1][i], t[1][i + 1]));
+ VSAVE4(3, VADD(t[2][1 + i], s));
+ }
+ VSAVE4(0, t[0][7]);
+ VSAVE4(1, VADD(t[2][7], t[3][7]));
+ VSAVE4(2, t[1][7]);
+ VSAVE4(3, t[3][7]);
+ }
+ } else
+#endif /* HAVE_SIMD */
+#ifdef MINIMP3_ONLY_SIMD
+ {}
+#else /* MINIMP3_ONLY_SIMD */
+ for (; k < n; k++)
+ {
+ float t[4][8], *x, *y = grbuf + k;
+
+ for (x = t[0], i = 0; i < 8; i++, x++)
+ {
+ float x0 = y[i*18];
+ float x1 = y[(15 - i)*18];
+ float x2 = y[(16 + i)*18];
+ float x3 = y[(31 - i)*18];
+ float t0 = x0 + x3;
+ float t1 = x1 + x2;
+ float t2 = (x1 - x2)*g_sec[3*i + 0];
+ float t3 = (x0 - x3)*g_sec[3*i + 1];
+ x[0] = t0 + t1;
+ x[8] = (t0 - t1)*g_sec[3*i + 2];
+ x[16] = t3 + t2;
+ x[24] = (t3 - t2)*g_sec[3*i + 2];
+ }
+ for (x = t[0], i = 0; i < 4; i++, x += 8)
+ {
+ float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;
+ xt = x0 - x7; x0 += x7;
+ x7 = x1 - x6; x1 += x6;
+ x6 = x2 - x5; x2 += x5;
+ x5 = x3 - x4; x3 += x4;
+ x4 = x0 - x3; x0 += x3;
+ x3 = x1 - x2; x1 += x2;
+ x[0] = x0 + x1;
+ x[4] = (x0 - x1)*0.70710677f;
+ x5 = x5 + x6;
+ x6 = (x6 + x7)*0.70710677f;
+ x7 = x7 + xt;
+ x3 = (x3 + x4)*0.70710677f;
+ x5 -= x7*0.198912367f; /* rotate by PI/8 */
+ x7 += x5*0.382683432f;
+ x5 -= x7*0.198912367f;
+ x0 = xt - x6; xt += x6;
+ x[1] = (xt + x7)*0.50979561f;
+ x[2] = (x4 + x3)*0.54119611f;
+ x[3] = (x0 - x5)*0.60134488f;
+ x[5] = (x0 + x5)*0.89997619f;
+ x[6] = (x4 - x3)*1.30656302f;
+ x[7] = (xt - x7)*2.56291556f;
+
+ }
+ for (i = 0; i < 7; i++, y += 4*18)
+ {
+ y[0*18] = t[0][i];
+ y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];
+ y[2*18] = t[1][i] + t[1][i + 1];
+ y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];
+ }
+ y[0*18] = t[0][7];
+ y[1*18] = t[2][7] + t[3][7];
+ y[2*18] = t[1][7];
+ y[3*18] = t[3][7];
+ }
+#endif /* MINIMP3_ONLY_SIMD */
+}
+
+#ifndef MINIMP3_FLOAT_OUTPUT
+static int16_t mp3d_scale_pcm(float sample)
+{
+ if (sample >= 32766.5) return (int16_t) 32767;
+ if (sample <= -32767.5) return (int16_t)-32768;
+ int16_t s = (int16_t)(sample + .5f);
+ s -= (s < 0); /* away from zero, to be compliant */
+ return s;
+}
+#else /* MINIMP3_FLOAT_OUTPUT */
+static float mp3d_scale_pcm(float sample)
+{
+ return sample*(1.f/32768.f);
+}
+#endif /* MINIMP3_FLOAT_OUTPUT */
+
+static void mp3d_synth_pair(mp3d_sample_t *pcm, int nch, const float *z)
+{
+ float a;
+ a = (z[14*64] - z[ 0]) * 29;
+ a += (z[ 1*64] + z[13*64]) * 213;
+ a += (z[12*64] - z[ 2*64]) * 459;
+ a += (z[ 3*64] + z[11*64]) * 2037;
+ a += (z[10*64] - z[ 4*64]) * 5153;
+ a += (z[ 5*64] + z[ 9*64]) * 6574;
+ a += (z[ 8*64] - z[ 6*64]) * 37489;
+ a += z[ 7*64] * 75038;
+ pcm[0] = mp3d_scale_pcm(a);
+
+ z += 2;
+ a = z[14*64] * 104;
+ a += z[12*64] * 1567;
+ a += z[10*64] * 9727;
+ a += z[ 8*64] * 64019;
+ a += z[ 6*64] * -9975;
+ a += z[ 4*64] * -45;
+ a += z[ 2*64] * 146;
+ a += z[ 0*64] * -5;
+ pcm[16*nch] = mp3d_scale_pcm(a);
+}
+
+static void mp3d_synth(float *xl, mp3d_sample_t *dstl, int nch, float *lins)
+{
+ int i;
+ float *xr = xl + 576*(nch - 1);
+ mp3d_sample_t *dstr = dstl + (nch - 1);
+
+ static const float g_win[] = {
+ -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,
+ -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,
+ -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,
+ -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,
+ -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,
+ -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,
+ -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,
+ -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,
+ -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,
+ -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,
+ -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,
+ -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,
+ -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,
+ -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,
+ -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290
+ };
+ float *zlin = lins + 15*64;
+ const float *w = g_win;
+
+ zlin[4*15] = xl[18*16];
+ zlin[4*15 + 1] = xr[18*16];
+ zlin[4*15 + 2] = xl[0];
+ zlin[4*15 + 3] = xr[0];
+
+ zlin[4*31] = xl[1 + 18*16];
+ zlin[4*31 + 1] = xr[1 + 18*16];
+ zlin[4*31 + 2] = xl[1];
+ zlin[4*31 + 3] = xr[1];
+
+ mp3d_synth_pair(dstr, nch, lins + 4*15 + 1);
+ mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);
+ mp3d_synth_pair(dstl, nch, lins + 4*15);
+ mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);
+
+#if HAVE_SIMD
+ if (have_simd()) for (i = 14; i >= 0; i--)
+ {
+#define VLOAD(k) f4 w0 = VSET(*w++); f4 w1 = VSET(*w++); f4 vz = VLD(&zlin[4*i - 64*k]); f4 vy = VLD(&zlin[4*i - 64*(15 - k)]);
+#define V0(k) { VLOAD(k) b = VADD(VMUL(vz, w1), VMUL(vy, w0)) ; a = VSUB(VMUL(vz, w0), VMUL(vy, w1)); }
+#define V1(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vz, w0), VMUL(vy, w1))); }
+#define V2(k) { VLOAD(k) b = VADD(b, VADD(VMUL(vz, w1), VMUL(vy, w0))); a = VADD(a, VSUB(VMUL(vy, w1), VMUL(vz, w0))); }
+ f4 a, b;
+ zlin[4*i] = xl[18*(31 - i)];
+ zlin[4*i + 1] = xr[18*(31 - i)];
+ zlin[4*i + 2] = xl[1 + 18*(31 - i)];
+ zlin[4*i + 3] = xr[1 + 18*(31 - i)];
+ zlin[4*i + 64] = xl[1 + 18*(1 + i)];
+ zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];
+ zlin[4*i - 64 + 2] = xl[18*(1 + i)];
+ zlin[4*i - 64 + 3] = xr[18*(1 + i)];
+
+ V0(0) V2(1) V1(2) V2(3) V1(4) V2(5) V1(6) V2(7)
+
+ {
+#ifndef MINIMP3_FLOAT_OUTPUT
+#if HAVE_SSE
+ static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
+ static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
+ __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
+ _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
+ dstr[(15 - i)*nch] = _mm_extract_epi16(pcm8, 1);
+ dstr[(17 + i)*nch] = _mm_extract_epi16(pcm8, 5);
+ dstl[(15 - i)*nch] = _mm_extract_epi16(pcm8, 0);
+ dstl[(17 + i)*nch] = _mm_extract_epi16(pcm8, 4);
+ dstr[(47 - i)*nch] = _mm_extract_epi16(pcm8, 3);
+ dstr[(49 + i)*nch] = _mm_extract_epi16(pcm8, 7);
+ dstl[(47 - i)*nch] = _mm_extract_epi16(pcm8, 2);
+ dstl[(49 + i)*nch] = _mm_extract_epi16(pcm8, 6);
+#else /* HAVE_SSE */
+ int16x4_t pcma, pcmb;
+ a = VADD(a, VSET(0.5f));
+ b = VADD(b, VSET(0.5f));
+ pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0)))));
+ pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0)))));
+ vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);
+ vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);
+ vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);
+ vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);
+ vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);
+ vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);
+ vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);
+ vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);
+#endif /* HAVE_SSE */
+
+#else /* MINIMP3_FLOAT_OUTPUT */
+
+ static const f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };
+ a = VMUL(a, g_scale);
+ b = VMUL(b, g_scale);
+#if HAVE_SSE
+ _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));
+ _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));
+ _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));
+ _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));
+ _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));
+ _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));
+ _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));
+ _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));
+#else /* HAVE_SSE */
+ vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);
+ vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);
+ vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);
+ vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);
+ vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);
+ vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);
+ vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);
+ vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);
+#endif /* HAVE_SSE */
+#endif /* MINIMP3_FLOAT_OUTPUT */
+ }
+ } else
+#endif /* HAVE_SIMD */
+#ifdef MINIMP3_ONLY_SIMD
+ {}
+#else /* MINIMP3_ONLY_SIMD */
+ for (i = 14; i >= 0; i--)
+ {
+#define LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64];
+#define S0(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] = vz[j]*w1 + vy[j]*w0, a[j] = vz[j]*w0 - vy[j]*w1; }
+#define S1(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; }
+#define S2(k) { int j; LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; }
+ float a[4], b[4];
+
+ zlin[4*i] = xl[18*(31 - i)];
+ zlin[4*i + 1] = xr[18*(31 - i)];
+ zlin[4*i + 2] = xl[1 + 18*(31 - i)];
+ zlin[4*i + 3] = xr[1 + 18*(31 - i)];
+ zlin[4*(i + 16)] = xl[1 + 18*(1 + i)];
+ zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];
+ zlin[4*(i - 16) + 2] = xl[18*(1 + i)];
+ zlin[4*(i - 16) + 3] = xr[18*(1 + i)];
+
+ S0(0) S2(1) S1(2) S2(3) S1(4) S2(5) S1(6) S2(7)
+
+ dstr[(15 - i)*nch] = mp3d_scale_pcm(a[1]);
+ dstr[(17 + i)*nch] = mp3d_scale_pcm(b[1]);
+ dstl[(15 - i)*nch] = mp3d_scale_pcm(a[0]);
+ dstl[(17 + i)*nch] = mp3d_scale_pcm(b[0]);
+ dstr[(47 - i)*nch] = mp3d_scale_pcm(a[3]);
+ dstr[(49 + i)*nch] = mp3d_scale_pcm(b[3]);
+ dstl[(47 - i)*nch] = mp3d_scale_pcm(a[2]);
+ dstl[(49 + i)*nch] = mp3d_scale_pcm(b[2]);
+ }
+#endif /* MINIMP3_ONLY_SIMD */
+}
+
+static void mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, mp3d_sample_t *pcm, float *lins)
+{
+ int i;
+ for (i = 0; i < nch; i++)
+ {
+ mp3d_DCT_II(grbuf + 576*i, nbands);
+ }
+
+ memcpy(lins, qmf_state, sizeof(float)*15*64);
+
+ for (i = 0; i < nbands; i += 2)
+ {
+ mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);
+ }
+#ifndef MINIMP3_NONSTANDARD_BUT_LOGICAL
+ if (nch == 1)
+ {
+ for (i = 0; i < 15*64; i += 2)
+ {
+ qmf_state[i] = lins[nbands*64 + i];
+ }
+ } else
+#endif /* MINIMP3_NONSTANDARD_BUT_LOGICAL */
+ {
+ memcpy(qmf_state, lins + nbands*64, sizeof(float)*15*64);
+ }
+}
+
+static int mp3d_match_frame(const uint8_t *hdr, int mp3_bytes, int frame_bytes)
+{
+ int i, nmatch;
+ for (i = 0, nmatch = 0; nmatch < MAX_FRAME_SYNC_MATCHES; nmatch++)
+ {
+ i += hdr_frame_bytes(hdr + i, frame_bytes) + hdr_padding(hdr + i);
+ if (i + HDR_SIZE > mp3_bytes)
+ return nmatch > 0;
+ if (!hdr_compare(hdr, hdr + i))
+ return 0;
+ }
+ return 1;
+}
+
+static int mp3d_find_frame(const uint8_t *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)
+{
+ int i, k;
+ for (i = 0; i < mp3_bytes - HDR_SIZE; i++, mp3++)
+ {
+ if (hdr_valid(mp3))
+ {
+ int frame_bytes = hdr_frame_bytes(mp3, *free_format_bytes);
+ int frame_and_padding = frame_bytes + hdr_padding(mp3);
+
+ for (k = HDR_SIZE; !frame_bytes && k < MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - HDR_SIZE; k++)
+ {
+ if (hdr_compare(mp3, mp3 + k))
+ {
+ int fb = k - hdr_padding(mp3);
+ int nextfb = fb + hdr_padding(mp3 + k);
+ if (i + k + nextfb + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + k + nextfb))
+ continue;
+ frame_and_padding = k;
+ frame_bytes = fb;
+ *free_format_bytes = fb;
+ }
+ }
+ if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&
+ mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||
+ (!i && frame_and_padding == mp3_bytes))
+ {
+ *ptr_frame_bytes = frame_and_padding;
+ return i;
+ }
+ *free_format_bytes = 0;
+ }
+ }
+ *ptr_frame_bytes = 0;
+ return i;
+}
+
+void mp3dec_init(mp3dec_t *dec)
+{
+ dec->header[0] = 0;
+}
+
+int mp3dec_decode_frame(mp3dec_t *dec, const uint8_t *mp3, int mp3_bytes, mp3d_sample_t *pcm, mp3dec_frame_info_t *info)
+{
+ int i = 0, igr, frame_size = 0, success = 1;
+ const uint8_t *hdr;
+ bs_t bs_frame[1];
+ mp3dec_scratch_t scratch;
+
+ if (mp3_bytes > 4 && dec->header[0] == 0xff && hdr_compare(dec->header, mp3))
+ {
+ frame_size = hdr_frame_bytes(mp3, dec->free_format_bytes) + hdr_padding(mp3);
+ if (frame_size != mp3_bytes && (frame_size + HDR_SIZE > mp3_bytes || !hdr_compare(mp3, mp3 + frame_size)))
+ {
+ frame_size = 0;
+ }
+ }
+ if (!frame_size)
+ {
+ memset(dec, 0, sizeof(mp3dec_t));
+ i = mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);
+ if (!frame_size || i + frame_size > mp3_bytes)
+ {
+ info->frame_bytes = i;
+ return 0;
+ }
+ }
+
+ hdr = mp3 + i;
+ memcpy(dec->header, hdr, HDR_SIZE);
+ info->frame_bytes = i + frame_size;
+ info->channels = HDR_IS_MONO(hdr) ? 1 : 2;
+ info->hz = hdr_sample_rate_hz(hdr);
+ info->layer = 4 - HDR_GET_LAYER(hdr);
+ info->bitrate_kbps = hdr_bitrate_kbps(hdr);
+
+ if (!pcm)
+ {
+ return hdr_frame_samples(hdr);
+ }
+
+ bs_init(bs_frame, hdr + HDR_SIZE, frame_size - HDR_SIZE);
+ if (HDR_IS_CRC(hdr))
+ {
+ get_bits(bs_frame, 16);
+ }
+
+ if (info->layer == 3)
+ {
+ int main_data_begin = L3_read_side_info(bs_frame, scratch.gr_info, hdr);
+ if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)
+ {
+ mp3dec_init(dec);
+ return 0;
+ }
+ success = L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);
+ if (success)
+ {
+ for (igr = 0; igr < (HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm += 576*info->channels)
+ {
+ memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
+ L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);
+ mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, pcm, scratch.syn[0]);
+ }
+ }
+ L3_save_reservoir(dec, &scratch);
+ } else
+ {
+#ifdef MINIMP3_ONLY_MP3
+ return 0;
+#else /* MINIMP3_ONLY_MP3 */
+ L12_scale_info sci[1];
+ L12_read_scale_info(hdr, bs_frame, sci);
+
+ memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
+ for (i = 0, igr = 0; igr < 3; igr++)
+ {
+ if (12 == (i += L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))
+ {
+ i = 0;
+ L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);
+ mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, pcm, scratch.syn[0]);
+ memset(scratch.grbuf[0], 0, 576*2*sizeof(float));
+ pcm += 384*info->channels;
+ }
+ if (bs_frame->pos > bs_frame->limit)
+ {
+ mp3dec_init(dec);
+ return 0;
+ }
+ }
+#endif /* MINIMP3_ONLY_MP3 */
+ }
+ return success*hdr_frame_samples(dec->header);
+}
+
+#ifdef MINIMP3_FLOAT_OUTPUT
+void mp3dec_f32_to_s16(const float *in, int16_t *out, int num_samples)
+{
+ if(num_samples > 0)
+ {
+ int i = 0;
+#if HAVE_SIMD
+ int aligned_count = num_samples & ~7;
+
+ for(;i < aligned_count;i+=8)
+ {
+ static const f4 g_scale = { 32768.0f, 32768.0f, 32768.0f, 32768.0f };
+ f4 a = VMUL(VLD(&in[i ]), g_scale);
+ f4 b = VMUL(VLD(&in[i+4]), g_scale);
+#if HAVE_SSE
+ static const f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };
+ static const f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };
+ __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),
+ _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));
+ out[i ] = _mm_extract_epi16(pcm8, 0);
+ out[i+1] = _mm_extract_epi16(pcm8, 1);
+ out[i+2] = _mm_extract_epi16(pcm8, 2);
+ out[i+3] = _mm_extract_epi16(pcm8, 3);
+ out[i+4] = _mm_extract_epi16(pcm8, 4);
+ out[i+5] = _mm_extract_epi16(pcm8, 5);
+ out[i+6] = _mm_extract_epi16(pcm8, 6);
+ out[i+7] = _mm_extract_epi16(pcm8, 7);
+#else /* HAVE_SSE */
+ int16x4_t pcma, pcmb;
+ a = VADD(a, VSET(0.5f));
+ b = VADD(b, VSET(0.5f));
+ pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, VSET(0)))));
+ pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, VSET(0)))));
+ vst1_lane_s16(out+i , pcma, 0);
+ vst1_lane_s16(out+i+1, pcma, 1);
+ vst1_lane_s16(out+i+2, pcma, 2);
+ vst1_lane_s16(out+i+3, pcma, 3);
+ vst1_lane_s16(out+i+4, pcmb, 0);
+ vst1_lane_s16(out+i+5, pcmb, 1);
+ vst1_lane_s16(out+i+6, pcmb, 2);
+ vst1_lane_s16(out+i+7, pcmb, 3);
+#endif /* HAVE_SSE */
+ }
+#endif /* HAVE_SIMD */
+ for(; i < num_samples; i++)
+ {
+ float sample = in[i] * 32768.0f;
+ if (sample >= 32766.5)
+ out[i] = (int16_t) 32767;
+ else if (sample <= -32767.5)
+ out[i] = (int16_t)-32768;
+ else
+ {
+ int16_t s = (int16_t)(sample + .5f);
+ s -= (s < 0); /* away from zero, to be compliant */
+ out[i] = s;
+ }
+ }
+ }
+}
+#endif /* MINIMP3_FLOAT_OUTPUT */
+#endif /* MINIMP3_IMPLEMENTATION && !_MINIMP3_IMPLEMENTATION_GUARD */
diff --git a/Src/Sound/MPEG/MPEG.h b/Src/Sound/MPEG/MPEG.h
deleted file mode 100644
index f23e590..0000000
--- a/Src/Sound/MPEG/MPEG.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * MPEG.h
- *
- * Header file for MPEG decoder based on AMP by Tomislav Uzalec. Modified to
- * play from memory buffers by R. Belmont for his arcade music player, M1.
- */
-
-#ifndef INCLUDED_MPEG_H
-#define INCLUDED_MPEG_H
-
-#include "Types.h"
-
-
-/******************************************************************************
- Functions
-
- The MPEG decoder is not thread-safe and must not be used by multiple sources.
- These functions are located in audio.cpp and getbits.cpp.
-******************************************************************************/
-
-/*
- * MPEG_IsPlaying(void):
- *
- * Returns:
- * TRUE if an MPEG stream is currently playing, otherwise false.
- */
-extern bool MPEG_IsPlaying(void);
-
-/*
- * MPEG_GetPlayPosition(playOffset, endOffset):
- *
- * Obtains the current playback and end offsets of the MPEG stream.
- *
- * Parameters:
- * playOffset Pointer to which playback byte offset will be written.
- * endOffset Pointer to which end offset will be written.
- */
-extern void MPEG_GetPlayPosition(int *playOffset, int *endOffset);
-
-/*
- * MPEG_SetPlayPosition(playOffset, endOffset):
- *
- * Sets the playback position within an MPEG stream.
- *
- * Parameters:
- * playOffset Playback byte offset (relative to beginning of the current
- * MPEG stream).
- * endOffset End offset.
- */
-extern void MPEG_SetPlayPosition(int playOffset, int endOffset);
-
-/*
- * MPEG_SetLoop(loop, loopend):
- *
- * Sets the start and end offsets for looped playback.
- *
- * Parameters:
- * loop Start address.
- * loopend End offset. Must NOT be 0!
- */
-extern void MPEG_SetLoop(const char *loop, int loopend);
-
-/*
- * MPEG_Decode(outputs, length):
- *
- * Decodes the requested number of samples from the currently playing MPEG
- * stream and updates the internal play position. If an MPEG is not playing,
- * writes silence (zeros).
- *
- * Parameters:
- * outputs A two-element array of pointers to equal-length signed 16-
- * bit sample buffers. The first is the left channel and the
- * second is the right channel. Audio is decoded to these.
- * length Number of samples to decode.
- */
-extern void MPEG_Decode(INT16 **outputs, int length);
-
-/*
- * MPEG_PlayMemory(sa, length):
- *
- * Specifies the memory buffer to decode from. This initializes the playback
- * process and will decode the first MPEG frame internally. The loop start
- * position is cleared (set looping after this call).
- *
- * Parameters:
- * sa Start address of MPEG stream.
- * length Length in bytes.
- */
-extern void MPEG_PlayMemory(const char *sa, int length);
-
-/*
- * MPEG_StopPlaying(void):
- *
- * Stop playing the current MPEG stream. The decoder will return silence.
- */
-extern void MPEG_StopPlaying(void);
-
-/*
- * MPEG_Init(void):
- *
- * Initializes the MPEG decoder. This should be called once per program
- * session. Allocates an internal buffer for MPEG decoding.
- *
- * Returns:
- * OKAY if successful, FAIL if internal buffer could not be allocated.
- */
-extern bool MPEG_Init(void);
-
-/*
- * MPEG_Shutdown(void):
- *
- * Shuts down the MPEG decoder. Releases internal memory.
- */
-extern void MPEG_Shutdown(void);
-
-
-#endif // INCLUDED_MPEG_H
\ No newline at end of file
diff --git a/Src/Sound/MPEG/MpegAudio.cpp b/Src/Sound/MPEG/MpegAudio.cpp
new file mode 100644
index 0000000..6f92e04
--- /dev/null
+++ b/Src/Sound/MPEG/MpegAudio.cpp
@@ -0,0 +1,130 @@
+#define MINIMP3_IMPLEMENTATION
+#include "Pkgs/minimp3.h"
+#include "MpegAudio.h"
+
+struct Decoder
+{
+ mp3dec_t mp3d;
+ mp3dec_frame_info_t info;
+ const uint8_t* buffer;
+ size_t size, pos;
+ bool loop;
+ bool stopped;
+ int numSamples;
+ int pcmPos;
+ short pcm[MINIMP3_MAX_SAMPLES_PER_FRAME];
+};
+
+static Decoder dec = { 0 };
+
+void MpegDec::SetMemory(const uint8_t *data, int length, bool loop)
+{
+ mp3dec_init(&dec.mp3d);
+
+ dec.buffer = data;
+ dec.size = length;
+ dec.pos = 0;
+ dec.numSamples = 0;
+ dec.pcmPos = 0;
+ dec.loop = loop;
+ dec.stopped = false;
+}
+
+void MpegDec::UpdateMemory(const uint8_t* data, int length, bool loop)
+{
+ auto pos = dec.buffer + dec.pos;
+
+ dec.buffer = data;
+ dec.size = length;
+ dec.pos = pos - dec.buffer; // update position relative to our new start location
+ dec.loop = loop;
+}
+
+int MpegDec::GetPosition()
+{
+ return (int)dec.pos;
+}
+
+void MpegDec::SetPosition(int pos)
+{
+ dec.pos = pos;
+}
+
+static void FlushBuffer(int16_t*& left, int16_t*& right, int& numStereoSamples)
+{
+ int numChans = dec.info.channels;
+
+ int &i = dec.pcmPos;
+
+ for (; i < (dec.numSamples * numChans) && numStereoSamples; i += numChans) {
+ *left++ = dec.pcm[i];
+ *right++ = dec.pcm[i + numChans - 1];
+ numStereoSamples--;
+ }
+}
+
+// might need to copy some silence to end the buffer if we aren't looping
+static void EndWithSilence(int16_t*& left, int16_t*& right, int& numStereoSamples)
+{
+ while (numStereoSamples)
+ {
+ *left++ = 0;
+ *right++ = 0;
+ numStereoSamples--;
+ }
+}
+
+static bool EndOfBuffer()
+{
+ return dec.pos >= dec.size - HDR_SIZE;
+}
+
+void MpegDec::Stop()
+{
+ dec.stopped = true;
+}
+
+bool MpegDec::IsLoaded()
+{
+ return dec.buffer != nullptr;
+}
+
+void MpegDec::DecodeAudio(int16_t* left, int16_t* right, int numStereoSamples)
+{
+ // if we are stopped return silence
+ if (dec.stopped || !dec.buffer) {
+ EndWithSilence(left, right, numStereoSamples);
+ }
+
+ // copy any left over samples first
+ FlushBuffer(left, right, numStereoSamples);
+
+ while (numStereoSamples) {
+
+ dec.numSamples = mp3dec_decode_frame(
+ &dec.mp3d,
+ dec.buffer + dec.pos,
+ dec.size - dec.pos,
+ dec.pcm,
+ &dec.info);
+
+ dec.pos += dec.info.frame_bytes;
+ dec.pcmPos = 0; // reset pos
+
+ FlushBuffer(left, right, numStereoSamples);
+
+ // check end of buffer handling
+ if (EndOfBuffer()) {
+ if (dec.loop) {
+ dec.pos = 0;
+ }
+ else {
+ EndWithSilence(left, right, numStereoSamples);
+ }
+ }
+
+ }
+
+}
+
+
diff --git a/Src/Sound/MPEG/MpegAudio.h b/Src/Sound/MPEG/MpegAudio.h
new file mode 100644
index 0000000..2a5b156
--- /dev/null
+++ b/Src/Sound/MPEG/MpegAudio.h
@@ -0,0 +1,18 @@
+#ifndef _MPEG_AUDIO_H_
+#define _MPEG_AUDIO_H_
+
+#include
+
+namespace MpegDec
+{
+ void SetMemory(const uint8_t *data, int length, bool loop);
+ void UpdateMemory(const uint8_t *data, int length, bool loop);
+ int GetPosition();
+ void SetPosition(int pos);
+ void DecodeAudio(int16_t* left, int16_t* right, int numStereoSamples);
+ void Stop();
+ bool IsLoaded();
+}
+
+#endif
+
diff --git a/Src/Sound/MPEG/amp.h b/Src/Sound/MPEG/amp.h
deleted file mode 100644
index 05d7a19..0000000
--- a/Src/Sound/MPEG/amp.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * amp.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* these should not be touched
-*/
-#define SYNCWORD 0xfff
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-/* version
-*/
-#define MAJOR 0
-#define MINOR 7
-#define PATCH 6
-
-#define MAX(a,b) ((a) > (b) ? (a) : (b))
-#define MAX3(a,b,c) ((a) > (b) ? MAX(a, c) : MAX(b, c))
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
-
-
-/* Debugging flags */
-
-struct debugFlags_t {
- int audio,args,buffer,buffer2,misc,misc2;
-};
-
-struct debugLookup_t {
- char *name; int *var;
-};
-
-extern struct debugFlags_t debugFlags;
-
-/* This is only here to keep all the debug stuff together */
-#ifdef AMP_UTIL
-struct debugLookup_t debugLookup[] = {
- {"audio", &debugFlags.audio},
- {"args", &debugFlags.args},
- {"buffer", &debugFlags.buffer},
- {"buffer2", &debugFlags.buffer2},
- {"misc", &debugFlags.misc},
- {"misc2", &debugFlags.misc2},
- {0,0}
-};
-#endif /* AMP_UTIL */
-
-extern struct debugLookup_t debugLookup[];
-
-
-#ifdef DEBUG
- #define DB(type,cmd) if (debugFlags.type) { cmd ; }
-#else
- #define DB(type,cmd)
-#endif
-
-#include "config.h"
-#include "proto.h"
-
-
-extern int AUDIO_BUFFER_SIZE;
diff --git a/Src/Sound/MPEG/amp_audio.cpp b/Src/Sound/MPEG/amp_audio.cpp
deleted file mode 100644
index 0ebc5ff..0000000
--- a/Src/Sound/MPEG/amp_audio.cpp
+++ /dev/null
@@ -1,432 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * audio.cpp
- *
- * Main Amp module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* audio.c main amp source file
- *
- * Created by: tomislav uzelac Apr 1996
- * Karl Anders Oygard added the IRIX code, 10 Mar 1997.
- * Ilkka Karvinen fixed /dev/dsp initialization, 11 Mar 1997.
- * Lutz Vieweg added the HP/UX code, 14 Mar 1997.
- * Dan Nelson added FreeBSD modifications, 23 Mar 1997.
- * Andrew Richards complete reorganisation, new features, 25 Mar 1997
- * Edouard Lafargue added sajber jukebox support, 12 May 1997
- */
-
-
-#include "amp.h"
-
-#define AUDIO
-#include "amp_audio.h"
-#include "formats.h"
-#include "getbits.h"
-#include "huffman.h"
-#include "layer2.h"
-#include "layer3.h"
-#include "position.h"
-#include "rtbuf.h"
-#include "transform.h"
-
-//#ifndef __BEOS__
-//typedef int bool;
-//#endif
-
-#include
-#include
-#include "Supermodel.h"
-#include "MPEG.h"
-
-//#include "m1snd.h"
-//#include "oss.h"
-//#include "mpeg.h"
-
-#define BUF_SIZE (1152 * sizeof(short) * 2)
-
-void calculate_t43(void);
-
-static int decoder_init = 0;
-static int cnt = 0;
-static int stream = -1;
-static char *buf0;
-static int playing = 0;
-static int outpos = 0;
-static int mpeg_eof = 0;
-static char *dst, *readbuf;
-static struct AUDIO_HEADER m1hdr;;
-
-void statusDisplay(struct AUDIO_HEADER *header, int frameNo)
-{
- int minutes,seconds;
-
- if ((A_SHOW_CNT || A_SHOW_TIME) && !(frameNo%10))
- msg("\r");
- if (A_SHOW_CNT && !(frameNo%10) ) {
- msg("{ %d } ",frameNo);
- }
- if (A_SHOW_TIME && !(frameNo%10)) {
- seconds=frameNo*1152/t_sampling_frequency[header->ID][header->sampling_frequency];
- minutes=seconds/60;
- seconds=seconds % 60;
- msg("[%d:%02d]",minutes,seconds);
- }
- if (A_SHOW_CNT || A_SHOW_TIME)
- fflush(stderr);
-}
-
-// one mpeg frame is 576 samples.
-int decodeMPEGOneFrame(struct AUDIO_HEADER *header)
-{
- int snd_eof = 0, g;
-
- if ((g=gethdr(header))!=0) {
- report_header_error(g);
- snd_eof=1;
- return snd_eof;
- }
-
- if (header->protection_bit==0) getcrc();
-
- statusDisplay(header,0);
-
- if (header->layer==1) {
- if (layer3_frame(header,cnt)) {
- ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- return -1;
- }
- } else if (header->layer==2)
- if (layer2_frame(header,cnt)) {
- ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- return -1;
- }
-
- cnt++;
-
- return snd_eof;
-}
-
-int decodeMPEG(void)
-{
-struct AUDIO_HEADER header;
-int g,snd_eof=0;
-
- initialise_globals();
-
- cnt = 0;
-
- if ((g=gethdr(&header))!=0) {
- report_header_error(g);
- return -1;
- }
-
- if (header.protection_bit==0) getcrc();
-
- //printf("%d Hz, layer %d\n", t_sampling_frequency[header.ID][header.sampling_frequency], header.layer);
-
- if (setup_audio(&header)!=0) { // will never fail (setup_audio() does nothing)
- ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- return -1;
- }
-
- if (header.layer==1) {
- if (layer3_frame(&header,cnt)) {
- ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- return -1;
- }
- } else if (header.layer==2)
- if (layer2_frame(&header,cnt)) {
- ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- return -1;
- }
-
- /*
- * decoder loop **********************************
- */
- snd_eof=0;
- while (!snd_eof) {
- while (!snd_eof && ready_audio()) {
- snd_eof = decodeMPEGOneFrame(&header);
- }
- }
- return 0;
-}
-
-/* call this once at the beginning
- */
-void initialise_decoder(void)
-{
- premultiply();
- imdct_init();
- calculate_t43();
-}
-
-/* call this before each file is played
- */
-void initialise_globals(void)
-{
- append=::data=nch=0;
- f_bdirty=TRUE;
- bclean_bytes=0;
-
- memset(s,0,sizeof s);
- memset(res,0,sizeof res);
-}
-
-void report_header_error(int err)
-{
- switch (err) {
- case GETHDR_ERR:
- ErrorLog("Internal error in MPEG decoder: unable to read bit stream.");
- break;
- case GETHDR_NS :
- ErrorLog("Internal error in MPEG decoder: invalid MPEG format encountered.");
- break;
- case GETHDR_FL1:
- ErrorLog("Internal error in MPEG decoder: unsupported MPEG format encountered.");
- break;
- case GETHDR_FF :
- ErrorLog("Internal error in MPEG decoder: unsupported bit stream encountered.");
- break;
- case GETHDR_SYN:
- ErrorLog("Internal error in MPEG decoder: out of sync!");
- break;
- case GETHDR_EOF:
- default: ; /* some stupid compilers need the semicolon */
- }
-}
-
-int setup_audio(struct AUDIO_HEADER *header)
-{
- return 0;
-}
-
-void close_audio(void)
-{
-}
-
-int ready_audio(void)
-{
- return 1;
-}
-
-// callback: called by the engine to output a frame of audio
-void printout(void)
-{
- int j;
-
- if (nch==2)
- {
- j=32 * 18 * 2;
- }
- else
- {
- j=32 * 18;
- }
-
-// printf("printout: %x, %d\n", (unsigned int), j*2);
- memcpy(dst, sample_buffer, j*2);
-
- dst += j*2;
- outpos += j/2;
-}
-
-void MPEG_Decode(INT16 **outputs, int length)
-{
- int i, remaining, bias;
- INT16 *get;
-
- remaining = length;
-
-// printf("%d: %x %x\n", length, (unsigned int)outputs[0], (unsigned int)outputs[1]);
-
- if (!playing)
- {
- memset(&outputs[0][0], 0, length * sizeof(INT16));
- memset(&outputs[1][0], 0, length * sizeof(INT16));
- return;
- }
-
- bias = 0;
-
- // will we need more data from the decoder?
- if (outpos < length)
- {
- // if there's anything left in the current buffer, drain it first
- if (outpos != 0)
- {
- get = (INT16 *)readbuf;
-
- for (i = 0; i < outpos; i++)
- {
- outputs[1][i] = *get++;
- outputs[0][i] = *get++;
- }
-
- remaining -= outpos;
- bias = outpos;
- readbuf += (outpos * 4);
- }
-
- outpos = 0;
- dst = buf0;
- while ((outpos < remaining) && (playing))
- {
- mpeg_eof = decodeMPEGOneFrame(&m1hdr);
- if (mpeg_eof)
- {
- MPEG_StopPlaying();
- }
- }
-
- // reset read pointer
- readbuf = buf0;
- }
-
- get = (INT16 *)readbuf;
-
- for (i = 0; i < remaining; i++)
- {
- outputs[1][i+bias] = *get++;
- outputs[0][i+bias] = *get++;
- }
-
- outpos -= remaining;
- readbuf += (remaining * 4);
-}
-
-void MPEG_PlayFile(char *filename)
-{
- memset(buf0, 0, BUF_SIZE);
-
- in_file = fopen(filename, "rb");
-
- initialise_globals();
-
- cnt = 0;
- mpeg_eof = 0;
- outpos = 0;
- dst = buf0;
- readbuf = buf0;
-
- gethdr(&m1hdr);
- if (m1hdr.protection_bit == 0) getcrc();
-
-// printf("%d Hz, layer %d\n", t_sampling_frequency[m1hdr.ID][m1hdr.sampling_frequency], m1hdr.layer);
-
-// stream_set_srate(stream, t_sampling_frequency[m1hdr.ID][m1hdr.sampling_frequency]);
-
- // prime the stream
- if (m1hdr.layer == 1)
- {
- layer3_frame(&m1hdr, cnt);
- }
- else if (m1hdr.layer == 2)
- {
- layer2_frame(&m1hdr, cnt);
- }
-
- playing = 1;
-}
-
-extern void m1setfile(const char *mstart, int mend);
-void MPEG_PlayMemory(const char *sa, int length)
-{
- memset(buf0, 0, BUF_SIZE);
-
- m1setfile(sa, length);
-
- initialise_globals();
-
- cnt = 0;
- mpeg_eof = 0;
- outpos = 0;
- dst = buf0;
- readbuf = buf0;
-
- gethdr(&m1hdr);
- if (m1hdr.protection_bit == 0) getcrc();
-
-// printf("%d Hz, layer %d\n", t_sampling_frequency[m1hdr.ID][m1hdr.sampling_frequency], m1hdr.layer);
-
-// stream_set_srate(stream, t_sampling_frequency[m1hdr.ID][m1hdr.sampling_frequency]);
-
- // prime the stream
- if (m1hdr.layer == 1)
- {
- layer3_frame(&m1hdr, cnt);
- }
- else if (m1hdr.layer == 2)
- {
- layer2_frame(&m1hdr, cnt);
- }
-
- in_file = NULL;
-
- playing = 1;
-}
-
-void MPEG_StopPlaying(void)
-{
- if (playing)
- {
- playing = 0;
- if (in_file)
- fclose(in_file);
- }
-}
-
-bool MPEG_IsPlaying(void)
-{
- return playing ? TRUE : false;
-}
-
-bool MPEG_Init(void)
-{
- if (!decoder_init)
- {
- initialise_decoder(); /* initialise decoder */
- decoder_init = 1;
- buf0 = new(std::nothrow) char[BUF_SIZE];
- if (NULL == buf0)
- return FAIL;
- memset(buf0, 0, BUF_SIZE);
- playing = 0;
- }
-
- return OKAY;
-}
-
-void MPEG_Shutdown( void )
-{
- decoder_init = 0;
- if (buf0 != NULL)
- delete [] buf0;
- buf0 = NULL;
-}
-
diff --git a/Src/Sound/MPEG/amp_audio.h b/Src/Sound/MPEG/amp_audio.h
deleted file mode 100644
index a584335..0000000
--- a/Src/Sound/MPEG/amp_audio.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * audio.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* audio.h some global variables
- *
- * Created by: tomislav uzelac Mar/Apr, Jul 96
- */
-
-#include
-
-struct AUDIO_HEADER {
- int ID;
- int layer;
- int protection_bit;
- int bitrate_index;
- int sampling_frequency;
- int padding_bit;
- int private_bit;
- int mode;
- int mode_extension;
- int copyright;
- int original;
- int emphasis;
-};
-
-struct SIDE_INFO {
- int main_data_begin;
- int scfsi[2][4];
- int part2_3_length[2][2];
- int big_values[2][2];
- int global_gain[2][2];
- int scalefac_compress[2][2];
- int window_switching_flag[2][2];
- int block_type[2][2];
- int mixed_block_flag[2][2];
- int table_select[2][2][3];
- int subblock_gain[2][2][3];
- int region0_count[2][2];
- int region1_count[2][2];
- int preflag[2][2];
- int scalefac_scale[2][2];
- int count1table_select[2][2];
-};
-
-
-/* global stuff
-*/
-
-extern FILE *in_file,*out_file;
-
-extern void statusDisplay(struct AUDIO_HEADER *header, int frameNo);
-extern int decodeMPEG(void);
-extern void initialise_globals(void);
-extern void report_header_error(int err);
-
-extern int scalefac_l[2][2][22];
-extern int scalefac_s[2][2][13][3];
-extern int t_b8_l[2][3][22];
-extern int t_b8_s[2][3][13];
-extern short t_bitrate[2][3][15];
-
-extern int is[2][578];
-extern float xr[2][32][18];
-
-extern int *t_l,*t_s;
-extern int nch;
-extern int t_sampling_frequency[2][3];
-
-extern int A_QUIET,A_SHOW_CNT,A_FORMAT_WAVE,A_DUMP_BINARY;
-extern int A_WRITE_TO_AUDIO,A_WRITE_TO_FILE;
-extern short pcm_sample[64];
-extern int A_AUDIO_PLAY;
-extern int A_SET_VOLUME,A_SHOW_TIME;
-extern int A_MSG_STDOUT;
-extern int A_DOWNMIX;
-
-/* GUI CONTROL STUFF */
-extern int GUI_PLAY;
-extern int GUI_PLAYING;
-extern int GUI_PAUSE;
-extern int GUI_PAUSED;
-extern int GUI_STOP;
-extern int GUI_STOPPED;
-extern int GUI_FD_TO_PLAY;
-extern int GUI_NEXT_FILE_READY;
-
-/* GUI control stuff */
-extern int send_fd;
-extern int receive_fd;
-
-extern int stop_flag;
-extern int quit_flag;
-
-/* ...
-*/
-
-#ifdef AUDIO
-
-FILE *in_file,*out_file;
-
-int scalefac_l[2][2][22];
-int scalefac_s[2][2][13][3];
-
-int is[2][578];
-float xr[2][32][18];
-
-int *t_l,*t_s;
-int nch;
-int t_sampling_frequency[2][3] = {
-{ 22050 , 24000 , 16000},
-{ 44100 , 48000 , 32000}
-};
-
-/* GUI control stuff */
-int send_fd;
-int receive_fd;
-
-int stop_flag;
-int quit_flag;
-
-int GUI_PLAY,GUI_PLAYING,GUI_STOP,GUI_STOPPED,GUI_PAUSE,GUI_PAUSED;
-int GUI_FD_TO_PLAY,GUI_NEXT_FILE_READY;
-
-int A_QUIET,A_SHOW_CNT,A_FORMAT_WAVE,A_DUMP_BINARY;
-int A_WRITE_TO_FILE;
-int A_AUDIO_PLAY;
-int A_SET_VOLUME, A_SHOW_TIME;
-int A_MSG_STDOUT;
-int A_DOWNMIX;
-
-short pcm_sample[64];
-
-short t_bitrate[2][3][15] = {{
-{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}
-},{
-{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}
-}};
-
-/* the last sfb is given implicitly on pg.28. of the standard. scalefactors
- * for that one are 0, pretab also
- */
-/* leftmost index denotes ID, so first three tables are for MPEG2 (header->ID==0)
- * and the other three are for MPEG1 (header->ID==1)
- */
-/* 22.05, 24, 16 */
-int t_b8_l[2][3][22]={{ /* table B.8b ISO/IEC 11172-3 */
-{5,11,17,23,29,35,43,53,65,79,95,115,139,167,199,237,283,335,395,463,521,575},
-{5,11,17,23,29,35,43,53,65,79,95,113,135,161,193,231,277,331,393,463,539,575},
-{5,11,17,23,29,35,43,53,65,79,95,115,139,167,199,237,283,335,395,463,521,575}
-},{
-{3,7,11,15,19,23,29,35,43,51,61,73,89,109,133,161,195,237,287,341,417,575},
-{3,7,11,15,19,23,29,35,41,49,59,71,87,105,127,155,189,229,275,329,383,575},
-{3,7,11,15,19,23,29,35,43,53,65,81,101,125,155,193,239,295,363,447,549,575}
-}};
-int t_b8_s[2][3][13]={{ /* table B.8b ISO/IEC 11172-3 */
-{3,7,11,17,23,31,41,55,73,99,131,173,191},
-{3,7,11,17,25,35,47,61,79,103,135,179,191},
-{3,7,11,17,25,35,47,61,79,103,133,173,191}
-},{
-{3,7,11,15,21,29,39,51,65,83,105,135,191},
-{3,7,11,15,21,27,37,49,63,79,99,125,191},
-{3,7,11,15,21,29,41,57,77,103,137,179,191}
-}};
-
-int args(int argc,char **argv);
-void initialise_decoder(void);
-int decodeMPEG(void);
-void initialise_globals(void);
-void report_header_error(int err);
-int setup_audio(struct AUDIO_HEADER *header);
-void close_audio(void);
-int ready_audio(void);
-
-void play(char *inFileStr, char *outFileStr);
-
-#endif /* AUDIO */
diff --git a/Src/Sound/MPEG/config.h b/Src/Sound/MPEG/config.h
deleted file mode 100644
index c2e8331..0000000
--- a/Src/Sound/MPEG/config.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * config.h
- *
- * Amp library internal header file.
- */
-
-
-/* Define to empty if the keyword does not work. */
-/* #undef const */
-
-/* Define if you don't have vprintf but do have _doprnt. */
-/* #undef HAVE_DOPRNT */
-
-/* Define if you have that is POSIX.1 compatible. */
-//#define HAVE_SYS_WAIT_H 1
-
-/* Define if you have the vprintf function. */
-//#define HAVE_VPRINTF 1
-
-/* Define as __inline if that's what the C compiler calls it. */
-/* #undef inline */
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if you can safely include both and . */
-//#define TIME_WITH_SYS_TIME 1
-
-/* Define if you have the mlock function. */
-//#define HAVE_MLOCK 1
-
-/* Define if you have the mlockall function. */
-//#define HAVE_MLOCKALL 1
-
-/* Define if you have the sched_setscheduler function. */
-//#define HAVE_SCHED_SETSCHEDULER 1
-
-/* Define if you have the select function. */
-//#define HAVE_SELECT 1
-
-/* Define if you have the header file. */
-/* #undef HAVE_DMEDIA_AUDIO_H */
-
-/* Define if you have the header file. */
-//#define HAVE_FCNTL_H 1
-
-/* Define if you have the header file. */
-//#define HAVE_LINUX_SOUNDCARD_H 1
-
-/* Define if you have the header file. */
-/* #undef HAVE_MACHINE_SOUNDCARD_H */
-
-/* Define if you have the header file. */
-/* #undef HAVE_SYS_AUDIOIO_H */
-
-/* Define if you have the header file. */
-//#define HAVE_SYS_IOCTL_H 1
-
-/* Define if you have the header file. */
-//#define HAVE_SYS_SELECT_H 1
-
-/* Define if you have the header file. */
-//#define HAVE_SYS_TIME_H 1
-
-/* Define if you have the header file. */
-#define HAVE_UNISTD_H 1
-
-/* define if you want playing to use Linux realtime features */
-/* #undef LINUX_REALTIME */
diff --git a/Src/Sound/MPEG/dump.cpp b/Src/Sound/MPEG/dump.cpp
deleted file mode 100644
index 4b9a91d..0000000
--- a/Src/Sound/MPEG/dump.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * dump.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* dump.c binary/hex dump from buffer
- *
- * Created by: tomislav uzelac May 1996
- * Last modified by: tomislav May 31 1997
- */
-//#include
-#include
-
-#include "amp_audio.h"
-#include "getbits.h"
-
-#define DUMP
-#include "dump.h"
-
-/* no hex dump, sorry
- */
-void dump(int *length) /* in fact int length[4] */
-{
-int i,j;
-int _data,space=0;
- printf(" *********** binary dump\n");
- _data=data;
- for (i=0;i<4;i++) {
- for (j=0;j> (7-(_data&7)) )&1 );
- space++;
- _data++;
- _data&=8*BUFFER_SIZE-1;
- if (!(_data & 7)) {
- printf(" ");
- space++;
- if (space>70) {
- printf("\n");
- space=0;
- }
- }
- }
- printf("~\n");
- }
-}
-
-void show_header(struct AUDIO_HEADER *header)
-{
-int bitrate=t_bitrate[header->ID][3-header->layer][header->bitrate_index];
-int fs=t_sampling_frequency[header->ID][header->sampling_frequency];
-int mpg,layer;
-char stm[8];
- if (A_QUIET) return;
- layer=4-header->layer;
- if (header->ID==1) mpg=1;
- else mpg=2;
- if (header->mode==3) strcpy(stm,"mono");
- else strcpy(stm,"stereo");
-
- printf("\n\
-Properties: %s %dHz\n\
-Coding Method: MPEG%1d.0 layer%1d\n\
-Bitrate: %dkbit/s\n"\
- ,stm,fs,mpg,layer,bitrate);
-}
diff --git a/Src/Sound/MPEG/dump.h b/Src/Sound/MPEG/dump.h
deleted file mode 100644
index a698561..0000000
--- a/Src/Sound/MPEG/dump.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * dump.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-/* dump.h
- *
- * Last modified by: tomislav uzelac May 31 1997
- */
-
-extern void dump(int *length);
-extern void show_header(struct AUDIO_HEADER *header);
-
-#ifdef DUMP
-void dump(int *length);
-void show_header(struct AUDIO_HEADER *header);
-/*
-static char *t_modes[] = {
- "stereo","joint_stereo","dual_channel","single_channel"};
-*/
-#endif /* DUMP */
diff --git a/Src/Sound/MPEG/formats.h b/Src/Sound/MPEG/formats.h
deleted file mode 100644
index ae0c9bf..0000000
--- a/Src/Sound/MPEG/formats.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * formats.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* formats.h
- *
- * Created by: tomislav uzelac Dec 22 1996
- */
-extern void wav_end(struct AUDIO_HEADER *header);
-extern void wav_begin(void);
-
-#ifdef FORMATS
-void wav_end(struct AUDIO_HEADER *header);
-void wav_begin(void);
-#endif /* FORMATS */
diff --git a/Src/Sound/MPEG/getbits.cpp b/Src/Sound/MPEG/getbits.cpp
deleted file mode 100644
index 9ceab86..0000000
--- a/Src/Sound/MPEG/getbits.cpp
+++ /dev/null
@@ -1,412 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * getbits.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* getbits.c bit level routines, input buffer
- *
- * Created by: tomislav uzelac Apr 1996
- * better synchronization, tomislav uzelac, Apr 23 1997
- */
-#include
-#include
-#include
-#include "amp.h"
-#include "amp_audio.h"
-#include "formats.h"
-#include "rtbuf.h"
-
-#define GETBITS
-#include "getbits.h"
-
-static const char *fstart, *lstart;
-static int offset, end, eof, lend;
-
-void MPEG_GetPlayPosition(int *playOffset, int *endOffset)
-{
- if (in_file)
- *playOffset = ftell(in_file);
- else
- *playOffset = offset;
- *endOffset = end;
-}
-
-void MPEG_SetPlayPosition(int playOffset, int endOffset)
-{
- offset = playOffset;
- end = endOffset;
-}
-
-void m1setfile(const char *mstart, int mend)
-{
- fstart = mstart;
- offset = 0;
- eof = 0;
- end = mend;
- lstart = NULL;
-}
-
-void MPEG_SetLoop(const char *loop, int loopend)
-{
- lstart = loop;
- lend = loopend;
-}
-
-int m1fread(unsigned char *buf, int size1, int size2, void *f)
-{
- int total = size1 * size2;
-
- if (in_file) return fread(buf, size1, size2, (FILE *) f);
-
- //printf("fstart=%X, total=%X, offset=%X, end=%X\n", fstart, total, offset, end);
-
- // if past EOF
- if ((total + offset) >= end)
- {
- if (lstart == NULL)
- {
- total = end - offset;
- eof = 1;
- }
- else
- {
- // if past the end, do the xfer in 2 pieces
- if ((total + offset) > end)
- {
- int temp = end - offset; // this part could be removed
- if (temp > 0) // since music lenght
- { //
- memcpy(buf, fstart + offset, temp); // always multiple
- buf += temp; // of 0x240
- total -= temp; // I let this as is in case
- } //
-
- offset = 0;
- fstart = lstart;
- end = lend;
- }
- }
- }
-
- memcpy(buf, fstart + offset, total);
-
- offset += total;
-
- return total;
-}
-
-int m1feof(void *f)
-{
- if (in_file) return feof((FILE *)f);
- return eof;
-}
-
-int m1fseek(void *f, int offs, int whence)
-{
- if (in_file) return fseek((FILE *) f, offs, whence);
-
- switch (whence)
- {
- case SEEK_CUR:
- if ((offset + offs) < 0)
- {
- offset = 0;
- eof = 0;
- return -1;
- }
- if ((offset + offs) > end)
- {
- offset = end;
- eof = 1;
- return end;
- }
- offset += offs;
- eof = 0;
- break;
- }
- return 0;
-}
-
-/*
- * buffer and bit manipulation functions ***************************************
- */
-static inline int _fillbfr(unsigned int size)
-{
- _bptr=0;
- return get_input(_buffer, size);
-}
-
-static inline int readsync()
-{
- _bptr=0;
- _buffer[0]=_buffer[1];
- _buffer[1]=_buffer[2];
- _buffer[2]=_buffer[3];
- return get_input(&_buffer[3],1);
-}
-
-static inline unsigned int _getbits(int n)
-{
-unsigned int pos,ret_value;
-
- pos = _bptr >> 3;
- ret_value = _buffer[pos] << 24 |
- _buffer[pos+1] << 16 |
- _buffer[pos+2] << 8 |
- _buffer[pos+3];
- ret_value <<= _bptr & 7;
- ret_value >>= 32 - n;
- _bptr += n;
- return ret_value;
-}
-
-int fillbfr(unsigned int advance)
-{
-int overflow,retval;
-
- retval=get_input(&buffer[append], advance);
-
- if ( append + advance >= BUFFER_SIZE ) {
- overflow = append + advance - BUFFER_SIZE;
- memcpy (buffer,&buffer[BUFFER_SIZE], overflow);
- if (overflow < 4) memcpy(&buffer[BUFFER_SIZE],buffer,4);
- append = overflow;
- } else {
- if (append==0) memcpy(&buffer[BUFFER_SIZE],buffer,4);
- append+=advance;
- }
- return retval;
-}
-
-unsigned int getbits(int n)
-{
- if (n) {
- unsigned int pos,ret_value;
-
- pos = data >> 3;
- ret_value = buffer[pos] << 24 |
- buffer[pos+1] << 16 |
- buffer[pos+2] << 8 |
- buffer[pos+3];
- ret_value <<= data & 7;
- ret_value >>= 32 - n;
-
- data += n;
- data &= (8*BUFFER_SIZE)-1;
-
- return ret_value;
- } else
- return 0;
-}
-
-/*
- * header and side info parsing stuff ******************************************
- */
-static inline void parse_header(struct AUDIO_HEADER *header)
-{
- header->ID=_getbits(1);
- header->layer=_getbits(2);
- header->protection_bit=_getbits(1);
- header->bitrate_index=_getbits(4);
- header->sampling_frequency=_getbits(2);
- header->padding_bit=_getbits(1);
- header->private_bit=_getbits(1);
- header->mode=_getbits(2);
- header->mode_extension=_getbits(2);
- if (!header->mode) header->mode_extension=0;
- header->copyright=_getbits(1);
- header->original=_getbits(1);
- header->emphasis=_getbits(2);
-}
-
-static inline int header_sanity_check(struct AUDIO_HEADER *header)
-{
- if ( header->layer==0 ||
- header->bitrate_index==15 ||
- header->sampling_frequency==3) return -1;
-
- /* an additional check to make shure that stuffing never gets mistaken
- * for a syncword. This rules out some legal layer1 streams, but who
- * cares about layer1 anyway :-). I must get this right sometime.
- */
- if ( header->ID==1 && header->layer==3 && header->protection_bit==1) return -1;
- return 0;
-}
-
-
-int gethdr(struct AUDIO_HEADER *header)
-{
-int s,retval;
-struct AUDIO_HEADER tmp;
-
- /* TODO: add a simple byte counter to check only first, say, 1024
- * bytes for a new header and then return GETHDR_SYN
- */
- if ((retval=_fillbfr(4))!=0) return retval;
-
- for(;;) {
- while ((s=_getbits(12)) != 0xfff) {
- if (s==0xffe) {
- parse_header(&tmp);
- if (header_sanity_check(&tmp)==0) return GETHDR_NS;
- }
- if ((retval=readsync())!=0) return retval;
- }
-
- parse_header(&tmp);
- if (header_sanity_check(&tmp)!=0) {
- if ((retval=readsync())!=0) return retval;
- } else break;
- }
-
- if (tmp.layer==3) return GETHDR_FL1;
- /* if (tmp.layer==2) return GETHDR_FL2; */
- if (tmp.bitrate_index==0) return GETHDR_FF;
-
- //printf("layer: %d\n", tmp.layer);
- //printf("sampling frequency: %d\n", tmp.sampling_frequency);
-
- memcpy(header,&tmp,sizeof(tmp));
- return 0;
-}
-
-/* dummy function, to get crc out of the way
-*/
-void getcrc()
-{
- _fillbfr(2);
- _getbits(16);
-}
-
-/* sizes of side_info:
- * MPEG1 1ch 17 2ch 32
- * MPEG2 1ch 9 2ch 17
- */
-void getinfo(struct AUDIO_HEADER *header,struct SIDE_INFO *info)
-{
-int gr,ch,scfsi_band,region,window;
-int nch;
- if (header->mode==3) {
- nch=1;
- if (header->ID) {
- _fillbfr(17);
- info->main_data_begin=_getbits(9);
- _getbits(5);
- } else {
- _fillbfr(9);
- info->main_data_begin=_getbits(8);
- _getbits(1);
- }
- } else {
- nch=2;
- if (header->ID) {
- _fillbfr(32);
- info->main_data_begin=_getbits(9);
- _getbits(3);
- } else {
- _fillbfr(17);
- info->main_data_begin=_getbits(8);
- _getbits(2);
- }
- }
-
- if (header->ID) for (ch=0;chscfsi[ch][scfsi_band]=_getbits(1);
-
- for (gr=0;gr<(header->ID ? 2:1);gr++)
- for (ch=0;chpart2_3_length[gr][ch]=_getbits(12);
- info->big_values[gr][ch]=_getbits(9);
- info->global_gain[gr][ch]=_getbits(8);
- if (header->ID) info->scalefac_compress[gr][ch]=_getbits(4);
- else info->scalefac_compress[gr][ch]=_getbits(9);
- info->window_switching_flag[gr][ch]=_getbits(1);
-
- if (info->window_switching_flag[gr][ch]) {
- info->block_type[gr][ch]=_getbits(2);
- info->mixed_block_flag[gr][ch]=_getbits(1);
-
- for (region=0;region<2;region++)
- info->table_select[gr][ch][region]=_getbits(5);
- info->table_select[gr][ch][2]=0;
-
- for (window=0;window<3;window++)
- info->subblock_gain[gr][ch][window]=_getbits(3);
- } else {
- for (region=0;region<3;region++)
- info->table_select[gr][ch][region]=_getbits(5);
-
- info->region0_count[gr][ch]=_getbits(4);
- info->region1_count[gr][ch]=_getbits(3);
- info->block_type[gr][ch]=0;
- }
-
- if (header->ID) info->preflag[gr][ch]=_getbits(1);
- info->scalefac_scale[gr][ch]=_getbits(1);
- info->count1table_select[gr][ch]=_getbits(1);
- }
- return;
-}
-
-int dummy_getinfo(int n)
-{
- n-=4;
- if ( m1fseek(in_file,n,SEEK_CUR) != 0)
- {
- if (m1feof(in_file)) return GETHDR_EOF;
- else return GETHDR_ERR;
- }
- return 0;
-}
-
-int rewind_stream(int nbytes)
-{
- nbytes+=5;
- if (m1fseek(in_file, -nbytes, SEEK_CUR) != 0) {
- /* what if we need to be at the very beginning? */
- nbytes--;
- if (m1fseek(in_file, -nbytes, SEEK_CUR) != 0) return GETHDR_ERR;
- }
- return 0;
-}
-
-static inline int get_input(unsigned char* bp, unsigned int size)
-{
-#ifdef LINUX_REALTIME
- return prefetch_get_input(bp,size);
-#else /* LINUX_REALTIME */
- if ( m1fread( bp , 1, size, in_file) != size)
- {
- if (m1feof(in_file)) return GETHDR_EOF;
- else return GETHDR_ERR;
- }
- return 0;
-#endif /* LINUX_REALTIME */
-}
diff --git a/Src/Sound/MPEG/getbits.h b/Src/Sound/MPEG/getbits.h
deleted file mode 100644
index e1d65af..0000000
--- a/Src/Sound/MPEG/getbits.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * getbits.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* getbits.h
- *
- * Created by: tomislav uzelac Apr 1996
- */
-
-/* gethdr() error codes
-*/
-#define GETHDR_ERR 0x1
-#define GETHDR_NS 0x2
-#define GETHDR_FL1 0x4
-#define GETHDR_FL2 0x8
-#define GETHDR_FF 0x10
-#define GETHDR_SYN 0x20
-#define GETHDR_EOF 0x30
-
-/* buffer for the 'bit reservoir'
-*/
-#define BUFFER_SIZE 4096
-#define BUFFER_AUX 2048
-extern unsigned char buffer[];
-extern int append,data,f_bdirty,bclean_bytes;
-
-/* exports
-*/
-extern int fillbfr(unsigned int advance);
-extern unsigned int getbits(int n);
-extern int gethdr(struct AUDIO_HEADER *header);
-extern void getcrc();
-extern void getinfo(struct AUDIO_HEADER *header,struct SIDE_INFO *info);
-extern int dummy_getinfo(int n);
-extern int rewind_stream(int nbytes);
-
-
-#ifdef GETBITS
-
-/* buffer, AUX is used in case of input buffer "overflow", and its contents
- * are copied to the beginning of the buffer
-*/
-unsigned char buffer[BUFFER_SIZE+BUFFER_AUX];
-
-/* buffer pointers: append counts in bytes, data in bits
- */
-int append,data;
-
-/* bit reservoir stuff. f_bdirty must be set to TRUE when starting play!
- */
-int f_bdirty,bclean_bytes;
-
-/* internal buffer, _bptr holds the position in _bits_
- */
-static unsigned char _buffer[32];
-static int _bptr;
-
-
-/* buffer and bit manipulation functions
- */
-static inline int _fillbfr(unsigned int size);
-static inline int readsync();
-static inline int get_input(unsigned char* bp, unsigned int size);
-static inline unsigned int _getbits(int n);
-int fillbfr(unsigned int advance);
-unsigned int getbits(int n);
-int dummy_getinfo(int n);
-int rewind_stream(int nbytes);
-
-/* header and side info parsing stuff
- */
-static inline void parse_header(struct AUDIO_HEADER *header);
-static inline int header_sanity_check(struct AUDIO_HEADER *header);
-
-int gethdr(struct AUDIO_HEADER *header);
-void getcrc();
-void getinfo(struct AUDIO_HEADER *header,struct SIDE_INFO *info);
-
-#endif /* GETBITS */
-
diff --git a/Src/Sound/MPEG/getdata.cpp b/Src/Sound/MPEG/getdata.cpp
deleted file mode 100644
index 28322ff..0000000
--- a/Src/Sound/MPEG/getdata.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * getdata.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* getdata.c scalefactor & huffman data extraction
- *
- * Created by: tomislav uzelac Apr 1996
- * Last modified by: tomislav uzelac Feb 27 1997
- */
-#include "amp.h"
-#include "amp_audio.h"
-#include "getbits.h"
-#include "huffman.h"
-
-#define GETDATA
-#include "getdata.h"
-
-/* layer3 scalefactor decoding. should we check for the number
- * of bits read, just in case?
- */
-int decode_scalefactors(struct SIDE_INFO *info,struct AUDIO_HEADER *header,int gr,int ch)
-{
-int sfb,window;
-int slen1,slen2;
-int i1,i2,i=0;
-int j,k;
- if (header->ID==1) {
- /* this is MPEG-1 scalefactors format, quite different than
- * the MPEG-2 format.
- */
- slen1=t_slen1[info->scalefac_compress[gr][ch]];
- slen2=t_slen2[info->scalefac_compress[gr][ch]];
- i1=3*slen1;
- i2=3*slen2;
-
- if (info->window_switching_flag[gr][ch] && info->block_type[gr][ch]==2) {
- if (info->mixed_block_flag[gr][ch]) {
- for (sfb=0;sfb<8;sfb++) {
- scalefac_l[gr][ch][sfb]=getbits(slen1);
- i+=slen1;
- }
- for (sfb=3;sfb<6;sfb++) {
- for (window=0;window<3;window++)
- scalefac_s[gr][ch][sfb][window]=getbits(slen1);
- i+=i1;
- }
- for (;sfb<12;sfb++) {
- for (window=0;window<3;window++)
- scalefac_s[gr][ch][sfb][window]=getbits(slen2);
- i+=i2;
- }
- } else { /* !mixed_block_flag */
- for (sfb=0;sfb<6;sfb++) {
- for (window=0;window<3;window++)
- scalefac_s[gr][ch][sfb][window]=getbits(slen1);
- i+=i1;
- }
- for (;sfb<12;sfb++) {
- for (window=0;window<3;window++)
- scalefac_s[gr][ch][sfb][window]=getbits(slen2);
- i+=i2;
- }
- }
- for (window=0;window<3;window++)
- scalefac_s[gr][ch][12][window]=0;
- } else { /* block_type!=2 */
- if ( !info->scfsi[ch][0] || !gr )
- for (sfb=0;sfb<6;sfb++) {
- scalefac_l[gr][ch][sfb]=getbits(slen1);
- i+=slen1;
- }
- else for (sfb=0;sfb<6;sfb++) {
- scalefac_l[1][ch][sfb]=scalefac_l[0][ch][sfb];
- }
- if ( !info->scfsi[ch][1] || !gr )
- for (sfb=6;sfb<11;sfb++) {
- scalefac_l[gr][ch][sfb]=getbits(slen1);
- i+=slen1;
- }
- else for (sfb=6;sfb<11;sfb++) {
- scalefac_l[1][ch][sfb]=scalefac_l[0][ch][sfb];
- }
- if ( !info->scfsi[ch][2] || !gr )
- for (sfb=11;sfb<16;sfb++) {
- scalefac_l[gr][ch][sfb]=getbits(slen2);
- i+=slen2;
- }
- else for (sfb=11;sfb<16;sfb++) {
- scalefac_l[1][ch][sfb]=scalefac_l[0][ch][sfb];
- }
- if ( !info->scfsi[ch][3] || !gr )
- for (sfb=16;sfb<21;sfb++) {
- scalefac_l[gr][ch][sfb]=getbits(slen2);
- i+=slen2;
- }
- else for (sfb=16;sfb<21;sfb++) {
- scalefac_l[1][ch][sfb]=scalefac_l[0][ch][sfb];
- }
- scalefac_l[gr][ch][21]=0;
- }
- } else { /* ID==0 */
- int index=0,index2,spooky_index;
- int slen[6],nr_of_sfb[6]; /* actually, there's four of each, not five, labelled 1 through 4, but
- * what's a word of storage compared to one's sanity. so [0] is irellevant.
- */
-
- /* ok, so we got 3 indexes.
- * spooky_index - indicates whether we use the normal set of slen eqs and nr_of_sfb tables
- * or the one for the right channel of intensity stereo coded frame
- * index - corresponds to the value of scalefac_compress, as listed in the standard
- * index2 - 0 for long blocks, 1 for short wo/ mixed_block_flag, 2 for short with it
- */
- if ( (header->mode_extension==1 || header->mode_extension==3) && ch==1) { /* right ch... */
- int int_scalefac_compress=info->scalefac_compress[0][ch]>>1;
- intensity_scale=info->scalefac_compress[0][1]&1;
- spooky_index=1;
- if (int_scalefac_compress < 180) {
- slen[1]=int_scalefac_compress/36;
- slen[2]=(int_scalefac_compress%36)/6;
- slen[3]=(int_scalefac_compress%36)%6;
- slen[4]=0;
- info->preflag[0][ch]=0;
- index=0;
- }
- if ( 180 <= int_scalefac_compress && int_scalefac_compress < 244) {
- slen[1]=((int_scalefac_compress-180)%64)>>4;
- slen[2]=((int_scalefac_compress-180)%16)>>2;
- slen[3]=(int_scalefac_compress-180)%4;
- slen[4]=0;
- info->preflag[0][ch]=0;
- index=1;
- }
- if ( 244 <= int_scalefac_compress && int_scalefac_compress < 255) {
- slen[1]=(int_scalefac_compress-244)/3;
- slen[2]=(int_scalefac_compress-244)%3;
- slen[3]=0;
- slen[4]=0;
- info->preflag[0][ch]=0;
- index=2;
- }
- } else { /* the usual */
- spooky_index=0;
- if (info->scalefac_compress[0][ch] < 400) {
- slen[1]=(info->scalefac_compress[0][ch]>>4)/5;
- slen[2]=(info->scalefac_compress[0][ch]>>4)%5;
- slen[3]=(info->scalefac_compress[0][ch]%16)>>2;
- slen[4]=info->scalefac_compress[0][ch]%4;
- info->preflag[0][ch]=0;
- index=0;
- }
- if (info->scalefac_compress[0][ch] >= 400 && info->scalefac_compress[0][ch] < 500) {
- slen[1]=((info->scalefac_compress[0][ch]-400)>>2)/5;
- slen[2]=((info->scalefac_compress[0][ch]-400)>>2)%5;
- slen[3]=(info->scalefac_compress[0][ch]-400)%4;
- slen[4]=0;
- info->preflag[0][ch]=0;
- index=1;
- }
- if (info->scalefac_compress[0][ch] >= 500 && info->scalefac_compress[0][ch] < 512) {
- slen[1]=(info->scalefac_compress[0][ch]-500)/3;
- slen[2]=(info->scalefac_compress[0][ch]-500)%3;
- slen[3]=0;
- slen[4]=0;
- info->preflag[0][ch]=1;
- index=2;
- }
- }
-
- if (info->window_switching_flag[0][ch] && info->block_type[0][ch]==2)
- if (info->mixed_block_flag[0][ch]) index2=2;
- else index2=1;
- else index2=0;
-
- for (j=1;j<=4;j++) nr_of_sfb[j]=spooky_table[spooky_index][index][index2][j-1];
-
- /* now we'll do some actual scalefactor extraction, and a little more.
- * for each scalefactor band we'll set the value of is_max to indicate
- * illegal is_pos, since with MPEG2 it's not 'hardcoded' to 7.
- */
- if (!info->window_switching_flag[0][ch] || (info->window_switching_flag[0][ch] && info->block_type[0][ch]!=2)) {
- sfb=0;
- for (j=1;j<=4;j++)
- for (k=0;kblock_type[0][ch]==2)
- {
- if (!info->mixed_block_flag[0][ch]) {
- sfb=0;
- for (j=1;j<=4;j++)
- for (k=0;k.
- **/
-
-/*
- * getdata.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* getdata.h
- *
- * tomislav uzelac Apr 1996
- */
-
-extern int decode_scalefactors(struct SIDE_INFO *info,struct AUDIO_HEADER *header,int gr,int ch);
-
-extern int is_max[21];
-extern int intensity_scale;
-
-#ifdef GETDATA
-
-static char t_slen1[16]={0,0,0,0,3,1,1,1,2,2,2,3,3,3,4,4};
-static char t_slen2[16]={0,1,2,3,0,1,2,3,1,2,3,1,2,3,2,3};
-
-int is_max[21]; /* the maximum value of is_pos. for short blocks is_max[sfb=0] == is_max[6],
- * it's sloppy but i'm sick of waisting storage. blaah...
- */
-int intensity_scale;
-
-int decode_scalefactors(struct SIDE_INFO *info,struct AUDIO_HEADER *header,int gr,int ch);
-
-/* my implementation of MPEG2 scalefactor decoding is, admitably, horrible
- * anyway, just take a look at pg.18 of MPEG2 specs, and you'll know what
- * this is all about
- */
-static const char spooky_table[2][3][3][4]={
-{
-{ {6,5,5,5}, {9,9,9,9}, {6,9,9,9} },
-{ {6,5,7,3}, {9,9,12,6}, {6,9,12,6}},
-{ {11,10,0,0}, {18,18,0,0}, {15,18,0,0}}
-},
-{
-{ {7,7,7,0}, {12,12,12,0}, {6,15,12,0}},
-{ {6,6,6,3}, {12,9,9,6}, {6,12,9,6}},
-{ {8,8,5,0}, {15,12,9,0}, {6,18,9,0}}
-}};
-
-#endif /* GETDATA */
diff --git a/Src/Sound/MPEG/huffman.cpp b/Src/Sound/MPEG/huffman.cpp
deleted file mode 100644
index b521ac7..0000000
--- a/Src/Sound/MPEG/huffman.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * huffman.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* huffman.c huffman decoding
- *
- * Created by: tomislav uzelac Mar,Apr 1996
- * Last modified by: tomislav uzelac Mar 8 97
- */
-#include
-#include "amp_audio.h"
-#include "getbits.h"
-
-#define HUFFMAN
-#include "huffman.h"
-
-#include "Supermodel.h"
-
-static inline unsigned int viewbits(int n)
-{
-unsigned int pos,ret_value;
-
- pos = ::data >> 3;
- ret_value = buffer[pos] << 24 |
- buffer[pos+1] << 16 |
- buffer[pos+2] << 8 |
- buffer[pos+3];
- ret_value <<= ::data & 7;
- ret_value >>= 32 - n;
-
- return ret_value;
-}
-
-static inline void sackbits(int n)
-{
- ::data += n;
- ::data &= 8*BUFFER_SIZE-1;
-}
-
-/* huffman_decode() is supposed to be faster now
- * decodes one codeword and returns no. of bits
- */
-static inline int huffman_decode(int tbl,int *x,int *y)
-{
-unsigned int chunk;
-register unsigned int *h_tab;
-register unsigned int lag;
-register unsigned int half_lag;
-int len;
-
- h_tab=tables[tbl];
- chunk=viewbits(19);
-
- h_tab += h_cue[tbl][chunk >> (19-NC_O)];
-
- len=(*h_tab>>8)&0x1f;
-
- /* check for an immediate hit, so we can decode those short codes very fast
- */
- if ((*h_tab>>(32-len)) != (chunk>>(19-len))) {
- if (chunk >> (19-NC_O) < N_CUE-1)
- lag=(h_cue[tbl][(chunk >> (19-NC_O))+1] -
- h_cue[tbl][chunk >> (19-NC_O)]);
- else {
- /* we strongly depend on h_cue[N_CUE-1] to point to
- * the last entry in the huffman table, so we should
- * not get here anyway. if it didn't, we'd have to
- * have another table with huffman tables lengths, and
- * it would be a mess. just in case, scream&shout.
- */
-
- ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__); // h_cue clobbered
- exit (-1);
- }
- chunk <<= 32-19;
- chunk |= 0x1ff;
-
- half_lag = lag >> 1;
-
- h_tab += half_lag;
- lag -= half_lag;
-
- while (lag > 1) {
- half_lag = lag >> 1;
-
- if (*h_tab < chunk)
- h_tab += half_lag;
- else
- h_tab -= half_lag;
-
- lag -= half_lag;
- }
-
- len=(*h_tab>>8)&0x1f;
- if ((*h_tab>>(32-len)) != (chunk>>(32-len))) {
- if (*h_tab > chunk)
- h_tab--;
- else
- h_tab++;
-
- len=(*h_tab>>8)&0x1f;
- }
- }
- sackbits(len);
- *x=(*h_tab>>4)&0xf;
- *y=*h_tab&0xf;
- return len;
-}
-
-static inline int _qsign(int x,int *q)
-{
-int ret_value=0,i;
- for (i=3;i>=0;i--)
- if ((x>>i) & 1) {
- if (getbits(1)) *q++=-1;
- else *q++=1;
- ret_value++;
- }
- else *q++=0;
- return ret_value;
-}
-
-int decode_huffman_data(struct SIDE_INFO *info,int gr,int ch,int ssize)
-{
-int l,i,cnt,x,y;
-int q[4],r[3],linbits[3],tr[4]={0,0,0,0};
-int big_value = info->big_values[gr][ch] << 1;
-
- for (l=0;l<3;l++) {
- tr[l]=info->table_select[gr][ch][l];
- linbits[l]=t_linbits[info->table_select[gr][ch][l]];
- }
-
- tr[3]=32+info->count1table_select[gr][ch];
-
- /* we have to be careful here because big_values are not necessarily
- * aligned with sfb boundaries
- */
- if (!info->window_switching_flag[gr][ch] && info->block_type[gr][ch]==0) {
-
- /* this code needed some cleanup
- */
- r[0]=t_l[info->region0_count[gr][ch]] + 1;
- if (r[0] > big_value)
- r[0]=r[1]=big_value;
- else {
- r[1]=t_l[ info->region0_count[gr][ch] + info->region1_count[gr][ch] + 1 ] + 1;
- if (r[1] > big_value)
- r[1]=big_value;
- }
- r[2]=big_value;
-
- } else {
-
- if (info->block_type[gr][ch]==2 && info->mixed_block_flag[gr][ch]==0)
- r[0]=3*(t_s[2]+1);
- else
- r[0]=t_l[7]+1;
-
- if (r[0] > big_value)
- r[0]=big_value;
-
- r[1]=r[2]=big_value;
- }
-
- l=0; cnt=0;
- for (i=0;i<3;i++) {
- for (;l0) {
- x+=getbits(j);
- cnt+=j;
- }
- if (x) {
- if (getbits(1)) x=-x;
- cnt++;
- }
- if (y==15 && j>0) {
- y+=getbits(j);
- cnt+=j;
- }
- if (y) {
- if (getbits(1)) y=-y;
- cnt++;
- }
-
- is[ch][l]=x;
- is[ch][l+1]=y;
- }
- }
- while ((cnt < info->part2_3_length[gr][ch]-ssize) && (l<576)) {
- cnt+=huffman_decode(tr[3],&x,&y);
- cnt+=_qsign(x,q);
- for (i=0;i<4;i++) is[ch][l+i]=q[i]; /* ziher je ziher, is[578]*/
- l+=4;
- }
-
- /* set position to start of the next gr/ch
- */
- if (cnt != info->part2_3_length[gr][ch] - ssize ) {
- ::data-=cnt-(info->part2_3_length[gr][ch] - ssize);
- ::data&= 8*BUFFER_SIZE - 1;
- }
- if (l<576) non_zero[ch]=l;
- else non_zero[ch]=576;
- /* zero out everything else
- */
- for (;l<576;l++) is[ch][l]=0;
- return 1;
-}
diff --git a/Src/Sound/MPEG/huffman.h b/Src/Sound/MPEG/huffman.h
deleted file mode 100644
index 0566f55..0000000
--- a/Src/Sound/MPEG/huffman.h
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * huffman.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* huffman.h
- *
- * Created by: tomislav uzelac Mar 1996
- * Last edited by: tomislav uzelac Mar 8 97
- */
-
-extern int decode_huffman_data(struct SIDE_INFO *info,int gr,int ch,int ssize);
-
-extern int non_zero[2];
-extern int t_linbits[32];
-
-#ifdef HUFFMAN
-
-static inline unsigned int viewbits(int n);
-static inline void sackbits(int n);
-static inline int huffman_decode(int tbl,int *x,int *y);
-static inline int _qsign(int x,int *q);
-int decode_huffman_data(struct SIDE_INFO *info,int gr,int ch,int ssize);
-
-int non_zero[2]; /* this is 2*bigvalues+4*count1, i guess...*/
-
-#define N_CUE 16
-#define NC_O 4
-
-int t_linbits[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13};
-
-/* these are the huffman tables, rearranged for lookup
-*/
-unsigned int h0[1]={0x0};
-unsigned int h1[4]={0x311, 0x20000301, 0x40000210, 0x80000100};
-unsigned int h2[9]={0x622, 0x4000602, 0x8000512, 0x10000521, 0x18000520, 0x20000311, 0x40000301, 0x60000310,
- 0x80000100};
-unsigned int h3[9]={ 0x622, 0x4000602, 0x8000512, 0x10000521, 0x18000520, 0x20000310, 0x40000211, 0x80000201,
- 0xc0000200};
-unsigned int h5[16]={0x833, 0x1000823, 0x2000732, 0x4000631, 0x8000713, 0xa000703, 0xc000730, 0xe000722,
- 0x10000612, 0x14000621, 0x18000602, 0x1c000620, 0x20000311, 0x40000301, 0x60000310, 0x80000100};
-unsigned int h6[16]={0x733, 0x2000703, 0x4000623, 0x8000632, 0xc000630, 0x10000513, 0x18000531, 0x20000522,
- 0x28000502, 0x30000412, 0x40000421, 0x50000420, 0x60000301, 0x80000211, 0xc0000310, 0xe0000300};
-unsigned int h7[36]={ 0xa55, 0x400a45, 0x800a54, 0xc00a53, 0x1000935, 0x1800944, 0x2000925, 0x2800952,
- 0x3000815, 0x4000851, 0x5000905, 0x5800934, 0x6000850, 0x7000943, 0x7800933, 0x8000824,
- 0x9000842, 0xa000714, 0xc000741, 0xe000740, 0x10000804, 0x11000823, 0x12000832, 0x13000803,
- 0x14000713, 0x16000731, 0x18000730, 0x1a000722, 0x1c000612, 0x20000521, 0x28000602, 0x2c000620,
- 0x30000411, 0x40000301, 0x60000310, 0x80000100};
-unsigned int h8[36]={0xb55, 0x200b54, 0x400a45, 0x800953, 0x1000a35, 0x1400a44, 0x1800925, 0x2000952,
- 0x2800905, 0x3000815, 0x4000851, 0x5000934, 0x5800943, 0x6000950, 0x6800933, 0x7000824,
- 0x8000842, 0x9000814, 0xa000741, 0xc000804, 0xd000840, 0xe000823, 0xf000832, 0x10000813,
- 0x11000831, 0x12000803, 0x13000830, 0x14000622, 0x18000602, 0x1c000620, 0x20000412, 0x30000421,
- 0x40000211, 0x80000301, 0xa0000310, 0xc0000200};
-unsigned int h9[36]={ 0x955, 0x800945, 0x1000835, 0x2000853, 0x3000954, 0x3800905, 0x4000844, 0x5000825,
- 0x6000852, 0x7000815, 0x8000751, 0xa000734, 0xc000743, 0xe000850, 0xf000804, 0x10000724,
- 0x12000742, 0x14000733, 0x16000740, 0x18000614, 0x1c000641, 0x20000623, 0x24000632, 0x28000513,
- 0x30000531, 0x38000603, 0x3c000630, 0x40000522, 0x48000502, 0x50000412, 0x60000421, 0x70000420,
- 0x80000311, 0xa0000301, 0xc0000310, 0xe0000300};
-unsigned int h10[64]={ 0xb77, 0x200b67, 0x400b76, 0x600b57, 0x800b75, 0xa00b66, 0xc00a47, 0x1000a74,
- 0x1400a56, 0x1800a65, 0x1c00a37, 0x2000a73, 0x2400a46, 0x2800b55, 0x2a00b54, 0x2c00a63,
- 0x3000927, 0x3800972, 0x4000a64, 0x4400a07, 0x4800970, 0x5000962, 0x5800a45, 0x5c00a35,
- 0x6000906, 0x6800a53, 0x6c00a44, 0x7000817, 0x8000871, 0x9000936, 0x9800926, 0xa000a25,
- 0xa400a52, 0xa800915, 0xb000951, 0xb800a34, 0xbc00a43, 0xc000816, 0xd000861, 0xe000860,
- 0xf000905, 0xf800950, 0x10000924, 0x10800942, 0x11000933, 0x11800904, 0x12000814, 0x13000841,
- 0x14000840, 0x15000823, 0x16000832, 0x17000803, 0x18000713, 0x1a000731, 0x1c000730, 0x1e000722,
- 0x20000612, 0x24000621, 0x28000602, 0x2c000620, 0x30000411, 0x40000301, 0x60000310, 0x80000100};
-unsigned int h11[64]={ 0xa77, 0x400a67, 0x800a76, 0xc00a75, 0x1000a66, 0x1400a47, 0x1800a74, 0x1c00b57,
- 0x1e00b55, 0x2000a56, 0x2400a65, 0x2800937, 0x3000973, 0x3800946, 0x4000a45, 0x4400a54,
- 0x4800a35, 0x4c00a53, 0x5000827, 0x6000872, 0x7000964, 0x7800907, 0x8000771, 0xa000817,
- 0xb000870, 0xc000836, 0xd000863, 0xe000860, 0xf000944, 0xf800925, 0x10000952, 0x10800905,
- 0x11000815, 0x12000762, 0x14000826, 0x15000806, 0x16000716, 0x18000761, 0x1a000851, 0x1b000834,
- 0x1c000850, 0x1d000943, 0x1d800933, 0x1e000824, 0x1f000842, 0x20000814, 0x21000841, 0x22000804,
- 0x23000840, 0x24000723, 0x26000732, 0x28000613, 0x2c000631, 0x30000703, 0x32000730, 0x34000622,
- 0x38000521, 0x40000412, 0x50000502, 0x58000520, 0x60000311, 0x80000301, 0xa0000310, 0xc0000200};
-unsigned int h12[64]={ 0xa77, 0x400a67, 0x800976, 0x1000957, 0x1800975, 0x2000966, 0x2800947, 0x3000974,
- 0x3800965, 0x4000856, 0x5000837, 0x6000973, 0x6800955, 0x7000827, 0x8000872, 0x9000846,
- 0xa000864, 0xb000817, 0xc000871, 0xd000907, 0xd800970, 0xe000836, 0xf000863, 0x10000845,
- 0x11000854, 0x12000844, 0x13000906, 0x13800905, 0x14000726, 0x16000762, 0x18000761, 0x1a000816,
- 0x1b000860, 0x1c000835, 0x1d000853, 0x1e000825, 0x1f000852, 0x20000715, 0x22000751, 0x24000734,
- 0x26000743, 0x28000850, 0x29000804, 0x2a000724, 0x2c000742, 0x2e000714, 0x30000633, 0x34000641,
- 0x38000623, 0x3c000632, 0x40000740, 0x42000703, 0x44000630, 0x48000513, 0x50000531, 0x58000522,
- 0x60000412, 0x70000421, 0x80000502, 0x88000520, 0x90000400, 0xa0000311, 0xc0000301, 0xe0000310};
-unsigned int h13[256]={
- 0x13fe, 0x33fc, 0x52fd, 0x91ed, 0x110ff, 0x210ef, 0x310df, 0x410ee,
- 0x510cf, 0x610de, 0x710bf, 0x810fb, 0x910ce, 0xa10dc, 0xb11af, 0xb91e9,
- 0xc0fec, 0xe0fdd, 0x1010fa, 0x1110cd, 0x120fbe, 0x140feb, 0x160f9f, 0x180ff9,
- 0x1a0fea, 0x1c0fbd, 0x1e0fdb, 0x200f8f, 0x220ff8, 0x240fcc, 0x2610ae, 0x27109e,
- 0x280f8e, 0x2a107f, 0x2b107e, 0x2c0ef7, 0x300eda, 0x340fad, 0x360fbc, 0x380fcb,
- 0x3a0ff6, 0x3c0e6f, 0x400ee8, 0x440e5f, 0x480e9d, 0x4c0ed9, 0x500ef5, 0x540ee7,
- 0x580eac, 0x5c0ebb, 0x600e4f, 0x640ef4, 0x680fca, 0x6a0fe6, 0x6c0ef3, 0x700d3f,
- 0x780e8d, 0x7c0ed8, 0x800d2f, 0x880df2, 0x900e6e, 0x940e9c, 0x980d0f, 0xa00ec9,
- 0xa40e5e, 0xa80dab, 0xb00e7d, 0xb40ed7, 0xb80d4e, 0xc00ec8, 0xc40ed6, 0xc80d3e,
- 0xd00db9, 0xd80e9b, 0xdc0eaa, 0xe00c1f, 0xf00cf1, 0x1000cf0, 0x1100dba, 0x1180de5,
- 0x1200de4, 0x1280d8c, 0x1300d6d, 0x1380de3, 0x1400ce2, 0x1500d2e, 0x1580d0e, 0x1600c1e,
- 0x1700ce1, 0x1800de0, 0x1880d5d, 0x1900dd5, 0x1980d7c, 0x1a00dc7, 0x1a80d4d, 0x1b00d8b,
- 0x1b80db8, 0x1c00dd4, 0x1c80d9a, 0x1d00da9, 0x1d80d6c, 0x1e00cc6, 0x1f00c3d, 0x2000dd3,
- 0x2080d7b, 0x2100c2d, 0x2200cd2, 0x2300c1d, 0x2400cb7, 0x2500d5c, 0x2580dc5, 0x2600d99,
- 0x2680d7a, 0x2700cc3, 0x2800da7, 0x2880d97, 0x2900c4b, 0x2a00bd1, 0x2c00c0d, 0x2d00cd0,
- 0x2e00c8a, 0x2f00ca8, 0x3000c4c, 0x3100cc4, 0x3200c6b, 0x3300cb6, 0x3400b3c, 0x3600b2c,
- 0x3800bc2, 0x3a00b5b, 0x3c00cb5, 0x3d00c89, 0x3e00b1c, 0x4000bc1, 0x4200c98, 0x4300c0c,
- 0x4400bc0, 0x4600cb4, 0x4700c6a, 0x4800ca6, 0x4900c79, 0x4a00b3b, 0x4c00bb3, 0x4e00c88,
- 0x4f00c5a, 0x5000b2b, 0x5200ca5, 0x5300c69, 0x5400ba4, 0x5600c78, 0x5700c87, 0x5800b94,
- 0x5a00c77, 0x5b00c76, 0x5c00ab2, 0x6000a1b, 0x6400ab1, 0x6800b0b, 0x6a00bb0, 0x6c00b96,
- 0x6e00b4a, 0x7000b3a, 0x7200ba3, 0x7400b59, 0x7600b95, 0x7800a2a, 0x7c00aa2, 0x8000a1a,
- 0x8400aa1, 0x8800b0a, 0x8a00b68, 0x8c00aa0, 0x9000b86, 0x9200b49, 0x9400a93, 0x9800b39,
- 0x9a00b58, 0x9c00b85, 0x9e00b67, 0xa000a29, 0xa400a92, 0xa800b57, 0xaa00b75, 0xac00a38,
- 0xb000a83, 0xb400b66, 0xb600b47, 0xb800b74, 0xba00b56, 0xbc00b65, 0xbe00b73, 0xc000919,
- 0xc800991, 0xd000a09, 0xd400a90, 0xd800a48, 0xdc00a84, 0xe000a72, 0xe400b46, 0xe600b64,
- 0xe800928, 0xf000982, 0xf800918, 0x10000a37, 0x10400a27, 0x10800917, 0x11000971, 0x11800a55,
- 0x11c00a07, 0x12000a70, 0x12400a36, 0x12800a63, 0x12c00a45, 0x13000a54, 0x13400a26, 0x13800a62,
- 0x13c00a35, 0x14000881, 0x15000908, 0x15800980, 0x16000916, 0x16800961, 0x17000906, 0x17800960,
- 0x18000a53, 0x18400a44, 0x18800925, 0x19000952, 0x19800905, 0x1a000815, 0x1b000851, 0x1c000934,
- 0x1c800943, 0x1d000950, 0x1d800924, 0x1e000942, 0x1e800933, 0x1f000814, 0x20000741, 0x22000804,
- 0x23000840, 0x24000823, 0x25000832, 0x26000713, 0x28000731, 0x2a000703, 0x2c000730, 0x2e000722,
- 0x30000612, 0x34000621, 0x38000602, 0x3c000620, 0x40000411, 0x50000401, 0x60000310, 0x80000100};
-unsigned int h15[256]={ 0xdff, 0x80def, 0x100dfe, 0x180ddf, 0x200cee, 0x300dfd, 0x380dcf, 0x400dfc,
- 0x480dde, 0x500ded, 0x580dbf, 0x600cfb, 0x700dce, 0x780dec, 0x800cdd, 0x900caf,
- 0xa00cfa, 0xb00cbe, 0xc00ceb, 0xd00ccd, 0xe00cdc, 0xf00c9f, 0x1000cf9, 0x1100cea,
- 0x1200cbd, 0x1300cdb, 0x1400c8f, 0x1500cf8, 0x1600ccc, 0x1700c9e, 0x1800ce9, 0x1900c7f,
- 0x1a00cf7, 0x1b00cad, 0x1c00cda, 0x1d00cbc, 0x1e00c6f, 0x1f00dae, 0x1f80d0f, 0x2000bcb,
- 0x2200bf6, 0x2400c8e, 0x2500ce8, 0x2600c5f, 0x2700c9d, 0x2800bf5, 0x2a00b7e, 0x2c00be7,
- 0x2e00bac, 0x3000bca, 0x3200bbb, 0x3400cd9, 0x3500c8d, 0x3600b4f, 0x3800bf4, 0x3a00b3f,
- 0x3c00bf3, 0x3e00bd8, 0x4000be6, 0x4200b2f, 0x4400bf2, 0x4600c6e, 0x4700cf0, 0x4800b1f,
- 0x4a00bf1, 0x4c00b9c, 0x4e00bc9, 0x5000b5e, 0x5200bab, 0x5400bba, 0x5600be5, 0x5800b7d,
- 0x5a00bd7, 0x5c00b4e, 0x5e00be4, 0x6000b8c, 0x6200bc8, 0x6400b3e, 0x6600b6d, 0x6800bd6,
- 0x6a00be3, 0x6c00b9b, 0x6e00bb9, 0x7000b2e, 0x7200baa, 0x7400be2, 0x7600b1e, 0x7800be1,
- 0x7a00c0e, 0x7b00ce0, 0x7c00b5d, 0x7e00bd5, 0x8000b7c, 0x8200bc7, 0x8400b4d, 0x8600b8b,
- 0x8800ad4, 0x8c00bb8, 0x8e00b9a, 0x9000ba9, 0x9200b6c, 0x9400bc6, 0x9600b3d, 0x9800ad3,
- 0x9c00ad2, 0xa000b2d, 0xa200b0d, 0xa400a1d, 0xa800a7b, 0xac00ab7, 0xb000ad1, 0xb400b5c,
- 0xb600bd0, 0xb800ac5, 0xbc00a8a, 0xc000aa8, 0xc400a4c, 0xc800ac4, 0xcc00a6b, 0xd000ab6,
- 0xd400b99, 0xd600b0c, 0xd800a3c, 0xdc00ac3, 0xe000a7a, 0xe400aa7, 0xe800aa6, 0xec00bc0,
- 0xee00b0b, 0xf0009c2, 0xf800a2c, 0xfc00a5b, 0x10000ab5, 0x10400a1c, 0x10800a89, 0x10c00a98,
- 0x11000ac1, 0x11400a4b, 0x11800ab4, 0x11c00a6a, 0x12000a3b, 0x12400a79, 0x128009b3, 0x13000a97,
- 0x13400a88, 0x13800a2b, 0x13c00a5a, 0x140009b2, 0x14800aa5, 0x14c00a1b, 0x150009b1, 0x15800ab0,
- 0x15c00a69, 0x16000a96, 0x16400a4a, 0x16800aa4, 0x16c00a78, 0x17000a87, 0x17400a3a, 0x178009a3,
- 0x18000959, 0x18800995, 0x1900092a, 0x198009a2, 0x1a00091a, 0x1a8009a1, 0x1b000a0a, 0x1b400aa0,
- 0x1b800968, 0x1c000986, 0x1c800949, 0x1d000994, 0x1d800939, 0x1e000993, 0x1e800a77, 0x1ec00a09,
- 0x1f000958, 0x1f800985, 0x20000929, 0x20800967, 0x21000976, 0x21800992, 0x22000891, 0x23000919,
- 0x23800990, 0x24000948, 0x24800984, 0x25000957, 0x25800975, 0x26000938, 0x26800983, 0x27000966,
- 0x27800947, 0x28000828, 0x29000882, 0x2a000818, 0x2b000881, 0x2c000974, 0x2c800908, 0x2d000980,
- 0x2d800956, 0x2e000965, 0x2e800937, 0x2f000973, 0x2f800946, 0x30000827, 0x31000872, 0x32000864,
- 0x33000817, 0x34000855, 0x35000871, 0x36000907, 0x36800970, 0x37000836, 0x38000863, 0x39000845,
- 0x3a000854, 0x3b000826, 0x3c000862, 0x3d000816, 0x3e000906, 0x3e800960, 0x3f000835, 0x40000761,
- 0x42000853, 0x43000844, 0x44000725, 0x46000752, 0x48000715, 0x4a000751, 0x4c000805, 0x4d000850,
- 0x4e000734, 0x50000743, 0x52000724, 0x54000742, 0x56000733, 0x58000641, 0x5c000714, 0x5e000704,
- 0x60000623, 0x64000632, 0x68000740, 0x6a000703, 0x6c000613, 0x70000631, 0x74000630, 0x78000522,
- 0x80000512, 0x88000521, 0x90000502, 0x98000520, 0xa0000311, 0xc0000401, 0xd0000410, 0xe0000300};
-unsigned int h16[256]={ 0xbef, 0x200bfe, 0x400bdf, 0x600bfd, 0x800bcf, 0xa00bfc, 0xc00bbf, 0xe00bfb,
- 0x1000aaf, 0x1400bfa, 0x1600b9f, 0x1800bf9, 0x1a00bf8, 0x1c00a8f, 0x2000a7f, 0x2400af7,
- 0x2800a6f, 0x2c00af6, 0x30008ff, 0x4000a5f, 0x4400af5, 0x480094f, 0x50009f4, 0x58009f3,
- 0x60009f0, 0x6800a3f, 0x6c010ce, 0x6c111ec, 0x6c191dd, 0x6c20fde, 0x6c40fe9, 0x6c610ea,
- 0x6c710d9, 0x6c80eee, 0x6cc0fed, 0x6ce0feb, 0x6d00ebe, 0x6d40ecd, 0x6d80fdc, 0x6da0fdb,
- 0x6dc0eae, 0x6e00ecc, 0x6e40fad, 0x6e60fda, 0x6e80f7e, 0x6ea0fac, 0x6ec0eca, 0x6f00fc9,
- 0x6f20f7d, 0x6f40e5e, 0x6f80dbd, 0x70008f2, 0x800092f, 0x880090f, 0x900081f, 0xa0008f1,
- 0xb000d9e, 0xb080ebc, 0xb0c0ecb, 0xb100e8e, 0xb140ee8, 0xb180e9d, 0xb1c0ee7, 0xb200ebb,
- 0xb240e8d, 0xb280ed8, 0xb2c0e6e, 0xb300de6, 0xb380d9c, 0xb400eab, 0xb440eba, 0xb480ee5,
- 0xb4c0ed7, 0xb500d4e, 0xb580ee4, 0xb5c0e8c, 0xb600dc8, 0xb680d3e, 0xb700d6d, 0xb780ed6,
- 0xb7c0e9b, 0xb800eb9, 0xb840eaa, 0xb880de1, 0xb900dd4, 0xb980eb8, 0xb9c0ea9, 0xba00d7b,
- 0xba80eb7, 0xbac0ed0, 0xbb00ce3, 0xbc00d0e, 0xbc80de0, 0xbd00d5d, 0xbd80dd5, 0xbe00d7c,
- 0xbe80dc7, 0xbf00d4d, 0xbf80d8b, 0xc000d9a, 0xc080d6c, 0xc100dc6, 0xc180d3d, 0xc200d5c,
- 0xc280dc5, 0xc300c0d, 0xc400d8a, 0xc480da8, 0xc500d99, 0xc580d4c, 0xc600db6, 0xc680d7a,
- 0xc700c3c, 0xc800d5b, 0xc880d89, 0xc900c1c, 0xca00cc0, 0xcb00d98, 0xcb80d79, 0xcc00be2,
- 0xce00c2e, 0xcf00c1e, 0xd000cd3, 0xd100c2d, 0xd200cd2, 0xd300cd1, 0xd400c3b, 0xd500d97,
- 0xd580d88, 0xd600b1d, 0xd800cc4, 0xd900c6b, 0xda00cc3, 0xdb00ca7, 0xdc00b2c, 0xde00cc2,
- 0xdf00cb5, 0xe000cc1, 0xe100c0c, 0xe200c4b, 0xe300cb4, 0xe400c6a, 0xe500ca6, 0xe600bb3,
- 0xe800c5a, 0xe900ca5, 0xea00b2b, 0xec00bb2, 0xee00b1b, 0xf000bb1, 0xf200c0b, 0xf300cb0,
- 0xf400c69, 0xf500c96, 0xf600c4a, 0xf700ca4, 0xf800c78, 0xf900c87, 0xfa00ba3, 0xfc00c3a,
- 0xfd00c59, 0xfe00b2a, 0x10000c95, 0x10100c68, 0x10200ba1, 0x10400c86, 0x10500c77, 0x10600b94,
- 0x10800c49, 0x10900c57, 0x10a00b67, 0x10c00aa2, 0x11000a1a, 0x11400b0a, 0x11600ba0, 0x11800b39,
- 0x11a00b93, 0x11c00b58, 0x11e00b85, 0x12000a29, 0x12400a92, 0x12800b76, 0x12a00b09, 0x12c00a19,
- 0x13000a91, 0x13400b90, 0x13600b48, 0x13800b84, 0x13a00b75, 0x13c00b38, 0x13e00b83, 0x14000b66,
- 0x14200b28, 0x14400a82, 0x14800b47, 0x14a00b74, 0x14c00a18, 0x15000a81, 0x15400a80, 0x15800b08,
- 0x15a00b56, 0x15c00a37, 0x16000a73, 0x16400b65, 0x16600b46, 0x16800a27, 0x16c00a72, 0x17000b64,
- 0x17200b55, 0x17400a07, 0x17800917, 0x18000971, 0x18800a70, 0x18c00a36, 0x19000a63, 0x19400a45,
- 0x19800a54, 0x19c00a26, 0x1a000962, 0x1a800916, 0x1b000961, 0x1b800a06, 0x1bc00a60, 0x1c000953,
- 0x1c800a35, 0x1cc00a44, 0x1d000925, 0x1d800952, 0x1e000851, 0x1f000915, 0x1f800905, 0x20000934,
- 0x20800943, 0x21000950, 0x21800924, 0x22000942, 0x22800933, 0x23000814, 0x24000841, 0x25000904,
- 0x25800940, 0x26000823, 0x27000832, 0x28000713, 0x2a000731, 0x2c000803, 0x2d000830, 0x2e000722,
- 0x30000612, 0x34000621, 0x38000602, 0x3c000620, 0x40000411, 0x50000401, 0x60000310, 0x80000100};
-unsigned int h24[256]={ 0x8ef, 0x10008fe, 0x20008df, 0x30008fd, 0x40008cf, 0x50008fc, 0x60008bf, 0x70008fb,
- 0x80007fa, 0xa0008af, 0xb00089f, 0xc0007f9, 0xe0007f8, 0x1000088f, 0x1100087f, 0x120007f7,
- 0x1400076f, 0x160007f6, 0x1800075f, 0x1a0007f5, 0x1c00074f, 0x1e0007f4, 0x2000073f, 0x220007f3,
- 0x2400072f, 0x260007f2, 0x280007f1, 0x2a00081f, 0x2b0008f0, 0x2c00090f, 0x2c800bee, 0x2ca00bde,
- 0x2cc00bed, 0x2ce00bce, 0x2d000bec, 0x2d200bdd, 0x2d400bbe, 0x2d600beb, 0x2d800bcd, 0x2da00bdc,
- 0x2dc00bae, 0x2de00bea, 0x2e000bbd, 0x2e200bdb, 0x2e400bcc, 0x2e600b9e, 0x2e800be9, 0x2ea00bad,
- 0x2ec00bda, 0x2ee00bbc, 0x2f000bcb, 0x2f200b8e, 0x2f400be8, 0x2f600b9d, 0x2f800bd9, 0x2fa00b7e,
- 0x2fc00be7, 0x2fe00bac, 0x300004ff, 0x40000bca, 0x40200bbb, 0x40400b8d, 0x40600bd8, 0x40800c0e,
- 0x40900ce0, 0x40a00b0d, 0x40c00ae6, 0x41000b6e, 0x41200b9c, 0x41400ac9, 0x41800a5e, 0x41c00aba,
- 0x42000ae5, 0x42400bab, 0x42600b7d, 0x42800ad7, 0x42c00ae4, 0x43000a8c, 0x43400ac8, 0x43800b4e,
- 0x43a00b2e, 0x43c00a3e, 0x44000a6d, 0x44400ad6, 0x44800ae3, 0x44c00a9b, 0x45000ab9, 0x45400aaa,
- 0x45800ae2, 0x45c00a1e, 0x46000ae1, 0x46400a5d, 0x46800ad5, 0x46c00a7c, 0x47000ac7, 0x47400a4d,
- 0x47800a8b, 0x47c00ab8, 0x48000ad4, 0x48400a9a, 0x48800aa9, 0x48c00a6c, 0x49000ac6, 0x49400a3d,
- 0x49800ad3, 0x49c00a2d, 0x4a000ad2, 0x4a400a1d, 0x4a800a7b, 0x4ac00ab7, 0x4b000ad1, 0x4b400a5c,
- 0x4b800ac5, 0x4bc00a8a, 0x4c000aa8, 0x4c400a99, 0x4c800a4c, 0x4cc00ac4, 0x4d000a6b, 0x4d400ab6,
- 0x4d800bd0, 0x4da00b0c, 0x4dc00a3c, 0x4e000ac3, 0x4e400a7a, 0x4e800aa7, 0x4ec00a2c, 0x4f000ac2,
- 0x4f400a5b, 0x4f800ab5, 0x4fc00a1c, 0x50000a89, 0x50400a98, 0x50800ac1, 0x50c00a4b, 0x51000bc0,
- 0x51200b0b, 0x51400a3b, 0x51800bb0, 0x51a00b0a, 0x51c00a1a, 0x520009b4, 0x52800a6a, 0x52c00aa6,
- 0x53000a79, 0x53400a97, 0x53800ba0, 0x53a00b09, 0x53c00a90, 0x540009b3, 0x54800988, 0x55000a2b,
- 0x55400a5a, 0x558009b2, 0x56000aa5, 0x56400a1b, 0x56800ab1, 0x56c00a69, 0x57000996, 0x578009a4,
- 0x58000a4a, 0x58400a78, 0x58800987, 0x5900093a, 0x598009a3, 0x5a000959, 0x5a800995, 0x5b00092a,
- 0x5b8009a2, 0x5c0009a1, 0x5c800968, 0x5d000986, 0x5d800977, 0x5e000949, 0x5e800994, 0x5f000939,
- 0x5f800993, 0x60000958, 0x60800985, 0x61000929, 0x61800967, 0x62000976, 0x62800992, 0x63000919,
- 0x63800991, 0x64000948, 0x64800984, 0x65000957, 0x65800975, 0x66000938, 0x66800983, 0x67000966,
- 0x67800928, 0x68000982, 0x68800918, 0x69000947, 0x69800974, 0x6a000981, 0x6a800a08, 0x6ac00a80,
- 0x6b000956, 0x6b800965, 0x6c000917, 0x6c800a07, 0x6cc00a70, 0x6d000873, 0x6e000937, 0x6e800927,
- 0x6f000872, 0x70000846, 0x71000864, 0x72000855, 0x73000871, 0x74000836, 0x75000863, 0x76000845,
- 0x77000854, 0x78000826, 0x79000862, 0x7a000816, 0x7b000861, 0x7c000906, 0x7c800960, 0x7d000835,
- 0x7e000853, 0x7f000844, 0x80000825, 0x81000852, 0x82000815, 0x83000905, 0x83800950, 0x84000751,
- 0x86000834, 0x87000843, 0x88000724, 0x8a000742, 0x8c000733, 0x8e000714, 0x90000741, 0x92000804,
- 0x93000840, 0x94000723, 0x96000732, 0x98000613, 0x9c000631, 0xa0000703, 0xa2000730, 0xa4000622,
- 0xa8000512, 0xb0000521, 0xb8000602, 0xbc000620, 0xc0000411, 0xd0000401, 0xe0000410, 0xf0000400};
-unsigned int hA[16]={ 0x6b0, 0x40006f0, 0x80006d0, 0xc0006e0, 0x10000670, 0x14000650, 0x18000590, 0x20000560,
- 0x28000530, 0x300005a0, 0x380005c0, 0x40000420, 0x50000410, 0x60000440, 0x70000480, 0x80000100};
-unsigned int hB[16]={ 0x4f0, 0x100004e0, 0x200004d0, 0x300004c0, 0x400004b0, 0x500004a0, 0x60000490, 0x70000480,
- 0x80000470, 0x90000460, 0xa0000450, 0xb0000440, 0xc0000430, 0xd0000420, 0xe0000410, 0xf0000400};
-
-/* now the cues, remember to change these tables if you change N_CUE
-*/
-unsigned char h_cue[34][N_CUE]={
-{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
-{0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3},
-{0,3,5,5,6,6,7,7,8,8,8,8,8,8,8,8},
-{0,3,5,5,6,6,6,6,7,7,7,7,8,8,8,8},
-{0,8,12,12,13,13,14,14,15,15,15,15,15,15,15,15},
-{0,8,12,12,13,13,14,14,15,15,15,15,15,15,15,15},
-{0,5,7,9,10,11,12,12,13,13,13,13,14,14,15,15},
-{0,20,29,32,33,33,34,34,35,35,35,35,35,35,35,35},
-{0,23,30,31,32,32,32,32,33,33,34,34,35,35,35,35},
-{0,15,21,24,27,29,30,31,32,32,33,33,34,34,35,35},
-{0,42,56,60,61,61,62,62,63,63,63,63,63,63,63,63},
-{0,30,45,53,57,58,60,60,61,61,62,62,63,63,63,63},
-{0,23,37,46,50,54,56,57,58,60,61,61,62,62,63,63},
-{0,203,238,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,132,178,205,223,233,240,245,248,250,252,252,253,254,255,255},
-{0,132,178,205,223,233,240,245,248,250,252,252,253,254,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,162,231,248,252,253,254,254,255,255,255,255,255,255,255,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,13,22,58,59,131,177,209,226,238,245,249,252,253,254,255},
-{0,4,7,9,11,12,13,14,15,15,15,15,15,15,15,15},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
-};
-
-/* h4->h5, h14->h15 as suggested by Fraunhofer
- * tomislav Aug 21 1997
- */
-unsigned int *tables[34]={h0,h1,h2,h3,h5,h5,h6,h7,h8,h9,h10,h11,h12,h13,h15,h15,
- h16,h16,h16,h16,h16,h16,h16,h16,h24,h24,h24,h24,h24,h24,h24,h24,hA,hB};
-#endif /* HUFFMAN */
diff --git a/Src/Sound/MPEG/layer2.cpp b/Src/Sound/MPEG/layer2.cpp
deleted file mode 100644
index e06e4ef..0000000
--- a/Src/Sound/MPEG/layer2.cpp
+++ /dev/null
@@ -1,354 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * layer2.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* layer2.c MPEG audio layer2 support
- *
- * Created by: Tomislav Uzelac Mar 1996
- * merged with amp, May 19 1997
- */
-#include "amp.h"
-#include "amp_audio.h"
-#include "getbits.h"
-#include "transform.h"
-
-#define LAYER2
-#include "layer2.h"
-
-#include "Supermodel.h"
-
-int layer2_frame(struct AUDIO_HEADER *header,int cnt)
-{
-int i,s,sb,ch,gr,bitrate,bound=0;
-char (*nbal)[],(*bit_alloc_index)[][16];
-unsigned char allocation[2][32];
-unsigned char scfsi[2][32];
-float scalefactor[2][32][3];
-float subband_sample[2][32][36];
-int sblimit,nlevels,grouping;
-
-float c,d;
-int no_of_bits,mpi;
-unsigned short sb_sample_buf[3];
-
-int hsize,fs,mean_frame_size;
-
- bit_alloc_index=(char (*)[][16])&t_alloc0;
- nbal=(char (*)[])&t_nbal0; // shut up compiler
- sblimit = 0;
-
- hsize=4;
- if (header->protection_bit==0) hsize+=2;
-
- bitrate=t_bitrate[header->ID][3-header->layer][header->bitrate_index];
- fs=t_sampling_frequency[header->ID][header->sampling_frequency];
- if (header->ID) mean_frame_size=144000*bitrate/fs;
- else mean_frame_size=72000*bitrate/fs;
-
- /* layers 1 and 2 do not have a 'bit reservoir'
- */
- append=::data=0;
-
- fillbfr(mean_frame_size + header->padding_bit - hsize);
-
- switch (header->mode)
- {
- case 0 :
- case 2 : nch=2; bound=32; bitrate=bitrate/2;
- break;
- case 3 : nch=1; bound=32;
- break;
- case 1 : nch=2; bitrate=bitrate/2; bound=(header->mode_extension+1)*4;
- }
-
- if (header->ID==1) switch (header->sampling_frequency) {
- case 0 : switch (bitrate) /* 0 = 44.1 kHz */
- {
- case 56 :
- case 64 :
- case 80 : bit_alloc_index=(char (*)[][16])&t_alloc0;
- nbal=(char (*)[])&t_nbal0;
- sblimit=27;
- break;
- case 96 :
- case 112 :
- case 128 :
- case 160 :
- case 192 : bit_alloc_index=(char (*)[][16])&t_alloc1;
- nbal=(char (*)[])&t_nbal1;
- sblimit=30;
- break;
- case 32 :
- case 48 : bit_alloc_index=(char (*)[][16])&t_alloc2;
- nbal=(char (*)[])&t_nbal2;
- sblimit=8;
- break;
- default : ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- }
- break;
- case 1 : switch (bitrate) /* 1 = 48 kHz */
- {
- case 56 :
- case 64 :
- case 80 :
- case 96 :
- case 112 :
- case 128 :
- case 160 :
- case 192 : bit_alloc_index=(char (*)[][16])&t_alloc0;
- nbal=(char (*)[])&t_nbal0;
- sblimit=27;
- break;
- case 32 :
- case 48 : bit_alloc_index=(char (*)[][16])&t_alloc2;
- nbal=(char (*)[])&t_nbal2;
- sblimit=8;
- break;
- default : ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- }
- break;
- case 2 : switch (bitrate) /* 2 = 32 kHz */
- {
- case 56 :
- case 64 :
- case 80 : bit_alloc_index=(char (*)[][16])&t_alloc0;
- nbal=(char (*)[])&t_nbal0;
- sblimit=27;
- break;
- case 96 :
- case 112 :
- case 128 :
- case 160 :
- case 192 : bit_alloc_index=(char (*)[][16])&t_alloc1;
- nbal=(char (*)[])&t_nbal1;
- sblimit=30;
- break;
- case 32 :
- case 48 : bit_alloc_index=(char (*)[][16])&t_alloc3;
- nbal=(char (*)[])&t_nbal3;
- sblimit=12;
- break;
- default : ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__);
- }
- break;
- default : ErrorLog("Internal error in MPEG decoder (%s:%d).", __FILE__, __LINE__); // sampling frequency no good
- } else {
- bit_alloc_index=(char (*)[][16])&t_allocMPG2;
- nbal=(char (*)[])&t_nbalMPG2;
- sblimit=30;
- }
-
-/*
- * bit allocation per subband per channel decoding *****************************
- */
-
- if (bound==32) bound=sblimit; /* bound=32 means there is no intensity stereo */
-
- for (sb=0;sb>2];
- }
- }
- } else
- for (s=0;s<3;s++) subband_sample[ch][sb][3*gr+s]=0;
-
-
- /*
- * joint stereo ********************************************
- */
-
- for (sb=bound;sb>2];
- }
- }
-
- } else for (s=0;s<3;s++) {
- subband_sample[0][sb][3*gr+s]=0;
- subband_sample[1][sb][3*gr+s]=0;
- }
-
- /*
- * the rest *******************************************
- */
- for (sb=sblimit;sb<32;sb++)
- for (ch=0;chmode!=3) {
- for (ch=0;chmode!=3) nch=2;
-
- return 0;
-}
-/****************************************************************************/
-/****************************************************************************/
-
-void convert_samplecode(unsigned int samplecode,unsigned int nlevels,unsigned short* sb_sample_buf)
-{
-int i;
-
- for (i=0;i<3;i++) {
- *sb_sample_buf=samplecode%nlevels;
- samplecode=samplecode/nlevels;
- sb_sample_buf++;
- }
-}
-
-float requantize_sample(unsigned short s4,unsigned short nlevels,float c,float d,float factor)
-{
-register float s,s2,s3;
-s3=(float) (-1.0+s4*2.0/(nlevels+1));
-s2=c*(s3+d);
-s=factor*s2;
-return s;
-}
diff --git a/Src/Sound/MPEG/layer2.h b/Src/Sound/MPEG/layer2.h
deleted file mode 100644
index 3972401..0000000
--- a/Src/Sound/MPEG/layer2.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * layer2.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-/* layer2.h
- * Tomislav Uzelac - cca. Feb 1996
- */
-
-
-extern int layer2_frame(struct AUDIO_HEADER *header,int cnt);
-
-#ifdef LAYER2
-
-int layer2_frame(struct AUDIO_HEADER *header,int cnt);
-float requantize_sample(unsigned short s4,unsigned short nlevels,float c,float d,float factor);
-void convert_samplecode(unsigned int samplecode,unsigned int nlevels,unsigned short* sb_sample_buf);
-
-char t_nbal0[27]={4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2};
-char t_nbal1[30]={4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2};
-char t_nbal2[8] ={4,4,3,3,3,3,3,3};
-char t_nbal3[12]={4,4,3,3,3,3,3,3,3,3,3,3};
-char t_nbalMPG2[30]={4,4,4,4,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
-
-char t_alloc0[27][16] = { /* table B.2a ISO/IEC 11172-3 */
-{0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17},
-{0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17},
-{0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17}};
-
-char t_alloc1[30][16] = { /* table B.2b ISO/IEC 11172-3 */
-{0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17},
-{0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17},
-{0,1,3,5,6,7,8,9,10,11,12,13,14,15,16,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,3,4,5,6,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17},
-{0,1,2,17}};
-
-char t_alloc2[8][16] = { /* table B.2c ISO/IEC 11172-3 */
-{0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16},
-{0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127}};
-
-char t_alloc3[12][16] = { /* table B.2d ISO/IEC 11172-3 */
-{0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16},
-{0,1,2,4,5,6,7,8,9,10,11,12,13,14,15,16},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127},
-{0,1,2,4,5,6,7,127}};
-
-char t_allocMPG2[30][16] = { /* table B.1. ISO/IEC 13818-3 */
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
-{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4,5,6,7,8},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4},
-{0,1,2,4}};
-
-double t_scalefactor[64] = {
-2.00000000000000, 1.58740105196820, 1.25992104989487,
-1.00000000000000, 0.79370052598410, 0.62996052494744, 0.50000000000000,
-0.39685026299205, 0.31498026247372, 0.25000000000000, 0.19842513149602,
-0.15749013123686, 0.12500000000000, 0.09921256574801, 0.07874506561843,
-0.06250000000000, 0.04960628287401, 0.03937253280921, 0.03125000000000,
-0.02480314143700, 0.01968626640461, 0.01562500000000, 0.01240157071850,
-0.00984313320230, 0.00781250000000, 0.00620078535925, 0.00492156660115,
-0.00390625000000, 0.00310039267963, 0.00246078330058, 0.00195312500000,
-0.00155019633981, 0.00123039165029, 0.00097656250000, 0.00077509816991,
-0.00061519582514, 0.00048828125000, 0.00038754908495, 0.00030759791257,
-0.00024414062500, 0.00019377454248, 0.00015379895629, 0.00012207031250,
-0.00009688727124, 0.00007689947814, 0.00006103515625, 0.00004844363562,
-0.00003844973907, 0.00003051757813, 0.00002422181781, 0.00001922486954,
-0.00001525878906, 0.00001211090890, 0.00000961243477, 0.00000762939453,
-0.00000605545445, 0.00000480621738, 0.00000381469727, 0.00000302772723,
-0.00000240310869, 0.00000190734863, 0.00000151386361, 0.00000120155435,
-1E-20};
-
-double t_c[18] = { 0,
- 1.33333333333, 1.60000000000, 1.14285714286,
- 1.77777777777, 1.06666666666, 1.03225806452,
- 1.01587301587, 1.00787401575, 1.00392156863,
- 1.00195694716, 1.00097751711, 1.00048851979,
- 1.00024420024, 1.00012208522, 1.00006103888,
- 1.00003051851, 1.00001525902 };
-
-double t_d[18] = {0,
- 0.500000000, 0.500000000, 0.250000000, 0.500000000,
- 0.125000000, 0.062500000, 0.031250000, 0.015625000,
- 0.007812500, 0.003906250, 0.001953125, 0.0009765625,
- 0.00048828125,0.00024414063,0.00012207031,
- 0.00006103516,0.00003051758 };
-
-float t_dd[18]={ -1.0f, -0.5f, -0.5f, -0.75f, -0.5f, -0.875f, -0.9375f, -0.96875f, -0.984375f,
--0.992188f, -0.996094f, -0.998047f, -0.999023f, -0.999512f, -0.999756f, -0.999878f, -0.999939f,
--0.999969f};
-
-char t_grouping[18]={0,3,5,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-/*
-int t_nlevels[18] = {0,3,5,7,9,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
-*/
-int t_nlevels[18] = {0,3,7,7,15,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
-
-
-float t_nli[18]={ 0.0f, 0.5f, 0.25f, 0.25f, 0.125f, 0.125f, 0.0625f, 0.03125f, 0.015625f, 0.0078125f, 0.00390625f,
-0.00195313f, 0.000976563f, 0.000488281f, 0.000244141f, 0.00012207f, 6.10352e-05f, 3.05176e-05f};
-
-int t_bpc[18] = {0,5,7,3,10,4,5,6,7,8,9,10,11,12,13,14,15,16};
-
-#endif /* LAYER2 */
diff --git a/Src/Sound/MPEG/layer3.cpp b/Src/Sound/MPEG/layer3.cpp
deleted file mode 100644
index 9730776..0000000
--- a/Src/Sound/MPEG/layer3.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * layer3.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* layer3.c layer3 audio decoding
- *
- * Created by: tomislav uzelac Mar 1 97
- * Last modified by:
- */
-#include "amp.h"
-#include "amp_audio.h"
-#include "dump.h"
-#include "getbits.h"
-#include "getdata.h"
-#include "huffman.h"
-#include "misc2.h"
-#include "rtbuf.h"
-#include "transform.h"
-
-#define LAYER3
-#include "layer3.h"
-
-void requantize_downmix(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
-
-/* this function decodes one layer3 audio frame, except for the header decoding
- * which is done in main() [audio.c]. returns 0 if everything is ok.
- */
-int layer3_frame(struct AUDIO_HEADER *header,int cnt)
-{
-static struct SIDE_INFO info;
-
-int gr,ch,sb,i;
-int mean_frame_size,bitrate,fs,hsize,ssize;
-
-/* we need these later, hsize is the size of header+side_info
-*/
- if (header->ID)
- if (header->mode==3) {
- nch=1;
- hsize=21;
- } else {
- nch=2;
- hsize=36;
- }
- else
- if (header->mode==3) {
- nch=1;
- hsize=13;
- } else {
- nch=2;
- hsize=21;
- }
-
-/* crc increases hsize by 2
-*/
- if (header->protection_bit==0) hsize+=2;
-
-
-/* read layer3 specific side_info
-*/
- getinfo(header,&info);
-
-
-/* MPEG2 only has one granule
-*/
- bitrate=t_bitrate[header->ID][3-header->layer][header->bitrate_index];
- fs=t_sampling_frequency[header->ID][header->sampling_frequency];
- if (header->ID) mean_frame_size=144000*bitrate/fs;
- else mean_frame_size=72000*bitrate/fs;
-
-
-/* check if mdb is too big for the first few frames. this means that
- * a part of the stream could be missing. We must still fill the buffer
- *
- * don't forget to (re)initialise bclean_bytes to 0, and f_bdirty to FALSE!!!
- */
- if (f_bdirty)
- {
- if (info.main_data_begin > bclean_bytes) {
- fillbfr(mean_frame_size + header->padding_bit - hsize);
- bclean_bytes+=mean_frame_size + header->padding_bit - hsize;
- /* warn(" frame %d discarded, incomplete main_data\n",cnt); */
- return 0;
- } else {
- /* re-initialise */
- f_bdirty=FALSE;
- bclean_bytes=0;
- }
- }
-
-/* now update the data 'pointer' (counting in bits) according to
- * the main_data_begin information
- */
- data = 8 * ((append - info.main_data_begin) & (BUFFER_SIZE-1));
-
-
-/* read into the buffer all bytes up to the start of next header
-*/
- fillbfr(mean_frame_size + header->padding_bit - hsize);
-
-
-/* these two should go away
-*/
- t_l=&t_b8_l[header->ID][header->sampling_frequency][0];
- t_s=&t_b8_s[header->ID][header->sampling_frequency][0];
-
-/* debug/dump stuff
-*/
- if (A_DUMP_BINARY) dump((int *)info.part2_3_length);
-
-/* decode the scalefactors and huffman data
- * this part needs to be enhanced for error robustness
- */
- for (gr=0;gr < ((header->ID) ? 2 : 1);gr++) {
- for (ch=0;chmode!=1 || (header->mode==1 && header->mode_extension==0))
- for (ch=0;chmode!=3) nch=2;
-
- } /* for (gr... */
-
- /* return status: 0 for ok, errors will be added
- */
- return 0;
-}
-
diff --git a/Src/Sound/MPEG/layer3.h b/Src/Sound/MPEG/layer3.h
deleted file mode 100644
index 9690621..0000000
--- a/Src/Sound/MPEG/layer3.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * layer3.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* layer3.h
- *
- * Created by: tomislav uzelac Mar 1 97
- * Last modified by:
- */
-
-extern int layer3_frame(struct AUDIO_HEADER *header,int cnt);
-
-#ifdef LAYER3
-
-int layer3_frame(struct AUDIO_HEADER *header,int cnt);
-
-#endif /* LAYER3 */
diff --git a/Src/Sound/MPEG/misc2.cpp b/Src/Sound/MPEG/misc2.cpp
deleted file mode 100644
index 908f225..0000000
--- a/Src/Sound/MPEG/misc2.cpp
+++ /dev/null
@@ -1,852 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * misc2.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* misc2.c requantization, stereo processing, reordering(shortbl) and antialiasing butterflies
- *
- * misc.c was created by tomislav uzelac in May 1996, and was completely awful
- * Created by: tomislav uzelac Dec 22 1996
- * some more speed injected, cca. Jun 1 1997
- */
-#include
-#include
-
-#include "amp.h"
-#include "amp_audio.h"
-#include "getdata.h"
-#include "huffman.h"
-
-#define MISC2
-#include "misc2.h"
-
-#include "Supermodel.h"
-
-/*
- * fras == Formula for Requantization and All Scaling **************************
- */
-static inline float fras_l(int sfb,int global_gain,int scalefac_scale,int scalefac,int preflag)
-{
-register int a,scale;
- /*
- if (scalefac_scale) scale=2;
- else scale=1;
- */
- scale=scalefac_scale+1;
- a= global_gain -210 -(scalefac << scale);
- if (preflag) a-=(t_pretab[sfb] << scale);
-
-/* bugfix, Mar 13 97: shifting won't produce a legal result if we shift by more than 31
- * since global_gain<256, this can only occur for (very) negative values of a.
-*/
- if (a < -127) return 0;
-
-/* a minor change here as well, no point in abs() if we now that a<0
-*/
- if (a>=0) return tab[a&3]*(1 << (a>>2));
- else return tabi[(-a)&3]/(1 << ((-a) >> 2));
-}
-
-static inline float fras_s(int global_gain,int subblock_gain,int scalefac_scale,int scalefac)
-{
-int a;
- a=global_gain - 210 - (subblock_gain << 3);
- if (scalefac_scale) a-= (scalefac << 2);
- else a-= (scalefac << 1);
-
- if (a < -127) return 0;
-
- if (a>=0) return tab[a&3]*(1 << (a>>2));
- else return tabi[(-a)&3]/(1 << ((-a) >> 2));
-}
-
-/* this should be faster than pow()
- */
-static inline float fras2(int is,float a)
-{
- if (is > 0) return t_43[is]*a;
- else return -t_43[-is]*a;
-}
-
-/*
- * requantize_mono *************************************************************
- */
-
-/* generally, the two channels do not have to be of the same block type - that's why we do two passes with requantize_mono.
- * if ms or intensity stereo is enabled we do a single pass with requantize_ms because both channels are same block type
- */
-
-void requantize_mono(int gr,int ch,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
-{
-int l,i,sfb;
-float a;
-int global_gain=info->global_gain[gr][ch];
-int scalefac_scale=info->scalefac_scale[gr][ch];
-int sfreq=header->sampling_frequency;
-
-
- no_of_imdcts[0]=no_of_imdcts[1]=32;
-
- if (info->window_switching_flag[gr][ch] && info->block_type[gr][ch]==2)
- if (info->mixed_block_flag[gr][ch]) {
- /*
- * requantize_mono - mixed blocks/long block part **********************
- */
- int window,window_len,preflag=0; /* pretab is all zero in this low frequency area */
- int scalefac=scalefac_l[gr][ch][0];
-
- l=0;sfb=0;
- a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
- while (l<36) {
- xr[ch][0][l]=fras2(is[ch][l],a);
- if (l==t_l[sfb]) {
- scalefac=scalefac_l[gr][ch][++sfb];
- a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
- }
- l++;
- }
- /*
- * requantize_mono - mixed blocks/short block part *********************
- */
- sfb=3;
- window_len=t_s[sfb]-t_s[sfb-1];
- while (lsubblock_gain[gr][ch][window];
- a=fras_s(global_gain,subblock_gain,scalefac_scale,scalefac);
- for (i=0;iID][sfreq][l]]=fras2(is[ch][l],a);
- l++;
- }
- }
- sfb++;
- window_len=t_s[sfb]-t_s[sfb-1];
- }
- while (l<576) xr[ch][0][t_reorder[header->ID][sfreq][l++]]=0;
- } else {
- /*
- * requantize mono - short blocks **************************************
- */
- int window,window_len;
-
- sfb=0; l=0;
- window_len=t_s[0]+1;
- while (lsubblock_gain[gr][ch][window];
- float a=fras_s(global_gain,subblock_gain,scalefac_scale,scalefac);
- for (i=0;iID][sfreq][l]]=fras2(is[ch][l],a);
- l++;
- }
- }
- sfb++;
- window_len=t_s[sfb]-t_s[sfb-1];
- }
- while (l<576) xr[ch][0][t_reorder[header->ID][sfreq][l++]]=0;
- }
- else {
- /* long blocks */
- int preflag=info->preflag[gr][ch];
- int scalefac=scalefac_l[gr][ch][0];
-
- sfb=0; l=0;
- a=fras_l(sfb,global_gain,scalefac_scale,scalefac,preflag);
- while (lmode_extension==1 || header->mode_extension==3) {
- if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2) {
-
- /* find that isbound!
- */
- tmp=non_zero[1];
- sfb=0; while ((3*t_s[sfb]+2) < tmp && sfb < 12) sfb++;
- while ((isbound[0]<0 || isbound[1]<0 || isbound[2]<0) && !(info->mixed_block_flag[gr][0] && sfb<3) && sfb) {
- for (window=0;window<3;window++) {
- if (sfb==0) {
- window_len=t_s[0]+1;
- tmp=(window+1)*window_len - 1;
- } else {
- window_len=t_s[sfb]-t_s[sfb-1];
- tmp=(3*t_s[sfb-1]+2) + (window+1)*window_len;
- }
- if (isbound[window] < 0)
- for (i=0;imixed_block_flag[gr][0])
- {
- if (isbound[0]<0 && isbound[1]<0 && isbound[2]<0)
- {
- tmp=35;
- while (is[1][tmp] == 0) tmp--;
- sfb=0; while (t_l[sfb] < tmp && sfb < 21) sfb++;
- isbound[0]=isbound[1]=isbound[2]=t_l[sfb]+1;
- }
- else for (window=0;window<3;window++)
- if (isbound[window]<0) isbound[window]=36;
- }
- if (header->ID==1) isbound[0]=isbound[1]=isbound[2]=MAX(isbound[0],MAX(isbound[1],isbound[2]));
-
- /* just how many imdcts?
- */
- tmp=non_zero[0];
- sfb=0; while ((3*t_s[sfb]+2) < tmp && sfb < 12) sfb++;
- no_of_imdcts[0]=no_of_imdcts[1]=(t_s[sfb]-1)/6+1;
- } else {
-
- /* long blocks now
- */
- tmp=non_zero[1];
- while (is[1][tmp] == 0) tmp--;
- sfb=0; while (t_l[sfb] < tmp && sfb < 21) sfb++;
- isbound[0]=isbound[1]=isbound[2]=t_l[sfb]+1;
- no_of_imdcts[0]=no_of_imdcts[1]=(non_zero[0]-1)/18+1;
- }
- if (header->mode_extension==1) ms_flag=0;
- else ms_flag=1;
- } else {
-
- /* intensity stereo is, regretably, turned off
- */
- ms_flag=1;
-
- /* i really put a lot of work in this, but it still looks like shit (works, though)
- */
- if (!info->window_switching_flag[gr][0] || (info->window_switching_flag[gr][0] && info->block_type[gr][0]!=2))
- isbound[0]=isbound[1]=isbound[2]=(MAX(non_zero[0],non_zero[1]));
- else isbound[0]=isbound[1]=isbound[2]=576;
-
- if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2) {
- /* should do for mixed blocks too, though i havent tested... */
- tmp=(MAX(non_zero[0],non_zero[1]))/3;
- sfb=0; while (t_s[sfb]=576) return; /* brrr... */
-
- if ((is_pos != IS_ILLEGAL) && (header->ID==1)) {
- ftmp=fras2(is[0][l],a[0]);
- xr[0][0][pos]=(1-t_is[is_pos])*ftmp;
- xr[1][0][pos]=t_is[is_pos]*ftmp;
- return;
- }
-
- if ((is_pos != IS_ILLEGAL) && (header->ID==0)) {
- ftmp=fras2(is[0][l],a[0]);
- if (is_pos&1) {
- xr[0][0][pos]= t_is2[intensity_scale][(is_pos+1)>>1] * ftmp;
- xr[1][0][pos]= ftmp;
- } else {
- xr[0][0][pos]= ftmp;
- xr[1][0][pos]= t_is2[intensity_scale][is_pos>>1] * ftmp;
- }
- return;
- }
-
- if (ms_flag) {
- Mi=fras2(is[0][l],a[0]);
- Si=fras2(is[1][l],a[1]);
- xr[0][0][pos]=(Mi+Si)*i_sq2;
- xr[1][0][pos]=(Mi-Si)*i_sq2;
- } else {
- xr[0][0][pos]=fras2(is[0][l],a[0]);
- xr[1][0][pos]=fras2(is[1][l],a[1]);
- }
-}
-
-static inline void stereo_l(int l,float a[2],int ms_flag,int is_pos,struct AUDIO_HEADER *header)
-{
-float ftmp,Mi,Si;
- if (l>=576) return;
-
-/* new code by ???
-*/
- if (is_pos != IS_ILLEGAL) {
- ftmp = fras2(is[0][l], a[0]);
- if (header -> ID ==1) {
- xr[0][0][l] = (1 - t_is[is_pos]) * ftmp;
- xr[1][0][l] = t_is[is_pos] * ftmp;
- return;
- } else if (is_pos & 1) {
- xr[0][0][l] = t_is2[intensity_scale][(is_pos + 1) >> 1] * ftmp;
- xr[1][0][l] = ftmp;
- } else {
- xr[0][0][l] = ftmp;
- xr[1][0][l] = t_is2[intensity_scale][is_pos >> 1] * ftmp;
- }
- return;
- }
-
- if (ms_flag) {
- Mi=fras2(is[0][l],a[0]);
- Si=fras2(is[1][l],a[1]);
- xr[0][0][l]=(Mi+Si)*i_sq2;
- xr[1][0][l]=(Mi-Si)*i_sq2;
- } else {
- xr[0][0][l]=fras2(is[0][l],a[0]);
- xr[1][0][l]=fras2(is[1][l],a[1]);
- }
-
-}
-
-
-/*
- * requantize_ms ***************************************************************
- */
-void requantize_ms(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
-{
-int l,sfb,ms_flag,is_pos,i,ch;
-int *global_gain,subblock_gain[2],*scalefac_scale,scalefac[2],isbound[3];
-int sfreq=header->sampling_frequency;
-int id = header->ID;
-float a[2];
-
-memset(a, 0, sizeof(a));
-
-global_gain=info->global_gain[gr];
-scalefac_scale=info->scalefac_scale[gr];
-
- if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2)
- if (info->mixed_block_flag[gr][0]) {
- /*
- * mixed blocks w/stereo processing - long block part ******************
- */
- int window,window_len;
- int preflag[2]={0,0};
-
- ms_flag=find_isbound(isbound,gr,info,header);
-
- sfb=0; l=0;
- for (ch=0;ch<2;ch++) {
- scalefac[ch]=scalefac_l[gr][ch][0];
- a[ch]=fras_l(0,global_gain[ch],scalefac_scale[ch],scalefac[ch],preflag[ch]);
- }
-
-
- while (l<36) {
- int is_pos;
- if (lsubblock_gain[gr][0][window];
- subblock_gain[1]=info->subblock_gain[gr][1][window];
- scalefac[0]=scalefac_s[gr][0][sfb][window];
- scalefac[1]=scalefac_s[gr][1][sfb][window];
-
- if (t_s[sfb] < isbound[window]) {
- is_pos=IS_ILLEGAL;
- a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
- a[1]=fras_s(global_gain[1],subblock_gain[1],scalefac_scale[1],scalefac[1]);
- } else {
- is_pos=scalefac[1];
- if (id==1) /* MPEG1 */
- {
- if (is_pos==7) is_pos=IS_ILLEGAL;
- }
- else /* MPEG2 */
- {
- if (is_pos==is_max[sfb+6]) is_pos=IS_ILLEGAL;
- }
-
- a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
- }
-
- for (i=0;isubblock_gain[gr][0][window];
- subblock_gain[1]=info->subblock_gain[gr][1][window];
- scalefac[0]=scalefac_s[gr][0][sfb][window];
- scalefac[1]=scalefac_s[gr][1][sfb][window];
-
- if (t_s[sfb] < isbound[window]) {
- is_pos=IS_ILLEGAL;
- a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
- a[1]=fras_s(global_gain[1],subblock_gain[1],scalefac_scale[1],scalefac[1]);
- } else {
- is_pos=scalefac[1];
- if (id==1) /* MPEG1 */
- {
- if (is_pos==7) is_pos=IS_ILLEGAL;
- }
- else /* MPEG2 */
- {
- if (is_pos==is_max[sfb+6]) is_pos=IS_ILLEGAL;
- }
- a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
- }
-
- for (i=0;ipreflag[gr];
-
- ms_flag=find_isbound(isbound,gr,info,header);
-
- sfb=0; l=0;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
-
- /* no intensity stereo part
- */
- if (ms_flag)
- while (l< isbound[0]) {
-#if defined(PENTIUM_RDTSC)
-
-unsigned int cnt4, cnt3, cnt2, cnt1;
-static int min_cycles = 99999999;
-
- __asm__(".byte 0x0f,0x31" : "=a" (cnt1), "=d" (cnt4));
-#endif
-
- {
- register float Mi = fras2(is[0][l],a[0]);
- register float Si = fras2(is[1][l],a[1]);
- register float tmp = i_sq2;
- xr[0][0][l]=(Mi+Si)*tmp;
- xr[1][0][l]=(Mi-Si)*tmp;
- }
-
-#if defined(PENTIUM_RDTSC)
- __asm__(".byte 0x0f,0x31" : "=a" (cnt2), "=d" (cnt4));
-
- if (cnt2-cnt1 < min_cycles) {
- min_cycles = cnt2-cnt1;
- //printf("%d cycles\n", min_cycles);
- }
-
-#endif
- if (l==t_l[sfb]) {
-#if defined(PENTIUM_RDTSC2)
-
-unsigned int cnt4, cnt2, cnt1;
-static int min_cycles = 99999999;
-
- __asm__(".byte 0x0f,0x31" : "=a" (cnt1), "=d" (cnt4));
-#endif
-
- sfb++;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
-#if defined(PENTIUM_RDTSC2)
- __asm__(".byte 0x0f,0x31" : "=a" (cnt2), "=d" (cnt4));
-
- if (cnt2-cnt1 < min_cycles) {
- min_cycles = cnt2-cnt1;
- //printf("%d cycles, sfb %d\n", min_cycles, sfb);
- }
-
-#endif
- }
- l++;
- }
- else
- while (l< isbound[0]) {
- xr[0][0][l]=fras2(is[0][l],a[0]);
- xr[1][0][l]=fras2(is[1][l],a[1]);
- if (l==t_l[sfb]) {
- sfb++;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
- }
- l++;
- }
-
-
- /* intensity stereo part
- */
- while (l<(MAX(non_zero[0],non_zero[1]))) {
- int is_pos=scalefac[1];
-
- if (id==1) /* MPEG1 */
- {
- if (is_pos==7) is_pos=IS_ILLEGAL;
- }
- else /* MPEG2 */
- {
- if (is_pos==is_max[sfb]) is_pos=IS_ILLEGAL;
- }
- stereo_l(l,a,ms_flag,is_pos,header);
-
- if (l==t_l[sfb]) {
- sfb++;
- scalefac[0]=scalefac_l[gr][0][sfb];
- scalefac[1]=scalefac_l[gr][1][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- }
- l++;
- }
-
- while (l<576) {
- xr[0][0][l]=0;
- xr[1][0][l]=0;
- l++;
- }
- }
-}
-
-/*
- * requantize_downmix **********************************************************
- */
-void requantize_downmix(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header)
-{
-int l,sfb,ms_flag,i;
-int *global_gain,subblock_gain[2],*scalefac_scale,scalefac[2];
-int sfreq=header->sampling_frequency;
-int id = header->ID;
-float a[2];
-
- /* first set some variables
- */
- global_gain=info->global_gain[gr];
- scalefac_scale=info->scalefac_scale[gr];
-
- if (header->mode_extension==2 || header->mode_extension==3) ms_flag=1;
- else ms_flag=0;
-
- /* ... and then we're off for requantization
- */
- if (info->window_switching_flag[gr][0] && info->block_type[gr][0]==2)
- if (info->mixed_block_flag[gr][0]) {
- ErrorLog("Internal error in MPEG decoder: mixed blocks encountered.");
- } else {
- int window,window_len;
- int isbound[3];
- int is_pos;
-
- memset(isbound, 0, sizeof(isbound));
-
- sfb=0; l=0; window_len=t_s[0]+1;
-
- while (l<(MAX(non_zero[0],non_zero[1]))) {
- for (window=0;window<3;window++) {
- subblock_gain[0]=info->subblock_gain[gr][0][window];
- subblock_gain[1]=info->subblock_gain[gr][1][window];
- scalefac[0]=scalefac_s[gr][0][sfb][window];
- is_pos=scalefac[1]=scalefac_s[gr][1][sfb][window];
-
- if (t_s[sfb] < isbound[window]) {
- a[0]=fras_s(global_gain[0],subblock_gain[0],scalefac_scale[0],scalefac[0]);
- if (ms_flag) {
- for (i=0;i>1];
- xr[0][0][t_reorder[id][sfreq][l]] = ftmp;
- l++;
- }
- }
- }
- window_len = -t_s[sfb++];
- window_len += t_s[sfb];
- }
- while (l<576) {
- xr[0][0][l]=0;
- l++;
- }
- }
- else {
- int *preflag=info->preflag[gr];
- int isbound;
-
- if (header->mode_extension==1 || header->mode_extension==3) {
- int tmp=non_zero[1];
- while (is[1][tmp] == 0) tmp--;
- sfb=0; while (t_l[sfb] < tmp && sfb < 21) sfb++;
- isbound=t_l[sfb]+1;
- no_of_imdcts[0]=no_of_imdcts[1]=(non_zero[0]-1)/18+1;
- } else {
- isbound=(MAX(non_zero[0],non_zero[1]));
- no_of_imdcts[0]=no_of_imdcts[1]=(isbound-1)/18+1;
- }
-
- sfb=0; l=0;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
-
- /* no intensity stereo part
- */
- if (ms_flag)
- while (l < isbound) {
- register float Mi = fras2(is[0][l],a[0]);
- register float tmp = i_sq2;
- xr[0][0][l]=Mi*tmp;
-
- if (l==t_l[sfb]) {
- sfb++;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- }
- l++;
- }
- else
- while (l < isbound) {
- register float tmp1=fras2(is[0][l],a[0]);
- register float tmp2=fras2(is[1][l],a[1]);
- xr[0][0][l]=(tmp1+tmp2)*0.5f;
- if (l==t_l[sfb]) {
- sfb++;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- a[1]=fras_l(sfb,global_gain[1],scalefac_scale[1],scalefac[1],preflag[1]);
- }
- l++;
- }
- /* intensity stereo part
- */
- while (l<(MAX(non_zero[0],non_zero[1]))) {
- int is_pos=scalefac[1];
- register float ftmp=fras2(is[0][l], a[0]);
-
- if (id==0 && is_pos>1];
- }
-
- xr[0][0][l] = ftmp;
-
- if (l==t_l[sfb]) {
- sfb++;
- scalefac[0]=scalefac_l[gr][0][sfb];
- a[0]=fras_l(sfb,global_gain[0],scalefac_scale[0],scalefac[0],preflag[0]);
- scalefac[1]=scalefac_l[gr][1][sfb];
- }
- l++;
- }
-
- /* _always_ zero out everything else
- */
- while (l<576) {
- xr[0][0][l]=0;
- l++;
- }
- }
-}
-
-/*
- * antialiasing butterflies ****************************************************
- *
- */
-void alias_reduction(int ch)
-{
-unsigned int sb;
-
- for (sb=1;sb<32;sb++) {
- float *x = xr[ch][sb];
- register float a, b;
-
- a = x[0];
- b = x[-1];
- x[-1] = b * Cs[0] - a * Ca[0];
- x[0] = a * Cs[0] + b * Ca[0];
-
- a = x[1];
- b = x[-2];
- x[-2] = b * Cs[1] - a * Ca[1];
- x[1] = a * Cs[1] + b * Ca[1];
-
- a = x[2];
- b = x[-3];
- x[-3] = b * Cs[2] - a * Ca[2];
- x[2] = a * Cs[2] + b * Ca[2];
-
- a = x[3];
- b = x[-4];
- x[-4] = b * Cs[3] - a * Ca[3];
- x[3] = a * Cs[3] + b * Ca[3];
-
- a = x[4];
- b = x[-5];
- x[-5] = b * Cs[4] - a * Ca[4];
- x[4] = a * Cs[4] + b * Ca[4];
-
- a = x[5];
- b = x[-6];
- x[-6] = b * Cs[5] - a * Ca[5];
- x[5] = a * Cs[5] + b * Ca[5];
-
- a = x[6];
- b = x[-7];
- x[-7] = b * Cs[6] - a * Ca[6];
- x[6] = a * Cs[6] + b * Ca[6];
-
- a = x[7];
- b = x[-8];
- x[-8] = b * Cs[7] - a * Ca[7];
- x[7] = a * Cs[7] + b * Ca[7];
- }
-}
-
-/* calculating t_43 instead of having that big table in misc2.h
- */
-
-void calculate_t43(void)
-{
-int i;
- for (i=0;i<8192;i++)
- t_43[i]=(float)pow((float)i,1.33333333333f);
-}
diff --git a/Src/Sound/MPEG/misc2.h b/Src/Sound/MPEG/misc2.h
deleted file mode 100644
index 94a50f6..0000000
--- a/Src/Sound/MPEG/misc2.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * misc2.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* misc2.h
- *
- * Created by: tomislav uzelac May 1996
- * Last modified by: tomislav uzelac Jan 8 1997
- */
-
-extern void requantize_mono(int gr,int ch,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
-extern void requantize_ms(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
-extern void alias_reduction(int ch);
-extern void calculate_t43(void);
-
-extern int no_of_imdcts[2];
-
-#ifdef MISC2
-
-#define i_sq2 0.707106781188
-#define IS_ILLEGAL 0xfeed
-
-void requantize_mono(int gr,int ch,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
-void requantize_ms(int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
-void alias_reduction(int ch);
-
-static inline float fras_l(int sfb,int global_gain,int scalefac_scale,int scalefac,int preflag);
-static inline float fras_s(int global_gain,int subblock_gain,int scalefac_scale,int scalefac);
-static inline float fras2(int is,float a);
-static int find_isbound(int isbound[3],int gr,struct SIDE_INFO *info,struct AUDIO_HEADER *header);
-static inline void stereo_s(int l,float a[2],int pos,int ms_flag,int is_pos,struct AUDIO_HEADER *header);
-static inline void stereo_l(int l,float a[2],int ms_flag,int is_pos,struct AUDIO_HEADER *header);
-
-int no_of_imdcts[2];
-
-static const int t_pretab[22]={0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,2,2,3,3,3,2,0};
-static const float t_is[7]={ 1.0f, 0.788675134596f, 0.633974596215f,
- 0.5f, 0.366025403784f, 0.211324865405f, 0.0f};
-static const float t_is2[2][32]={
-{ 1.0f, 0.840896f, 0.707107f, 0.594604f, 0.5f, 0.420448f,
- 0.353553f, 0.297302f, 0.25f, 0.210224f, 0.176777f, 0.148651f,
- 0.125f, 0.105112f, 0.0883883f, 0.0743254f},
-{ 1.0f, 0.707107f, 0.5f, 0.353553f, 0.25f, 0.176777f,
- 0.125f, 0.0883883f, 0.0625f, 0.0441942f, 0.03125f, 0.0220971f,
- 0.015625f, 0.0110485f, 0.0078125f, 0.00552427f}
-};
-static const float t_downmix[2][32]={
-{ 1.000000f, 0.920448f, 0.853554f, 0.797302f, 0.750000f, 0.710224f,
- 0.676776f, 0.648651f, 0.625000f, 0.605112f, 0.588389f, 0.574326f,
- 0.562500f, 0.552556f, 0.544194f, 0.537163f},
-{ 1.000000f, 0.853554f, 0.750000f, 0.676776f, 0.625000f, 0.588389f,
- 0.562500f, 0.544194f, 0.531250f, 0.522097f, 0.515625f, 0.511049f,
- 0.507813f, 0.505524f, 0.503906f, 0.502762f}
-};
-
-static const float Cs[8]={0.857492925712f, 0.881741997318f, 0.949628649103f,
- 0.983314592492f, 0.995517816065f, 0.999160558175f,
- 0.999899195243f, 0.999993155067f};
-static const float Ca[8]={-0.5144957554270f, -0.4717319685650f, -0.3133774542040f,
- -0.1819131996110f, -0.0945741925262f, -0.0409655828852f,
- -0.0141985685725f, -0.00369997467375f};
-static const float tab[4]={1.0f,1.189207115f,1.414213562f,1.6817928301f};
-static const float tabi[4]={1.0f,0.840896415f,0.707106781f,0.594603557f};
-
-static float t_43[8192];
-
-
-/* leftmost index denotes header->ID, so first three are for MPEG2
- * and the others are for MPEG1
- */
-static const short t_reorder[2][3][576]={{
-{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
- 16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 90, 91,
- 78, 79, 80, 81, 82, 83, 96, 97, 84, 85, 86, 87, 88, 89, 102, 103, 92, 93, 94, 95,
- 108, 109, 110, 111, 112, 113, 98, 99, 100, 101, 114, 115, 116, 117, 118, 119, 104, 105, 106, 107,
- 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 148, 149, 162, 163,
- 132, 133, 134, 135, 136, 137, 150, 151, 152, 153, 154, 155, 168, 169, 138, 139, 140, 141, 142, 143,
- 156, 157, 158, 159, 160, 161, 174, 175, 164, 165, 166, 167, 180, 181, 182, 183, 184, 185, 198, 199,
- 200, 201, 202, 203, 216, 217, 170, 171, 172, 173, 186, 187, 188, 189, 190, 191, 204, 205, 206, 207,
- 208, 209, 222, 223, 176, 177, 178, 179, 192, 193, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215,
- 228, 229, 218, 219, 220, 221, 234, 235, 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271,
- 272, 273, 274, 275, 288, 289, 290, 291, 224, 225, 226, 227, 240, 241, 242, 243, 244, 245, 258, 259,
- 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295, 296, 297, 230, 231, 232, 233, 246, 247,
- 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303,
- 292, 293, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347,
- 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383, 298, 299, 312, 313, 314, 315, 316, 317,
- 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353, 366, 367, 368, 369, 370, 371, 384, 385,
- 386, 387, 388, 389, 304, 305, 318, 319, 320, 321, 322, 323, 336, 337, 338, 339, 340, 341, 354, 355,
- 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399,
- 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435, 436, 437, 450, 451, 452, 453, 454, 455,
- 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491, 504, 505, 506, 507, 508, 509, 402, 403,
- 404, 405, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459,
- 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515,
- 408, 409, 410, 411, 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463,
- 464, 465, 466, 467, 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519,
- 520, 521, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563,
- 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 534, 535,
- 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
-
-{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
- 16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 72, 73, 60, 61, 62, 63, 64, 65, 78, 79, 66, 67, 68, 69, 70, 71, 84, 85, 74, 75,
- 76, 77, 90, 91, 92, 93, 94, 95, 80, 81, 82, 83, 96, 97, 98, 99, 100, 101, 86, 87,
- 88, 89, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 126, 127, 128, 129, 130, 131,
- 114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 120, 121, 122, 123, 124, 125, 138, 139,
- 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167, 180, 181, 150, 151,
- 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 156, 157, 158, 159, 160, 161, 174, 175,
- 176, 177, 178, 179, 192, 193, 182, 183, 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219,
- 220, 221, 234, 235, 188, 189, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227,
- 240, 241, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
- 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
- 292, 293, 306, 307, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281,
- 294, 295, 296, 297, 298, 299, 312, 313, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
- 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
- 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
- 396, 397, 398, 399, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353,
- 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 320, 321, 322, 323,
- 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391,
- 392, 393, 394, 395, 408, 409, 410, 411, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
- 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
- 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 406, 407, 420, 421, 422, 423, 424, 425,
- 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493,
- 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 412, 413, 426, 427,
- 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467, 480, 481, 482, 483,
- 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535, 536, 537, 538, 539,
- 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563, 546, 547, 548, 549, 550, 551, 564, 565,
- 566, 567, 568, 569, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
-
-{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
- 16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 72, 73, 60, 61, 62, 63, 64, 65, 78, 79, 66, 67, 68, 69, 70, 71, 84, 85, 74, 75,
- 76, 77, 90, 91, 92, 93, 94, 95, 80, 81, 82, 83, 96, 97, 98, 99, 100, 101, 86, 87,
- 88, 89, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 126, 127, 128, 129, 130, 131,
- 114, 115, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 120, 121, 122, 123, 124, 125, 138, 139,
- 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167, 180, 181, 150, 151,
- 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 156, 157, 158, 159, 160, 161, 174, 175,
- 176, 177, 178, 179, 192, 193, 182, 183, 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219,
- 220, 221, 234, 235, 188, 189, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227,
- 240, 241, 194, 195, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
- 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
- 292, 293, 306, 307, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281,
- 294, 295, 296, 297, 298, 299, 312, 313, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
- 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
- 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
- 396, 397, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351, 352, 353, 366, 367,
- 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 320, 321, 322, 323, 336, 337, 338, 339,
- 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391, 392, 393, 394, 395,
- 408, 409, 398, 399, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435, 436, 437, 450, 451,
- 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491, 504, 505, 506, 507,
- 508, 509, 404, 405, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457,
- 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513,
- 514, 515, 410, 411, 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463,
- 464, 465, 466, 467, 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519,
- 520, 521, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563,
- 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 534, 535,
- 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575}
-},
-{
-{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
- 16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
- 42, 43, 44, 45, 48, 49, 50, 51, 40, 41, 54, 55, 56, 57, 46, 47, 60, 61, 62, 63,
- 52, 53, 66, 67, 68, 69, 58, 59, 72, 73, 74, 75, 76, 77, 64, 65, 78, 79, 80, 81,
- 82, 83, 70, 71, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 108, 109, 110, 111,
- 96, 97, 98, 99, 100, 101, 114, 115, 116, 117, 102, 103, 104, 105, 106, 107, 120, 121, 122, 123,
- 112, 113, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 118, 119, 132, 133, 134, 135, 136, 137,
- 150, 151, 152, 153, 124, 125, 138, 139, 140, 141, 142, 143, 156, 157, 158, 159, 148, 149, 162, 163,
- 164, 165, 166, 167, 180, 181, 182, 183, 184, 185, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187,
- 188, 189, 190, 191, 160, 161, 174, 175, 176, 177, 178, 179, 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 201, 202, 203, 216, 217, 218, 219, 220, 221, 234, 235, 236, 237, 238, 239, 204, 205, 206, 207,
- 208, 209, 222, 223, 224, 225, 226, 227, 240, 241, 242, 243, 244, 245, 210, 211, 212, 213, 214, 215,
- 228, 229, 230, 231, 232, 233, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 270, 271,
- 272, 273, 274, 275, 288, 289, 290, 291, 292, 293, 306, 307, 308, 309, 258, 259, 260, 261, 262, 263,
- 276, 277, 278, 279, 280, 281, 294, 295, 296, 297, 298, 299, 312, 313, 314, 315, 264, 265, 266, 267,
- 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 320, 321, 310, 311,
- 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379,
- 380, 381, 382, 383, 396, 397, 398, 399, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351,
- 352, 353, 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 322, 323,
- 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 390, 391,
- 392, 393, 394, 395, 408, 409, 410, 411, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
- 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
- 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559,
- 560, 561, 562, 563, 406, 407, 420, 421, 422, 423, 424, 425, 438, 439, 440, 441, 442, 443, 456, 457,
- 458, 459, 460, 461, 474, 475, 476, 477, 478, 479, 492, 493, 494, 495, 496, 497, 510, 511, 512, 513,
- 514, 515, 528, 529, 530, 531, 532, 533, 546, 547, 548, 549, 550, 551, 564, 565, 566, 567, 568, 569,
- 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467,
- 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535,
- 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
-
-{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
- 16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
- 42, 43, 44, 45, 48, 49, 50, 51, 40, 41, 54, 55, 56, 57, 46, 47, 60, 61, 62, 63,
- 52, 53, 66, 67, 68, 69, 58, 59, 72, 73, 74, 75, 64, 65, 78, 79, 80, 81, 70, 71,
- 84, 85, 86, 87, 76, 77, 90, 91, 92, 93, 94, 95, 108, 109, 82, 83, 96, 97, 98, 99,
- 100, 101, 114, 115, 88, 89, 102, 103, 104, 105, 106, 107, 120, 121, 110, 111, 112, 113, 126, 127,
- 128, 129, 130, 131, 144, 145, 116, 117, 118, 119, 132, 133, 134, 135, 136, 137, 150, 151, 122, 123,
- 124, 125, 138, 139, 140, 141, 142, 143, 156, 157, 146, 147, 148, 149, 162, 163, 164, 165, 166, 167,
- 180, 181, 182, 183, 152, 153, 154, 155, 168, 169, 170, 171, 172, 173, 186, 187, 188, 189, 158, 159,
- 160, 161, 174, 175, 176, 177, 178, 179, 192, 193, 194, 195, 184, 185, 198, 199, 200, 201, 202, 203,
- 216, 217, 218, 219, 220, 221, 234, 235, 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225,
- 226, 227, 240, 241, 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 246, 247,
- 236, 237, 238, 239, 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291,
- 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295, 296, 297,
- 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283, 284, 285, 286, 287, 300, 301, 302, 303,
- 292, 293, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 342, 343, 344, 345, 346, 347,
- 360, 361, 362, 363, 364, 365, 298, 299, 312, 313, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335,
- 348, 349, 350, 351, 352, 353, 366, 367, 368, 369, 370, 371, 304, 305, 318, 319, 320, 321, 322, 323,
- 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375, 376, 377, 378, 379,
- 380, 381, 382, 383, 396, 397, 398, 399, 400, 401, 414, 415, 416, 417, 418, 419, 432, 433, 434, 435,
- 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487, 488, 489, 490, 491,
- 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 540, 541, 542, 543, 544, 545, 558, 559,
- 560, 561, 562, 563, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 406, 407, 420, 421, 422, 423,
- 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479,
- 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 546, 547,
- 548, 549, 550, 551, 564, 565, 566, 567, 568, 569, 390, 391, 392, 393, 394, 395, 408, 409, 410, 411,
- 412, 413, 426, 427, 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467,
- 480, 481, 482, 483, 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535,
- 536, 537, 538, 539, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575},
-
-{ 0, 1, 2, 3, 6, 7, 8, 9, 12, 13, 14, 15, 4, 5, 18, 19, 10, 11, 24, 25,
- 16, 17, 30, 31, 20, 21, 22, 23, 26, 27, 28, 29, 32, 33, 34, 35, 36, 37, 38, 39,
- 42, 43, 44, 45, 48, 49, 50, 51, 40, 41, 54, 55, 56, 57, 46, 47, 60, 61, 62, 63,
- 52, 53, 66, 67, 68, 69, 58, 59, 72, 73, 74, 75, 76, 77, 64, 65, 78, 79, 80, 81,
- 82, 83, 70, 71, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 108, 109, 110, 111,
- 112, 113, 96, 97, 98, 99, 100, 101, 114, 115, 116, 117, 118, 119, 102, 103, 104, 105, 106, 107,
- 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 144, 145, 146, 147, 148, 149, 162, 163,
- 164, 165, 132, 133, 134, 135, 136, 137, 150, 151, 152, 153, 154, 155, 168, 169, 170, 171, 138, 139,
- 140, 141, 142, 143, 156, 157, 158, 159, 160, 161, 174, 175, 176, 177, 166, 167, 180, 181, 182, 183,
- 184, 185, 198, 199, 200, 201, 202, 203, 216, 217, 218, 219, 220, 221, 172, 173, 186, 187, 188, 189,
- 190, 191, 204, 205, 206, 207, 208, 209, 222, 223, 224, 225, 226, 227, 178, 179, 192, 193, 194, 195,
- 196, 197, 210, 211, 212, 213, 214, 215, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
- 252, 253, 254, 255, 256, 257, 270, 271, 272, 273, 274, 275, 288, 289, 290, 291, 292, 293, 306, 307,
- 240, 241, 242, 243, 244, 245, 258, 259, 260, 261, 262, 263, 276, 277, 278, 279, 280, 281, 294, 295,
- 296, 297, 298, 299, 312, 313, 246, 247, 248, 249, 250, 251, 264, 265, 266, 267, 268, 269, 282, 283,
- 284, 285, 286, 287, 300, 301, 302, 303, 304, 305, 318, 319, 308, 309, 310, 311, 324, 325, 326, 327,
- 328, 329, 342, 343, 344, 345, 346, 347, 360, 361, 362, 363, 364, 365, 378, 379, 380, 381, 382, 383,
- 396, 397, 398, 399, 400, 401, 314, 315, 316, 317, 330, 331, 332, 333, 334, 335, 348, 349, 350, 351,
- 352, 353, 366, 367, 368, 369, 370, 371, 384, 385, 386, 387, 388, 389, 402, 403, 404, 405, 406, 407,
- 320, 321, 322, 323, 336, 337, 338, 339, 340, 341, 354, 355, 356, 357, 358, 359, 372, 373, 374, 375,
- 376, 377, 390, 391, 392, 393, 394, 395, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419,
- 432, 433, 434, 435, 436, 437, 450, 451, 452, 453, 454, 455, 468, 469, 470, 471, 472, 473, 486, 487,
- 488, 489, 490, 491, 504, 505, 506, 507, 508, 509, 522, 523, 524, 525, 526, 527, 420, 421, 422, 423,
- 424, 425, 438, 439, 440, 441, 442, 443, 456, 457, 458, 459, 460, 461, 474, 475, 476, 477, 478, 479,
- 492, 493, 494, 495, 496, 497, 510, 511, 512, 513, 514, 515, 528, 529, 530, 531, 532, 533, 426, 427,
- 428, 429, 430, 431, 444, 445, 446, 447, 448, 449, 462, 463, 464, 465, 466, 467, 480, 481, 482, 483,
- 484, 485, 498, 499, 500, 501, 502, 503, 516, 517, 518, 519, 520, 521, 534, 535, 536, 537, 538, 539,
- 540, 541, 542, 543, 544, 545, 558, 559, 560, 561, 562, 563, 546, 547, 548, 549, 550, 551, 564, 565,
- 566, 567, 568, 569, 552, 553, 554, 555, 556, 557, 570, 571, 572, 573, 574, 575}
-}};
-
-#endif
diff --git a/Src/Sound/MPEG/position.cpp b/Src/Sound/MPEG/position.cpp
deleted file mode 100644
index 296489a..0000000
--- a/Src/Sound/MPEG/position.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * position.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-/* position.c ffwd/rew within a stream
- *
- * Creted by: Tomislav Uzelac, May 10 1997
- */
-#include
-#include
-#include "amp.h"
-#include "amp_audio.h"
-#include "getbits.h"
-
-#define POSITION
-#include "position.h"
-
-/* Returns the number of frames actually skipped, -1 on error.
- *
- * Values in header are not changed if retval!=nframes.
- * This is not necessary because gethdr() doesn't clobber
- * the contents of header, but I don't want to rely on that.
- */
-int ffwd(struct AUDIO_HEADER *header, int nframes)
-{
-int cnt=0,g;
-int hsize,bitrate,fs,mean_frame_size;
-struct AUDIO_HEADER tmp;
- memcpy(&tmp,header,sizeof(tmp));
-
- while (cnt < nframes) {
- if (tmp.ID)
- if (tmp.mode==3) hsize=21;
- else hsize=36;
- else
- if (tmp.mode==3) hsize=13;
- else hsize=21;
- if (tmp.protection_bit==0) hsize+=2;
- if ((g=dummy_getinfo(hsize))) /* dummy_getinfo: reads hsize-4 bytes */
- switch (g) {
- case GETHDR_EOF: return cnt;
- case GETHDR_ERR:
- default: return -1;
- }
-
- bitrate=t_bitrate[tmp.ID][3-tmp.layer][tmp.bitrate_index];
- fs=t_sampling_frequency[tmp.ID][tmp.sampling_frequency];
- if (tmp.ID) mean_frame_size=144000*bitrate/fs;
- else mean_frame_size=72000*bitrate/fs;
- fillbfr(mean_frame_size + tmp.padding_bit - hsize);
-
- if ((g=gethdr(&tmp)))
- switch (g) {
- case GETHDR_EOF: return cnt;
- case GETHDR_ERR:
- default: return -1;
- }
- cnt++;
- }
-
- memcpy(header,&tmp,sizeof(tmp));
- return cnt;
-}
-
-/* Mostly the same as ffwd. Some streams might be 'tough', i.e.
- * the ones switching bitrates.
- */
-int rew(struct AUDIO_HEADER *header, int nframes)
-{
-int cnt=0;
-int bitrate,fs,mean_frame_size;
-struct AUDIO_HEADER tmp;
- memcpy(&tmp,header,sizeof(tmp));
-
- while (cnt < nframes) {
- /* ffwd/rew functions are to be called right after the header has been parsed
- * so we have to go back one frame + 4 bytes + 1 byte (in case padding was used).
- */
- bitrate=t_bitrate[tmp.ID][3-tmp.layer][tmp.bitrate_index];
- fs=t_sampling_frequency[tmp.ID][tmp.sampling_frequency];
- if (tmp.ID) mean_frame_size=144000*bitrate/fs;
- else mean_frame_size=72000*bitrate/fs;
-
- if (rewind_stream(mean_frame_size) !=0) {
- memcpy(header,&tmp,sizeof(tmp));
- return cnt;
- }
- if ((gethdr(&tmp))) return -1;
- cnt++;
- }
- /* We have to make sure that the bit reservoir contains enough data.
- * Hopefully, layer3_frame will take care of that.
- */
- f_bdirty=TRUE;
- bclean_bytes=0;
-
- memcpy(header,&tmp,sizeof(tmp));
- return cnt;
-}
-
-/* TODO: after the gethdr function is enhanced with the counter to count
- * the number of bytes to search for the next syncword, make the call to
- * gethdr() from rew() have that counter something like (frame_size-1) so
- * that we don't go back again and again to the same header. (not very important)
- */
diff --git a/Src/Sound/MPEG/position.h b/Src/Sound/MPEG/position.h
deleted file mode 100644
index 0b6f736..0000000
--- a/Src/Sound/MPEG/position.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * position.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-extern int ffwd(struct AUDIO_HEADER *header, int nframes);
-extern int rew(struct AUDIO_HEADER *header, int nframes);
-
-#ifdef POSITION
-int ffwd(struct AUDIO_HEADER *header, int nframes);
-int rew(struct AUDIO_HEADER *header, int nframes);
-#endif
diff --git a/Src/Sound/MPEG/proto.h b/Src/Sound/MPEG/proto.h
deleted file mode 100644
index a4c4d4b..0000000
--- a/Src/Sound/MPEG/proto.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * proto.h
- *
- * Amp library internal header file.
- */
-
-
-/* From: util.c */
-void die(char *, ...);
-void warn(char *, ...);
-void msg(char *, ...);
-void debugSetup(char *);
-void debugOptions();
-
-/* From: audioIO_.c */
-void audioOpen(int frequency, int stereo, int volume);
-void audioSetVolume(int);
-void audioFlush();
-void audioClose();
-int audioWrite(char *, int);
-int getAudioFd();
-void audioBufferOn(int);
-
-
-/* From: buffer.c */
-void printout(void);
-int audioBufferOpen(int, int, int);
-void audioBufferClose();
-void audioBufferWrite(char *, int);
-void audioBufferFlush();
-
-/* From: audio.c */
-void displayUsage();
diff --git a/Src/Sound/MPEG/rtbuf.h b/Src/Sound/MPEG/rtbuf.h
deleted file mode 100644
index 7d24c38..0000000
--- a/Src/Sound/MPEG/rtbuf.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * rtbuf.h
- *
- * Amp library internal header file.
- */
-
-
-/*****************************************************************************/
-
-/*
- * rtbuf.h -- Linux realtime audio output.
- *
- * Copyright (C) 1996 Thomas Sailer (sailer@ife.ee.ethz.ch)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- * This is the Linux realtime sound output driver
- */
-
-/*****************************************************************************/
-
-#include "config.h"
-
-#ifndef HAVE_MLOCKALL
-#undef LINUX_REALTIME
-#endif
-
-#ifndef HAVE_SCHED_SETSCHEDULER
-#undef LINUX_REALTIME
-#endif
-
-#if 0
-#ifndef _POSIX_MEMLOCK
-#undef LINUX_REALTIME
-#endif
-
-#ifndef _POSIX_PRIORITY_SCHEDULING
-#undef LINUX_REALTIME
-#endif
-#endif
-
-#ifdef LINUX_REALTIME
-
-int prefetch_get_input(unsigned char *bp, int bytes);
-int rt_play(char *file);
-void rt_printout(short *sbuf, int ln);
-int setup_fancy_audio(struct AUDIO_HEADER *mpegheader);
-int start_fancy_audio(struct AUDIO_HEADER *mpegheader);
-int stop_fancy_audio(void);
-int block_fancy_audio(int snd_eof);
-int ready_fancy_audio(void);
-void cleanup_fancy_audio(void);
-void prefetch_initial_fill(void);
-int set_realtime_priority(void);
-
-#endif /* LINUX_REALTIME */
-
diff --git a/Src/Sound/MPEG/transform.cpp b/Src/Sound/MPEG/transform.cpp
deleted file mode 100644
index a57b4bc..0000000
--- a/Src/Sound/MPEG/transform.cpp
+++ /dev/null
@@ -1,1546 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * transform.cpp
- *
- * Amp library internal module.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* transform.c imdct and polyphase(DCT) transforms
- *
- * Created by: tomislav uzelac May 1996
- * Karl Anders Oygard optimized this for speed, Mar 13 97
- * Some optimisations based on ideas from Michael Hipp's mpg123 package
- */
-
-/*
- * Comments for this file:
- *
- * The polyphase algorithm is clearly the most cpu consuming part of mpeg 1
- * layer 3 decoding. Thus, there has been some effort to optimise this
- * particular algorithm. Currently, everything has been kept in straight C
- * with no assembler optimisations, but in order to provide efficient paths
- * for different architectures, alternative implementations of some
- * critical sections has been done. You may want to experiment with these,
- * to see which suits your architecture better.
- *
- * Selection of the different implementations is done with the following
- * defines:
- *
- * HAS_AUTOINCREMENT
- *
- * Define this if your architecture supports preincrementation of
- * pointers when referencing (applies to e.g. 68k)
- *
- * For those who are optimising amp, check out the Pentium rdtsc code
- * (define PENTIUM_RDTSC). This code uses the rdtsc counter for showing
- * how many cycles are spent in different parts of the code.
- */
-
-#include
-
-#include "amp_audio.h"
-#include "getdata.h"
-#include "misc2.h"
-
-#define TRANSFORM
-#include "transform.h"
-
-#define PI12 0.261799387f
-#define PI36 0.087266462f
-
-void imdct_init()
-{
- int i;
-
- for(i=0;i<36;i++) /* 0 */
- win[0][i] = (float) sin(PI36 *(i+0.5));
- for(i=0;i<18;i++) /* 1 */
- win[1][i] = (float) sin(PI36 *(i+0.5));
- for(i=18;i<24;i++)
- win[1][i] = 1.0f;
- for(i=24;i<30;i++)
- win[1][i] = (float) sin(PI12 *(i+0.5-18));
- for(i=30;i<36;i++)
- win[1][i] = 0.0f;
- for(i=0;i<6;i++) /* 3 */
- win[3][i] = 0.0f;
- for(i=6;i<12;i++)
- win[3][i] = (float) sin(PI12 * (i+ 0.5 - 6.0));
- for(i=12;i<18;i++)
- win[3][i] = 1.0f;
- for(i=18;i<36;i++)
- win[3][i] = (float) sin(PI36 * (i + 0.5));
-}
-
-/* This uses Byeong Gi Lee's Fast Cosine Transform algorithm to decompose
- the 36 point and 12 point IDCT's into 9 point and 3 point IDCT's,
- respectively. Then the 9 point IDCT is computed by a modified version of
- Mikko Tommila's IDCT algorithm, based on the WFTA. See his comments
- before the first 9 point IDCT. The 3 point IDCT is already efficient to
- implement. -- Jeff Tsay. */
-/* I got the unrolled IDCT from Jeff Tsay; the code is presumably by
- Francois-Raymond Boyer - I unrolled it a little further. tu */
-
-void imdct(int win_type,int sb,int ch)
-{
-/*------------------------------------------------------------------*/
-/* */
-/* Function: Calculation of the inverse MDCT */
-/* In the case of short blocks the 3 output vectors are already */
-/* overlapped and added in this modul. */
-/* */
-/* New layer3 */
-/* */
-/*------------------------------------------------------------------*/
-
- float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10, tmp11;
-
- register float save;
- float pp1, pp2;
- float *win_bt;
- int i, p, ss;
- float *in = xr[ch][sb];
- float *s_p = s[ch][sb];
- float *res_p = res[sb];
- float out[36];
-
- if(win_type == 2){
- for(p=0;p<36;p+=9) {
- out[p] = out[p+1] = out[p+2] = out[p+3] =
- out[p+4] = out[p+5] = out[p+6] = out[p+7] =
- out[p+8] = 0.0f;
- }
-
- for(ss=0;ss<18;ss+=6) {
-
- /*
- * 12 point IMDCT
- */
-
- /* Begin 12 point IDCT */
-
- /* Input aliasing for 12 pt IDCT */
- in[5+ss]+=in[4+ss];in[4+ss]+=in[3+ss];in[3+ss]+=in[2+ss];
- in[2+ss]+=in[1+ss];in[1+ss]+=in[0+ss];
-
- /* Input aliasing on odd indices (for 6 point IDCT) */
- in[5+ss] += in[3+ss]; in[3+ss] += in[1+ss];
-
- /* 3 point IDCT on even indices */
-
- pp2 = in[4+ss] * 0.500000000f;
- pp1 = in[2+ss] * 0.866025403f;
- save = in[0+ss] + pp2;
- tmp1 = in[0+ss] - in[4+ss];
- tmp0 = save + pp1;
- tmp2 = save - pp1;
-
- /* End 3 point IDCT on even indices */
-
- /* 3 point IDCT on odd indices (for 6 point IDCT) */
-
- pp2 = in[5+ss] * 0.500000000f;
- pp1 = in[3+ss] * 0.866025403f;
- save = in[1+ss] + pp2;
- tmp4 = in[1+ss] - in[5+ss];
- tmp5 = save + pp1;
- tmp3 = save - pp1;
-
- /* End 3 point IDCT on odd indices */
-
- /* Twiddle factors on odd indices (for 6 point IDCT) */
-
- tmp3 *= 1.931851653f;
- tmp4 *= 0.707106781f;
- tmp5 *= 0.517638090f;
-
- /* Output butterflies on 2 3 point IDCT's (for 6 point IDCT) */
-
- save = tmp0;
- tmp0 += tmp5;
- tmp5 = save - tmp5;
-
- save = tmp1;
- tmp1 += tmp4;
- tmp4 = save - tmp4;
-
- save = tmp2;
- tmp2 += tmp3;
- tmp3 = save - tmp3;
-
- /* End 6 point IDCT */
-
- /* Twiddle factors on indices (for 12 point IDCT) */
-
- tmp0 *= 0.504314480f;
- tmp1 *= 0.541196100f;
- tmp2 *= 0.630236207f;
- tmp3 *= 0.821339815f;
- tmp4 *= 1.306562965f;
- tmp5 *= 3.830648788f;
-
- /* End 12 point IDCT */
-
- /* Shift to 12 point modified IDCT, multiply by window type 2 */
- tmp8 = tmp0 * -0.793353340f;
- tmp9 = tmp0 * -0.608761429f;
- tmp7 = tmp1 * -0.923879532f;
- tmp10 = tmp1 * -0.382683432f;
- tmp6 = tmp2 * -0.991444861f;
- tmp11 = tmp2 * -0.130526192f;
-
- tmp0 = tmp3;
- tmp1 = tmp4 * 0.382683432f;
- tmp2 = tmp5 * 0.608761429f;
-
- tmp3 = tmp5 * -0.793353340f;
- tmp4 = tmp4 * -0.923879532f;
- tmp5 = tmp0 * -0.991444861f;
-
- tmp0 *= 0.130526192f;
-
- out[ss + 6] += tmp0;
- out[ss + 7] += tmp1;
- out[ss + 8] += tmp2;
- out[ss + 9] += tmp3;
- out[ss + 10] += tmp4;
- out[ss + 11] += tmp5;
- out[ss + 12] += tmp6;
- out[ss + 13] += tmp7;
- out[ss + 14] += tmp8;
- out[ss + 15] += tmp9;
- out[ss + 16] += tmp10;
- out[ss + 17] += tmp11;
-
- }
- if (sb&1) {
- for (i=0;i<18;i+=2) res_p[i]=out[i] + s_p[i];
- for (i=1;i<18;i+=2) res_p[i]=-out[i] - s_p[i];
- } else
- for (i=0;i<18;i++) res_p[i]=out[i] + s_p[i];
- for (i=18;i<36;i++) s_p[i-18]=out[i];
-
- } else {
-/*
- * 36 point IDCT ****************************************************************
- */
- float tmp[18];
-
- /* input aliasing for 36 point IDCT */
- in[17]+=in[16]; in[16]+=in[15]; in[15]+=in[14]; in[14]+=in[13];
- in[13]+=in[12]; in[12]+=in[11]; in[11]+=in[10]; in[10]+=in[9];
- in[9] +=in[8]; in[8] +=in[7]; in[7] +=in[6]; in[6] +=in[5];
- in[5] +=in[4]; in[4] +=in[3]; in[3] +=in[2]; in[2] +=in[1];
- in[1] +=in[0];
-
- /* 18 point IDCT for odd indices */
-
- /* input aliasing for 18 point IDCT */
- in[17]+=in[15]; in[15]+=in[13]; in[13]+=in[11]; in[11]+=in[9];
- in[9] +=in[7]; in[7] +=in[5]; in[5] +=in[3]; in[3] +=in[1];
-
-
-{
- float tmp0,tmp1,tmp2,tmp3,tmp4,tmp0_,tmp1_,tmp2_,tmp3_;
- float tmp0o,tmp1o,tmp2o,tmp3o,tmp4o,tmp0_o,tmp1_o,tmp2_o,tmp3_o;
-
-/* Fast 9 Point Inverse Discrete Cosine Transform
-//
-// By Francois-Raymond Boyer
-// mailto:boyerf@iro.umontreal.ca
-// http://www.iro.umontreal.ca/~boyerf
-//
-// The code has been optimized for Intel processors
-// (takes a lot of time to convert float to and from iternal FPU representation)
-//
-// It is a simple "factorization" of the IDCT matrix.
-*/
- /* 9 point IDCT on even indices */
- {
- /* 5 points on odd indices (not realy an IDCT) */
- float i0 = in[0]+in[0];
- float i0p12 = i0 + in[12];
-
- tmp0 = i0p12 + in[4]*1.8793852415718f + in[8]*1.532088886238f + in[16]*0.34729635533386f;
- tmp1 = i0 + in[4] - in[8] - in[12] - in[12] - in[16];
- tmp2 = i0p12 - in[4]*0.34729635533386f - in[8]*1.8793852415718f + in[16]*1.532088886238f;
- tmp3 = i0p12 - in[4]*1.532088886238f + in[8]*0.34729635533386f - in[16]*1.8793852415718f;
- tmp4 = in[0] - in[4] + in[8] - in[12] + in[16];
- }
- {
- float i6_ = in[6]*1.732050808f;
-
- tmp0_ = in[2]*1.9696155060244f + i6_ + in[10]*1.2855752193731f + in[14]*0.68404028665134f;
- tmp1_ = (in[2] - in[10] - in[14])*1.732050808f;
- tmp2_ = in[2]*1.2855752193731f - i6_ - in[10]*0.68404028665134f + in[14]*1.9696155060244f;
- tmp3_ = in[2]*0.68404028665134f - i6_ + in[10]*1.9696155060244f - in[14]*1.2855752193731f;
- }
-
- /* 9 point IDCT on odd indices */
- {
- /* 5 points on odd indices (not realy an IDCT) */
- float i0 = in[0+1]+in[0+1];
- float i0p12 = i0 + in[12+1];
-
- tmp0o = i0p12 + in[4+1]*1.8793852415718f + in[8+1]*1.532088886238f + in[16+1]*0.34729635533386f;
- tmp1o = i0 + in[4+1] - in[8+1] - in[12+1] - in[12+1] - in[16+1];
- tmp2o = i0p12 - in[4+1]*0.34729635533386f - in[8+1]*1.8793852415718f + in[16+1]*1.532088886238f;
- tmp3o = i0p12 - in[4+1]*1.532088886238f + in[8+1]*0.34729635533386f - in[16+1]*1.8793852415718f;
- tmp4o = (in[0+1] - in[4+1] + in[8+1] - in[12+1] + in[16+1])*0.707106781f; /* Twiddled */
- }
- {
- /* 4 points on even indices */
- float i6_ = in[6+1]*1.732050808f; /* Sqrt[3] */
-
- tmp0_o = in[2+1]*1.9696155060244f + i6_ + in[10+1]*1.2855752193731f + in[14+1]*0.68404028665134f;
- tmp1_o = (in[2+1] - in[10+1] - in[14+1])*1.732050808f;
- tmp2_o = in[2+1]*1.2855752193731f - i6_ - in[10+1]*0.68404028665134f + in[14+1]*1.9696155060244f;
- tmp3_o = in[2+1]*0.68404028665134f - i6_ + in[10+1]*1.9696155060244f - in[14+1]*1.2855752193731f;
- }
-
- /* Twiddle factors on odd indices
- // and
- // Butterflies on 9 point IDCT's
- // and
- // twiddle factors for 36 point IDCT
- */
- {
- float e, o;
- e = tmp0 + tmp0_; o = (tmp0o + tmp0_o)*0.501909918f; tmp[0] = (e + o)*(-0.500476342f*.5f); tmp[17] = (e - o)*(-11.46279281f*.5f);
- e = tmp1 + tmp1_; o = (tmp1o + tmp1_o)*0.517638090f; tmp[1] = (e + o)*(-0.504314480f*.5f); tmp[16] = (e - o)*(-3.830648788f*.5f);
- e = tmp2 + tmp2_; o = (tmp2o + tmp2_o)*0.551688959f; tmp[2] = (e + o)*(-0.512139757f*.5f); tmp[15] = (e - o)*(-2.310113158f*.5f);
- e = tmp3 + tmp3_; o = (tmp3o + tmp3_o)*0.610387294f; tmp[3] = (e + o)*(-0.524264562f*.5f); tmp[14] = (e - o)*(-1.662754762f*.5f);
- tmp[4] = (tmp4 + tmp4o)*(-0.541196100f); tmp[13] = (tmp4 - tmp4o)*(-1.306562965f);
- e = tmp3 - tmp3_; o = (tmp3o - tmp3_o)*0.871723397f; tmp[5] = (e + o)*(-0.563690973f*.5f); tmp[12] = (e - o)*(-1.082840285f*.5f);
- e = tmp2 - tmp2_; o = (tmp2o - tmp2_o)*1.183100792f; tmp[6] = (e + o)*(-0.592844523f*.5f); tmp[11] = (e - o)*(-0.930579498f*.5f);
- e = tmp1 - tmp1_; o = (tmp1o - tmp1_o)*1.931851653f; tmp[7] = (e + o)*(-0.630236207f*.5f); tmp[10] = (e - o)*(-0.821339815f*.5f);
- e = tmp0 - tmp0_; o = (tmp0o - tmp0_o)*5.736856623f; tmp[8] = (e + o)*(-0.678170852f*.5f); tmp[9] = (e - o)*(-0.740093616f*.5f);
- }
- }
- /* shift to modified IDCT */
- win_bt = win[win_type];
-
- if (sb&1) {
- res_p[0] = -tmp[9] * win_bt[0] + s_p[0];
- res_p[1] =-(-tmp[10] * win_bt[1] + s_p[1]);
- res_p[2] = -tmp[11] * win_bt[2] + s_p[2];
- res_p[3] =-(-tmp[12] * win_bt[3] + s_p[3]);
- res_p[4] = -tmp[13] * win_bt[4] + s_p[4];
- res_p[5] =-(-tmp[14] * win_bt[5] + s_p[5]);
- res_p[6] = -tmp[15] * win_bt[6] + s_p[6];
- res_p[7] =-(-tmp[16] * win_bt[7] + s_p[7]);
- res_p[8] = -tmp[17] * win_bt[8] + s_p[8];
-
- res_p[9] = -(tmp[17] * win_bt[9] + s_p[9]);
- res_p[10]= tmp[16] * win_bt[10] + s_p[10];
- res_p[11]=-(tmp[15] * win_bt[11] + s_p[11]);
- res_p[12]= tmp[14] * win_bt[12] + s_p[12];
- res_p[13]=-(tmp[13] * win_bt[13] + s_p[13]);
- res_p[14]= tmp[12] * win_bt[14] + s_p[14];
- res_p[15]=-(tmp[11] * win_bt[15] + s_p[15]);
- res_p[16]= tmp[10] * win_bt[16] + s_p[16];
- res_p[17]=-(tmp[9] * win_bt[17] + s_p[17]);
- } else {
- res_p[0] = -tmp[9] * win_bt[0] + s_p[0];
- res_p[1] = -tmp[10] * win_bt[1] + s_p[1];
- res_p[2] = -tmp[11] * win_bt[2] + s_p[2];
- res_p[3] = -tmp[12] * win_bt[3] + s_p[3];
- res_p[4] = -tmp[13] * win_bt[4] + s_p[4];
- res_p[5] = -tmp[14] * win_bt[5] + s_p[5];
- res_p[6] = -tmp[15] * win_bt[6] + s_p[6];
- res_p[7] = -tmp[16] * win_bt[7] + s_p[7];
- res_p[8] = -tmp[17] * win_bt[8] + s_p[8];
-
- res_p[9] = tmp[17] * win_bt[9] + s_p[9];
- res_p[10]= tmp[16] * win_bt[10] + s_p[10];
- res_p[11]= tmp[15] * win_bt[11] + s_p[11];
- res_p[12]= tmp[14] * win_bt[12] + s_p[12];
- res_p[13]= tmp[13] * win_bt[13] + s_p[13];
- res_p[14]= tmp[12] * win_bt[14] + s_p[14];
- res_p[15]= tmp[11] * win_bt[15] + s_p[15];
- res_p[16]= tmp[10] * win_bt[16] + s_p[16];
- res_p[17]= tmp[9] * win_bt[17] + s_p[17];
- }
-
- s_p[0]= tmp[8] * win_bt[18];
- s_p[1]= tmp[7] * win_bt[19];
- s_p[2]= tmp[6] * win_bt[20];
- s_p[3]= tmp[5] * win_bt[21];
- s_p[4]= tmp[4] * win_bt[22];
- s_p[5]= tmp[3] * win_bt[23];
- s_p[6]= tmp[2] * win_bt[24];
- s_p[7]= tmp[1] * win_bt[25];
- s_p[8]= tmp[0] * win_bt[26];
-
- s_p[9]= tmp[0] * win_bt[27];
- s_p[10]= tmp[1] * win_bt[28];
- s_p[11]= tmp[2] * win_bt[29];
- s_p[12]= tmp[3] * win_bt[30];
- s_p[13]= tmp[4] * win_bt[31];
- s_p[14]= tmp[5] * win_bt[32];
- s_p[15]= tmp[6] * win_bt[33];
- s_p[16]= tmp[7] * win_bt[34];
- s_p[17]= tmp[8] * win_bt[35];
- }
-}
-
-/* fast DCT according to Lee[84]
- * reordering according to Konstantinides[94]
- */
-void poly(const int ch,int f)
-{
-static float u[2][2][17][16]; /* no v[][], it's redundant */
-static int u_start[2]={0,0}; /* first element of u[][] */
-static int u_div[2]={0,0}; /* which part of u[][] is currently used */
-int start = u_start[ch];
-int div = u_div[ch];
-float (*u_p)[16];
-
-#if defined(PENTIUM_RDTSC)
-unsigned int cnt4, cnt3, cnt2, cnt1;
-static int min_cycles = 99999999;
-
- __asm__(".byte 0x0f,0x31" : "=a" (cnt1), "=d" (cnt4));
-#endif
-
- {
- float d16,d17,d18,d19,d20,d21,d22,d23,d24,d25,d26,d27,d28,d29,d30,d31;
- float d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15;
-
- /* step 1: initial reordering and 1st (16 wide) butterflies
- */
-
- d0 = res[ 0][f]; d16=(d0 - res[31][f]) * b1; d0 += res[31][f];
- d1 = res[ 1][f]; d17=(d1 - res[30][f]) * b3; d1 += res[30][f];
- d3 = res[ 2][f]; d19=(d3 - res[29][f]) * b5; d3 += res[29][f];
- d2 = res[ 3][f]; d18=(d2 - res[28][f]) * b7; d2 += res[28][f];
- d6 = res[ 4][f]; d22=(d6 - res[27][f]) * b9; d6 += res[27][f];
- d7 = res[ 5][f]; d23=(d7 - res[26][f]) * b11; d7 += res[26][f];
- d5 = res[ 6][f]; d21=(d5 - res[25][f]) * b13; d5 += res[25][f];
- d4 = res[ 7][f]; d20=(d4 - res[24][f]) * b15; d4 += res[24][f];
- d12= res[ 8][f]; d28=(d12 - res[23][f]) * b17; d12+= res[23][f];
- d13= res[ 9][f]; d29=(d13 - res[22][f]) * b19; d13+= res[22][f];
- d15= res[10][f]; d31=(d15 - res[21][f]) * b21; d15+= res[21][f];
- d14= res[11][f]; d30=(d14 - res[20][f]) * b23; d14+= res[20][f];
- d10= res[12][f]; d26=(d10 - res[19][f]) * b25; d10+= res[19][f];
- d11= res[13][f]; d27=(d11 - res[18][f]) * b27; d11+= res[18][f];
- d9 = res[14][f]; d25=(d9 - res[17][f]) * b29; d9 += res[17][f];
- d8 = res[15][f]; d24=(d8 - res[16][f]) * b31; d8 += res[16][f];
-
- {
- float c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15;
-
-/* a test to see what can be done with memory separation
- * first we process indexes 0-15
-*/
- c0 = d0 + d8 ; c8 = ( d0 - d8 ) * b2;
- c1 = d1 + d9 ; c9 = ( d1 - d9 ) * b6;
- c2 = d2 + d10; c10= ( d2 - d10) * b14;
- c3 = d3 + d11; c11= ( d3 - d11) * b10;
- c4 = d4 + d12; c12= ( d4 - d12) * b30;
- c5 = d5 + d13; c13= ( d5 - d13) * b26;
- c6 = d6 + d14; c14= ( d6 - d14) * b18;
- c7 = d7 + d15; c15= ( d7 - d15) * b22;
-
- /* step 3: 4-wide butterflies
- */
- d0 = c0 + c4 ; d4 = ( c0 - c4 ) * b4;
- d1 = c1 + c5 ; d5 = ( c1 - c5 ) * b12;
- d2 = c2 + c6 ; d6 = ( c2 - c6 ) * b28;
- d3 = c3 + c7 ; d7 = ( c3 - c7 ) * b20;
-
- d8 = c8 + c12; d12= ( c8 - c12) * b4;
- d9 = c9 + c13; d13= ( c9 - c13) * b12;
- d10= c10+ c14; d14= (c10 - c14) * b28;
- d11= c11+ c15; d15= (c11 - c15) * b20;
-
-
- /* step 4: 2-wide butterflies
- */
- {
- float rb8 = b8;
- float rb24 = b24;
-
-/**/ c0 = d0 + d2 ; c2 = ( d0 - d2 ) * rb8;
- c1 = d1 + d3 ; c3 = ( d1 - d3 ) * rb24;
-/**/ c4 = d4 + d6 ; c6 = ( d4 - d6 ) * rb8;
- c5 = d5 + d7 ; c7 = ( d5 - d7 ) * rb24;
-/**/ c8 = d8 + d10; c10= ( d8 - d10) * rb8;
- c9 = d9 + d11; c11= ( d9 - d11) * rb24;
-/**/ c12= d12+ d14; c14= (d12 - d14) * rb8;
- c13= d13+ d15; c15= (d13 - d15) * rb24;
- }
-
- /* step 5: 1-wide butterflies
- */
- {
- float rb16 = b16;
-
- /* this is a little 'hacked up'
- */
- d0 = (-c0 -c1) * 2; d1 = ( c0 - c1 ) * rb16;
- d2 = c2 + c3; d3 = ( c2 - c3 ) * rb16;
- d3 -= d2;
-
- d4 = c4 +c5; d5 = ( c4 - c5 ) * rb16;
- d5 += d4;
- d7 = -d5;
- d7 += ( c6 - c7 ) * rb16; d6 = +c6 +c7;
-
- d8 = c8 + c9 ; d9 = ( c8 - c9 ) * rb16;
- d11= +d8 +d9;
- d11 +=(c10 - c11) * rb16; d10= c10+ c11;
-
- d12 = c12+ c13; d13 = (c12 - c13) * rb16;
- d13 += -d8-d9+d12;
- d14 = c14+ c15; d15 = (c14 - c15) * rb16;
- d15-=d11;
- d14 += -d8 -d10;
- }
-
- /* step 6: final resolving & reordering
- * the other 32 are stored for use with the next granule
- */
-
- u_p = (float (*)[16]) &u[ch][div][0][start];
-
-/*16*/ u_p[ 0][0] =+d1 ;
- u_p[ 2][0] = +d9 -d14;
-/*20*/ u_p[ 4][0] = +d5 -d6;
- u_p[ 6][0] = -d10 +d13;
-/*24*/ u_p[ 8][0] =d3;
- u_p[10][0] = -d8 -d9 +d11 -d13;
-/*28*/ u_p[12][0] = +d7;
- u_p[14][0] = +d15;
-
- /* the other 32 are stored for use with the next granule
- */
-
- u_p = (float (*)[16]) &u[ch][!div][0][start];
-
-/*0*/ u_p[16][0] = d0;
- u_p[14][0] = -(+d8 );
-/*4*/ u_p[12][0] = -(+d4 );
- u_p[10][0] = -(-d8 +d12 );
-/*8*/ u_p[ 8][0] = -(+d2 );
- u_p[ 6][0] = -(+d8 +d10 -d12 );
-/*12*/ u_p[ 4][0] = -(-d4 +d6 );
- u_p[ 2][0] = -d14;
- u_p[ 0][0] = -d1;
- }
-
- {
- float c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15;
-
-/* memory separation, second part
-*/
-/* 2
-*/
- c0=d16 + d24; c8= (d16 - d24) * b2;
- c1=d17 + d25; c9= (d17 - d25) * b6;
- c2=d18 + d26; c10= (d18 - d26) * b14;
- c3=d19 + d27; c11= (d19 - d27) * b10;
- c4=d20 + d28; c12= (d20 - d28) * b30;
- c5=d21 + d29; c13= (d21 - d29) * b26;
- c6=d22 + d30; c14= (d22 - d30) * b18;
- c7=d23 + d31; c15= (d23 - d31) * b22;
-
-/* 3
-*/
- d16= c0+ c4; d20= (c0 - c4) * b4;
- d17= c1+ c5; d21= (c1 - c5) * b12;
- d18= c2+ c6; d22= (c2 - c6) * b28;
- d19= c3+ c7; d23= (c3 - c7) * b20;
-
- d24= c8+ c12; d28= (c8 - c12) * b4;
- d25= c9+ c13; d29= (c9 - c13) * b12;
- d26= c10+ c14; d30= (c10 - c14) * b28;
- d27= c11+ c15; d31= (c11 - c15) * b20;
-
-/* 4
-*/
- {
- float rb8 = b8;
- float rb24 = b24;
-
-/**/ c0= d16+ d18; c2= (d16 - d18) * rb8;
- c1= d17+ d19; c3= (d17 - d19) * rb24;
-/**/ c4= d20+ d22; c6= (d20 - d22) * rb8;
- c5= d21+ d23; c7= (d21 - d23) * rb24;
-/**/ c8= d24+ d26; c10= (d24 - d26) * rb8;
- c9= d25+ d27; c11= (d25 - d27) * rb24;
-/**/ c12= d28+ d30; c14= (d28 - d30) * rb8;
- c13= d29+ d31; c15= (d29 - d31) * rb24;
- }
-
-/* 5
-*/
- {
- float rb16 = b16;
- d16= c0+ c1; d17= (c0 - c1) * rb16;
- d18= c2+ c3; d19= (c2 - c3) * rb16;
-
- d20= c4+ c5; d21= (c4 - c5) * rb16;
- d20+=d16; d21+=d17;
- d22= c6+ c7; d23= (c6 - c7) * rb16;
- d22+=d16; d22+=d18;
- d23+=d16; d23+=d17; d23+=d19;
-
-
- d24= c8+ c9; d25= (c8 - c9) * rb16;
- d26= c10+ c11; d27= (c10 - c11) * rb16;
- d26+=d24;
- d27+=d24; d27+=d25;
-
- d28= c12+ c13; d29= (c12 - c13) * rb16;
- d28-=d20; d29+=d28; d29-=d21;
- d30= c14+ c15; d31= (c14 - c15) * rb16;
- d30-=d22;
- d31-=d23;
- }
-
- /* step 6: final resolving & reordering
- * the other 32 are stored for use with the next granule
- */
-
- u_p = (float (*)[16]) &u[ch][!div][0][start];
-
- u_p[ 1][0] = -(+d30 );
- u_p[ 3][0] = -(+d22 -d26 );
- u_p[ 5][0] = -(-d18 -d20 +d26 );
- u_p[ 7][0] = -(+d18 -d28 );
- u_p[ 9][0] = -(+d28 );
- u_p[11][0] = -(+d20 -d24 );
- u_p[13][0] = -(-d16 +d24 );
- u_p[15][0] = -(+d16 );
-
- /* the other 32 are stored for use with the next granule
- */
-
- u_p = (float (*)[16]) &u[ch][div][0][start];
-
- u_p[15][0] = +d31;
- u_p[13][0] = +d23 -d27;
- u_p[11][0] = -d19 -d20 -d21 +d27;
- u_p[ 9][0] = +d19 -d29;
- u_p[ 7][0] = -d18 +d29;
- u_p[ 5][0] = +d18 +d20 +d21 -d25 -d26;
- u_p[ 3][0] = -d17 -d22 +d25 +d26;
- u_p[ 1][0] = +d17 -d30;
- }
- }
-
-#if defined(PENTIUM_RDTSC)
- __asm__(".byte 0x0f,0x31" : "=a" (cnt3), "=d" (cnt4));
-#endif
-
- /* we're doing dewindowing and calculating final samples now
- */
-
-#if defined(ARCH_i586)
- /* x86 assembler optimisations. These optimisations are tuned
- specifically for Intel Pentiums. */
-
- asm("movl $15,%%eax\n\t"\
- "1:\n\t"\
- "flds (%0)\n\t"\
- "fmuls (%1)\n\t"\
- "flds 4(%0)\n\t"\
- "fmuls 4(%1)\n\t"\
- "flds 8(%0)\n\t"\
- "fmuls 8(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 12(%0)\n\t"\
- "fmuls 12(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 16(%0)\n\t"\
- "fmuls 16(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 20(%0)\n\t"\
- "fmuls 20(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 24(%0)\n\t"\
- "fmuls 24(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 28(%0)\n\t"\
- "fmuls 28(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 32(%0)\n\t"\
- "fmuls 32(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 36(%0)\n\t"\
- "fmuls 36(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 40(%0)\n\t"\
- "fmuls 40(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 44(%0)\n\t"\
- "fmuls 44(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 48(%0)\n\t"\
- "fmuls 48(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 52(%0)\n\t"\
- "fmuls 52(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 56(%0)\n\t"\
- "fmuls 56(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 60(%0)\n\t"\
- "fmuls 60(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "addl $64,%0\n\t"\
- "addl $128,%1\n\t"\
- "subl $4,%%esp\n\t"\
- "faddp\n\t"\
- "fistpl (%%esp)\n\t"\
- "popl %%ecx\n\t"\
- "cmpl $32767,%%ecx\n\t"\
- "jle 2f\n\t"\
- "movw $32767,%%cx\n\t"\
- "jmp 3f\n\t"\
- "2: cmpl $-32768,%%ecx\n\t"\
- "jge 3f\n\t"\
- "movw $-32768,%%cx\n\t"\
- "3: movw %%cx,(%2)\n\t"\
- "addl %3,%2\n\t"\
- "decl %%eax\n\t"\
- "jns 1b\n\t"\
-
- "testb $1,%4\n\t"\
- "je 4f\n\t"
-
- "flds (%0)\n\t"\
- "fmuls (%1)\n\t"\
- "flds 8(%0)\n\t"\
- "fmuls 8(%1)\n\t"\
- "flds 16(%0)\n\t"\
- "fmuls 16(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 24(%0)\n\t"\
- "fmuls 24(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 32(%0)\n\t"\
- "fmuls 32(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 40(%0)\n\t"\
- "fmuls 40(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 48(%0)\n\t"\
- "fmuls 48(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 56(%0)\n\t"\
- "fmuls 56(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "subl $4,%%esp\n\t"\
- "subl $64,%0\n\t"\
- "subl $192,%1\n\t"\
- "faddp\n\t"\
- "fistpl (%%esp)\n\t"\
- "popl %%ecx\n\t"\
- "cmpl $32767,%%ecx\n\t"\
- "jle 2f\n\t"\
- "movw $32767,%%cx\n\t"\
- "jmp 3f\n\t"\
- "2: cmpl $-32768,%%ecx\n\t"\
- "jge 3f\n\t"\
- "movw $-32768,%%cx\n\t"\
- "3: movw %%cx,(%2)\n\t"\
-
- "movl %5,%%ecx\n\t"\
- "sall $3,%%ecx\n\t"\
- "addl %%ecx,%1\n\t"\
- "addl %3,%2\n\t"\
- "movl $14,%%eax\n\t"\
-
- "1:flds 4(%0)\n\t"\
- "fmuls 56(%1)\n\t"\
- "flds (%0)\n\t"\
- "fmuls 60(%1)\n\t"\
- "flds 12(%0)\n\t"\
- "fmuls 48(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubp\n\t"\
- "flds 8(%0)\n\t"\
- "fmuls 52(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 20(%0)\n\t"\
- "fmuls 40(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 16(%0)\n\t"\
- "fmuls 44(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 28(%0)\n\t"\
- "fmuls 32(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 24(%0)\n\t"\
- "fmuls 36(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 36(%0)\n\t"\
- "fmuls 24(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 32(%0)\n\t"\
- "fmuls 28(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 44(%0)\n\t"\
- "fmuls 16(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 40(%0)\n\t"\
- "fmuls 20(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 52(%0)\n\t"\
- "fmuls 8(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 48(%0)\n\t"\
- "fmuls 12(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 60(%0)\n\t"\
- "fmuls (%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 56(%0)\n\t"\
- "fmuls 4(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "subl $64,%0\n\t"\
- "subl $128,%1\n\t"\
- "subl $4,%%esp\n\t"\
- "fsubp\n\t"\
- "fistpl (%%esp)\n\t"\
- "popl %%ecx\n\t"\
- "cmpl $32767,%%ecx\n\t"\
- "jle 2f\n\t"\
- "movw $32767,%%cx\n\t"\
- "jmp 3f\n\t"\
- "2: cmpl $-32768,%%ecx\n\t"\
- "jge 3f\n\t"\
- "movw $-32768,%%cx\n\t"\
- "3: movw %%cx,(%2)\n\t"\
- "addl %3,%2\n\t"\
- "decl %%eax\n\t"\
- "jns 1b\n\t"\
- "jmp 5f\n\t"\
-
- "4:flds 4(%0)\n\t"\
- "fmuls 4(%1)\n\t"\
- "flds 12(%0)\n\t"\
- "fmuls 12(%1)\n\t"\
- "flds 20(%0)\n\t"\
- "fmuls 20(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 28(%0)\n\t"\
- "fmuls 28(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 36(%0)\n\t"\
- "fmuls 36(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 44(%0)\n\t"\
- "fmuls 44(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 52(%0)\n\t"\
- "fmuls 52(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 60(%0)\n\t"\
- "fmuls 60(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "subl $4,%%esp\n\t"\
- "subl $64,%0\n\t"\
- "subl $192,%1\n\t"\
- "faddp\n\t"\
- "fistpl (%%esp)\n\t"\
- "popl %%ecx\n\t"\
- "cmpl $32767,%%ecx\n\t"\
- "jle 2f\n\t"\
- "movw $32767,%%cx\n\t"\
- "jmp 3f\n\t"\
- "2: cmpl $-32768,%%ecx\n\t"\
- "jge 3f\n\t"\
- "movw $-32768,%%cx\n\t"\
- "3: movw %%cx,(%2)\n\t"\
-
- "movl %5,%%ecx\n\t"\
- "sall $3,%%ecx\n\t"\
- "addl %%ecx,%1\n\t"\
- "addl %3,%2\n\t"\
-
- "movl $14,%%eax\n\t"\
- "1:flds (%0)\n\t"\
- "fmuls 60(%1)\n\t"\
- "flds 4(%0)\n\t"\
- "fmuls 56(%1)\n\t"\
- "flds 8(%0)\n\t"\
- "fmuls 52(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubp\n\t"\
- "flds 12(%0)\n\t"\
- "fmuls 48(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 16(%0)\n\t"\
- "fmuls 44(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 20(%0)\n\t"\
- "fmuls 40(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 24(%0)\n\t"\
- "fmuls 36(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 28(%0)\n\t"\
- "fmuls 32(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 32(%0)\n\t"\
- "fmuls 28(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 36(%0)\n\t"\
- "fmuls 24(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 40(%0)\n\t"\
- "fmuls 20(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 44(%0)\n\t"\
- "fmuls 16(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 48(%0)\n\t"\
- "fmuls 12(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 52(%0)\n\t"\
- "fmuls 8(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "flds 56(%0)\n\t"\
- "fmuls 4(%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "fsubrp\n\t"\
- "flds 60(%0)\n\t"\
- "fmuls (%1)\n\t"\
- "fxch %%st(2)\n\t"\
- "faddp\n\t"\
- "subl $64,%0\n\t"\
- "subl $128,%1\n\t"\
- "subl $4,%%esp\n\t"\
- "fsubp\n\t"\
- "fistpl (%%esp)\n\t"\
- "popl %%ecx\n\t"\
- "cmpl $32767,%%ecx\n\t"\
- "jle 2f\n\t"\
- "movw $32767,%%cx\n\t"\
- "jmp 3f\n\t"\
- "2: cmpl $-32768,%%ecx\n\t"\
- "jge 3f\n\t"\
- "movw $-32768,%%cx\n\t"\
- "3: movw %%cx,(%2)\n\t"\
- "addl %3,%2\n\t"\
- "decl %%eax\n\t"\
- "jns 1b\n\t"\
-
- "5:"\
- : : "b" (u[ch][div]), "d" (t_dewindow[0] + 16 - start), "S" (&sample_buffer[f>>(2-nch)][nch==2?0:(f&1?16:0)][ch]), "m" (sizeof(short) * nch), "m" (div), "m" (start)\
- : "eax", "ecx", "memory");
-#else
- {
- short *samples = (&sample_buffer[f>>(2-nch)][nch==2?0:(f&1?16:0)][ch]);
- int out, j;
-
-#define PUT_SAMPLE(out) \
- if (out > 32767) \
- *samples = 32767; \
- else \
- if (out < -32768) \
- *samples = -32768; \
- else \
- *samples = out; \
- \
- samples += nch;
-
-#if defined(SUPERHACK)
- /* These is a simple implementation which should be nicer to the
- cache; computation of samples are done in one pass rather than
- two. However, for various reasons which I do not have time to
- investigate, it runs quite a lot slower than two pass
- computations. If you have time, you are welcome to look into
- it. */
-
- {
- float (*u_ptr)[16] = u[ch][div];
- const float *dewindow2 = t_dewindow[0] + start;
-
- {
- float outf1, outf2, outf3, outf4;
-
- outf1 = u_ptr[0][ 0] * dewindow[0x0];
- outf2 = u_ptr[0][ 1] * dewindow[0x1];
- outf3 = u_ptr[0][ 2] * dewindow[0x2];
- outf4 = u_ptr[0][ 3] * dewindow[0x3];
- outf1 += u_ptr[0][ 4] * dewindow[0x4];
- outf2 += u_ptr[0][ 5] * dewindow[0x5];
- outf3 += u_ptr[0][ 6] * dewindow[0x6];
- outf4 += u_ptr[0][ 7] * dewindow[0x7];
- outf1 += u_ptr[0][ 8] * dewindow[0x8];
- outf2 += u_ptr[0][ 9] * dewindow[0x9];
- outf3 += u_ptr[0][10] * dewindow[0xa];
- outf4 += u_ptr[0][11] * dewindow[0xb];
- outf1 += u_ptr[0][12] * dewindow[0xc];
- outf2 += u_ptr[0][13] * dewindow[0xd];
- outf3 += u_ptr[0][14] * dewindow[0xe];
- outf4 += u_ptr[0][15] * dewindow[0xf];
-
- out = outf1 + outf2 + outf3 + outf4;
-
- dewindow += 32;
- dewindow2 += 32;
- u_ptr++;
-
- if (out > 32767)
- samples[0] = 32767;
- else
- if (out < -32768)
- samples[0] = -32768;
- else
- samples[0] = out;
- }
-
- if (div & 0x1) {
- for (j = 1; j < 16; ++j) {
- float outf1, outf2, outf3, outf4;
-
- outf1 = u_ptr[0][ 0] * dewindow[0x0];
- outf3 = u_ptr[0][ 0] * dewindow2[0xf];
- outf2 = u_ptr[0][ 1] * dewindow[0x1];
- outf4 = u_ptr[0][ 1] * dewindow2[0xe];
- outf1 += u_ptr[0][ 2] * dewindow[0x2];
- outf3 += u_ptr[0][ 2] * dewindow2[0xd];
- outf2 += u_ptr[0][ 3] * dewindow[0x3];
- outf4 += u_ptr[0][ 3] * dewindow2[0xc];
- outf1 += u_ptr[0][ 4] * dewindow[0x4];
- outf3 += u_ptr[0][ 4] * dewindow2[0xb];
- outf2 += u_ptr[0][ 5] * dewindow[0x5];
- outf4 += u_ptr[0][ 5] * dewindow2[0xa];
- outf1 += u_ptr[0][ 6] * dewindow[0x6];
- outf3 += u_ptr[0][ 6] * dewindow2[0x9];
- outf2 += u_ptr[0][ 7] * dewindow[0x7];
- outf4 += u_ptr[0][ 7] * dewindow2[0x8];
- outf1 += u_ptr[0][ 8] * dewindow[0x8];
- outf3 += u_ptr[0][ 8] * dewindow2[0x7];
- outf2 += u_ptr[0][ 9] * dewindow[0x9];
- outf4 += u_ptr[0][ 9] * dewindow2[0x6];
- outf1 += u_ptr[0][10] * dewindow[0xa];
- outf3 += u_ptr[0][10] * dewindow2[0x5];
- outf2 += u_ptr[0][11] * dewindow[0xb];
- outf4 += u_ptr[0][11] * dewindow2[0x4];
- outf1 += u_ptr[0][12] * dewindow[0xc];
- outf3 += u_ptr[0][12] * dewindow2[0x3];
- outf2 += u_ptr[0][13] * dewindow[0xd];
- outf4 += u_ptr[0][13] * dewindow2[0x2];
- outf1 += u_ptr[0][14] * dewindow[0xe];
- outf3 += u_ptr[0][14] * dewindow2[0x1];
- outf2 += u_ptr[0][15] * dewindow[0xf];
- outf4 += u_ptr[0][15] * dewindow2[0x0];
-
- dewindow += 32;
- dewindow2 += 32;
- u_ptr++;
-
- out = outf1 + outf2;
-
- if (out > 32767)
- samples[j * 2] = 32767;
- else
- if (out < -32768)
- samples[j * 2] = -32768;
- else
- samples[j * 2] = out;
-
- out = outf4 - outf3;
-
- if (out > 32767)
- samples[64 - (j * 2)] = 32767;
- else
- if (out < -32768)
- samples[64 - (j * 2)] = -32768;
- else
- samples[64 - (j * 2)] = out;
- }
-
- {
- float outf2, outf4;
-
- outf2 = u_ptr[0][ 0] * dewindow[0x0];
- outf4 = u_ptr[0][ 2] * dewindow[0x2];
- outf2 += u_ptr[0][ 4] * dewindow[0x4];
- outf4 += u_ptr[0][ 6] * dewindow[0x6];
- outf2 += u_ptr[0][ 8] * dewindow[0x8];
- outf4 += u_ptr[0][10] * dewindow[0xa];
- outf2 += u_ptr[0][12] * dewindow[0xc];
- outf4 += u_ptr[0][14] * dewindow[0xe];
-
- out = outf2 + outf4;
-
- if (out > 32767)
- samples[16 * 2] = 32767;
- else
- if (out < -32768)
- samples[16 * 2] = -32768;
- else
- samples[16 * 2] = out;
- }
- } else {
- for (j = 1; j < 16; ++j) {
- float outf1, outf2, outf3, outf4;
-
- outf1 = u_ptr[0][ 0] * dewindow[0x0];
- outf3 = u_ptr[0][ 0] * dewindow2[0xf];
- outf2 = u_ptr[0][ 1] * dewindow[0x1];
- outf4 = u_ptr[0][ 1] * dewindow2[0xe];
- outf1 += u_ptr[0][ 2] * dewindow[0x2];
- outf3 += u_ptr[0][ 2] * dewindow2[0xd];
- outf2 += u_ptr[0][ 3] * dewindow[0x3];
- outf4 += u_ptr[0][ 3] * dewindow2[0xc];
- outf1 += u_ptr[0][ 4] * dewindow[0x4];
- outf3 += u_ptr[0][ 4] * dewindow2[0xb];
- outf2 += u_ptr[0][ 5] * dewindow[0x5];
- outf4 += u_ptr[0][ 5] * dewindow2[0xa];
- outf1 += u_ptr[0][ 6] * dewindow[0x6];
- outf3 += u_ptr[0][ 6] * dewindow2[0x9];
- outf2 += u_ptr[0][ 7] * dewindow[0x7];
- outf4 += u_ptr[0][ 7] * dewindow2[0x8];
- outf1 += u_ptr[0][ 8] * dewindow[0x8];
- outf3 += u_ptr[0][ 8] * dewindow2[0x7];
- outf2 += u_ptr[0][ 9] * dewindow[0x9];
- outf4 += u_ptr[0][ 9] * dewindow2[0x6];
- outf1 += u_ptr[0][10] * dewindow[0xa];
- outf3 += u_ptr[0][10] * dewindow2[0x5];
- outf2 += u_ptr[0][11] * dewindow[0xb];
- outf4 += u_ptr[0][11] * dewindow2[0x4];
- outf1 += u_ptr[0][12] * dewindow[0xc];
- outf3 += u_ptr[0][12] * dewindow2[0x3];
- outf2 += u_ptr[0][13] * dewindow[0xd];
- outf4 += u_ptr[0][13] * dewindow2[0x2];
- outf1 += u_ptr[0][14] * dewindow[0xe];
- outf3 += u_ptr[0][14] * dewindow2[0x1];
- outf2 += u_ptr[0][15] * dewindow[0xf];
- outf4 += u_ptr[0][15] * dewindow2[0x0];
-
- dewindow += 32;
- dewindow2 += 32;
- u_ptr++;
-
- out = outf1 + outf2;
-
- if (out > 32767)
- samples[j * 2] = 32767;
- else
- if (out < -32768)
- samples[j * 2] = -32768;
- else
- samples[j * 2] = out;
-
- out = outf3 - outf4;
-
- if (out > 32767)
- samples[64 - (j * 2)] = 32767;
- else
- if (out < -32768)
- samples[64 - (j * 2)] = -32768;
- else
- samples[64 - (j * 2)] = out;
- }
-
- {
- float outf2, outf4;
-
- outf2 = u_ptr[0][ 1] * dewindow[0x1];
- outf4 = u_ptr[0][ 3] * dewindow[0x3];
- outf2 += u_ptr[0][ 5] * dewindow[0x5];
- outf4 += u_ptr[0][ 7] * dewindow[0x7];
- outf2 += u_ptr[0][ 9] * dewindow[0x9];
- outf4 += u_ptr[0][11] * dewindow[0xb];
- outf2 += u_ptr[0][13] * dewindow[0xd];
- outf4 += u_ptr[0][15] * dewindow[0xf];
-
- out = outf2 + outf4;
-
- if (out > 32767)
- samples[16 * 2] = 32767;
- else
- if (out < -32768)
- samples[16 * 2] = -32768;
- else
- samples[16 * 2] = out;
- }
- }
- }
-#elif defined(HAS_AUTOINCREMENT)
- const float *dewindow = t_dewindow[0] + 15 - start;
-
- /* This is tuned specifically for architectures with
- autoincrement and -decrement. */
-
- {
- float *u_ptr = (float*) u[ch][div];
-
- u_ptr--;
-
- for (j = 0; j < 16; ++j) {
- float outf1, outf2, outf3, outf4;
-
- outf1 = *++u_ptr * *++dewindow;
- outf2 = *++u_ptr * *++dewindow;
- outf3 = *++u_ptr * *++dewindow;
- outf4 = *++u_ptr * *++dewindow;
- outf1 += *++u_ptr * *++dewindow;
- outf2 += *++u_ptr * *++dewindow;
- outf3 += *++u_ptr * *++dewindow;
- outf4 += *++u_ptr * *++dewindow;
- outf1 += *++u_ptr * *++dewindow;
- outf2 += *++u_ptr * *++dewindow;
- outf3 += *++u_ptr * *++dewindow;
- outf4 += *++u_ptr * *++dewindow;
- outf1 += *++u_ptr * *++dewindow;
- outf2 += *++u_ptr * *++dewindow;
- outf3 += *++u_ptr * *++dewindow;
- outf4 += *++u_ptr * *++dewindow;
-
- out = outf1 + outf2 + outf3 + outf4;
-
- dewindow += 16;
-
- PUT_SAMPLE(out)
- }
-
- if (div & 0x1) {
- {
- float outf2, outf4;
-
- outf2 = u_ptr[ 1] * dewindow[0x1];
- outf4 = u_ptr[ 3] * dewindow[0x3];
- outf2 += u_ptr[ 5] * dewindow[0x5];
- outf4 += u_ptr[ 7] * dewindow[0x7];
- outf2 += u_ptr[ 9] * dewindow[0x9];
- outf4 += u_ptr[11] * dewindow[0xb];
- outf2 += u_ptr[13] * dewindow[0xd];
- outf4 += u_ptr[15] * dewindow[0xf];
-
- out = outf2 + outf4;
-
- PUT_SAMPLE(out)
- }
-
- dewindow -= 31;
- dewindow += start;
- dewindow += start;
- u_ptr -= 16;
-
- for (; j < 31; ++j) {
- float outf1, outf2, outf3, outf4;
-
- outf1 = *++u_ptr * *--dewindow;
- outf2 = *++u_ptr * *--dewindow;
- outf3 = *++u_ptr * *--dewindow;
- outf4 = *++u_ptr * *--dewindow;
- outf1 += *++u_ptr * *--dewindow;
- outf2 += *++u_ptr * *--dewindow;
- outf3 += *++u_ptr * *--dewindow;
- outf4 += *++u_ptr * *--dewindow;
- outf1 += *++u_ptr * *--dewindow;
- outf2 += *++u_ptr * *--dewindow;
- outf3 += *++u_ptr * *--dewindow;
- outf4 += *++u_ptr * *--dewindow;
- outf1 += *++u_ptr * *--dewindow;
- outf2 += *++u_ptr * *--dewindow;
- outf3 += *++u_ptr * *--dewindow;
- outf4 += *++u_ptr * *--dewindow;
-
- out = outf2 - outf1 + outf4 - outf3;
-
- dewindow -= 16;
- u_ptr -= 32;
-
- PUT_SAMPLE(out)
- }
- } else {
- {
- float outf2, outf4;
-
- outf2 = u_ptr[ 2] * dewindow[ 0x2];
- outf4 = u_ptr[ 4] * dewindow[ 0x4];
- outf2 += u_ptr[ 6] * dewindow[ 0x6];
- outf4 += u_ptr[ 8] * dewindow[ 0x8];
- outf2 += u_ptr[10] * dewindow[ 0xa];
- outf4 += u_ptr[12] * dewindow[ 0xc];
- outf2 += u_ptr[14] * dewindow[ 0xe];
- outf4 += u_ptr[16] * dewindow[0x10];
-
- out = outf2 + outf4;
-
- PUT_SAMPLE(out)
- }
-
- dewindow -= 31;
- dewindow += start;
- dewindow += start;
- u_ptr -= 16;
-
- for (; j < 31; ++j) {
- float outf1, outf2, outf3, outf4;
-
- outf1 = *++u_ptr * *--dewindow;
- outf2 = *++u_ptr * *--dewindow;
- outf3 = *++u_ptr * *--dewindow;
- outf4 = *++u_ptr * *--dewindow;
- outf1 += *++u_ptr * *--dewindow;
- outf2 += *++u_ptr * *--dewindow;
- outf3 += *++u_ptr * *--dewindow;
- outf4 += *++u_ptr * *--dewindow;
- outf1 += *++u_ptr * *--dewindow;
- outf2 += *++u_ptr * *--dewindow;
- outf3 += *++u_ptr * *--dewindow;
- outf4 += *++u_ptr * *--dewindow;
- outf1 += *++u_ptr * *--dewindow;
- outf2 += *++u_ptr * *--dewindow;
- outf3 += *++u_ptr * *--dewindow;
- outf4 += *++u_ptr * *--dewindow;
-
- out = outf1 - outf2 + outf3 - outf4;
-
- dewindow -= 16;
- u_ptr -= 32;
-
- PUT_SAMPLE(out)
- }
- }
- }
-#else
- const float *dewindow = t_dewindow[0] + 16 - start;
-
- /* These optimisations are tuned specifically for architectures
- without autoincrement and -decrement. */
-
- {
- float (*u_ptr)[16] = u[ch][div];
-
- for (j = 0; j < 16; ++j) {
- float outf1, outf2, outf3, outf4;
-
- outf1 = u_ptr[0][ 0] * dewindow[0x0];
- outf2 = u_ptr[0][ 1] * dewindow[0x1];
- outf3 = u_ptr[0][ 2] * dewindow[0x2];
- outf4 = u_ptr[0][ 3] * dewindow[0x3];
- outf1 += u_ptr[0][ 4] * dewindow[0x4];
- outf2 += u_ptr[0][ 5] * dewindow[0x5];
- outf3 += u_ptr[0][ 6] * dewindow[0x6];
- outf4 += u_ptr[0][ 7] * dewindow[0x7];
- outf1 += u_ptr[0][ 8] * dewindow[0x8];
- outf2 += u_ptr[0][ 9] * dewindow[0x9];
- outf3 += u_ptr[0][10] * dewindow[0xa];
- outf4 += u_ptr[0][11] * dewindow[0xb];
- outf1 += u_ptr[0][12] * dewindow[0xc];
- outf2 += u_ptr[0][13] * dewindow[0xd];
- outf3 += u_ptr[0][14] * dewindow[0xe];
- outf4 += u_ptr[0][15] * dewindow[0xf];
-
- out = (int) (outf1 + outf2 + outf3 + outf4);
-
- dewindow += 32;
- u_ptr++;
-
- PUT_SAMPLE(out)
- }
-
- if (div & 0x1) {
- {
- float outf2, outf4;
-
- outf2 = u_ptr[0][ 0] * dewindow[0x0];
- outf4 = u_ptr[0][ 2] * dewindow[0x2];
- outf2 += u_ptr[0][ 4] * dewindow[0x4];
- outf4 += u_ptr[0][ 6] * dewindow[0x6];
- outf2 += u_ptr[0][ 8] * dewindow[0x8];
- outf4 += u_ptr[0][10] * dewindow[0xa];
- outf2 += u_ptr[0][12] * dewindow[0xc];
- outf4 += u_ptr[0][14] * dewindow[0xe];
-
- out = (int) (outf2 + outf4);
-
- PUT_SAMPLE(out)
- }
-
- dewindow -= 48;
- dewindow += start;
- dewindow += start;
-
- for (; j < 31; ++j) {
- float outf1, outf2, outf3, outf4;
-
- --u_ptr;
-
- outf1 = u_ptr[0][ 0] * dewindow[0xf];
- outf2 = u_ptr[0][ 1] * dewindow[0xe];
- outf3 = u_ptr[0][ 2] * dewindow[0xd];
- outf4 = u_ptr[0][ 3] * dewindow[0xc];
- outf1 += u_ptr[0][ 4] * dewindow[0xb];
- outf2 += u_ptr[0][ 5] * dewindow[0xa];
- outf3 += u_ptr[0][ 6] * dewindow[0x9];
- outf4 += u_ptr[0][ 7] * dewindow[0x8];
- outf1 += u_ptr[0][ 8] * dewindow[0x7];
- outf2 += u_ptr[0][ 9] * dewindow[0x6];
- outf3 += u_ptr[0][10] * dewindow[0x5];
- outf4 += u_ptr[0][11] * dewindow[0x4];
- outf1 += u_ptr[0][12] * dewindow[0x3];
- outf2 += u_ptr[0][13] * dewindow[0x2];
- outf3 += u_ptr[0][14] * dewindow[0x1];
- outf4 += u_ptr[0][15] * dewindow[0x0];
-
- out = (int) (-outf1 + outf2 - outf3 + outf4);
-
- dewindow -= 32;
-
- PUT_SAMPLE(out)
- }
- } else {
- {
- float outf2, outf4;
-
- outf2 = u_ptr[0][ 1] * dewindow[0x1];
- outf4 = u_ptr[0][ 3] * dewindow[0x3];
- outf2 += u_ptr[0][ 5] * dewindow[0x5];
- outf4 += u_ptr[0][ 7] * dewindow[0x7];
- outf2 += u_ptr[0][ 9] * dewindow[0x9];
- outf4 += u_ptr[0][11] * dewindow[0xb];
- outf2 += u_ptr[0][13] * dewindow[0xd];
- outf4 += u_ptr[0][15] * dewindow[0xf];
-
- out = (int) (outf2 + outf4);
-
- PUT_SAMPLE(out)
- }
-
- dewindow -= 48;
- dewindow += start;
- dewindow += start;
-
- for (; j < 31; ++j) {
- float outf1, outf2, outf3, outf4;
-
- --u_ptr;
-
- outf1 = u_ptr[0][ 0] * dewindow[0xf];
- outf2 = u_ptr[0][ 1] * dewindow[0xe];
- outf3 = u_ptr[0][ 2] * dewindow[0xd];
- outf4 = u_ptr[0][ 3] * dewindow[0xc];
- outf1 += u_ptr[0][ 4] * dewindow[0xb];
- outf2 += u_ptr[0][ 5] * dewindow[0xa];
- outf3 += u_ptr[0][ 6] * dewindow[0x9];
- outf4 += u_ptr[0][ 7] * dewindow[0x8];
- outf1 += u_ptr[0][ 8] * dewindow[0x7];
- outf2 += u_ptr[0][ 9] * dewindow[0x6];
- outf3 += u_ptr[0][10] * dewindow[0x5];
- outf4 += u_ptr[0][11] * dewindow[0x4];
- outf1 += u_ptr[0][12] * dewindow[0x3];
- outf2 += u_ptr[0][13] * dewindow[0x2];
- outf3 += u_ptr[0][14] * dewindow[0x1];
- outf4 += u_ptr[0][15] * dewindow[0x0];
-
- out = (int) (outf1 - outf2 + outf3 - outf4);
-
- dewindow -= 32;
-
- PUT_SAMPLE(out)
- }
- }
- }
-#endif
- }
-#endif
-
- --u_start[ch];
- u_start[ch] &= 0xf;
- u_div[ch]=u_div[ch] ? 0 : 1;
-
-#if defined(PENTIUM_RDTSC)
- __asm__(".byte 0x0f,0x31" : "=a" (cnt2), "=d" (cnt4));
-
- if (cnt2-cnt1 < min_cycles) {
- min_cycles = cnt2-cnt1;
- //printf("%d, %d cycles, %d\n", cnt3-cnt1, min_cycles, start);
- }
-#endif
-}
-
-void premultiply()
-{
- int i,t;
-
- for (i = 0; i < 17; ++i)
- for (t = 0; t < 32; ++t)
- t_dewindow[i][t] *= 16383.5f;
-}
diff --git a/Src/Sound/MPEG/transform.h b/Src/Sound/MPEG/transform.h
deleted file mode 100644
index 3fd14cb..0000000
--- a/Src/Sound/MPEG/transform.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * transform.h
- *
- * Amp library internal header file.
- */
-
-
-/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
-*/
-
-/* transform.h tables galore
- *
- * Created by: tomislav uzelac May 1996
- * Last modified by: tomislav uzelac Mar 1 97
- */
-extern void imdct_init();
-extern void imdct(int win_type,int sb,int ch);
-extern void poly(int ch,int i);
-extern void premultiply();
-
-extern short sample_buffer[18][32][2];
-extern float res[32][18];
-extern float s[2][32][18];
-
-#ifdef TRANSFORM
-
-void imdct_init();
-void imdct(int win_type,int sb,int ch);
-void poly(int ch,int i);
-void premultiply();
-
-short sample_buffer[18][32][2];
-float s[2][32][18];
-float res[32][18];
-float win[4][36];
-
-static const float t_sin[4][36]={{
- -0.032160f, 0.103553f, -0.182543f, 0.266729f, -0.353554f, 0.440377f,
- -0.524563f, 0.603553f, -0.674947f, 0.736575f, -0.786566f, 0.823400f,
- -0.845957f, 0.853554f, -0.845957f, 0.823399f, -0.786566f, 0.736575f,
- -0.674947f, 0.603553f, -0.524564f, 0.440378f, -0.353553f, 0.266729f,
- -0.182544f, 0.103553f, -0.032160f, -0.029469f, 0.079459f, -0.116293f,
- 0.138851f, -0.146446f, 0.138851f, -0.116293f, 0.079459f, -0.029469f
-},{
- -0.032160f, 0.103553f, -0.182543f, 0.266729f, -0.353554f, 0.440377f,
- -0.524563f, 0.603553f, -0.674947f, 0.736575f, -0.786566f, 0.823400f,
- -0.845957f, 0.853554f, -0.845957f, 0.823399f, -0.786566f, 0.736575f,
- -0.675590f, 0.608761f, -0.537300f, 0.461749f, -0.382683f, 0.300706f,
- -0.214588f, 0.120590f, -0.034606f, -0.026554f, 0.049950f, -0.028251f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f
-},{
- -0.103553f, 0.353554f, -0.603553f, 0.786566f, -0.853554f, 0.786566f,
- -0.603553f, 0.353553f, -0.103553f, -0.079459f, 0.146446f, -0.079459f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f
-},{
- 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f, 0.000000f,
- -0.127432f, 0.379410f, -0.608182f, 0.792598f, -0.915976f, 0.967944f,
- -0.953717f, 0.923880f, -0.887011f, 0.843391f, -0.793353f, 0.737277f,
- -0.674947f, 0.603553f, -0.524564f, 0.440378f, -0.353553f, 0.266729f,
- -0.182544f, 0.103553f, -0.032160f, -0.029469f, 0.079459f, -0.116293f,
- 0.138851f, -0.146446f, 0.138851f, -0.116293f, 0.079459f, -0.029469f
-}};
-
-static const float t_2cos[4][18]={
-{ -0.174311f, -0.517638f, -0.845237f, -1.147153f, -1.414214f, -1.638304f, -1.812616f, -1.931852f, -1.992389f,
- 0.174311f, 0.517638f, 0.845237f, 1.147153f, 1.414214f, 1.638304f, 1.812616f, 1.931852f, 1.992389f},
-{ -0.174311f, -0.517638f, -0.845237f, -1.147153f, -1.414214f, -1.638304f, -1.812616f, -1.931852f, -1.992389f,
- 0.174311f, 0.517638f, 0.845237f, 1.147153f, 1.414214f, 1.638304f, 1.812616f, 1.931852f, 1.992389f},
-{ -0.517638f, -1.41421f, -1.93185f, 0.517638f, 1.41421f, 1.93185f,0,0,0,0,0,0,0,0,0,0,0,0},
-{ -0.174311f, -0.517638f, -0.845237f, -1.147153f, -1.414214f, -1.638304f, -1.812616f, -1.931852f, -1.992389f,
- 0.174311f, 0.517638f, 0.845237f, 1.147153f, 1.414214f, 1.638304f, 1.812616f, 1.931852f, 1.992389f}
-};
-
-static const float b1 = 1.997590912f; static const float b2 = 1.990369453f; static const float b3 = 1.978353019f;
-static const float b4 = 1.961570560f; static const float b5 = 1.940062506f; static const float b6 = 1.913880671f;
-static const float b7 = 1.883088130f; static const float b8 = 1.847759065f; static const float b9 = 1.807978586f;
-static const float b10= 1.763842529f; static const float b11= 1.715457220f; static const float b12= 1.662939225f;
-static const float b13= 1.606415063f; static const float b14= 1.546020907f; static const float b15= 1.481902251f;
-static const float b16= 1.414213562f; static const float b17= 1.343117910f; static const float b18= 1.268786568f;
-static const float b19= 1.191398609f; static const float b20= 1.111140466f; static const float b21= 1.028205488f;
-static const float b22= 0.942793474f; static const float b23= 0.855110187f; static const float b24= 0.765366865f;
-static const float b25= 0.673779707f; static const float b26= 0.580569355f; static const float b27= 0.485960360f;
-static const float b28= 0.390180644f; static const float b29= 0.293460949f; static const float b30= 0.196034281f;
-static const float b31= 0.098135349f;
-
-static float t_dewindow[17][32] = {{
- 0.000000000f,-0.000442505f, 0.003250122f,-0.007003784f, 0.031082153f,-0.078628540f, 0.100311279f,-0.572036743f,
- 1.144989014f, 0.572036743f, 0.100311279f, 0.078628540f, 0.031082153f, 0.007003784f, 0.003250122f, 0.000442505f,
- 0.000000000f,-0.000442505f, 0.003250122f,-0.007003784f, 0.031082153f,-0.078628540f, 0.100311279f,-0.572036743f,
- 1.144989014f, 0.572036743f, 0.100311279f, 0.078628540f, 0.031082153f, 0.007003784f, 0.003250122f, 0.000442505f,
-},{
--0.000015259f,-0.000473022f, 0.003326416f,-0.007919312f, 0.030517578f,-0.084182739f, 0.090927124f,-0.600219727f,
- 1.144287109f, 0.543823242f, 0.108856201f, 0.073059082f, 0.031478882f, 0.006118774f, 0.003173828f, 0.000396729f,
--0.000015259f,-0.000473022f, 0.003326416f,-0.007919312f, 0.030517578f,-0.084182739f, 0.090927124f,-0.600219727f,
- 1.144287109f, 0.543823242f, 0.108856201f, 0.073059082f, 0.031478882f, 0.006118774f, 0.003173828f, 0.000396729f,
-},{
--0.000015259f,-0.000534058f, 0.003387451f,-0.008865356f, 0.029785156f,-0.089706421f, 0.080688477f,-0.628295898f,
- 1.142211914f, 0.515609741f, 0.116577148f, 0.067520142f, 0.031738281f, 0.005294800f, 0.003082275f, 0.000366211f,
--0.000015259f,-0.000534058f, 0.003387451f,-0.008865356f, 0.029785156f,-0.089706421f, 0.080688477f,-0.628295898f,
- 1.142211914f, 0.515609741f, 0.116577148f, 0.067520142f, 0.031738281f, 0.005294800f, 0.003082275f, 0.000366211f,
-},{
--0.000015259f,-0.000579834f, 0.003433228f,-0.009841919f, 0.028884888f,-0.095169067f, 0.069595337f,-0.656219482f,
- 1.138763428f, 0.487472534f, 0.123474121f, 0.061996460f, 0.031845093f, 0.004486084f, 0.002990723f, 0.000320435f,
--0.000015259f,-0.000579834f, 0.003433228f,-0.009841919f, 0.028884888f,-0.095169067f, 0.069595337f,-0.656219482f,
- 1.138763428f, 0.487472534f, 0.123474121f, 0.061996460f, 0.031845093f, 0.004486084f, 0.002990723f, 0.000320435f,
-},{
--0.000015259f,-0.000625610f, 0.003463745f,-0.010848999f, 0.027801514f,-0.100540161f, 0.057617187f,-0.683914185f,
- 1.133926392f, 0.459472656f, 0.129577637f, 0.056533813f, 0.031814575f, 0.003723145f, 0.002899170f, 0.000289917f,
--0.000015259f,-0.000625610f, 0.003463745f,-0.010848999f, 0.027801514f,-0.100540161f, 0.057617187f,-0.683914185f,
- 1.133926392f, 0.459472656f, 0.129577637f, 0.056533813f, 0.031814575f, 0.003723145f, 0.002899170f, 0.000289917f,
-},{
--0.000015259f,-0.000686646f, 0.003479004f,-0.011886597f, 0.026535034f,-0.105819702f, 0.044784546f,-0.711318970f,
- 1.127746582f, 0.431655884f, 0.134887695f, 0.051132202f, 0.031661987f, 0.003005981f, 0.002792358f, 0.000259399f,
--0.000015259f,-0.000686646f, 0.003479004f,-0.011886597f, 0.026535034f,-0.105819702f, 0.044784546f,-0.711318970f,
- 1.127746582f, 0.431655884f, 0.134887695f, 0.051132202f, 0.031661987f, 0.003005981f, 0.002792358f, 0.000259399f,
-},{
--0.000015259f,-0.000747681f, 0.003479004f,-0.012939453f, 0.025085449f,-0.110946655f, 0.031082153f,-0.738372803f,
- 1.120223999f, 0.404083252f, 0.139450073f, 0.045837402f, 0.031387329f, 0.002334595f, 0.002685547f, 0.000244141f,
--0.000015259f,-0.000747681f, 0.003479004f,-0.012939453f, 0.025085449f,-0.110946655f, 0.031082153f,-0.738372803f,
- 1.120223999f, 0.404083252f, 0.139450073f, 0.045837402f, 0.031387329f, 0.002334595f, 0.002685547f, 0.000244141f,
-},{
--0.000030518f,-0.000808716f, 0.003463745f,-0.014022827f, 0.023422241f,-0.115921021f, 0.016510010f,-0.765029907f,
- 1.111373901f, 0.376800537f, 0.143264771f, 0.040634155f, 0.031005859f, 0.001693726f, 0.002578735f, 0.000213623f,
--0.000030518f,-0.000808716f, 0.003463745f,-0.014022827f, 0.023422241f,-0.115921021f, 0.016510010f,-0.765029907f,
- 1.111373901f, 0.376800537f, 0.143264771f, 0.040634155f, 0.031005859f, 0.001693726f, 0.002578735f, 0.000213623f,
-},{
--0.000030518f,-0.000885010f, 0.003417969f,-0.015121460f, 0.021575928f,-0.120697021f, 0.001068115f,-0.791213989f,
- 1.101211548f, 0.349868774f, 0.146362305f, 0.035552979f, 0.030532837f, 0.001098633f, 0.002456665f, 0.000198364f,
--0.000030518f,-0.000885010f, 0.003417969f,-0.015121460f, 0.021575928f,-0.120697021f, 0.001068115f,-0.791213989f,
- 1.101211548f, 0.349868774f, 0.146362305f, 0.035552979f, 0.030532837f, 0.001098633f, 0.002456665f, 0.000198364f,
-},{
--0.000030518f,-0.000961304f, 0.003372192f,-0.016235352f, 0.019531250f,-0.125259399f,-0.015228271f,-0.816864014f,
- 1.089782715f, 0.323318481f, 0.148773193f, 0.030609131f, 0.029937744f, 0.000549316f, 0.002349854f, 0.000167847f,
--0.000030518f,-0.000961304f, 0.003372192f,-0.016235352f, 0.019531250f,-0.125259399f,-0.015228271f,-0.816864014f,
- 1.089782715f, 0.323318481f, 0.148773193f, 0.030609131f, 0.029937744f, 0.000549316f, 0.002349854f, 0.000167847f,
-},{
--0.000030518f,-0.001037598f, 0.003280640f,-0.017349243f, 0.017257690f,-0.129562378f,-0.032379150f,-0.841949463f,
- 1.077117920f, 0.297210693f, 0.150497437f, 0.025817871f, 0.029281616f, 0.000030518f, 0.002243042f, 0.000152588f,
--0.000030518f,-0.001037598f, 0.003280640f,-0.017349243f, 0.017257690f,-0.129562378f,-0.032379150f,-0.841949463f,
- 1.077117920f, 0.297210693f, 0.150497437f, 0.025817871f, 0.029281616f, 0.000030518f, 0.002243042f, 0.000152588f,
-},{
--0.000045776f,-0.001113892f, 0.003173828f,-0.018463135f, 0.014801025f,-0.133590698f,-0.050354004f,-0.866363525f,
- 1.063217163f, 0.271591187f, 0.151596069f, 0.021179199f, 0.028533936f,-0.000442505f, 0.002120972f, 0.000137329f,
--0.000045776f,-0.001113892f, 0.003173828f,-0.018463135f, 0.014801025f,-0.133590698f,-0.050354004f,-0.866363525f,
- 1.063217163f, 0.271591187f, 0.151596069f, 0.021179199f, 0.028533936f,-0.000442505f, 0.002120972f, 0.000137329f,
-},{
--0.000045776f,-0.001205444f, 0.003051758f,-0.019577026f, 0.012115479f,-0.137298584f,-0.069168091f,-0.890090942f,
- 1.048156738f, 0.246505737f, 0.152069092f, 0.016708374f, 0.027725220f,-0.000869751f, 0.002014160f, 0.000122070f,
--0.000045776f,-0.001205444f, 0.003051758f,-0.019577026f, 0.012115479f,-0.137298584f,-0.069168091f,-0.890090942f,
- 1.048156738f, 0.246505737f, 0.152069092f, 0.016708374f, 0.027725220f,-0.000869751f, 0.002014160f, 0.000122070f,
-},{
--0.000061035f,-0.001296997f, 0.002883911f,-0.020690918f, 0.009231567f,-0.140670776f,-0.088775635f,-0.913055420f,
- 1.031936646f, 0.221984863f, 0.151962280f, 0.012420654f, 0.026840210f,-0.001266479f, 0.001907349f, 0.000106812f,
--0.000061035f,-0.001296997f, 0.002883911f,-0.020690918f, 0.009231567f,-0.140670776f,-0.088775635f,-0.913055420f,
- 1.031936646f, 0.221984863f, 0.151962280f, 0.012420654f, 0.026840210f,-0.001266479f, 0.001907349f, 0.000106812f,
-},{
--0.000061035f,-0.001388550f, 0.002700806f,-0.021789551f, 0.006134033f,-0.143676758f,-0.109161377f,-0.935195923f,
- 1.014617920f, 0.198059082f, 0.151306152f, 0.008316040f, 0.025909424f,-0.001617432f, 0.001785278f, 0.000106812f,
--0.000061035f,-0.001388550f, 0.002700806f,-0.021789551f, 0.006134033f,-0.143676758f,-0.109161377f,-0.935195923f,
- 1.014617920f, 0.198059082f, 0.151306152f, 0.008316040f, 0.025909424f,-0.001617432f, 0.001785278f, 0.000106812f,
-},{
--0.000076294f,-0.001480103f, 0.002487183f,-0.022857666f, 0.002822876f,-0.146255493f,-0.130310059f,-0.956481934f,
- 0.996246338f, 0.174789429f, 0.150115967f, 0.004394531f, 0.024932861f,-0.001937866f, 0.001693726f, 0.000091553f,
--0.000076294f,-0.001480103f, 0.002487183f,-0.022857666f, 0.002822876f,-0.146255493f,-0.130310059f,-0.956481934f,
- 0.996246338f, 0.174789429f, 0.150115967f, 0.004394531f, 0.024932861f,-0.001937866f, 0.001693726f, 0.000091553f,
-},{
--0.000076294f,-0.001586914f, 0.002227783f,-0.023910522f,-0.000686646f,-0.148422241f,-0.152206421f,-0.976852417f,
- 0.976852417f, 0.152206421f, 0.148422241f, 0.000686646f, 0.023910522f,-0.002227783f, 0.001586914f, 0.000076294f,
--0.000076294f,-0.001586914f, 0.002227783f,-0.023910522f,-0.000686646f,-0.148422241f,-0.152206421f,-0.976852417f,
- 0.976852417f, 0.152206421f, 0.148422241f, 0.000686646f, 0.023910522f,-0.002227783f, 0.001586914f, 0.000076294f,
-} };
-#endif /* TRANSFORM */
diff --git a/Src/Sound/MPEG/util.cpp b/Src/Sound/MPEG/util.cpp
deleted file mode 100644
index c869193..0000000
--- a/Src/Sound/MPEG/util.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/**
- ** Supermodel
- ** A Sega Model 3 Arcade Emulator.
- ** Copyright 2011 Bart Trzynadlowski, Nik Henson
- **
- ** This file is part of Supermodel.
- **
- ** Supermodel is free software: you can redistribute it and/or modify it under
- ** the terms of the GNU General Public License as published by the Free
- ** Software Foundation, either version 3 of the License, or (at your option)
- ** any later version.
- **
- ** Supermodel 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 General Public License for
- ** more details.
- **
- ** You should have received a copy of the GNU General Public License along
- ** with Supermodel. If not, see .
- **/
-
-/*
- * util.cpp
- *
- * Amp library internal module.
- */
-
-
-/*
- * None of these functions should ever be called in Supermodel.
- */
-
-/* this file is a part of amp software
-
- util.c: created by Andrew Richards
-
-*/
-
-#define AMP_UTIL
-#include "amp.h"
-
-#include
-#include
-#include
-#include
-
-#include "amp_audio.h"
-
-struct debugFlags_t debugFlags;
-
-
-/* die - for terminal conditions prints the error message and exits */
-/* can not be suppressed with -q,-quiet */
-void
-die(char *fmt, ...)
-{
- va_list ap;
- va_start(ap,fmt);
- vfprintf(stderr, fmt, ap);
-}
-
-
-/* warn - for warning messages. Can be suppressed by -q,-quiet */
-void
-warn(char *fmt, ...)
-{
- va_list ap;
- va_start(ap,fmt);
- if (!A_QUIET) {
- fprintf(stderr,"Warning: ");
- vfprintf(stderr, fmt, ap);
- }
-}
-
-
-/* msg - for general output. Can be suppressed by -q,-quiet. Output */
-/* goes to stderr so it doesn't conflict with stdout output */
-void
-msg(char *fmt, ...)
-{
- va_list ap;
- va_start(ap,fmt);
-
- if (!A_QUIET)
- {
- if (A_MSG_STDOUT) {
- vfprintf(stdout, fmt, ap);
- fflush(stdout);
- } else {
- vfprintf(stderr, fmt, ap);
- fflush(stderr);
- }
- }
-}
-
-void
-debugOptions()
-{
- int idx;
- msg("Possible options are: ");
- for(idx=0;debugLookup[idx].name!=0;idx++)
- msg("%s,",debugLookup[idx].name);
- msg("\010 \n");
-}
-
-
-/* debugSetup - if debugging is turned on sets up the debug flags from */
-/* the command line arguments */
-
-void
-debugSetup(char *dbgFlags)
-{
-#ifndef DEBUG
- warn("Debugging has not been compiled into this version of amp\n");
-#else
- char *ptr;
- int idx;
-
- memset(&debugFlags,0,sizeof(debugFlags));
-
- ptr=strtok(dbgFlags,",");
- while(ptr) {
- for(idx=0;debugLookup[idx].name!=0;idx++) {
- if (strcmp(debugLookup[idx].name,ptr)==0) {
- *(debugLookup[idx].var)=1;
- break;
- }
- }
- if (debugLookup[idx].name==0) {
- warn("Debug option, %s, does not exist\n",ptr);
- debugOptions();
- exit(1);
- }
- ptr=strtok(NULL,",");
- }
-
- DB(args,
- for(idx=0;debugLookup[idx].name!=0;idx++)
- printf("Flag: %s = %d\n",debugLookup[idx].name,*(debugLookup[idx].var));
- );
-#endif
-}
-
diff --git a/Src/Supermodel.h b/Src/Supermodel.h
index 70e87a6..9922074 100644
--- a/Src/Supermodel.h
+++ b/Src/Supermodel.h
@@ -145,7 +145,6 @@
#include "Model3/TileGen.h"
#include "Model3/Real3D.h"
#include "Sound/SCSP.h"
-#include "Sound/MPEG/MPEG.h"
#include "Model3/SoundBoard.h"
#include "Model3/DSB.h"
#include "Model3/DriveBoard.h"
diff --git a/VS2008/Supermodel.vcxproj b/VS2008/Supermodel.vcxproj
index e414302..e7d9b55 100644
--- a/VS2008/Supermodel.vcxproj
+++ b/VS2008/Supermodel.vcxproj
@@ -379,67 +379,7 @@ xcopy /D /Y "$(ProjectDir)\SDL\$(Platform)\$(Configuration)\SDL.dll" "$(TargetDi
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
-
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
- $(IntDir)amp_%(Filename).obj
-
+
@@ -597,26 +537,12 @@ xcopy /D /Y "$(ProjectDir)\SDL\$(Platform)\$(Configuration)\SDL.dll" "$(TargetDi
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/VS2008/Supermodel.vcxproj.filters b/VS2008/Supermodel.vcxproj.filters
index 36954d1..f8cec54 100644
--- a/VS2008/Supermodel.vcxproj.filters
+++ b/VS2008/Supermodel.vcxproj.filters
@@ -281,36 +281,6 @@
Source Files\Sound
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
-
- Source Files\Sound\MPEG
-
Source Files\Debugger
@@ -446,9 +416,6 @@
Source Files\Model3
-
- Source Files\Sound\MPEG
-
Source Files\Network
@@ -470,6 +437,9 @@
Source Files\Graphics\New
+
+ Source Files\Sound\MPEG
+
@@ -655,51 +625,6 @@
Header Files\Sound
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
-
- Header Files\Sound\MPEG
-
Header Files\Debugger
@@ -847,9 +772,6 @@
Header Files\Util
-
- Header Files\Sound\MPEG
-
Header Files\Network
@@ -880,6 +802,12 @@
Source Files\Graphics\New
+
+ Header Files\Sound\MPEG
+
+
+ Header Files\Pkgs
+