dynamic_mod.c
上传用户:nini_0081
上传日期:2022-07-21
资源大小:2628k
文件大小:7k
源码类别:

多媒体编程

开发平台:

DOS

  1. /*
  2.     SDL_mixer:  An audio mixer library based on the SDL library
  3.     Copyright (C) 1997-2009 Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef MOD_MUSIC
  19. #include "SDL_loadso.h"
  20. #include "dynamic_mod.h"
  21. mikmod_loader mikmod = {
  22. 0, NULL
  23. };
  24. #ifdef MOD_DYNAMIC
  25. int Mix_InitMOD()
  26. {
  27. if ( mikmod.loaded == 0 ) {
  28. mikmod.handle = SDL_LoadObject(MOD_DYNAMIC);
  29. if ( mikmod.handle == NULL ) {
  30. return -1;
  31. }
  32. mikmod.MikMod_Exit =
  33. (void (*)(void))
  34. SDL_LoadFunction(mikmod.handle, "MikMod_Exit");
  35. if ( mikmod.MikMod_Exit == NULL ) {
  36. SDL_UnloadObject(mikmod.handle);
  37. return -1;
  38. }
  39. mikmod.MikMod_InfoDriver =
  40. (CHAR* (*)(void))
  41. SDL_LoadFunction(mikmod.handle, "MikMod_InfoDriver");
  42. if ( mikmod.MikMod_InfoDriver == NULL ) {
  43. SDL_UnloadObject(mikmod.handle);
  44. return -1;
  45. }
  46. mikmod.MikMod_InfoLoader =
  47. (CHAR* (*)(void))
  48. SDL_LoadFunction(mikmod.handle, "MikMod_InfoLoader");
  49. if ( mikmod.MikMod_InfoLoader == NULL ) {
  50. SDL_UnloadObject(mikmod.handle);
  51. return -1;
  52. }
  53. mikmod.MikMod_Init =
  54. (BOOL (*)(CHAR*))
  55. SDL_LoadFunction(mikmod.handle, "MikMod_Init");
  56. if ( mikmod.MikMod_Init == NULL ) {
  57. SDL_UnloadObject(mikmod.handle);
  58. return -1;
  59. }
  60. mikmod.MikMod_RegisterAllLoaders =
  61. (void (*)(void))
  62. SDL_LoadFunction(mikmod.handle, "MikMod_RegisterAllLoaders");
  63. if ( mikmod.MikMod_RegisterAllLoaders == NULL ) {
  64. SDL_UnloadObject(mikmod.handle);
  65. return -1;
  66. }
  67. mikmod.MikMod_RegisterDriver =
  68. (void (*)(struct MDRIVER*))
  69. SDL_LoadFunction(mikmod.handle, "MikMod_RegisterDriver");
  70. if ( mikmod.MikMod_RegisterDriver == NULL ) {
  71. SDL_UnloadObject(mikmod.handle);
  72. return -1;
  73. }
  74. mikmod.MikMod_errno =
  75. (int*)
  76. SDL_LoadFunction(mikmod.handle, "MikMod_errno");
  77. if ( mikmod.MikMod_errno == NULL ) {
  78. SDL_UnloadObject(mikmod.handle);
  79. return -1;
  80. }
  81. mikmod.MikMod_strerror =
  82. (char* (*)(int))
  83. SDL_LoadFunction(mikmod.handle, "MikMod_strerror");
  84. if ( mikmod.MikMod_strerror == NULL ) {
  85. SDL_UnloadObject(mikmod.handle);
  86. return -1;
  87. }
  88. mikmod.Player_Active =
  89. (BOOL (*)(void))
  90. SDL_LoadFunction(mikmod.handle, "Player_Active");
  91. if ( mikmod.Player_Active == NULL ) {
  92. SDL_UnloadObject(mikmod.handle);
  93. return -1;
  94. }
  95. mikmod.Player_Free =
  96. (void (*)(MODULE*))
  97. SDL_LoadFunction(mikmod.handle, "Player_Free");
  98. if ( mikmod.Player_Free == NULL ) {
  99. SDL_UnloadObject(mikmod.handle);
  100. return -1;
  101. }
  102. mikmod.Player_LoadGeneric =
  103. (MODULE* (*)(MREADER*,int,BOOL))
  104. SDL_LoadFunction(mikmod.handle, "Player_LoadGeneric");
  105. if ( mikmod.Player_LoadGeneric == NULL ) {
  106. SDL_UnloadObject(mikmod.handle);
  107. return -1;
  108. }
  109. mikmod.Player_SetPosition =
  110. (void (*)(UWORD))
  111. SDL_LoadFunction(mikmod.handle, "Player_SetPosition");
  112. if ( mikmod.Player_SetPosition == NULL ) {
  113. SDL_UnloadObject(mikmod.handle);
  114. return -1;
  115. }
  116. mikmod.Player_SetVolume =
  117. (void (*)(SWORD))
  118. SDL_LoadFunction(mikmod.handle, "Player_SetVolume");
  119. if ( mikmod.Player_SetVolume == NULL ) {
  120. SDL_UnloadObject(mikmod.handle);
  121. return -1;
  122. }
  123. mikmod.Player_Start =
  124. (void (*)(MODULE*))
  125. SDL_LoadFunction(mikmod.handle, "Player_Start");
  126. if ( mikmod.Player_Start == NULL ) {
  127. SDL_UnloadObject(mikmod.handle);
  128. return -1;
  129. }
  130. mikmod.Player_Stop =
  131. (void (*)(void))
  132. SDL_LoadFunction(mikmod.handle, "Player_Stop");
  133. if ( mikmod.Player_Stop == NULL ) {
  134. SDL_UnloadObject(mikmod.handle);
  135. return -1;
  136. }
  137. mikmod.VC_WriteBytes =
  138. (ULONG (*)(SBYTE*,ULONG))
  139. SDL_LoadFunction(mikmod.handle, "VC_WriteBytes");
  140. if ( mikmod.VC_WriteBytes == NULL ) {
  141. SDL_UnloadObject(mikmod.handle);
  142. return -1;
  143. }
  144. mikmod.drv_nos =
  145. (MDRIVER*)
  146. SDL_LoadFunction(mikmod.handle, "drv_nos");
  147. if ( mikmod.drv_nos == NULL ) {
  148. SDL_UnloadObject(mikmod.handle);
  149. return -1;
  150. }
  151. mikmod.md_device =
  152. (UWORD*)
  153. SDL_LoadFunction(mikmod.handle, "md_device");
  154. if ( mikmod.md_device == NULL ) {
  155. SDL_UnloadObject(mikmod.handle);
  156. return -1;
  157. }
  158. mikmod.md_mixfreq =
  159. (UWORD*)
  160. SDL_LoadFunction(mikmod.handle, "md_mixfreq");
  161. if ( mikmod.md_mixfreq == NULL ) {
  162. SDL_UnloadObject(mikmod.handle);
  163. return -1;
  164. }
  165. mikmod.md_mode =
  166. (UWORD*)
  167. SDL_LoadFunction(mikmod.handle, "md_mode");
  168. if ( mikmod.md_mode == NULL ) {
  169. SDL_UnloadObject(mikmod.handle);
  170. return -1;
  171. }
  172. mikmod.md_musicvolume =
  173. (UBYTE*)
  174. SDL_LoadFunction(mikmod.handle, "md_musicvolume");
  175. if ( mikmod.md_musicvolume == NULL ) {
  176. SDL_UnloadObject(mikmod.handle);
  177. return -1;
  178. }
  179. mikmod.md_pansep =
  180. (UBYTE*)
  181. SDL_LoadFunction(mikmod.handle, "md_pansep");
  182. if ( mikmod.md_pansep == NULL ) {
  183. SDL_UnloadObject(mikmod.handle);
  184. return -1;
  185. }
  186. mikmod.md_reverb =
  187. (UBYTE*)
  188. SDL_LoadFunction(mikmod.handle, "md_reverb");
  189. if ( mikmod.md_reverb == NULL ) {
  190. SDL_UnloadObject(mikmod.handle);
  191. return -1;
  192. }
  193. mikmod.md_sndfxvolume =
  194. (UBYTE*)
  195. SDL_LoadFunction(mikmod.handle, "md_sndfxvolume");
  196. if ( mikmod.md_sndfxvolume == NULL ) {
  197. SDL_UnloadObject(mikmod.handle);
  198. return -1;
  199. }
  200. mikmod.md_volume =
  201. (UBYTE*)
  202. SDL_LoadFunction(mikmod.handle, "md_volume");
  203. if ( mikmod.md_volume == NULL ) {
  204. SDL_UnloadObject(mikmod.handle);
  205. return -1;
  206. }
  207. }
  208. ++mikmod.loaded;
  209. return 0;
  210. }
  211. void Mix_QuitMOD()
  212. {
  213. if ( mikmod.loaded == 0 ) {
  214. return;
  215. }
  216. if ( mikmod.loaded == 1 ) {
  217. SDL_UnloadObject(mikmod.handle);
  218. }
  219. --mikmod.loaded;
  220. }
  221. #else
  222. int Mix_InitMOD()
  223. {
  224. if ( mikmod.loaded == 0 ) {
  225. mikmod.MikMod_Exit = MikMod_Exit;
  226. mikmod.MikMod_InfoDriver = MikMod_InfoDriver;
  227. mikmod.MikMod_InfoLoader = MikMod_InfoLoader;
  228. mikmod.MikMod_Init = MikMod_Init;
  229. mikmod.MikMod_RegisterAllLoaders = MikMod_RegisterAllLoaders;
  230. mikmod.MikMod_RegisterDriver = MikMod_RegisterDriver;
  231. mikmod.MikMod_errno = &MikMod_errno;
  232. mikmod.MikMod_strerror = MikMod_strerror;
  233. mikmod.Player_Active = Player_Active;
  234. mikmod.Player_Free = Player_Free;
  235. mikmod.Player_LoadGeneric = Player_LoadGeneric;
  236. mikmod.Player_SetPosition = Player_SetPosition;
  237. mikmod.Player_SetVolume = Player_SetVolume;
  238. mikmod.Player_Start = Player_Start;
  239. mikmod.Player_Stop = Player_Stop;
  240. mikmod.VC_WriteBytes = VC_WriteBytes;
  241. mikmod.drv_nos = &drv_nos;
  242. mikmod.md_device = &md_device;
  243. mikmod.md_mixfreq = &md_mixfreq;
  244. mikmod.md_mode = &md_mode;
  245. mikmod.md_musicvolume = &md_musicvolume;
  246. mikmod.md_pansep = &md_pansep;
  247. mikmod.md_reverb = &md_reverb;
  248. mikmod.md_sndfxvolume = &md_sndfxvolume;
  249. mikmod.md_volume = &md_volume;
  250. }
  251. ++mikmod.loaded;
  252. return 0;
  253. }
  254. void Mix_QuitMOD()
  255. {
  256. if ( mikmod.loaded == 0 ) {
  257. return;
  258. }
  259. if ( mikmod.loaded == 1 ) {
  260. }
  261. --mikmod.loaded;
  262. }
  263. #endif /* MOD_DYNAMIC */
  264. #endif /* MOD_MUSIC */