1 /* splayMEM.c
2 * An example on how to use libmikmod to play a module,
3 * but to load it with a custom MREADER.
4 *
5 * (C) 2004, Raphael Assenat (raph@raphnet.net)
6 *
7 * This example is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRENTY; without event the implied warrenty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 */
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <mikmod.h>
15
16 #if defined(_WIN32)
17 #define MikMod_Sleep(ns) Sleep(ns / 1000)
18 #elif defined(_MIKMOD_AMIGA)
19 void amiga_sysinit (void);
20 void amiga_usleep (unsigned long timeout);
21 #define MikMod_Sleep(ns) amiga_usleep(ns)
22 #else
23 #include <unistd.h> /* for usleep() */
24 #define MikMod_Sleep(ns) usleep(ns)
25 #endif
26
27 #include "myloader.h"
28
main(int argc,char ** argv)29 int main(int argc, char **argv)
30 {
31 MODULE *module;
32 unsigned char *data_buf;
33 long data_len;
34 FILE *fptr;
35 MREADER *mem_reader;
36
37 if (argc < 2) {
38 fprintf(stderr, "Usage: ./splayMEM file\n");
39 return 1;
40 }
41
42 #ifdef _MIKMOD_AMIGA
43 amiga_sysinit ();
44 #endif
45
46 /* initialize MikMod threads */
47 MikMod_InitThreads ();
48
49 /* register all the drivers */
50 MikMod_RegisterAllDrivers();
51
52 /* register all the module loaders */
53 MikMod_RegisterAllLoaders();
54
55 /* init the library */
56 md_mode |= DMODE_SOFT_MUSIC | DMODE_NOISEREDUCTION;
57 md_mode |= DMODE_HQMIXER;
58
59 if (MikMod_Init("")) {
60 fprintf(stderr, "Could not initialize sound, reason: %s\n",
61 MikMod_strerror(MikMod_errno));
62 return 2;
63 }
64
65 /* open the file */
66 fptr = fopen(argv[1], "rb");
67 if (fptr == NULL) {
68 perror("fopen");
69 MikMod_Exit();
70 return 1;
71 }
72
73 /* calculate the file size */
74 fseek(fptr, 0, SEEK_END);
75 data_len = ftell(fptr);
76 fseek(fptr, 0, SEEK_SET);
77
78 /* allocate a buffer and load the file into it */
79 data_buf = malloc(data_len);
80 if (data_buf == NULL) {
81 perror("malloc");
82 fclose(fptr);
83 MikMod_Exit();
84 return 1;
85 }
86 if (fread(data_buf, data_len, 1, fptr) != 1)
87 {
88 perror("fread");
89 fclose(fptr);
90 free(data_buf);
91 MikMod_Exit();
92 return 1;
93 }
94 fclose(fptr);
95
96 /* Create the memory reader */
97 mem_reader = my_new_mem_reader(data_buf, data_len);
98 if (mem_reader == NULL) {
99 fprintf(stderr, "failed to create mem reader\n");
100 free(data_buf);
101 MikMod_Exit();
102 return 1;
103 }
104
105 /* load module */
106 module = Player_LoadGeneric(mem_reader, 64, 0);
107 if (module) {
108 /* start module */
109 printf("Playing %s\n", module->songname);
110 Player_Start(module);
111
112 while (Player_Active()) {
113 MikMod_Sleep(10000);
114 MikMod_Update();
115 }
116
117 Player_Stop();
118 Player_Free(module);
119 } else
120 fprintf(stderr, "Could not load module, reason: %s\n",
121 MikMod_strerror(MikMod_errno));
122
123 my_delete_mem_reader(mem_reader);
124 mem_reader = NULL;
125 free(data_buf);
126 MikMod_Exit();
127
128 return 0;
129 }
130
131