Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

#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