/src/Mixer/Music.xs

http://github.com/PerlGameDev/SDL · Unknown · 341 lines · 282 code · 59 blank · 0 comment · 0 complexity · 931a874247b2b4e75f477c98249d1449 MD5 · raw file

  1. #include "EXTERN.h"
  2. #include "perl.h"
  3. #include "XSUB.h"
  4. #include "ppport.h"
  5. #include "defines.h"
  6. #include <SDL.h>
  7. #ifdef HAVE_SDL_MIXER
  8. #include <SDL_mixer.h>
  9. char *cb = NULL;
  10. char *fcb = NULL;
  11. void mix_func(void *udata, Uint8 *stream, int len)
  12. {
  13. PERL_SET_CONTEXT(parent_perl);
  14. dSP; /* initialize stack pointer */
  15. ENTER; /* everything created after here */
  16. SAVETMPS; /* ...is a temporary variable. */
  17. PUSHMARK(SP); /* remember the stack pointer */
  18. XPUSHs(sv_2mortal(newSViv(*(int*)udata))); /* push something onto the stack */
  19. XPUSHs(sv_2mortal(newSViv(len)));
  20. *(int*)udata = *(int*)udata + len;
  21. PUTBACK; /* make local stack pointer global */
  22. if(cb != NULL)
  23. {
  24. int count = call_pv(cb, G_ARRAY); /* call the function */
  25. SPAGAIN; /* refresh stack pointer */
  26. if(count == len + 1)
  27. {
  28. int i;
  29. for(i=0; i<len; i++)
  30. stream[i] = POPi; /* pop the return value from stack */
  31. }
  32. PUTBACK;
  33. }
  34. FREETMPS; /* free that return value */
  35. LEAVE; /* ...and the XPUSHed "mortal" args. */
  36. }
  37. void mix_finished(void)
  38. {
  39. PERL_SET_CONTEXT(parent_perl);
  40. dSP; /* initialize stack pointer */
  41. PUSHMARK(SP); /* remember the stack pointer */
  42. if(fcb != NULL)
  43. {
  44. call_pv(fcb, G_DISCARD|G_VOID); /* call the function */
  45. }
  46. }
  47. #endif
  48. MODULE = SDL::Mixer::Music PACKAGE = SDL::Mixer::Music PREFIX = mixmus_
  49. =for documentation
  50. SDL_mixer bindings
  51. See: http:/*www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html */
  52. =cut
  53. #ifdef HAVE_SDL_MIXER
  54. #if (SDL_MIXER_MAJOR_VERSION >= 1) && (SDL_MIXER_MINOR_VERSION >= 2) && (SDL_MIXER_PATCHLEVEL >= 9)
  55. int
  56. mixmus_get_num_music_decoders( )
  57. CODE:
  58. RETVAL = Mix_GetNumMusicDecoders();
  59. OUTPUT:
  60. RETVAL
  61. const char *
  62. mixmus_get_music_decoder( index )
  63. int index
  64. CODE:
  65. RETVAL = Mix_GetMusicDecoder(index);
  66. OUTPUT:
  67. RETVAL
  68. #else
  69. int
  70. mixmus_get_num_music_decoders( )
  71. CODE:
  72. warn("SDL_mixer >= 1.2.9 needed for SDL::Mixer::Music::getnum_music_decoders()");
  73. XSRETURN_UNDEF;
  74. OUTPUT:
  75. RETVAL
  76. const char *
  77. mixmus_get_music_decoder( index )
  78. int index
  79. CODE:
  80. warn("SDL_mixer >= 1.2.9 needed for SDL::Mixer::Music::get_music_decoder( index )");
  81. XSRETURN_UNDEF;
  82. OUTPUT:
  83. RETVAL
  84. #endif
  85. Mix_Music *
  86. mixmus_load_MUS( filename )
  87. char *filename
  88. PREINIT:
  89. char * CLASS = "SDL::Mixer::MixMusic";
  90. CODE:
  91. Mix_Music * mixmusic;
  92. mixmusic = Mix_LoadMUS(filename);
  93. if (mixmusic == NULL)
  94. fprintf(stderr, "Could not load %s\n", filename);
  95. RETVAL = mixmusic;
  96. OUTPUT:
  97. RETVAL
  98. #if VERSION_ATLEAST(SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION, SDL_MIXER_PATCHLEVEL, 1, 2, 7)
  99. Mix_Music *
  100. mixmus_load_MUS_RW( rw )
  101. SDL_RWops *rw
  102. PREINIT:
  103. char * CLASS = "SDL::Mixer::MixMusic";
  104. CODE:
  105. Mix_Music * mixmusic;
  106. mixmusic = Mix_LoadMUS_RW(rw);
  107. if (mixmusic == NULL)
  108. fprintf(stderr, "Could not load SDL::RWOp object\n");
  109. RETVAL = mixmusic;
  110. OUTPUT:
  111. RETVAL
  112. #else
  113. Mix_Music *
  114. mixmus_load_MUS_RW( rw )
  115. SDL_RWops *rw
  116. CODE:
  117. warn("SDL_mixer >= 1.2.7 needed for SDL::Mixer::Music::load_MUS_RW( rw )");
  118. XSRETURN_UNDEF;
  119. OUTPUT:
  120. RETVAL
  121. #endif
  122. void
  123. mixmus_free_music( music )
  124. Mix_Music *music
  125. CODE:
  126. Mix_FreeMusic(music);
  127. #ifdef USE_THREADS
  128. void
  129. mixmus_hook_music( func = NULL, arg = 0 )
  130. char *func
  131. int arg
  132. CODE:
  133. if(func != NULL)
  134. {
  135. parent_perl = PERL_GET_CONTEXT;
  136. cb = func;
  137. void *arg2 = safemalloc(sizeof(int));
  138. *(int*) arg2 = arg;
  139. Mix_HookMusic(&mix_func, arg2);
  140. }
  141. else
  142. {
  143. Mix_HookMusic(NULL, NULL);
  144. void *arg2 = Mix_GetMusicHookData();
  145. if(arg2 != NULL)
  146. safefree(arg2);
  147. }
  148. void
  149. mixmus_hook_music_finished( func = NULL )
  150. char *func
  151. CODE:
  152. if(func != NULL)
  153. {
  154. parent_perl = PERL_GET_CONTEXT;
  155. fcb = func;
  156. Mix_HookMusicFinished(&mix_finished);
  157. }
  158. else
  159. Mix_HookMusicFinished(NULL);
  160. #else
  161. void
  162. mixmus_hook_music( func = NULL, arg = 0 )
  163. char *func
  164. int arg
  165. CODE:
  166. warn("Perl need to be compiled with 'useithreads' for SDL::Mixer::Music::hook_music( func, arg )");
  167. void
  168. mixmus_hook_music_finished( func = NULL )
  169. char *func
  170. CODE:
  171. warn("Perl need to be compiled with 'useithreads' for SDL::Mixer::Music::hook_music_finished( func )");
  172. #endif
  173. int
  174. mixmus_get_music_hook_data()
  175. CODE:
  176. RETVAL = *(int*)Mix_GetMusicHookData();
  177. OUTPUT:
  178. RETVAL
  179. int
  180. mixmus_play_music( music, loops )
  181. Mix_Music *music
  182. int loops
  183. CODE:
  184. RETVAL = Mix_PlayMusic(music,loops);
  185. OUTPUT:
  186. RETVAL
  187. int
  188. mixmus_fade_in_music( music, loops, ms )
  189. Mix_Music *music
  190. int loops
  191. int ms
  192. CODE:
  193. RETVAL = Mix_FadeInMusic(music,loops,ms);
  194. OUTPUT:
  195. RETVAL
  196. int
  197. mixmus_fade_in_music_pos( music, loops, ms, position )
  198. Mix_Music *music
  199. int loops
  200. int ms
  201. double position
  202. CODE:
  203. RETVAL = Mix_FadeInMusicPos(music,loops,ms,position);
  204. OUTPUT:
  205. RETVAL
  206. int
  207. mixmus_volume_music( volume = -1 )
  208. int volume
  209. CODE:
  210. RETVAL = Mix_VolumeMusic(volume);
  211. OUTPUT:
  212. RETVAL
  213. int
  214. mixmus_halt_music()
  215. CODE:
  216. RETVAL = Mix_HaltMusic();
  217. OUTPUT:
  218. RETVAL
  219. int
  220. mixmus_fade_out_music ( ms )
  221. int ms
  222. CODE:
  223. RETVAL = Mix_FadeOutMusic(ms);
  224. OUTPUT:
  225. RETVAL
  226. Mix_Fading
  227. mixmus_fading_music()
  228. CODE:
  229. RETVAL = Mix_FadingMusic();
  230. OUTPUT:
  231. RETVAL
  232. void
  233. mixmus_pause_music ()
  234. CODE:
  235. Mix_PauseMusic();
  236. void
  237. mixmus_resume_music ()
  238. CODE:
  239. Mix_ResumeMusic();
  240. void
  241. mixmus_rewind_music ()
  242. CODE:
  243. Mix_RewindMusic();
  244. int
  245. mixmus_paused_music ()
  246. CODE:
  247. RETVAL = Mix_PausedMusic();
  248. OUTPUT:
  249. RETVAL
  250. int
  251. mixmus_playing_music()
  252. CODE:
  253. RETVAL = Mix_PlayingMusic();
  254. OUTPUT:
  255. RETVAL
  256. int
  257. mixmus_set_music_position( position )
  258. double position
  259. CODE:
  260. RETVAL = Mix_SetMusicPosition(position);
  261. OUTPUT:
  262. RETVAL
  263. int
  264. mixmus_get_music_type( music = NULL )
  265. Mix_Music * music
  266. CODE:
  267. RETVAL = Mix_GetMusicType( music );
  268. OUTPUT:
  269. RETVAL
  270. int
  271. mixmus_set_music_cmd( cmd = NULL )
  272. char *cmd
  273. CODE:
  274. RETVAL = Mix_SetMusicCMD( cmd );
  275. OUTPUT:
  276. RETVAL
  277. void
  278. mixmus_DESTROY( music )
  279. Mix_Music *music
  280. CODE:
  281. Mix_FreeMusic(music);
  282. #endif