fixed music playback in dos
[dosdemo] / src / dos / music.c
1 #include <stdlib.h>
2 #include "music.h"
3 #include "mikmod.h"
4 #include "logger.h"
5
6 static void update_callback(void);
7
8 static UNIMOD *mod;
9 static int initialized;
10
11 static int init(void)
12 {
13         md_mixfreq = 44100;
14         md_dmabufsize = 20000;
15         md_mode = DMODE_STEREO | DMODE_16BITS;/* | DMODE_INTERP;*/
16         md_device = 0;
17
18         ML_RegisterLoader(&load_m15);
19         ML_RegisterLoader(&load_mod);
20         ML_RegisterLoader(&load_mtm);
21         ML_RegisterLoader(&load_s3m);
22         ML_RegisterLoader(&load_stm);
23         ML_RegisterLoader(&load_ult);
24         ML_RegisterLoader(&load_uni);
25         ML_RegisterLoader(&load_xm);
26
27         MD_RegisterDriver(&drv_nos);
28         MD_RegisterDriver(&drv_ss);
29         MD_RegisterDriver(&drv_sb);
30         MD_RegisterDriver(&drv_gus);
31
32         MD_RegisterPlayer(update_callback);
33
34         if(!MD_Init()) {
35                 printlog("mikmod init failed: %s\n", myerr);
36                 return -1;
37         }
38         printlog("using mikmod driver %s\n", md_driver->Name);
39         printlog(" %d bits, %s, %s mixing at %d Hz\n", md_mode & DMODE_16BITS ? 16 : 8,
40                         md_mode & DMODE_STEREO ? "stereo" : "mono",
41                         md_mode & DMODE_INTERP ? "interpolated" : "normal",
42                         md_mixfreq);
43
44         atexit(MD_Exit);
45         return 0;
46 }
47
48 int music_open(const char *fname)
49 {
50         if(!initialized) {
51                 if(init() == -1) {
52                         return -1;
53                 }
54                 initialized = 1;
55         }
56
57         if(!(mod = ML_LoadFN((const signed char*)fname))) {
58                 printlog("failed to load music: %s: %s\n", fname, myerr);
59                 return -1;
60         }
61
62         MP_Init(mod);
63         md_numchn = mod->numchn;
64         printlog("opened module %s (%d channels)\n", fname, md_numchn);
65         return 0;
66 }
67
68 void music_close(void)
69 {
70         if(mod) {
71                 printlog("shutting down music playback\n");
72                 music_stop();
73                 ML_Free(mod);
74                 mod = 0;
75         }
76 }
77
78 void music_play(void)
79 {
80         MD_PlayStart();
81 }
82
83 void music_stop(void)
84 {
85         MD_PlayStop();
86 }
87
88 void music_update(void)
89 {
90         MD_Update();
91 }
92
93 static void update_callback(void)
94 {
95         MP_HandleTick();
96         MD_SetBPM(mp_bpm);
97 }