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