backported fixes from rtxon
[dosdemo] / src / music.c
index 365ad01..11b9c44 100644 (file)
@@ -1,21 +1,56 @@
+#include <stdlib.h>
 #include "music.h"
+
+#ifndef NO_MUSIC
 #include "mikmod.h"
 
+#ifdef __WATCOMC__
+#define USE_OLDMIK
+typedef UNIMOD MODULE;
+
+static void update_callback(void);
+static void MikMod_RegisterAllDrivers(void);
+static void MikMod_RegisterAllLoaders(void);
+#else
+#define USE_NEWMIK
+#endif
+
 static MODULE *mod;
 static int initialized;
 
-
 static int init(void)
 {
        MikMod_RegisterAllDrivers();
        MikMod_RegisterAllLoaders();
 
-       md_mode |= DMODE_SOFT_MUSIC;
+#ifdef USE_NEWMIK
+       md_mode |= DMODE_SOFT_MUSIC | DMODE_16BITS | DMODE_STEREO | DMODE_INTERP;
        if(MikMod_Init("") != 0) {
                fprintf(stderr, "mikmod init failed: %s\n",
                                MikMod_strerror(MikMod_errno));
                return -1;
        }
+
+#else
+       md_mixfreq = 44100;
+       md_dmabufsize = 20000;
+       md_mode = DMODE_STEREO | DMODE_16BITS | DMODE_INTERP;
+       md_device = 0;
+
+       MD_RegisterPlayer(update_callback);
+
+       if(!MD_Init()) {
+               fprintf(stderr, "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,
+                       md_mode & DMODE_STEREO ? "stereo" : "mono",
+                       md_mode & DMODE_INTERP ? "interpolated" : "normal",
+                       md_mixfreq);
+
+       atexit(MD_Exit);
+#endif
        return 0;
 }
 
@@ -28,35 +63,117 @@ int music_open(const char *fname)
                initialized = 1;
        }
 
+#ifdef USE_NEWMIK
        if(!(mod = Player_Load(fname, 64, 0))) {
                fprintf(stderr, "failed to load music: %s: %s\n", fname,
                                MikMod_strerror(MikMod_errno));
                return -1;
        }
+#else
+       if(!(mod = ML_LoadFN((char*)fname))) {
+               fprintf(stderr, "failed to load music: %s: %s\n", fname, myerr);
+               return -1;
+       }
+
+       MP_Init(mod);
+       md_numchn = mod->numchn;
+       printf("opened module %s (%d channels)\n", fname, md_numchn);
+#endif
        return 0;
 }
 
 void music_close(void)
 {
        if(mod) {
+               printf("shutting down music playback\n");
                music_stop();
+#ifdef USE_NEWMIK
                Player_Free(mod);
+#else
+               ML_Free(mod);
+#endif
+               mod = 0;
        }
 }
 
 void music_play(void)
 {
+#ifdef USE_NEWMIK
        Player_Start(mod);
+#else
+       MD_PlayStart();
+#endif
 }
 
 void music_stop(void)
 {
+#ifdef USE_NEWMIK
        Player_Stop();
+#else
+       MD_PlayStop();
+#endif
 }
 
 void music_update(void)
 {
+#ifdef USE_NEWMIK
        if(Player_Active()) {
                MikMod_Update();
        }
+#else
+       MD_Update();
+#endif
+}
+
+#ifdef USE_OLDMIK
+static void update_callback(void)
+{
+       MP_HandleTick();
+       MD_SetBPM(mp_bpm);
 }
+
+static void MikMod_RegisterAllDrivers(void)
+{
+       MD_RegisterDriver(&drv_nos);
+       MD_RegisterDriver(&drv_ss);
+       MD_RegisterDriver(&drv_sb);
+       MD_RegisterDriver(&drv_gus);
+}
+
+static void MikMod_RegisterAllLoaders(void)
+{
+       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);
+}
+#endif
+
+#else  /* NO_MUSIC */
+
+int music_open(const char *fname)
+{
+       return 0;
+}
+
+void music_close(void)
+{
+}
+
+void music_play(void)
+{
+}
+
+void music_stop(void)
+{
+}
+
+void music_update(void)
+{
+}
+
+#endif