/**************************************************************************** * * Digital Sound Interface Kit (DSIK) * Version 2.00 * * by Carlos Hasan * * Filename: audio.h * Version: Revision 1.1 * * Language: WATCOM C * Environment: IBM PC (DOS/4GW) * * Description: Audio Interface header file. * * Revision History: * ---------------- * * Revision 1.1 94/11/05 12:13:39 chv * Added function to return the amount of free soundcard memory * * Revision 1.0 94/09/25 15:28:25 chv * Initial revision * ****************************************************************************/ #ifndef __AUDIO_H #define __AUDIO_H /* Misc defines */ #define MAXVOICES 32 #define MAXTRACKS 16 #define MAXSAMPLES 256 #define MAXORDERS 128 #define MINPERIOD 28 #define MAXPERIOD 6848 #define MIDCPERIOD 428 #define MIDCFREQ 8363 /* Soundcards ID values */ #define ID_NONE 0 #define ID_SB 1 #define ID_SB201 2 #define ID_SBPRO 3 #define ID_SB16 4 #define ID_PAS 5 #define ID_PASPLUS 6 #define ID_PAS16 7 #define ID_WSS 8 #define ID_GUS 9 #define ID_DEBUG 255 /* Soundcards capabilities bit flags */ #define AF_8BITS 0x00 #define AF_16BITS 0x01 #define AF_MONO 0x00 #define AF_STEREO 0x02 #define AF_NODRAM 0x00 #define AF_DRAM 0x04 /* Stereo panning values */ #define PAN_LEFT 0x00 #define PAN_MIDDLE 0x40 #define PAN_RIGHT 0x80 #define PAN_SURROUND 0xA4 /* Internal lowlevel audio messages bitflags */ #define AM_SAMPLE 0x01 #define AM_KEYON 0x02 #define AM_KEYOFF 0x04 #define AM_VOLUME 0x08 #define AM_BALANCE 0x10 #define AM_SETCTL 0x20 #define AM_GETCTL 0x40 #define AM_PAUSE 0x80 /* Music playing status values */ #define PS_STOPPED 0 #define PS_PLAYING 1 #define PS_PAUSED 2 /* Music pattern break modes */ #define PB_NONE 0 #define PB_BREAK 1 #define PB_JUMP 2 #define PB_HOLD 3 #define PB_TRACE 4 /* RIFF/DSMF block identifier values */ #define ID_RIFF 0x46464952L #define ID_DSMF 0x464D5344L #define ID_SONG 0x474E4F53L #define ID_INST 0x54534E49L #define ID_PATT 0x54544150L /* RIFF/WAVE block identifier values */ #define ID_WAVE 0x45564157L #define ID_FMT 0x20746D66L #define ID_DATA 0x61746164L /* RIFF/DSMF INST digital samples bit flags */ #define SF_LOOPED 0x01 #define SF_UNSIGNED 0x00 #define SF_SIGNED 0x02 #define SF_8BITS 0x00 #define SF_16BITS 0x04 #define SF_DELTA 0x40 #define SF_LIBRARY 0x80 /* RIFF/WAVE sample format */ #define WAVE_FMT_PCM 1 /* Error values */ #define ERR_OK 0 #define ERR_FORMAT 1 #define ERR_NOFILE 2 #define ERR_FILEIO 3 #define ERR_NOMEM 4 #define ERR_NODRAM 5 #ifdef __cplusplus extern "C" { #endif /* General typedefs */ typedef unsigned long dword; typedef unsigned short word; typedef unsigned char byte; /* Internal lowlevel audio drivers structure */ #pragma pack(1) typedef struct { dword Magic; dword Next; byte ID; byte Modes; char Name[32]; word Port; byte IrqLine; byte DmaChannel; word MinRate; word MaxRate; word BufferLength; void *ProcTablePtr; void *DriverPtr; word *ParmTablePtr; } Driver; /* Internal soundcards configuration structure */ typedef struct SoundCard_s { byte ID; byte Modes; word Port; byte IrqLine; byte DmaChannel; word SampleRate; char DriverName[16]; char InversePan; char Ckeys[14]; char effecttracks; int musicvol; int sfxvol; int ambientlight; int camdelay; int screensize; char animation; char violence; char jstick; char mouse; int chartype; int socket; int numplayers; char dialnum[13]; int com; int serplayers; char netname[13]; word jcenx, jceny, xsense, ysense; int rightbutton, leftbutton; int joybut1, joybut2; int netmap, netdifficulty; int mousesensitivity; int turnspeed, turnaccel; int vrhelmet; int vrangle; int vrdist; } SoundCard; /* RIFF file and block headers structures */ typedef struct { dword ID; dword Length; dword Type; } RiffHeader; typedef struct { dword ID; dword Length; } RiffBlock; /* RIFF/WAVE fmt block structure */ typedef struct { word Format; word Channels; dword SampleRate; dword BytesPerSecond; word BlockAlign; word BitsPerSample; } WaveFmt; /* RIFF/DSMF SONG block structure */ typedef struct { char ModuleName[28]; word FileVersion; word Flags; word OrderPos; word ReStart; word NumOrders; word NumSamples; word NumPatterns; word NumTracks; byte GlobalVolume; byte MasterVolume; byte InitTempo; byte InitBPM; byte ChanMap[MAXTRACKS]; byte Orders[MAXORDERS]; } Song; /* RIFF/DSMF INST block structure */ typedef struct { char FileName[13]; word Flags; byte Volume; dword Length; dword LoopStart; dword LoopEnd; void *DataPtr; word Rate; word Voice; char SampleName[28]; } Sample; /* RIFF/DSMF PATT block structure */ typedef struct { word Length; byte Data[1]; } Pattern; /* Internal RIFF/DSMF music module structure */ typedef struct { Song Header; Sample **Samples; Pattern **Patterns; } DSM; /* Internal music structures */ typedef struct { byte Note; /* note index */ byte Sample; /* sample number */ byte Volume; /* volume level */ byte Balance; /* balance */ word Effect; /* Protracker command */ word Rate; /* middle-C finetune frequency */ byte VUMeter; /* volume unit meter */ byte Flags; /* audio message bitflags */ byte Reserved[38]; } MTrk; typedef struct { dword MusicVolume; /* music volume */ dword SoundVolume; /* sound effects volume */ MTrk Tracks[MAXVOICES]; /* track structures */ byte NumTracks; /* number of active tracks */ byte NumVoices; /* number of active voices */ byte OrderPos; /* order position */ byte OrderLen; /* order length */ byte ReStart; /* restart position */ byte PattNum; /* pattern number */ byte PattRow; /* pattern row */ byte BreakFlag; /* break pattern mode */ byte Tempo; /* tempo */ byte TempoCount; /* tempo counter */ byte BPM; /* beats per minute */ byte SyncMark; /* synchronization mark */ byte Status; /* music status */ byte DriverStatus; /* audio driver status */ void *PattPtr; /* internal pattern pointer */ DSM *SongPtr; /* module pointer */ } MHdr; #pragma pack(4) /* External lowlevel audio drivers */ extern Driver SBDriver; extern Driver PASDriver; extern Driver WSSDriver; extern Driver GUSDriver; #define dRegisterDrivers() { \ dRegisterDriver(&SBDriver); dRegisterDriver(&PASDriver); \ dRegisterDriver(&WSSDriver); dRegisterDriver(&GUSDriver); } #pragma aux SBDriver "_*"; #pragma aux PASDriver "_*"; #pragma aux WSSDriver "_*"; #pragma aux GUSDriver "_*"; /* Global error variable */ extern int dError; extern char *dErrorMsg[]; /* Audio interface API prototypes */ void dRegisterDriver(Driver *DriverPtr); Driver *dGetDriverStruc(int DriverId); int dGetDriverFlags(void); int dInit(SoundCard *SC); int dDone(void); void dPoll(void); void dSetupVoices(int NumVoices, int MasterVolume); long dMemAlloc(Sample *SampPtr); void dMemFree(Sample *SampPtr); long dMemAvail(void); void dSetMusicVolume(int Volume); void dSetSoundVolume(int Volume); int dPlayMusic(DSM *MusicPtr); int dPlayPatterns(DSM *MusicPtr, int OrderPos, int OrderEnd); void dStopMusic(void); int dPauseMusic(void); int dResumeMusic(void); int dGetMusicStatus(void); MHdr *dGetMusicStruc(void); void dPlayVoice(int Voice, Sample *SampPtr); void dStopVoice(int Voice); void dSetVoiceFreq(int Voice, int Freq); void dSetVoiceVolume(int Voice, int Volume); void dSetVoiceBalance(int Voice, int Balance); long dGetVoicePos(int Voice); int dGetVoiceStatus(int Voice); int dAutoDetect(SoundCard *SC); DSM *dLoadModule(char *Filename); void dFreeModule(DSM *MusicPtr); Sample *dLoadSample(char *Filename); void dFreeSample(Sample *SampPtr); DSM *dLoadModuleFile(int Handle, long Length); Sample *dLoadSampleFile(int Handle, long Length, int Flags); int dLoadSetup(SoundCard *SC, char *Filename); int dSaveSetup(SoundCard *SC, char *Filename); #ifdef __cplusplus } #endif /* Register calling conventions used by the API routines */ #pragma aux dRegisterDriver "_*" parm [eax]; #pragma aux dGetDriverStruc "_*" parm [eax]; #pragma aux dGetDriverFlags "_*" parm []; #pragma aux dInit "_*" parm [eax]; #pragma aux dDone "_*" parm []; #pragma aux dPoll "_*" parm []; #pragma aux dSetupVoices "_*" parm [eax] [edx]; #pragma aux dMemAlloc "_*" parm [eax] [edx]; #pragma aux dMemFree "_*" parm [eax]; #pragma aux dMemAvail "_*" parm []; #pragma aux dSetMusicVolume "_*" parm [eax]; #pragma aux dSetSoundVolume "_*" parm [eax]; #pragma aux dPlayMusic "_*" parm [eax]; #pragma aux dPlayPatterns "_*" parm [eax] [edx] [ebx]; #pragma aux dStopMusic "_*" parm []; #pragma aux dPauseMusic "_*" parm []; #pragma aux dResumeMusic "_*" parm []; #pragma aux dGetMusicStatus "_*" parm []; #pragma aux dGetMusicStruc "_*" parm []; #pragma aux dPlayVoice "_*" parm [eax] [edx]; #pragma aux dStopVoice "_*" parm [eax]; #pragma aux dSetVoiceFreq "_*" parm [eax] [edx]; #pragma aux dSetVoiceVolume "_*" parm [eax] [edx]; #pragma aux dSetVoiceBalance "_*" parm [eax] [edx]; #pragma aux dGetVoicePos "_*" parm [eax]; #pragma aux dGetVoiceStatus "_*" parm [eax]; #pragma aux dAutoDetect "_*" parm [eax]; #pragma aux dLoadModule "_*" parm [eax]; #pragma aux dFreeModule "_*" parm [eax]; #pragma aux dLoadSample "_*" parm [eax]; #pragma aux dFreeSample "_*" parm [eax]; #pragma aux dLoadModuleFile "_*" parm [eax] [edx]; #pragma aux dLoadSampleFile "_*" parm [eax] [edx]; #pragma aux dLoadSetup "*" parm [eax] [edx]; #pragma aux dSaveSetup "*" parm [eax] [edx]; #pragma library (audio); #endif