major bsp bugs fixed
[dosdemo] / src / music.c
1 #include <stdlib.h>
2 #include "music.h"
3 #include "mikmod.h"
4
5 #ifdef __WATCOMC__
6 #define USE_OLDMIK
7 typedef UNIMOD MODULE;
8
9 static void update_callback(void);
10 static void MikMod_RegisterAllDrivers(void);
11 static void MikMod_RegisterAllLoaders(void);
12 #else
13 #define USE_NEWMIK
14 #endif
15
16 static MODULE *mod;
17 static int initialized;
18
19 static int init(void)
20 {
21         MikMod_RegisterAllDrivers();
22         MikMod_RegisterAllLoaders();
23
24 #ifdef USE_NEWMIK
25         md_mode |= DMODE_SOFT_MUSIC | DMODE_16BITS | DMODE_STEREO | DMODE_INTERP;
26         if(MikMod_Init("") != 0) {
27                 fprintf(stderr, "mikmod init failed: %s\n",
28                                 MikMod_strerror(MikMod_errno));
29                 return -1;
30         }
31
32 #else
33         md_mixfreq = 44100;
34         md_dmabufsize = 20000;
35         md_mode = DMODE_STEREO | DMODE_16BITS | DMODE_INTERP;
36         md_device = 0;
37
38         MD_RegisterPlayer(update_callback);
39
40         if(!MD_Init()) {
41                 fprintf(stderr, "mikmod init failed: %s\n", myerr);
42                 return -1;
43         }
44         printf("using mikmod driver %s\n", md_driver->Name);
45         printf(" %d bits, %s, %s mixing at %d Hz\n", md_mode & DMODE_16BITS ? 16 : 8,
46                         md_mode & DMODE_STEREO ? "stereo" : "mono",
47                         md_mode & DMODE_INTERP ? "interpolated" : "normal",
48                         md_mixfreq);
49
50         atexit(MD_Exit);
51 #endif
52         return 0;
53 }
54
55 int music_open(const char *fname)
56 {
57         if(!initialized) {
58                 if(init() == -1) {
59                         return -1;
60                 }
61                 initialized = 1;
62         }
63
64 #ifdef USE_NEWMIK
65         if(!(mod = Player_Load(fname, 64, 0))) {
66                 fprintf(stderr, "failed to load music: %s: %s\n", fname,
67                                 MikMod_strerror(MikMod_errno));
68                 return -1;
69         }
70 #else
71         if(!(mod = ML_LoadFN((char*)fname))) {
72                 fprintf(stderr, "failed to load music: %s: %s\n", fname, myerr);
73                 return -1;
74         }
75
76         MP_Init(mod);
77         md_numchn = mod->numchn;
78         printf("opened module %s (%d channels)\n", fname, md_numchn);
79 #endif
80         return 0;
81 }
82
83 void music_close(void)
84 {
85         if(mod) {
86                 printf("shutting down music playback\n");
87                 music_stop();
88 #ifdef USE_NEWMIK
89                 Player_Free(mod);
90 #else
91                 ML_Free(mod);
92 #endif
93                 mod = 0;
94         }
95 }
96
97 void music_play(void)
98 {
99 #ifdef USE_NEWMIK
100         Player_Start(mod);
101 #else
102         MD_PlayStart();
103 #endif
104 }
105
106 void music_stop(void)
107 {
108 #ifdef USE_NEWMIK
109         Player_Stop();
110 #else
111         MD_PlayStop();
112 #endif
113 }
114
115 void music_update(void)
116 {
117 #ifdef USE_NEWMIK
118         if(Player_Active()) {
119                 MikMod_Update();
120         }
121 #else
122         MD_Update();
123 #endif
124 }
125
126 #ifdef USE_OLDMIK
127 static void update_callback(void)
128 {
129         MP_HandleTick();
130         MD_SetBPM(mp_bpm);
131 }
132
133 static void MikMod_RegisterAllDrivers(void)
134 {
135         MD_RegisterDriver(&drv_nos);
136         MD_RegisterDriver(&drv_ss);
137         MD_RegisterDriver(&drv_sb);
138         MD_RegisterDriver(&drv_gus);
139 }
140
141 static void MikMod_RegisterAllLoaders(void)
142 {
143         ML_RegisterLoader(&load_m15);
144         ML_RegisterLoader(&load_mod);
145         ML_RegisterLoader(&load_mtm);
146         ML_RegisterLoader(&load_s3m);
147         ML_RegisterLoader(&load_stm);
148         ML_RegisterLoader(&load_ult);
149         ML_RegisterLoader(&load_uni);
150         ML_RegisterLoader(&load_xm);
151 }
152 #endif