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