/***************************************************************************
 *
 * sfx.h
 *
 ***************************************************************************
 *
 * High level soundcard API
 *
 ***************************************************************************/

#ifndef SFX_H_INCLUDED
#define SFX_H_INCLUDED

/*
 * includes
 */

/*
 * defines
 */

/* sound effect modes */
#define SFX_MODE_STEREO		1
#define SFX_MODE_16_BIT		2

/* status flags for channels/playlist */
#define SFX_ACTIVE			1
#define SFX_LOOPING			2

/* callback masks */
#define SFX_CALLBACK_END	1

/* queue status */
#define SFX_QUEUE_PLAYING	1

#define QUEUE_BUFSIZE		8192

/*
 * typedefs
 */

/*
 * structures
 */

struct sfxQueue
{
	struct sfxQueue *next;

	signed long playHandle;
	signed long sampleHandles[2];
	char samplesValid[2];

	unsigned long size;
	unsigned short *data;

	unsigned long read;
	unsigned long write;
	unsigned long used;

	unsigned long freq;
	unsigned long blockSize;

	unsigned char vol;
	unsigned char pan;
	unsigned char priority;

	unsigned char curBuf;
};

struct sampleParms
{
	int length;
	int loopStart;
	int loopEnd;
	int freq;
};

#include "snd.h"

/*
 * globals
 */

extern struct sndDriver *snd;
extern int sfxOpen;

/*
 * function prototypes
 */

extern int      SfxQuery(int *numChannels,int *mode,int *freq,int *latency);
extern int	SfxOpen(int numChannels,int mode,int freq,int latency,int *spt,int *afreq);
extern void	SfxClose(void);

extern int	SfxRegisterSample(char *sampleName);
extern int	SfxRegisterSampleByID(int id);
extern int	SfxRegisterSampleDirect(unsigned short *data,int len,int lpStart,int lpEnd,int freq);
extern void	SfxUnRegisterSample(int sampleHandle);
extern void	SfxUnRegisterAll(void);
extern void 	SfxQuerySample(int sampleHandle,struct sampleParms *s);
extern void 	SfxUpdateSample(int sampleHandle,struct sampleParms *s);
extern void 	SfxUpdateSampleData(int sampleHandle,unsigned short *data,int len);

extern int	SfxPlay(int sampleHandle,int freq,int vol,int pan,int priority,int flags);
extern void	SfxStop(int playHandle);
extern void	SfxStopAll(void);

extern void SfxPauseAll(void);
extern void SfxUnPauseAll(void);

extern void SfxHalt(void);
extern void SfxUnHalt(void);

extern void SfxSetVol(int playHandle,int vol);
extern void SfxSetPan(int playHandle,int pan);
extern void SfxSetFreq(int playHandle,int freq);
extern void SfxSetPriority(int playHandle,int priority);
extern void SfxSetCallback(int playHandle,int mask,void (*callback)(int,int));
extern void SfxEnvelope(int handle,int fade);

extern int	SfxGetVol(int playHandle);
extern int 	SfxGetPan(int playHandle);
extern int 	SfxGetFreq(int playHandle);
extern int	SfxGetPriority(int playHandle);
extern int	SfxGetBufferCount(void);

extern void	SfxProcess(void);
extern void SfxPrune(void);

extern void SfxSetBufferCallback(void (*callback)(void));
extern void (*SfxGetBufferCallback(void))(void);

extern int	SfxReverbOpen(int size);
extern void SfxReverbSetDepth(int d);
extern void SfxReverbClose(void);

extern void SfxKick(void);

extern struct sfxQueue *SfxQueueCreate(int size);
extern void SfxQueueDestroy(struct sfxQueue *q);
extern void SfxQueueAdd(struct sfxQueue *q,int size,unsigned short *data);
extern void SfxQueuePlay(struct sfxQueue *q,int freq,int vol,int pan,int priority);
extern void SfxQueueSetFreq(struct sfxQueue *q,int freq);
extern void SfxQueueSetVol(struct sfxQueue *q,int vol);
extern void SfxQueueSetPan(struct sfxQueue *q,int pan);
extern void SfxQueueSetPriority(struct sfxQueue *q,int priority);
extern void SfxProcessQueue(struct sfxQueue *q);

#endif
