diff playercode/mwav.c @ 6:d14fd386d182

Initial entry of mikmod into the CVS tree.
author darius
date Fri, 23 Jan 1998 16:05:09 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/playercode/mwav.c	Fri Jan 23 16:05:09 1998 +0000
@@ -0,0 +1,133 @@
+/*
+
+ Name:  MWAV.C
+
+ Description:
+ WAV sample loader
+ Stereo .WAV files are not yet supported as samples.
+
+ Portability:
+ All compilers -- All systems (hopefully)
+
+*/
+
+#include <string.h>
+#include "mikmod.h"
+
+
+typedef struct WAV
+{   CHAR  rID[4];
+    ULONG rLen;
+    CHAR  wID[4];
+    CHAR  fID[4];
+    ULONG fLen;
+    UWORD wFormatTag;
+    UWORD nChannels;
+    ULONG nSamplesPerSec;
+    ULONG nAvgBytesPerSec;
+    UWORD nBlockAlign;
+    UWORD nFormatSpecific;
+} WAV;
+
+
+SAMPLE *WAV_LoadFP(FILE *fp)
+{
+    SAMPLE     *si;
+    static WAV  wh;
+    static CHAR dID[4];
+
+    // read wav header
+
+    _mm_read_string(wh.rID,4,fp);
+    wh.rLen = _mm_read_I_ULONG(fp);
+    _mm_read_string(wh.wID,4,fp);
+
+    while(1)
+    {   _mm_read_string(wh.fID,4,fp);
+        wh.fLen = _mm_read_I_ULONG(fp);
+        if(memcmp(wh.fID,"fmt ",4) == 0) break;
+        _mm_fseek(fp,wh.fLen,SEEK_CUR);
+    }
+
+    if( feof(fp) ||
+        memcmp(wh.rID,"RIFF",4) ||
+        memcmp(wh.wID,"WAVE",4))
+    {
+        _mm_errno = MMERR_UNKNOWN_WAVE_TYPE;
+        return NULL;
+    }
+
+    wh.wFormatTag      = _mm_read_I_UWORD(fp);
+    wh.nChannels       = _mm_read_I_UWORD(fp);
+    wh.nSamplesPerSec  = _mm_read_I_ULONG(fp);
+    wh.nAvgBytesPerSec = _mm_read_I_ULONG(fp);
+    wh.nBlockAlign     = _mm_read_I_UWORD(fp);
+    wh.nFormatSpecific = _mm_read_I_UWORD(fp);
+
+    // check it
+
+    if(feof(fp))
+    {   _mm_errno = MMERR_UNKNOWN_WAVE_TYPE;
+        return NULL;
+    }
+
+    // skip other crap
+
+    _mm_fseek(fp,wh.fLen-16,SEEK_CUR);
+    _mm_read_string(dID,4,fp);
+
+    if(memcmp(dID,"data",4))
+    {   _mm_errno = MMERR_UNKNOWN_WAVE_TYPE;
+        return NULL;
+    }
+
+    if(wh.nChannels > 1)
+    {   _mm_errno = MMERR_UNKNOWN_WAVE_TYPE;
+        return NULL;
+    }
+
+//  printf("wFormatTag: %x\n",wh.wFormatTag);
+//  printf("blockalign: %x\n",wh.nBlockAlign);
+//  prinff("nFormatSpc: %x\n",wh.nFormatSpecific);
+
+    if((si=(SAMPLE *)_mm_calloc(1,sizeof(SAMPLE)))==NULL) return NULL;
+
+    si->speed  = wh.nSamplesPerSec;
+    si->volume = 64;
+    si->length = _mm_read_I_ULONG(fp);
+
+    if(wh.nBlockAlign == 2)
+    {   si->flags    = SF_16BITS | SF_SIGNED;
+        si->length >>= 1;
+    }
+
+    SL_RegisterSample(si,MD_SNDFX,fp);
+
+    return si;
+}
+
+
+SAMPLE *WAV_LoadFN(CHAR *filename)
+{
+    FILE   *fp;
+    SAMPLE *si;
+
+    if(!(md_mode & DMODE_SOFT_SNDFX)) return NULL;
+    if((fp=_mm_fopen(filename,"rb"))==NULL) return NULL;
+
+    si = WAV_LoadFP(fp);
+    SL_LoadSamples();
+    fclose(fp);
+
+    return si;
+}
+
+
+void WAV_Free(SAMPLE *si)
+{
+    if(si!=NULL)
+    {   MD_SampleUnLoad(si->handle);
+        free(si);
+    }
+}
+