From 17fa4a9ede6e783b149702da0d9cce3048b312e5 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Tue, 20 Sep 2016 05:27:04 +0300 Subject: [PATCH] fixed music playback in dos --- .gitignore | 2 + Makefile | 2 +- libs/oldmik/Makefile | 7 +-- libs/oldmik/src/drv_sb.c | 2 +- libs/oldmik/src/mloader.c | 6 +- libs/oldmik/src/mtypes.h | 2 +- libs/oldmik/src/mwav.c | 143 +++++++++++++++++++++++++++++++++++++++++++++ src/dos/music.c | 26 +++++++-- 8 files changed, 173 insertions(+), 17 deletions(-) create mode 100644 libs/oldmik/src/mwav.c diff --git a/.gitignore b/.gitignore index ced3325..f656a4a 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ data *.dll *.occ *.OCC +*.map +*.MAP diff --git a/Makefile b/Makefile index 6e73142..3d56856 100644 --- 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 diff --git a/libs/oldmik/Makefile b/libs/oldmik/Makefile index 433b6e2..c0b72de 100644 --- a/libs/oldmik/Makefile +++ b/libs/oldmik/Makefile @@ -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) diff --git a/libs/oldmik/src/drv_sb.c b/libs/oldmik/src/drv_sb.c index 6d85d47..ae71fc6 100644 --- a/libs/oldmik/src/drv_sb.c +++ b/libs/oldmik/src/drv_sb.c @@ -205,7 +205,7 @@ static UWORD SB_GetDSPVersion(void) ***************************************************************************/ static DMAMEM *SB_DMAMEM; -static signed char *SB_DMABUF; +static char *SB_DMABUF; static UBYTE SB_TIMECONSTANT; diff --git a/libs/oldmik/src/mloader.c b/libs/oldmik/src/mloader.c index 6e135fc..e4643b2 100644 --- a/libs/oldmik/src/mloader.c +++ b/libs/oldmik/src/mloader.c @@ -179,7 +179,7 @@ char *DupStr(char *s,UWORD len) /* Scan for first printing char in buffer [includes high ascii up to 254] */ while(len){ - if(!(s[len-1]>=0 && s[len-1]<=0x20)) break; + if(!(s[len-1]>=0 && s[len-1]<=0x20)) break; len--; } @@ -190,9 +190,7 @@ char *DupStr(char *s,UWORD len) for any control-chars */ if((d=(char *)malloc(len+1))!=NULL){ - for(t=0;t=0 && s[t]<32) ? ' ': s[t]; - } + for(t=0;t=0 && s[t]<32) ? ' ': s[t]; d[t]=0; } } diff --git a/libs/oldmik/src/mtypes.h b/libs/oldmik/src/mtypes.h index 65cda6d..a57d087 100644 --- a/libs/oldmik/src/mtypes.h +++ b/libs/oldmik/src/mtypes.h @@ -29,7 +29,7 @@ typedef int BOOL; /* doesn't matter.. 0=FALSE, <>0 true */ #else -typedef signed char SBYTE; /* has to be 1 byte signed */ +typedef char SBYTE; /* has to be 1 byte signed */ typedef unsigned char UBYTE; /* has to be 1 byte unsigned */ typedef short SWORD; /* has to be 2 bytes signed */ typedef unsigned short UWORD; /* has to be 2 bytes unsigned */ diff --git a/libs/oldmik/src/mwav.c b/libs/oldmik/src/mwav.c new file mode 100644 index 0000000..f1a1e9a --- /dev/null +++ b/libs/oldmik/src/mwav.c @@ -0,0 +1,143 @@ +/* + +Name: +MWAV.C + +Description: +WAV sample loader + +Portability: + +MSDOS: BC(y) Watcom(y) DJGPP(?) +Win95: BC(n) +Linux: n + +(y) - yes +(n) - no (not possible or not useful) +(?) - may be possible, but not tested + +*/ +#include +#include +#include + +#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 *MW_LoadWavFP(FILE *fp) +{ + SAMPLE *si; + static WAV wh; + static char dID[4]; + + _mm_rewind(fp); + + /* read wav header */ + + _mm_read_str(wh.rID,4,fp); + wh.rLen=_mm_read_I_ULONG(fp); + _mm_read_str(wh.wID,4,fp); + _mm_read_str(wh.fID,4,fp); + wh.fLen=_mm_read_I_ULONG(fp); + 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) || + memcmp(wh.rID,"RIFF",4) || + memcmp(wh.wID,"WAVE",4) || + memcmp(wh.fID,"fmt ",4) ){ + myerr="Not a WAV file"; + return NULL; + } + + /* skip other crap */ + + _mm_fseek(fp,wh.fLen-16,SEEK_CUR); + _mm_read_str(dID,4,fp); + + if( memcmp(dID,"data",4) ){ + myerr="Not a WAV file"; + return NULL; + } + + if(wh.nChannels>1){ + myerr="Only mono WAV's are supported"; + return NULL; + } + +/* printf("wFormatTag: %x\n",wh.wFormatTag); */ +/* printf("blockalign: %x\n",wh.nBlockAlign); */ +/* prinff("nFormatSpc: %x\n",wh.nFormatSpecific); */ + + if((si=(SAMPLE *)calloc(1,sizeof(SAMPLE)))==NULL){ + myerr="Out of memory"; + return NULL; + }; + + si->c2spd=8192; + si->volume=64; + + si->length=_mm_read_I_ULONG(fp); + + if(wh.nBlockAlign==2){ + si->flags=SF_16BITS|SF_SIGNED; + si->length>>=1; + } + + si->handle=MD_SampleLoad(fp,si->length,0,si->length,si->flags); + + if(si->handle<0){ + free(si); + return NULL; + } + + return si; +} + + +SAMPLE *MW_LoadWavFN(char *filename) +{ + FILE *fp; + SAMPLE *si; + + if((fp=fopen(filename,"rb"))==NULL){ + myerr="Couldn't open wav file"; + return NULL; + } + + si=MW_LoadWavFP(fp); + + fclose(fp); + return si; +} + + +void MW_FreeWav(SAMPLE *si) +{ + if(si!=NULL){ + MD_SampleUnLoad(si->handle); + free(si); + } +} diff --git a/src/dos/music.c b/src/dos/music.c index fa0a598..5aa4fac 100644 --- a/src/dos/music.c +++ b/src/dos/music.c @@ -1,6 +1,7 @@ #include #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; -- 1.7.10.4