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