1 /*
2   SDL_mixer:  An audio mixer library based on the SDL library
3   Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
4 
5   This software is provided 'as-is', without any express or implied
6   warranty.  In no event will the authors be held liable for any damages
7   arising from the use of this software.
8 
9   Permission is granted to anyone to use this software for any purpose,
10   including commercial applications, and to alter it and redistribute it
11   freely, subject to the following restrictions:
12 
13   1. The origin of this software must not be misrepresented; you must not
14      claim that you wrote the original software. If you use this software
15      in a product, an acknowledgment in the product documentation would be
16      appreciated but is not required.
17   2. Altered source versions must be plainly marked as such, and must not be
18      misrepresented as being the original software.
19   3. This notice may not be removed or altered from any source distribution.
20 */
21 
22 #ifdef MOD_MUSIC
23 
24 #include "SDL_loadso.h"
25 
26 #include "dynamic_mod.h"
27 
28 mikmod_loader mikmod = {
29 	0, NULL
30 };
31 
32 #ifdef MOD_DYNAMIC
33 int Mix_InitMOD()
34 {
35 	if ( mikmod.loaded == 0 ) {
36 		mikmod.handle = SDL_LoadObject(MOD_DYNAMIC);
37 		if ( mikmod.handle == NULL ) {
38 			return -1;
39 		}
40 		mikmod.MikMod_Exit =
41 			(void (*)(void))
42 			SDL_LoadFunction(mikmod.handle, "MikMod_Exit");
43 		if ( mikmod.MikMod_Exit == NULL ) {
44 			SDL_UnloadObject(mikmod.handle);
45 			return -1;
46 		}
47 		mikmod.MikMod_InfoDriver =
48 			(CHAR* (*)(void))
49 			SDL_LoadFunction(mikmod.handle, "MikMod_InfoDriver");
50 		if ( mikmod.MikMod_InfoDriver == NULL ) {
51 			SDL_UnloadObject(mikmod.handle);
52 			return -1;
53 		}
54 		mikmod.MikMod_InfoLoader =
55 			(CHAR* (*)(void))
56 			SDL_LoadFunction(mikmod.handle, "MikMod_InfoLoader");
57 		if ( mikmod.MikMod_InfoLoader == NULL ) {
58 			SDL_UnloadObject(mikmod.handle);
59 			return -1;
60 		}
61 		mikmod.MikMod_Init =
62 			(BOOL (*)(CHAR*))
63 			SDL_LoadFunction(mikmod.handle, "MikMod_Init");
64 		if ( mikmod.MikMod_Init == NULL ) {
65 			SDL_UnloadObject(mikmod.handle);
66 			return -1;
67 		}
68 		mikmod.MikMod_RegisterAllLoaders =
69 			(void (*)(void))
70 			SDL_LoadFunction(mikmod.handle, "MikMod_RegisterAllLoaders");
71 		if ( mikmod.MikMod_RegisterAllLoaders == NULL ) {
72 			SDL_UnloadObject(mikmod.handle);
73 			return -1;
74 		}
75 		mikmod.MikMod_RegisterDriver =
76 			(void (*)(struct MDRIVER*))
77 			SDL_LoadFunction(mikmod.handle, "MikMod_RegisterDriver");
78 		if ( mikmod.MikMod_RegisterDriver == NULL ) {
79 			SDL_UnloadObject(mikmod.handle);
80 			return -1;
81 		}
82 		mikmod.MikMod_errno =
83 			(int*)
84 			SDL_LoadFunction(mikmod.handle, "MikMod_errno");
85 		if ( mikmod.MikMod_errno == NULL ) {
86 			SDL_UnloadObject(mikmod.handle);
87 			return -1;
88 		}
89 		mikmod.MikMod_strerror =
90 			(char* (*)(int))
91 			SDL_LoadFunction(mikmod.handle, "MikMod_strerror");
92 		if ( mikmod.MikMod_strerror == NULL ) {
93 			SDL_UnloadObject(mikmod.handle);
94 			return -1;
95 		}
96 		mikmod.Player_Active =
97 			(BOOL (*)(void))
98 			SDL_LoadFunction(mikmod.handle, "Player_Active");
99 		if ( mikmod.Player_Active == NULL ) {
100 			SDL_UnloadObject(mikmod.handle);
101 			return -1;
102 		}
103 		mikmod.Player_Free =
104 			(void (*)(MODULE*))
105 			SDL_LoadFunction(mikmod.handle, "Player_Free");
106 		if ( mikmod.Player_Free == NULL ) {
107 			SDL_UnloadObject(mikmod.handle);
108 			return -1;
109 		}
110 		mikmod.Player_LoadGeneric =
111 			(MODULE* (*)(MREADER*,int,BOOL))
112 			SDL_LoadFunction(mikmod.handle, "Player_LoadGeneric");
113 		if ( mikmod.Player_LoadGeneric == NULL ) {
114 			SDL_UnloadObject(mikmod.handle);
115 			return -1;
116 		}
117 		mikmod.Player_SetPosition =
118 			(void (*)(UWORD))
119 			SDL_LoadFunction(mikmod.handle, "Player_SetPosition");
120 		if ( mikmod.Player_SetPosition == NULL ) {
121 			SDL_UnloadObject(mikmod.handle);
122 			return -1;
123 		}
124 		mikmod.Player_SetVolume =
125 			(void (*)(SWORD))
126 			SDL_LoadFunction(mikmod.handle, "Player_SetVolume");
127 		if ( mikmod.Player_SetVolume == NULL ) {
128 			SDL_UnloadObject(mikmod.handle);
129 			return -1;
130 		}
131 		mikmod.Player_Start =
132 			(void (*)(MODULE*))
133 			SDL_LoadFunction(mikmod.handle, "Player_Start");
134 		if ( mikmod.Player_Start == NULL ) {
135 			SDL_UnloadObject(mikmod.handle);
136 			return -1;
137 		}
138 		mikmod.Player_Stop =
139 			(void (*)(void))
140 			SDL_LoadFunction(mikmod.handle, "Player_Stop");
141 		if ( mikmod.Player_Stop == NULL ) {
142 			SDL_UnloadObject(mikmod.handle);
143 			return -1;
144 		}
145 		mikmod.VC_WriteBytes =
146 			(ULONG (*)(SBYTE*,ULONG))
147 			SDL_LoadFunction(mikmod.handle, "VC_WriteBytes");
148 		if ( mikmod.VC_WriteBytes == NULL ) {
149 			SDL_UnloadObject(mikmod.handle);
150 			return -1;
151 		}
152 		mikmod.drv_nos =
153 			(MDRIVER*)
154 			SDL_LoadFunction(mikmod.handle, "drv_nos");
155 		if ( mikmod.drv_nos == NULL ) {
156 			SDL_UnloadObject(mikmod.handle);
157 			return -1;
158 		}
159 		mikmod.md_device =
160 			(UWORD*)
161 			SDL_LoadFunction(mikmod.handle, "md_device");
162 		if ( mikmod.md_device == NULL ) {
163 			SDL_UnloadObject(mikmod.handle);
164 			return -1;
165 		}
166 		mikmod.md_mixfreq =
167 			(UWORD*)
168 			SDL_LoadFunction(mikmod.handle, "md_mixfreq");
169 		if ( mikmod.md_mixfreq == NULL ) {
170 			SDL_UnloadObject(mikmod.handle);
171 			return -1;
172 		}
173 		mikmod.md_mode =
174 			(UWORD*)
175 			SDL_LoadFunction(mikmod.handle, "md_mode");
176 		if ( mikmod.md_mode == NULL ) {
177 			SDL_UnloadObject(mikmod.handle);
178 			return -1;
179 		}
180 		mikmod.md_musicvolume =
181 			(UBYTE*)
182 			SDL_LoadFunction(mikmod.handle, "md_musicvolume");
183 		if ( mikmod.md_musicvolume == NULL ) {
184 			SDL_UnloadObject(mikmod.handle);
185 			return -1;
186 		}
187 		mikmod.md_pansep =
188 			(UBYTE*)
189 			SDL_LoadFunction(mikmod.handle, "md_pansep");
190 		if ( mikmod.md_pansep == NULL ) {
191 			SDL_UnloadObject(mikmod.handle);
192 			return -1;
193 		}
194 		mikmod.md_reverb =
195 			(UBYTE*)
196 			SDL_LoadFunction(mikmod.handle, "md_reverb");
197 		if ( mikmod.md_reverb == NULL ) {
198 			SDL_UnloadObject(mikmod.handle);
199 			return -1;
200 		}
201 		mikmod.md_sndfxvolume =
202 			(UBYTE*)
203 			SDL_LoadFunction(mikmod.handle, "md_sndfxvolume");
204 		if ( mikmod.md_sndfxvolume == NULL ) {
205 			SDL_UnloadObject(mikmod.handle);
206 			return -1;
207 		}
208 		mikmod.md_volume =
209 			(UBYTE*)
210 			SDL_LoadFunction(mikmod.handle, "md_volume");
211 		if ( mikmod.md_volume == NULL ) {
212 			SDL_UnloadObject(mikmod.handle);
213 			return -1;
214 		}
215 	}
216 	++mikmod.loaded;
217 
218 	return 0;
219 }
220 void Mix_QuitMOD()
221 {
222 	if ( mikmod.loaded == 0 ) {
223 		return;
224 	}
225 	if ( mikmod.loaded == 1 ) {
226 		SDL_UnloadObject(mikmod.handle);
227 	}
228 	--mikmod.loaded;
229 }
230 #else
231 int Mix_InitMOD()
232 {
233 	if ( mikmod.loaded == 0 ) {
234 		mikmod.MikMod_Exit = MikMod_Exit;
235 		mikmod.MikMod_InfoDriver = MikMod_InfoDriver;
236 		mikmod.MikMod_InfoLoader = MikMod_InfoLoader;
237 		mikmod.MikMod_Init = MikMod_Init;
238 		mikmod.MikMod_RegisterAllLoaders = MikMod_RegisterAllLoaders;
239 		mikmod.MikMod_RegisterDriver = MikMod_RegisterDriver;
240 		mikmod.MikMod_errno = &MikMod_errno;
241 		mikmod.MikMod_strerror = MikMod_strerror;
242 		mikmod.Player_Active = Player_Active;
243 		mikmod.Player_Free = Player_Free;
244 		mikmod.Player_LoadGeneric = Player_LoadGeneric;
245 		mikmod.Player_SetPosition = Player_SetPosition;
246 		mikmod.Player_SetVolume = Player_SetVolume;
247 		mikmod.Player_Start = Player_Start;
248 		mikmod.Player_Stop = Player_Stop;
249 		mikmod.VC_WriteBytes = VC_WriteBytes;
250 		mikmod.drv_nos = &drv_nos;
251 		mikmod.md_device = &md_device;
252 		mikmod.md_mixfreq = &md_mixfreq;
253 		mikmod.md_mode = &md_mode;
254 		mikmod.md_musicvolume = &md_musicvolume;
255 		mikmod.md_pansep = &md_pansep;
256 		mikmod.md_reverb = &md_reverb;
257 		mikmod.md_sndfxvolume = &md_sndfxvolume;
258 		mikmod.md_volume = &md_volume;
259 	}
260 	++mikmod.loaded;
261 
262 	return 0;
263 }
264 void Mix_QuitMOD()
265 {
266 	if ( mikmod.loaded == 0 ) {
267 		return;
268 	}
269 	if ( mikmod.loaded == 1 ) {
270 	}
271 	--mikmod.loaded;
272 }
273 #endif /* MOD_DYNAMIC */
274 
275 #endif /* MOD_MUSIC */
276