#ifndef _SOUND_H_
#define _SOUND_H_

#ifdef __cplusplus
extern "C"
{
#endif

#define SOUND_VERSION 0x0100
#define PCM_ALL       0

#define PCM_OUT       0x08000000
#define PCM_RING      0x10000000
#define PCM_STATIC    0x20000000
#define PCM_FLOAT     0x40000000
#define PCM_FILTER    0x80000000

#define PCM_2_16_48   1
#define PCM_1_16_48   2
#define PCM_2_16_44   3
#define PCM_1_16_44   4
#define PCM_2_16_32   5
#define PCM_1_16_32   6
#define PCM_2_16_24   7
#define PCM_1_16_24   8
#define PCM_2_16_22   9
#define PCM_1_16_22  10
#define PCM_2_16_16  11
#define PCM_1_16_16  12
#define PCM_2_16_12  13
#define PCM_1_16_12  14
#define PCM_2_16_11  15
#define PCM_1_16_11  16
#define PCM_2_16_8   17
#define PCM_1_16_8   18
#define PCM_2_8_48   19
#define PCM_1_8_48   20
#define PCM_2_8_44   21
#define PCM_1_8_44   22
#define PCM_2_8_32   23
#define PCM_1_8_32   24
#define PCM_2_8_24   25
#define PCM_1_8_24   26
#define PCM_2_8_22   27
#define PCM_1_8_22   28
#define PCM_2_8_16   29
#define PCM_1_8_16   30
#define PCM_2_8_12   31
#define PCM_1_8_12   32
#define PCM_2_8_11   33
#define PCM_1_8_11   34
#define PCM_2_8_8    35
#define PCM_1_8_8    36

#define SRV_GETVERSION      0
#define SND_CREATE_BUFF     1
#define SND_DESTROY_BUFF    2
#define SND_SETFORMAT       3
#define SND_GETFORMAT       4
#define SND_RESET           5
#define SND_SETPOS          6
#define SND_GETPOS          7
#define SND_SETBUFF         8
#define SND_OUT             9
#define SND_PLAY           10
#define SND_STOP           11
#define SND_SETVOLUME      12
#define SND_GETVOLUME      13
#define SND_SETPAN         14
#define SND_GETPAN         15
#define SND_GETBUFFSIZE    16
#define SND_GETFREESPACE   17


#define PLAY_SYNC     0x80000000

typedef unsigned int SNDBUF;

int _stdcall  InitSound(int *version);

int _stdcall  CreateBuffer(unsigned int format,int size,SNDBUF *buf);
int _stdcall  DestroyBuffer(SNDBUF hBuff);

int _stdcall  SetFormat(SNDBUF hBuff, unsigned int format);
int _stdcall  GetFormat(SNDBUF hBuff, unsigned int *format);

int _stdcall  ResetBuffer(SNDBUF hBuff, unsigned int flags);
int _stdcall  SetBufferPos(SNDBUF hBuff, int offset);
int _stdcall  GetBufferPos(SNDBUF hBuff, int *offset);
int _stdcall  GetBufferSize(SNDBUF hBuff, int *size);
int _stdcall  GetBufferFree(SNDBUF hBuff, int *free);

int _stdcall  SetBuffer(SNDBUF hBuff,void* buff,
                        int offs, int size);
int _stdcall  WaveOut(SNDBUF hBuff,void *buff, int size);
int _stdcall  PlayBuffer(SNDBUF hBuff,unsigned int flags);
int _stdcall  StopBuffer(SNDBUF hBuff);

int _stdcall  SetVolume(SNDBUF hBuff, int left, int right);
int _stdcall  GetVolume(SNDBUF hBuff, int *left, int *right);
int _stdcall  SetPan(SNDBUF hBuff, int pan);
int _stdcall  GetPan(SNDBUF hBuff, int *pan);

int _stdcall  GetMasterVol(int* vol);
int _stdcall  SetMasterVol(int vol);


typedef struct
{
    unsigned int   riff_id;
    unsigned int   riff_size;
    unsigned int   riff_format;

    unsigned int   fmt_id;
    unsigned int   fmt_size;

    unsigned short int wFormatTag;
    unsigned short int nChannels;
    unsigned int   nSamplesPerSec;
    unsigned int   nAvgBytesPerSec;
    unsigned short int nBlockAlign;
    unsigned short int wBitsPerSample;
    unsigned int   data_id;
    unsigned int   data_size;
} WAVEHEADER;


unsigned int _stdcall test_wav(WAVEHEADER *hdr);

#ifdef __cplusplus
extern "C"
}
#endif

#endif //_SOUND_H_