--- /dev/null
+/*\r
+\r
+Name:\r
+MWAV.C\r
+\r
+Description:\r
+WAV sample loader\r
+\r
+Portability:\r
+\r
+MSDOS: BC(y) Watcom(y) DJGPP(?)\r
+Win95: BC(n)\r
+Linux: n\r
+\r
+(y) - yes\r
+(n) - no (not possible or not useful)\r
+(?) - may be possible, but not tested\r
+\r
+*/\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+\r
+#include "mikmod.h"\r
+\r
+\r
+typedef struct WAV{\r
+ char rID[4];\r
+ ULONG rLen;\r
+ char wID[4];\r
+ char fID[4];\r
+ ULONG fLen;\r
+ UWORD wFormatTag;\r
+ UWORD nChannels;\r
+ ULONG nSamplesPerSec;\r
+ ULONG nAvgBytesPerSec;\r
+ UWORD nBlockAlign;\r
+ UWORD nFormatSpecific;\r
+} WAV;\r
+\r
+\r
+\r
+SAMPLE *MW_LoadWavFP(FILE *fp)\r
+{\r
+ SAMPLE *si;\r
+ static WAV wh;\r
+ static char dID[4];\r
+\r
+ _mm_rewind(fp);\r
+\r
+ /* read wav header */\r
+\r
+ _mm_read_str(wh.rID,4,fp);\r
+ wh.rLen=_mm_read_I_ULONG(fp);\r
+ _mm_read_str(wh.wID,4,fp);\r
+ _mm_read_str(wh.fID,4,fp);\r
+ wh.fLen=_mm_read_I_ULONG(fp);\r
+ wh.wFormatTag=_mm_read_I_UWORD(fp);\r
+ wh.nChannels=_mm_read_I_UWORD(fp);\r
+ wh.nSamplesPerSec=_mm_read_I_ULONG(fp);\r
+ wh.nAvgBytesPerSec=_mm_read_I_ULONG(fp);\r
+ wh.nBlockAlign=_mm_read_I_UWORD(fp);\r
+ wh.nFormatSpecific=_mm_read_I_UWORD(fp);\r
+\r
+ /* check it */\r
+\r
+ if( feof(fp) ||\r
+ memcmp(wh.rID,"RIFF",4) ||\r
+ memcmp(wh.wID,"WAVE",4) ||\r
+ memcmp(wh.fID,"fmt ",4) ){\r
+ myerr="Not a WAV file";\r
+ return NULL;\r
+ }\r
+\r
+ /* skip other crap */\r
+\r
+ _mm_fseek(fp,wh.fLen-16,SEEK_CUR);\r
+ _mm_read_str(dID,4,fp);\r
+\r
+ if( memcmp(dID,"data",4) ){\r
+ myerr="Not a WAV file";\r
+ return NULL;\r
+ }\r
+\r
+ if(wh.nChannels>1){\r
+ myerr="Only mono WAV's are supported";\r
+ return NULL;\r
+ }\r
+\r
+/* printf("wFormatTag: %x\n",wh.wFormatTag); */\r
+/* printf("blockalign: %x\n",wh.nBlockAlign); */\r
+/* prinff("nFormatSpc: %x\n",wh.nFormatSpecific); */\r
+\r
+ if((si=(SAMPLE *)calloc(1,sizeof(SAMPLE)))==NULL){\r
+ myerr="Out of memory";\r
+ return NULL;\r
+ };\r
+\r
+ si->c2spd=8192;\r
+ si->volume=64;\r
+\r
+ si->length=_mm_read_I_ULONG(fp);\r
+\r
+ if(wh.nBlockAlign==2){\r
+ si->flags=SF_16BITS|SF_SIGNED;\r
+ si->length>>=1;\r
+ }\r
+\r
+ si->handle=MD_SampleLoad(fp,si->length,0,si->length,si->flags);\r
+\r
+ if(si->handle<0){\r
+ free(si);\r
+ return NULL;\r
+ }\r
+\r
+ return si;\r
+}\r
+\r
+\r
+SAMPLE *MW_LoadWavFN(char *filename)\r
+{\r
+ FILE *fp;\r
+ SAMPLE *si;\r
+\r
+ if((fp=fopen(filename,"rb"))==NULL){\r
+ myerr="Couldn't open wav file";\r
+ return NULL;\r
+ }\r
+\r
+ si=MW_LoadWavFP(fp);\r
+\r
+ fclose(fp);\r
+ return si;\r
+}\r
+\r
+\r
+void MW_FreeWav(SAMPLE *si)\r
+{\r
+ if(si!=NULL){\r
+ MD_SampleUnLoad(si->handle);\r
+ free(si);\r
+ }\r
+}\r