#ifndef _SeqHdr_H
#define _SeqHdr_H

#define seq_hard_buf_len    1024
#define seq_soft_buf_size   240
#define seq_soft_buf_len    (seq_soft_buf_size*2)
#define seq_max_streams     128
#define seq_max_handlers    10
#define Max_Equalizers      10

typedef struct StreamInfo
{
	int32_t     volume_left;
	int32_t     volume_right;
} StreamInfo;

typedef struct BandPass
{
	int32_t     par_c0;
	int32_t     par_c1;
	int32_t     par_c2;
	int32_t     par_d1;
	int32_t     par_d2;
	int32_t     save_x1L;
	int32_t     save_x2L;
	int32_t     save_y1L;
	int32_t     save_y2L;
	int32_t     save_x1R;
	int32_t     save_x2R;
	int32_t     save_y1R;
	int32_t     save_y2R;
} BandPass;

#define TimerType_None 0
#define TimerType_IOC  1
#define TimerType_HAL  2

#define seq_status_filling              0x00000001 // buffer filling reentry lock
#define seq_status_16bit                0x00000002
#define seq_status_interpol             0x00000004
#define seq_status_16bitpresent         0x00000008
#define seq_status_16bitconfig          0x00000010
#define seq_status_mix_mono             0x00000020
#define seq_status_fullscaleAGC         0x00000040
#define seq_status_mixnorescale         0x00000080

#define seq_status_activehandler        0x00000100
#define seq_status_handlersharedsound   0x00000200
#define seq_status_handlerDMA16bit      0x00000400
#define seq_status_handlerDMA8bit       0x00000800
#define seq_status_handlerWAV           0x00001000
#define seq_status_handlerdisconnected  0x00002000
#define seq_status_handlermask          0x00003F00

#define seq_status_enableinterrupts     0x00020000
#define seq_status_WAVFilling           0x00040000

#define seq_status_SMLASupport          0x01000000
#define seq_status_LDRHSupport          0x02000000
#define seq_status_disable_ITFilters    0x04000000
#define seq_status_equalizer_serial     0x08000000

typedef struct SeqHdr
{
	char        TAG[4];
	uint32_t    EqualNr;
	BandPass    EqualPars[Max_Equalizers];
	uint32_t    Filler_Mix_Scale; // 100% = 65536
	int32_t     StereoSeparation; // 100% = 256 [-1024, 1024]
	uint32_t    Balance;          // 128 = center [left 0, right 255]
	uint32_t    Status;
	uint32_t    SampleSize;
	uint32_t    Quality;
	uint32_t    FreqIndex;        // 16-bit mixing frequency index
	uint32_t    FineQuality;      // in 1/2^8 us = 256*1000000/FMix
	uint32_t    TimeStep;         // 2^40/Fmix (see R7 of filling routines)
	uint32_t    SharedSoundHandler;
	uint32_t    Stream_NrOfHandlers;
	uint32_t    Stream_Handlers[seq_max_handlers];
	uint32_t    DMAConfig[5];     // R0-R4
	uint8_t*    pVoicesBuffer;    // area for writing individual voices
	uint32_t*   pBuffer32;
	uint32_t*   pBuffer32_Equ;
	uint32_t    WAVBuffer;
	uint32_t    MaxReadWave;      // maximal seen wave amplitude
	uint32_t    MaxWave;          // maximal wave amplitude accepted by AGC
	uint32_t    AGC;              // current AGC wave amplitude scaling factor
	uint32_t    MaxAGC;           // worst seen AGC wave amplitude scaling factor
	uint32_t    WavePercentage;   // lowest seen amplification % required to trigger AGC
                                  // it's just to help the user ajust songs relative volumes
	uint32_t    TimerType;        // 0 None, 1 IOC, 2 HAL
	uint32_t    TimerTicksPerSec;
	uint32_t    TimerPeriod;
	uint32_t    TimerStartValue;
	uint32_t    Filler_CPU;
	uint32_t    Filler_CPU1;
	uint32_t    Filler_CPUCount;
	uint32_t    Filler_MaxCPU;
	uint32_t    Filler_AllowedTime;
	uint32_t    MaxNrOfStreams;
	uint32_t    MaxNrOfStreamsSeen;
	uint32_t    NrOfStreams;
	uint32_t    StreamsPtr[seq_max_streams];
	StreamInfo  Streams_Info[seq_max_streams];
} SeqHdr;

#endif
