diff playercode/load_wav.c @ 4:5d614bcc4287

Initial entry of mikmod into the CVS tree.
author darius
date Fri, 23 Jan 1998 16:05:08 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/playercode/load_wav.c	Fri Jan 23 16:05:08 1998 +0000
@@ -0,0 +1,97 @@
+/*
+
+ Name:  LOAD_WAV.C
+
+ Description:
+ WAV Streaming Audio Loader / Player
+
+ Portability:
+ All compilers -- All systems (hopefully)
+
+*/
+
+#include "mikmod.h"
+#include <string.h>
+
+
+typedef struct
+{   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;
+
+
+BOOL WAV_Load(void)
+{
+    SAMPLE     *si;
+    static WAV  wh;
+    static CHAR dID[4];
+
+    // read wav header
+
+    _mm_read_string(wh.rID,4,stream_fp);
+    wh.rLen            = _mm_read_I_ULONG(stream_fp);
+    _mm_read_string(wh.wID,4,stream_fp);
+    _mm_read_string(wh.fID,4,stream_fp);
+    wh.fLen            = _mm_read_I_ULONG(stream_fp);
+    wh.wFormatTag      = _mm_read_I_UWORD(stream_fp);
+    wh.nChannels       = _mm_read_I_UWORD(stream_fp);
+    wh.nSamplesPerSec  = _mm_read_I_ULONG(stream_fp);
+    wh.nAvgBytesPerSec = _mm_read_I_ULONG(stream_fp);
+    wh.nBlockAlign     = _mm_read_I_UWORD(stream_fp);
+    wh.nFormatSpecific = _mm_read_I_UWORD(stream_fp);
+
+    // check it
+
+    if( feof(stream_fp) ||
+        memcmp(wh.rID,"RIFF",4) ||
+        memcmp(wh.wID,"WAVE",4) ||
+        memcmp(wh.fID,"fmt ",4) )
+    {
+        _mm_errno = MMERR_UNKNOWN_WAVE_TYPE;
+        return NULL;
+    }
+
+    // skip other crap
+
+    _mm_fseek(stream_fp,wh.fLen-16,SEEK_CUR);
+    _mm_read_string(dID,4,stream_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/wh.nChannels;
+    si->volume = 64;
+
+    si->length = _mm_read_I_ULONG(stream_fp);
+
+    if(wh.nBlockAlign==2)
+    {   si->flags = SF_16BITS | SF_SIGNED;
+        si->length>>=1;
+    }
+
+    return 0;
+}
+
+