141 lines
3.9 KiB
C
141 lines
3.9 KiB
C
|
// Filename: mp3struct.h
|
||
|
//
|
||
|
// this file is my struct to gather all loose MP3 global vars into one struct so we can do multiple-stream decompression
|
||
|
//
|
||
|
|
||
|
#ifndef MP3STRUCT_H
|
||
|
#define MP3STRUCT_H
|
||
|
|
||
|
#pragma warning (disable : 4201 ) // nonstandard extension used : nameless struct/union
|
||
|
|
||
|
#include "small_header.h" // for SAMPLE and IN_OUT
|
||
|
|
||
|
typedef void (*SBT_FUNCTION) (float *sample, short *pcm, int n);
|
||
|
typedef void (*XFORM_FUNCTION) (void *pcm, int igr);
|
||
|
typedef IN_OUT(*DECODE_FUNCTION) (unsigned char *bs, unsigned char *pcm);
|
||
|
|
||
|
typedef struct
|
||
|
{
|
||
|
union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
SBT_FUNCTION sbt;
|
||
|
|
||
|
float cs_factor[3][64]; // 768 bytes
|
||
|
|
||
|
int nbat[4];
|
||
|
int bat[4][16];
|
||
|
int max_sb;
|
||
|
int stereo_sb;
|
||
|
int bit_skip;
|
||
|
|
||
|
float* cs_factorL1;
|
||
|
int nbatL1;
|
||
|
|
||
|
};//L1_2;
|
||
|
|
||
|
struct
|
||
|
{
|
||
|
SBT_FUNCTION sbt_L3;
|
||
|
XFORM_FUNCTION Xform;
|
||
|
DECODE_FUNCTION decode_function;
|
||
|
|
||
|
SAMPLE sample[2][2][576]; // if this isn't kept per stream then the decode breaks up
|
||
|
|
||
|
// the 4k version of these 2 seems to work for everything, but I'm reverting to original 8k for safety jic.
|
||
|
//
|
||
|
#define NBUF (8*1024)
|
||
|
#define BUF_TRIGGER (NBUF-1500)
|
||
|
// #define NBUF (4096) // 2048 works for all except 133+ kbps VBR files, 4096 copes with these
|
||
|
// #define BUF_TRIGGER ((NBUF/4)*3)
|
||
|
|
||
|
unsigned char buf[NBUF];
|
||
|
int buf_ptr0;
|
||
|
int buf_ptr1;
|
||
|
int main_pos_bit;
|
||
|
|
||
|
|
||
|
int band_limit_nsb;
|
||
|
int nBand[2][22]; /* [long/short][cb] */
|
||
|
int sfBandIndex[2][22]; /* [long/short][cb] */
|
||
|
int half_outbytes;
|
||
|
int crcbytes;
|
||
|
int nchan;
|
||
|
int ms_mode;
|
||
|
int is_mode;
|
||
|
unsigned int zero_level_pcm;
|
||
|
int mpeg25_flag;
|
||
|
int band_limit;
|
||
|
int band_limit21;
|
||
|
int band_limit12;
|
||
|
int gain_adjust;
|
||
|
int ncbl_mixed;
|
||
|
};//L3;
|
||
|
};
|
||
|
// from csbt.c...
|
||
|
//
|
||
|
// if this isn't kept per stream then the decode breaks up
|
||
|
signed int vb_ptr; //
|
||
|
signed int vb2_ptr; //
|
||
|
float vbuf[512]; //
|
||
|
float vbuf2[512]; // this can be lost if we stick to mono samples
|
||
|
|
||
|
// L3 only...
|
||
|
//
|
||
|
int sr_index; // L3 only (99%)
|
||
|
int id;
|
||
|
|
||
|
// any type...
|
||
|
//
|
||
|
int outvalues;
|
||
|
int outbytes;
|
||
|
int framebytes;
|
||
|
int pad;
|
||
|
int nsb_limit;
|
||
|
|
||
|
// stuff added now that the game uses streaming MP3s...
|
||
|
//
|
||
|
byte *pbSourceData; // a useful dup ptr only, this whole struct will be owned by an sfx_t struct that has the actual data ptr field
|
||
|
int iSourceBytesRemaining;
|
||
|
int iSourceReadIndex;
|
||
|
int iSourceFrameBytes;
|
||
|
#ifdef _DEBUG
|
||
|
int iSourceFrameCounter; // not really important
|
||
|
#endif
|
||
|
int iBytesDecodedTotal;
|
||
|
int iBytesDecodedThisPacket;// not sure how useful this will be, it's only per-frame, so will always be full frame size (eg 2304 or below for mono) except possibly for the last frame?
|
||
|
|
||
|
int iRewind_FinalReductionCode;
|
||
|
int iRewind_FinalConvertCode;
|
||
|
int iRewind_SourceBytesRemaining;
|
||
|
int iRewind_SourceReadIndex;
|
||
|
byte bDecodeBuffer[2304*2]; // *2 to allow for stereo now
|
||
|
int iCopyOffset; // used for painting to DMA-feeder, since 2304 won't match the size it wants
|
||
|
|
||
|
// some new stuff added for dynamic music, to allow "how many seconds left to play" queries...
|
||
|
//
|
||
|
// ( m_lengthInSeconds = ((iUnpackedDataLength / iRate) / iChannels) / iWidth; )
|
||
|
//
|
||
|
// Note that these fields are only valid/initialised if MP3Stream_InitPlayingTimeFields() was called.
|
||
|
// If not, this->iTimeQuery_UnpackedLength will be zero.
|
||
|
//
|
||
|
int iTimeQuery_UnpackedLength;
|
||
|
int iTimeQuery_SampleRate;
|
||
|
int iTimeQuery_Channels;
|
||
|
int iTimeQuery_Width;
|
||
|
|
||
|
} MP3STREAM, *LP_MP3STREAM;
|
||
|
|
||
|
|
||
|
extern LP_MP3STREAM pMP3Stream;
|
||
|
extern int bFastEstimateOnly;
|
||
|
|
||
|
#pragma warning (default : 4201 ) // nonstandard extension used : nameless struct/union
|
||
|
#pragma warning (disable : 4711 ) // function 'xxxx' selected for automatic inline expansion
|
||
|
|
||
|
#endif // #ifndef MP3STRUCT_H
|
||
|
|
||
|
////////////////// eof /////////////////////
|
||
|
|