/***************************************************************************
 *
 * seq.h
 *
 ***************************************************************************
 *
 * midi player function prototypes
 *
 ***************************************************************************/

#ifndef SEQ_H_INCLUDED
#define SEQ_H_INCLUDED

/*
 * includes
 */

/*
 * defines
 */

#define SEQPLAY_PAUSED	1
#define SEQPLAY_LOOP	2
#define SEQPLAY_END		4

/*
 * typedefs
 */

/*
 * structures
 */

// modified to match SQ2 resources
struct sampleMap
{
	int		resId;
	int		sfxHandle;
	unsigned long	freq;
	int		fade;
	char		smpNote;
	char		disable;
	char		pad[2];
};

struct noteHandle
{
	struct noteHandle *next;
	unsigned long handle;
	unsigned char note;
	unsigned char orgVol;
};

struct seq
{
	unsigned long pitchBendRange;
	unsigned long numSamples;
	unsigned char *data;
	struct sampleMap samples[1];
};

struct seqPlay
{
	struct seqPlay *next;

	struct seq *s;
	unsigned char *playPtr;
	unsigned long currentTime;
	unsigned long lastEventTime;
	unsigned char flags;
	unsigned char pitchSemitones;
	struct noteHandle **noteHandles;
	int vol,pan,priority,spread;

	unsigned char *updateBuffer;
	unsigned long updateMask;
};

/*
 * globals
 */

extern volatile int seqCallbackOccurred;
extern int seqOpen;

/*
 * function prototypes
 */

extern void SEQConstructor(unsigned char **);
extern void SEQFree(struct seq *s);

struct seqPlay *SEQPlay(struct seq *sq,int flags,int vol,int pan,int priority);
extern void SEQPlayPause(struct seqPlay *s);
extern void SEQPlayUnPause(struct seqPlay *s);
extern void SEQPlayStop(struct seqPlay *s);

extern void SEQPlaySetVol(struct seqPlay *s,int vol);
extern void SEQPlaySetPan(struct seqPlay *s,int pan);
extern void SEQPlaySetSpread(struct seqPlay *s,int spread);
extern void SEQPlaySetPriority(struct seqPlay *s,int priority);


extern void SEQAdvanceTime(struct seqPlay *s);
extern void SEQOpen(int latency);
extern void SEQClose(void);
extern void SEQStopAll(void);


extern unsigned long SEQGetDuration(struct seq *s);


#endif


