/* AUDIOBUFSIZE = n*64 with n=1,2,3 ...  */
#define         AUDIOBUFSIZE            16384

//#define         FALSE                   0
//#define         TRUE                    1

#define         SBLIMIT                 32
#define         SSLIMIT                 18

#define         SCALE_BLOCK             12


#define         MPG_MD_STEREO           0
#define         MPG_MD_JOINT_STEREO     1
#define         MPG_MD_DUAL_CHANNEL     2
#define         MPG_MD_MONO             3

#define MAXFRAMESIZE 1792


/* Pre Shift fo 16 to 8 bit converter table */
#define AUSHIFT (3)

typedef float real;

struct buf {
  unsigned char *pnt;
  long size;
  long pos;
  struct buf *next;
  struct buf *prev;
};

struct framebuf {
  struct buf *buf;
  long pos;
  struct frame *next;
  struct frame *prev;
};

struct frame {
  int stereo;
  int jsbound;
  int single;
  int lsf;
  int mpeg25;
  int header_change;
  int lay;
  int error_protection;
  int bitrate_index;
  int sampling_frequency;
  int padding;
  int extension;
  int mode;
  int mode_ext;
  int copyright;
  int original;
  int emphasis;
  int framesize; /* computed framesize */

  /* layer2 stuff */
  int II_sblimit;
  void *alloc;
};

struct mpstr {
  struct buf *head,*tail;
  int bsize;
  int framesize;
  int fsizeold;
  struct frame fr;
  unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */
  real hybrid_block[2][2][SBLIMIT*SSLIMIT];
  int hybrid_blc[2];
  unsigned long header;
  int bsnum;
  real synth_buffs[2][2][0x110];
  int  synth_bo;
};

#define BOOL int

#define MP3_ERR -1
#define MP3_OK  0
#define MP3_NEED_MORE 1

extern struct mpstr *gmp;

BOOL InitMP3(struct mpstr *mp, int down_sample);
int decodeMP3(struct mpstr *mp,char *inmemory,int inmemsize,
                               char *outmemory,int outmemsize,int *done);
void ExitMP3(struct mpstr *mp);
