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