fixed music playback in dos
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Tue, 20 Sep 2016 02:27:04 +0000 (05:27 +0300)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Tue, 20 Sep 2016 02:27:04 +0000 (05:27 +0300)
.gitignore
Makefile
libs/oldmik/Makefile
libs/oldmik/src/drv_sb.c
libs/oldmik/src/mloader.c
libs/oldmik/src/mtypes.h
libs/oldmik/src/mwav.c [new file with mode: 0644]
src/dos/music.c

index ced3325..f656a4a 100644 (file)
@@ -25,3 +25,5 @@ data
 *.dll
 *.occ
 *.OCC
+*.map
+*.MAP
index 6e73142..3d56856 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -25,7 +25,7 @@ CXX = wpp386
 ASFLAGS = -fobj
 CFLAGS = $(dbg) $(opt) $(def) -zq -bt=dos $(incpath)
 CXXFLAGS = $(CFLAGS)
-LDFLAGS = $(libpath) library { $(libs) }
+LDFLAGS = option stack=16k option map $(libpath) library { $(libs) }
 LD = wlink
 
 $(bin): cflags.occ $(obj) libs/imago/imago.lib
index 433b6e2..c0b72de 100644 (file)
@@ -7,13 +7,12 @@ $(oloader) $(odriver)
 
 alib = mikmod.lib
 
-opt = -5 -fp5 -otexan
-dbg = -d1
-def =
+opt = -5 -oxl+
+#dbg = -d1
 
 CC = wcc386
 AS = wasm
-CFLAGS = $(dbg) $(opt) $(def) -zq -zu -bt=dos -Isrc
+CFLAGS = $(dbg) $(opt) -zq -zu -j -s -bt=dos -Isrc
 ASFLAGS = -zq -5pr
 
 $(alib): cflags.occ $(obj)
index 6d85d47..ae71fc6 100644 (file)
@@ -205,7 +205,7 @@ static UWORD SB_GetDSPVersion(void)
 ***************************************************************************/\r
 \r
 static DMAMEM *SB_DMAMEM;\r
-static signed char *SB_DMABUF;\r
+static char *SB_DMABUF;\r
 \r
 static UBYTE SB_TIMECONSTANT;\r
 \r
index 6e135fc..e4643b2 100644 (file)
@@ -179,7 +179,7 @@ char *DupStr(char *s,UWORD len)
        /* Scan for first printing char in buffer [includes high ascii up to 254] */\r
 \r
        while(len){\r
-               if(!(s[len-1]>=0 && s[len-1]<=0x20)) break;\r
+                if(!(s[len-1]>=0 && s[len-1]<=0x20)) break;\r
                len--;\r
        }\r
 \r
@@ -190,9 +190,7 @@ char *DupStr(char *s,UWORD len)
                   for any control-chars */\r
 \r
                if((d=(char *)malloc(len+1))!=NULL){\r
-                       for(t=0;t<len;t++) {\r
-                               d[t]=(s[t]>=0 && s[t]<32) ? ' ': s[t];\r
-                       }\r
+                        for(t=0;t<len;t++) d[t]=(s[t]>=0 && s[t]<32) ? ' ': s[t];\r
                        d[t]=0;\r
                }\r
        }\r
index 65cda6d..a57d087 100644 (file)
@@ -29,7 +29,7 @@ typedef int             BOOL;           /* doesn't matter.. 0=FALSE, <>0 true */
 \r
 #else\r
 \r
-typedef signed char     SBYTE;          /* has to be 1 byte signed */\r
+typedef char            SBYTE;          /* has to be 1 byte signed */\r
 typedef unsigned char   UBYTE;          /* has to be 1 byte unsigned */\r
 typedef short           SWORD;          /* has to be 2 bytes signed */\r
 typedef unsigned short  UWORD;          /* has to be 2 bytes unsigned */\r
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
index fa0a598..5aa4fac 100644 (file)
@@ -1,6 +1,7 @@
 #include <stdlib.h>
 #include "music.h"
 #include "mikmod.h"
+#include "logger.h"
 
 static void update_callback(void);
 
@@ -9,8 +10,18 @@ static int initialized;
 
 static int init(void)
 {
+       md_mixfreq = 44100;
+       md_dmabufsize = 20000;
+       md_mode = DMODE_STEREO | DMODE_16BITS;/* | DMODE_INTERP;*/
+       md_device = 0;
+
+       ML_RegisterLoader(&load_m15);
        ML_RegisterLoader(&load_mod);
+       ML_RegisterLoader(&load_mtm);
        ML_RegisterLoader(&load_s3m);
+       ML_RegisterLoader(&load_stm);
+       ML_RegisterLoader(&load_ult);
+       ML_RegisterLoader(&load_uni);
        ML_RegisterLoader(&load_xm);
 
        MD_RegisterDriver(&drv_nos);
@@ -18,15 +29,14 @@ static int init(void)
        MD_RegisterDriver(&drv_sb);
        MD_RegisterDriver(&drv_gus);
 
-       MD_RegisterPlayer(&update_callback);
+       MD_RegisterPlayer(update_callback);
 
-       /*md_mode |= DMODE_INTERP;*/
        if(!MD_Init()) {
-               fprintf(stderr, "mikmod init failed: %s\n", myerr);
+               printlog("mikmod init failed: %s\n", myerr);
                return -1;
        }
-       printf("using mikmod driver %s\n", md_driver->Name);
-       printf(" %d bits, %s, %s mixing at %d Hz\n", md_mode & DMODE_16BITS ? 16 : 8,
+       printlog("using mikmod driver %s\n", md_driver->Name);
+       printlog(" %d bits, %s, %s mixing at %d Hz\n", md_mode & DMODE_16BITS ? 16 : 8,
                        md_mode & DMODE_STEREO ? "stereo" : "mono",
                        md_mode & DMODE_INTERP ? "interpolated" : "normal",
                        md_mixfreq);
@@ -45,16 +55,20 @@ int music_open(const char *fname)
        }
 
        if(!(mod = ML_LoadFN((const signed char*)fname))) {
-               fprintf(stderr, "failed to load music: %s: %s\n", fname, myerr);
+               printlog("failed to load music: %s: %s\n", fname, myerr);
                return -1;
        }
+
+       MP_Init(mod);
        md_numchn = mod->numchn;
+       printlog("opened module %s (%d channels)\n", fname, md_numchn);
        return 0;
 }
 
 void music_close(void)
 {
        if(mod) {
+               printlog("shutting down music playback\n");
                music_stop();
                ML_Free(mod);
                mod = 0;