fixed music playback in dos
[dosdemo] / libs / oldmik / src / mwav.c
diff --git a/libs/oldmik/src/mwav.c b/libs/oldmik/src/mwav.c
new file mode 100644 (file)
index 0000000..f1a1e9a
--- /dev/null
@@ -0,0 +1,143 @@
+/*\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