/src/Mixer/Music.xs
http://github.com/PerlGameDev/SDL · Unknown · 341 lines · 282 code · 59 blank · 0 comment · 0 complexity · 931a874247b2b4e75f477c98249d1449 MD5 · raw file
- #include "EXTERN.h"
- #include "perl.h"
- #include "XSUB.h"
- #include "ppport.h"
- #include "defines.h"
- #include <SDL.h>
- #ifdef HAVE_SDL_MIXER
- #include <SDL_mixer.h>
- char *cb = NULL;
- char *fcb = NULL;
- void mix_func(void *udata, Uint8 *stream, int len)
- {
- PERL_SET_CONTEXT(parent_perl);
- dSP; /* initialize stack pointer */
- ENTER; /* everything created after here */
- SAVETMPS; /* ...is a temporary variable. */
- PUSHMARK(SP); /* remember the stack pointer */
- XPUSHs(sv_2mortal(newSViv(*(int*)udata))); /* push something onto the stack */
- XPUSHs(sv_2mortal(newSViv(len)));
- *(int*)udata = *(int*)udata + len;
- PUTBACK; /* make local stack pointer global */
- if(cb != NULL)
- {
- int count = call_pv(cb, G_ARRAY); /* call the function */
- SPAGAIN; /* refresh stack pointer */
-
- if(count == len + 1)
- {
- int i;
-
- for(i=0; i<len; i++)
- stream[i] = POPi; /* pop the return value from stack */
- }
- PUTBACK;
- }
- FREETMPS; /* free that return value */
- LEAVE; /* ...and the XPUSHed "mortal" args. */
- }
- void mix_finished(void)
- {
- PERL_SET_CONTEXT(parent_perl);
- dSP; /* initialize stack pointer */
- PUSHMARK(SP); /* remember the stack pointer */
- if(fcb != NULL)
- {
- call_pv(fcb, G_DISCARD|G_VOID); /* call the function */
- }
- }
- #endif
- MODULE = SDL::Mixer::Music PACKAGE = SDL::Mixer::Music PREFIX = mixmus_
- =for documentation
- SDL_mixer bindings
- See: http:/*www.libsdl.org/projects/SDL_mixer/docs/SDL_mixer.html */
- =cut
- #ifdef HAVE_SDL_MIXER
- #if (SDL_MIXER_MAJOR_VERSION >= 1) && (SDL_MIXER_MINOR_VERSION >= 2) && (SDL_MIXER_PATCHLEVEL >= 9)
- int
- mixmus_get_num_music_decoders( )
- CODE:
- RETVAL = Mix_GetNumMusicDecoders();
- OUTPUT:
- RETVAL
- const char *
- mixmus_get_music_decoder( index )
- int index
- CODE:
- RETVAL = Mix_GetMusicDecoder(index);
- OUTPUT:
- RETVAL
- #else
- int
- mixmus_get_num_music_decoders( )
- CODE:
- warn("SDL_mixer >= 1.2.9 needed for SDL::Mixer::Music::getnum_music_decoders()");
- XSRETURN_UNDEF;
- OUTPUT:
- RETVAL
- const char *
- mixmus_get_music_decoder( index )
- int index
- CODE:
- warn("SDL_mixer >= 1.2.9 needed for SDL::Mixer::Music::get_music_decoder( index )");
- XSRETURN_UNDEF;
- OUTPUT:
- RETVAL
- #endif
- Mix_Music *
- mixmus_load_MUS( filename )
- char *filename
- PREINIT:
- char * CLASS = "SDL::Mixer::MixMusic";
- CODE:
- Mix_Music * mixmusic;
- mixmusic = Mix_LoadMUS(filename);
- if (mixmusic == NULL)
- fprintf(stderr, "Could not load %s\n", filename);
- RETVAL = mixmusic;
- OUTPUT:
- RETVAL
- #if VERSION_ATLEAST(SDL_MIXER_MAJOR_VERSION, SDL_MIXER_MINOR_VERSION, SDL_MIXER_PATCHLEVEL, 1, 2, 7)
- Mix_Music *
- mixmus_load_MUS_RW( rw )
- SDL_RWops *rw
- PREINIT:
- char * CLASS = "SDL::Mixer::MixMusic";
- CODE:
- Mix_Music * mixmusic;
- mixmusic = Mix_LoadMUS_RW(rw);
- if (mixmusic == NULL)
- fprintf(stderr, "Could not load SDL::RWOp object\n");
- RETVAL = mixmusic;
- OUTPUT:
- RETVAL
- #else
- Mix_Music *
- mixmus_load_MUS_RW( rw )
- SDL_RWops *rw
- CODE:
- warn("SDL_mixer >= 1.2.7 needed for SDL::Mixer::Music::load_MUS_RW( rw )");
- XSRETURN_UNDEF;
- OUTPUT:
- RETVAL
- #endif
- void
- mixmus_free_music( music )
- Mix_Music *music
- CODE:
- Mix_FreeMusic(music);
- #ifdef USE_THREADS
- void
- mixmus_hook_music( func = NULL, arg = 0 )
- char *func
- int arg
- CODE:
- if(func != NULL)
- {
- parent_perl = PERL_GET_CONTEXT;
- cb = func;
- void *arg2 = safemalloc(sizeof(int));
- *(int*) arg2 = arg;
- Mix_HookMusic(&mix_func, arg2);
- }
- else
- {
- Mix_HookMusic(NULL, NULL);
- void *arg2 = Mix_GetMusicHookData();
- if(arg2 != NULL)
- safefree(arg2);
- }
- void
- mixmus_hook_music_finished( func = NULL )
- char *func
- CODE:
- if(func != NULL)
- {
- parent_perl = PERL_GET_CONTEXT;
- fcb = func;
- Mix_HookMusicFinished(&mix_finished);
- }
- else
- Mix_HookMusicFinished(NULL);
- #else
- void
- mixmus_hook_music( func = NULL, arg = 0 )
- char *func
- int arg
- CODE:
- warn("Perl need to be compiled with 'useithreads' for SDL::Mixer::Music::hook_music( func, arg )");
- void
- mixmus_hook_music_finished( func = NULL )
- char *func
- CODE:
- warn("Perl need to be compiled with 'useithreads' for SDL::Mixer::Music::hook_music_finished( func )");
- #endif
- int
- mixmus_get_music_hook_data()
- CODE:
- RETVAL = *(int*)Mix_GetMusicHookData();
- OUTPUT:
- RETVAL
- int
- mixmus_play_music( music, loops )
- Mix_Music *music
- int loops
- CODE:
- RETVAL = Mix_PlayMusic(music,loops);
- OUTPUT:
- RETVAL
- int
- mixmus_fade_in_music( music, loops, ms )
- Mix_Music *music
- int loops
- int ms
- CODE:
- RETVAL = Mix_FadeInMusic(music,loops,ms);
- OUTPUT:
- RETVAL
- int
- mixmus_fade_in_music_pos( music, loops, ms, position )
- Mix_Music *music
- int loops
- int ms
- double position
- CODE:
- RETVAL = Mix_FadeInMusicPos(music,loops,ms,position);
- OUTPUT:
- RETVAL
- int
- mixmus_volume_music( volume = -1 )
- int volume
- CODE:
- RETVAL = Mix_VolumeMusic(volume);
- OUTPUT:
- RETVAL
- int
- mixmus_halt_music()
- CODE:
- RETVAL = Mix_HaltMusic();
- OUTPUT:
- RETVAL
- int
- mixmus_fade_out_music ( ms )
- int ms
- CODE:
- RETVAL = Mix_FadeOutMusic(ms);
- OUTPUT:
- RETVAL
- Mix_Fading
- mixmus_fading_music()
- CODE:
- RETVAL = Mix_FadingMusic();
- OUTPUT:
- RETVAL
- void
- mixmus_pause_music ()
- CODE:
- Mix_PauseMusic();
- void
- mixmus_resume_music ()
- CODE:
- Mix_ResumeMusic();
- void
- mixmus_rewind_music ()
- CODE:
- Mix_RewindMusic();
- int
- mixmus_paused_music ()
- CODE:
- RETVAL = Mix_PausedMusic();
- OUTPUT:
- RETVAL
- int
- mixmus_playing_music()
- CODE:
- RETVAL = Mix_PlayingMusic();
- OUTPUT:
- RETVAL
- int
- mixmus_set_music_position( position )
- double position
- CODE:
- RETVAL = Mix_SetMusicPosition(position);
- OUTPUT:
- RETVAL
- int
- mixmus_get_music_type( music = NULL )
- Mix_Music * music
- CODE:
- RETVAL = Mix_GetMusicType( music );
- OUTPUT:
- RETVAL
- int
- mixmus_set_music_cmd( cmd = NULL )
- char *cmd
- CODE:
- RETVAL = Mix_SetMusicCMD( cmd );
- OUTPUT:
- RETVAL
- void
- mixmus_DESTROY( music )
- Mix_Music *music
- CODE:
- Mix_FreeMusic(music);
- #endif