#ifndef stream_h
#define stream_h

#include "common.h"
#include "buffer.h"
#include "mp3mod.h"
#include "layer12.h"
#include "layer3.h"

typedef struct GlobHdr GlobHdr;

typedef enum
{ Stream_Decode_Init     = 0
, Stream_Decode_Seek     = 1
, Stream_Decode_Decode   = 2
, Stream_Decode_Finished = 3
, Stream_Decode_Skip     = 4
} Stream_Decode;

typedef enum
{ Stream_SkipType_Init     = 0
, Stream_SkipType_Bytes    = 1
, Stream_SkipType_WaveData = 2
} Stream_SkipType;

#define HAN_SIZE        512
#define SCALE_BLOCK      12

typedef struct
{
	GlobHdr*        pGlobHdr;
	// dynamic area buffers
	dinbuf*         inb;
	doutbuf*        outb;
	int             inb_area;
	int             outb_area;
	// main information
	int             running;
	int             bgcount;
	Stream_Decode   decoding;
	Stream_SkipType skiptype;
	unsigned int    bytestoskip;
	int             code;
	int             foreground;
	mp3info         mp3i;
	// output
	sndbuf          sndb;
	// input
	bytebuf         mp3b;
	// frame
	frame_params    fr_ps;
	unsigned int    frameNum;
	int             prev_frame_corrupted;
	// subbandsynthesis
	int             Hanbuf[2][2][17*16];
	int             HanOffset[2];
	// layer info
	union
	{
		layer12     lay12;
		layer3      lay3;
		char        skipbuf[256];
	} l;
} stream;

#endif
