Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
with
269 additions
and 28 deletions.
- +3 −2 configure.in
- +180 −0 dynamic_mp3.c
- +49 −0 dynamic_mp3.h
- +2 −0 dynamic_ogg.c
- +35 −26 music.c
@@ -0,0 +1,180 @@ | ||
/* | ||
SDL_mixer: An audio mixer library based on the SDL library | ||
Copyright (C) 1997-2004 Sam Lantinga | ||
This library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Library General Public | ||
License as published by the Free Software Foundation; either | ||
version 2 of the License, or (at your option) any later version. | ||
This library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Library General Public License for more details. | ||
You should have received a copy of the GNU Library General Public | ||
License along with this library; if not, write to the Free | ||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
Sam Lantinga | ||
slouken@libsdl.org | ||
*/ | ||
|
||
#ifdef MP3_MUSIC | ||
|
||
#include "SDL_loadso.h" | ||
|
||
#include "dynamic_mp3.h" | ||
|
||
smpeg_loader smpeg = { | ||
0, NULL | ||
}; | ||
|
||
#ifdef MP3_DYNAMIC | ||
int Mix_InitMP3() | ||
{ | ||
if ( smpeg.loaded == 0 ) { | ||
smpeg.handle = SDL_LoadObject(MP3_DYNAMIC); | ||
if ( smpeg.handle == NULL ) { | ||
return -1; | ||
} | ||
smpeg.SMPEG_actualSpec = | ||
(void (*)( SMPEG *, SDL_AudioSpec * )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_actualSpec"); | ||
if ( smpeg.SMPEG_actualSpec == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_delete = | ||
(void (*)( SMPEG* )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_delete"); | ||
if ( smpeg.SMPEG_delete == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_enableaudio = | ||
(void (*)( SMPEG*, int )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_enableaudio"); | ||
if ( smpeg.SMPEG_enableaudio == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_enablevideo = | ||
(void (*)( SMPEG*, int )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_enablevideo"); | ||
if ( smpeg.SMPEG_enablevideo == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_new = | ||
(SMPEG* (*)(const char *, SMPEG_Info*, int)) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_new"); | ||
if ( smpeg.SMPEG_new == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_new_rwops = | ||
(SMPEG* (*)(SDL_RWops *, SMPEG_Info*, int)) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_new_rwops"); | ||
if ( smpeg.SMPEG_new_rwops == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_play = | ||
(void (*)( SMPEG* )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_play"); | ||
if ( smpeg.SMPEG_play == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_playAudio = | ||
(int (*)( SMPEG *, Uint8 *, int )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_playAudio"); | ||
if ( smpeg.SMPEG_playAudio == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_rewind = | ||
(void (*)( SMPEG* )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_rewind"); | ||
if ( smpeg.SMPEG_rewind == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_setvolume = | ||
(void (*)( SMPEG*, int )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_setvolume"); | ||
if ( smpeg.SMPEG_setvolume == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_skip = | ||
(void (*)( SMPEG*, float )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_skip"); | ||
if ( smpeg.SMPEG_skip == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_status = | ||
(SMPEGstatus (*)( SMPEG* )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_status"); | ||
if ( smpeg.SMPEG_status == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
smpeg.SMPEG_stop = | ||
(void (*)( SMPEG* )) | ||
SDL_LoadFunction(smpeg.handle, "SMPEG_stop"); | ||
if ( smpeg.SMPEG_stop == NULL ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
return -1; | ||
} | ||
} | ||
++smpeg.loaded; | ||
|
||
return 0; | ||
} | ||
void Mix_QuitMP3() | ||
{ | ||
if ( smpeg.loaded == 0 ) { | ||
return; | ||
} | ||
if ( smpeg.loaded == 1 ) { | ||
SDL_UnloadObject(smpeg.handle); | ||
} | ||
--smpeg.loaded; | ||
} | ||
#else | ||
int Mix_InitMP3() | ||
{ | ||
if ( smpeg.loaded == 0 ) { | ||
smpeg.SMPEG_actualSpec = SMPEG_actualSpec; | ||
smpeg.SMPEG_delete = SMPEG_delete; | ||
smpeg.SMPEG_enableaudio = SMPEG_enableaudio; | ||
smpeg.SMPEG_enablevideo = SMPEG_enablevideo; | ||
smpeg.SMPEG_new = SMPEG_new; | ||
smpeg.SMPEG_new_rwops = SMPEG_new_rwops; | ||
smpeg.SMPEG_play = SMPEG_play; | ||
smpeg.SMPEG_playAudio = SMPEG_playAudio; | ||
smpeg.SMPEG_rewind = SMPEG_rewind; | ||
smpeg.SMPEG_setvolume = SMPEG_setvolume; | ||
smpeg.SMPEG_skip = SMPEG_skip; | ||
smpeg.SMPEG_status = SMPEG_status; | ||
smpeg.SMPEG_stop = SMPEG_stop; | ||
} | ||
++smpeg.loaded; | ||
|
||
return 0; | ||
} | ||
void Mix_QuitMP3() | ||
{ | ||
if ( smpeg.loaded == 0 ) { | ||
return; | ||
} | ||
if ( smpeg.loaded == 1 ) { | ||
} | ||
--smpeg.loaded; | ||
} | ||
#endif /* MP3_DYNAMIC */ | ||
|
||
#endif /* MP3_MUSIC */ |
@@ -0,0 +1,49 @@ | ||
/* | ||
SDL_mixer: An audio mixer library based on the SDL library | ||
Copyright (C) 1997-2004 Sam Lantinga | ||
This library is free software; you can redistribute it and/or | ||
modify it under the terms of the GNU Library General Public | ||
License as published by the Free Software Foundation; either | ||
version 2 of the License, or (at your option) any later version. | ||
This library is distributed in the hope that it will be useful, | ||
but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
Library General Public License for more details. | ||
You should have received a copy of the GNU Library General Public | ||
License along with this library; if not, write to the Free | ||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
Sam Lantinga | ||
slouken@libsdl.org | ||
*/ | ||
|
||
#ifdef MP3_MUSIC | ||
#include "smpeg.h" | ||
|
||
typedef struct { | ||
int loaded; | ||
void *handle; | ||
void (*SMPEG_actualSpec)( SMPEG *mpeg, SDL_AudioSpec *spec ); | ||
void (*SMPEG_delete)( SMPEG* mpeg ); | ||
void (*SMPEG_enableaudio)( SMPEG* mpeg, int enable ); | ||
void (*SMPEG_enablevideo)( SMPEG* mpeg, int enable ); | ||
SMPEG* (*SMPEG_new)(const char *file, SMPEG_Info* info, int sdl_audio); | ||
SMPEG* (*SMPEG_new_rwops)(SDL_RWops *src, SMPEG_Info* info, int sdl_audio); | ||
void (*SMPEG_play)( SMPEG* mpeg ); | ||
int (*SMPEG_playAudio)( SMPEG *mpeg, Uint8 *stream, int len ); | ||
void (*SMPEG_rewind)( SMPEG* mpeg ); | ||
void (*SMPEG_setvolume)( SMPEG* mpeg, int volume ); | ||
void (*SMPEG_skip)( SMPEG* mpeg, float seconds ); | ||
SMPEGstatus (*SMPEG_status)( SMPEG* mpeg ); | ||
void (*SMPEG_stop)( SMPEG* mpeg ); | ||
} smpeg_loader; | ||
|
||
extern smpeg_loader smpeg; | ||
|
||
extern int Mix_InitMP3(); | ||
extern void Mix_QuitMP3(); | ||
|
||
#endif |