slouken@419: /* slouken@518: SDL_mixer: An audio mixer library based on the SDL library slouken@518: Copyright (C) 1997-2012 Sam Lantinga slouken@419: slouken@518: This software is provided 'as-is', without any express or implied slouken@518: warranty. In no event will the authors be held liable for any damages slouken@518: arising from the use of this software. slouken@419: slouken@518: Permission is granted to anyone to use this software for any purpose, slouken@518: including commercial applications, and to alter it and redistribute it slouken@518: freely, subject to the following restrictions: slouken@419: slouken@518: 1. The origin of this software must not be misrepresented; you must not slouken@518: claim that you wrote the original software. If you use this software slouken@518: in a product, an acknowledgment in the product documentation would be slouken@518: appreciated but is not required. slouken@518: 2. Altered source versions must be plainly marked as such, and must not be slouken@518: misrepresented as being the original software. slouken@518: 3. This notice may not be removed or altered from any source distribution. slouken@419: */ slouken@419: slouken@419: #ifdef MOD_MUSIC slouken@419: slouken@419: #include "SDL_loadso.h" slouken@419: slouken@419: #include "dynamic_mod.h" slouken@419: slouken@419: mikmod_loader mikmod = { slouken@419: 0, NULL slouken@419: }; slouken@419: slouken@419: #ifdef MOD_DYNAMIC slouken@419: int Mix_InitMOD() slouken@419: { slouken@419: if ( mikmod.loaded == 0 ) { slouken@419: mikmod.handle = SDL_LoadObject(MOD_DYNAMIC); slouken@419: if ( mikmod.handle == NULL ) { slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_Exit = slouken@419: (void (*)(void)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_Exit"); slouken@419: if ( mikmod.MikMod_Exit == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_InfoDriver = slouken@419: (CHAR* (*)(void)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_InfoDriver"); slouken@419: if ( mikmod.MikMod_InfoDriver == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_InfoLoader = slouken@419: (CHAR* (*)(void)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_InfoLoader"); slouken@419: if ( mikmod.MikMod_InfoLoader == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_Init = slouken@419: (BOOL (*)(CHAR*)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_Init"); slouken@419: if ( mikmod.MikMod_Init == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_RegisterAllLoaders = slouken@419: (void (*)(void)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_RegisterAllLoaders"); slouken@419: if ( mikmod.MikMod_RegisterAllLoaders == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_RegisterDriver = slouken@419: (void (*)(struct MDRIVER*)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_RegisterDriver"); slouken@419: if ( mikmod.MikMod_RegisterDriver == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_errno = slouken@419: (int*) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_errno"); slouken@419: if ( mikmod.MikMod_errno == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.MikMod_strerror = slouken@419: (char* (*)(int)) slouken@419: SDL_LoadFunction(mikmod.handle, "MikMod_strerror"); slouken@419: if ( mikmod.MikMod_strerror == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_Active = slouken@419: (BOOL (*)(void)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_Active"); slouken@419: if ( mikmod.Player_Active == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_Free = slouken@419: (void (*)(MODULE*)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_Free"); slouken@419: if ( mikmod.Player_Free == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_LoadGeneric = slouken@419: (MODULE* (*)(MREADER*,int,BOOL)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_LoadGeneric"); slouken@419: if ( mikmod.Player_LoadGeneric == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_SetPosition = slouken@419: (void (*)(UWORD)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_SetPosition"); slouken@419: if ( mikmod.Player_SetPosition == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_SetVolume = slouken@419: (void (*)(SWORD)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_SetVolume"); slouken@419: if ( mikmod.Player_SetVolume == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_Start = slouken@419: (void (*)(MODULE*)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_Start"); slouken@419: if ( mikmod.Player_Start == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.Player_Stop = slouken@419: (void (*)(void)) slouken@419: SDL_LoadFunction(mikmod.handle, "Player_Stop"); slouken@419: if ( mikmod.Player_Stop == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.VC_WriteBytes = slouken@419: (ULONG (*)(SBYTE*,ULONG)) slouken@419: SDL_LoadFunction(mikmod.handle, "VC_WriteBytes"); slouken@419: if ( mikmod.VC_WriteBytes == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.drv_nos = slouken@419: (MDRIVER*) slouken@419: SDL_LoadFunction(mikmod.handle, "drv_nos"); slouken@419: if ( mikmod.drv_nos == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_device = slouken@419: (UWORD*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_device"); slouken@419: if ( mikmod.md_device == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_mixfreq = slouken@419: (UWORD*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_mixfreq"); slouken@419: if ( mikmod.md_mixfreq == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_mode = slouken@419: (UWORD*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_mode"); slouken@419: if ( mikmod.md_mode == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_musicvolume = slouken@419: (UBYTE*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_musicvolume"); slouken@419: if ( mikmod.md_musicvolume == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_pansep = slouken@419: (UBYTE*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_pansep"); slouken@419: if ( mikmod.md_pansep == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_reverb = slouken@419: (UBYTE*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_reverb"); slouken@419: if ( mikmod.md_reverb == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_sndfxvolume = slouken@419: (UBYTE*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_sndfxvolume"); slouken@419: if ( mikmod.md_sndfxvolume == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: mikmod.md_volume = slouken@419: (UBYTE*) slouken@419: SDL_LoadFunction(mikmod.handle, "md_volume"); slouken@419: if ( mikmod.md_volume == NULL ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: return -1; slouken@419: } slouken@419: } slouken@419: ++mikmod.loaded; slouken@419: slouken@419: return 0; slouken@419: } slouken@419: void Mix_QuitMOD() slouken@419: { slouken@419: if ( mikmod.loaded == 0 ) { slouken@419: return; slouken@419: } slouken@419: if ( mikmod.loaded == 1 ) { slouken@419: SDL_UnloadObject(mikmod.handle); slouken@419: } slouken@419: --mikmod.loaded; slouken@419: } slouken@419: #else slouken@419: int Mix_InitMOD() slouken@419: { slouken@419: if ( mikmod.loaded == 0 ) { slouken@419: mikmod.MikMod_Exit = MikMod_Exit; slouken@419: mikmod.MikMod_InfoDriver = MikMod_InfoDriver; slouken@419: mikmod.MikMod_InfoLoader = MikMod_InfoLoader; slouken@419: mikmod.MikMod_Init = MikMod_Init; slouken@419: mikmod.MikMod_RegisterAllLoaders = MikMod_RegisterAllLoaders; slouken@419: mikmod.MikMod_RegisterDriver = MikMod_RegisterDriver; slouken@419: mikmod.MikMod_errno = &MikMod_errno; slouken@419: mikmod.MikMod_strerror = MikMod_strerror; slouken@419: mikmod.Player_Active = Player_Active; slouken@419: mikmod.Player_Free = Player_Free; slouken@419: mikmod.Player_LoadGeneric = Player_LoadGeneric; slouken@419: mikmod.Player_SetPosition = Player_SetPosition; slouken@419: mikmod.Player_SetVolume = Player_SetVolume; slouken@419: mikmod.Player_Start = Player_Start; slouken@419: mikmod.Player_Stop = Player_Stop; slouken@419: mikmod.VC_WriteBytes = VC_WriteBytes; slouken@419: mikmod.drv_nos = &drv_nos; slouken@419: mikmod.md_device = &md_device; slouken@419: mikmod.md_mixfreq = &md_mixfreq; slouken@419: mikmod.md_mode = &md_mode; slouken@419: mikmod.md_musicvolume = &md_musicvolume; slouken@419: mikmod.md_pansep = &md_pansep; slouken@419: mikmod.md_reverb = &md_reverb; slouken@419: mikmod.md_sndfxvolume = &md_sndfxvolume; slouken@419: mikmod.md_volume = &md_volume; slouken@419: } slouken@419: ++mikmod.loaded; slouken@419: slouken@419: return 0; slouken@419: } slouken@419: void Mix_QuitMOD() slouken@419: { slouken@419: if ( mikmod.loaded == 0 ) { slouken@419: return; slouken@419: } slouken@419: if ( mikmod.loaded == 1 ) { slouken@419: } slouken@419: --mikmod.loaded; slouken@419: } slouken@419: #endif /* MOD_DYNAMIC */ slouken@419: slouken@419: #endif /* MOD_MUSIC */