For playing music over SDL_mixer always use handle over PhysFS to save the path building mess; When building Jukebox path, only try to build full path if given path is actually a child of Searchpath

This commit is contained in:
zicodxx 2010-06-27 14:30:12 +00:00
parent 7849947519
commit bdcf86679b
3 changed files with 21 additions and 43 deletions

View file

@ -3,6 +3,7 @@ D2X-Rebirth Changelog
20100627 20100627
-------- --------
main/game.c, main/game.h, main/gameseq.c: When starting, leaving or changing a level in any way, use more ordered approach to set Game_wind visible or invisible. Fixing timer-issues after level-change and makes hiding of Game_wind obsolete for certain messageboxes; Moved GameTime and weapon timer variables out of reset_time since this function is not appropriate for this and is not needed between levels anymore due to window management handling start/stop_time properly main/game.c, main/game.h, main/gameseq.c: When starting, leaving or changing a level in any way, use more ordered approach to set Game_wind visible or invisible. Fixing timer-issues after level-change and makes hiding of Game_wind obsolete for certain messageboxes; Moved GameTime and weapon timer variables out of reset_time since this function is not appropriate for this and is not needed between levels anymore due to window management handling start/stop_time properly
arch/sdl/digi_mixer_music.c, main/jukebox.c: For playing music over SDL_mixer always use handle over PhysFS to save the path building mess; When building Jukebox path, only try to build full path if given path is actually a child of Searchpath
20100625 20100625
-------- --------

View file

@ -70,8 +70,11 @@ void convert_hmp(char *filename, char *mid_filename)
int mix_play_file(char *filename, int loop, void (*hook_finished_track)()) int mix_play_file(char *filename, int loop, void (*hook_finished_track)())
{ {
SDL_RWops *rw = NULL;
PHYSFS_file *filehandle = NULL;
char tmp_file[PATH_MAX], real_filename[PATH_MAX], real_filename_absolute[PATH_MAX]; char tmp_file[PATH_MAX], real_filename[PATH_MAX], real_filename_absolute[PATH_MAX];
char *basedir = "music", *fptr; char *basedir = "music", *fptr, *buf = NULL;
int bufsize = 0;
mix_free_music(); // stop and free what we're already playing, if anything mix_free_music(); // stop and free what we're already playing, if anything
@ -98,33 +101,14 @@ int mix_play_file(char *filename, int loop, void (*hook_finished_track)())
loop = loop ? -1 : 1; // loop means loop infinitely, otherwise play once loop = loop ? -1 : 1; // loop means loop infinitely, otherwise play once
current_music = Mix_LoadMUS(real_filename); filehandle = PHYSFS_openRead(real_filename);
if (filehandle != NULL)
// Could not open the file, yet. Try to get absolute path.
if (!current_music)
{ {
PHYSFSX_getRealPath(real_filename, real_filename_absolute); buf = realloc(buf, sizeof(char *)*PHYSFS_fileLength(filehandle));
current_music = Mix_LoadMUS(real_filename_absolute); bufsize = PHYSFS_read(filehandle, buf, sizeof(char), PHYSFS_fileLength(filehandle));
} rw = SDL_RWFromConstMem(buf,bufsize*sizeof(char));
PHYSFS_close(filehandle);
// Still no luck. Maybe the music is stored in an archive. Try that. current_music = Mix_LoadMUS_RW(rw);
// NOTE: This method should basically always work - making the above steps unnecessary. But for now it stays the last resort for the sake of memory swallowed by 'buf'.
if (!current_music)
{
SDL_RWops *rw = NULL;
PHYSFS_file *filehandle = NULL;
char *buf = NULL;
int bufsize = 0;
filehandle = PHYSFS_openRead(real_filename);
if (filehandle != NULL)
{
buf = realloc(buf, sizeof(char *)*PHYSFS_fileLength(filehandle));
bufsize = PHYSFS_read(filehandle, buf, sizeof(char), PHYSFS_fileLength(filehandle));
rw = SDL_RWFromConstMem(buf,bufsize*sizeof(char));
PHYSFS_close(filehandle);
current_music = Mix_LoadMUS_RW(rw);
}
} }
if (current_music) if (current_music)

View file

@ -60,33 +60,26 @@ void jukebox_load()
char *p; char *p;
const char *sep = PHYSFS_getDirSeparator(); const char *sep = PHYSFS_getDirSeparator();
// make sure there's a proper path separator. // build path properly.
if (strlen(GameCfg.CMLevelMusicPath) >= strlen(sep)) if (strlen(GameCfg.CMLevelMusicPath) >= strlen(sep))
{ {
char abspath[PATH_MAX+1];
p = GameCfg.CMLevelMusicPath + strlen(GameCfg.CMLevelMusicPath) - strlen(sep); p = GameCfg.CMLevelMusicPath + strlen(GameCfg.CMLevelMusicPath) - strlen(sep);
if (strcmp(p, sep)) if (strcmp(p, sep))
strncat(GameCfg.CMLevelMusicPath, sep, PATH_MAX - 1 - strlen(GameCfg.CMLevelMusicPath)); strncat(GameCfg.CMLevelMusicPath, sep, PATH_MAX - 1 - strlen(GameCfg.CMLevelMusicPath));
if (PHYSFS_isDirectory(GameCfg.CMLevelMusicPath)) // it's a child of Sharepath, build full path
{
PHYSFSX_getRealPath(GameCfg.CMLevelMusicPath,abspath);
snprintf(GameCfg.CMLevelMusicPath,sizeof(char)*PATH_MAX,abspath);
}
} }
PHYSFS_addToSearchPath(GameCfg.CMLevelMusicPath, 0); PHYSFS_addToSearchPath(GameCfg.CMLevelMusicPath, 0);
// as mountpoints are no option (yet), make sure only files originating from GameCfg.CMLevelMusicPath are aded to the list. // as mountpoints are no option (yet), make sure only files originating from GameCfg.CMLevelMusicPath are aded to the list.
JukeboxSongs = PHYSFSX_findabsoluteFiles("", GameCfg.CMLevelMusicPath, music_exts); JukeboxSongs = PHYSFSX_findabsoluteFiles("", GameCfg.CMLevelMusicPath, music_exts);
// If we do not find anything, try to see if given path is child of Searchpath
if (JukeboxSongs != NULL)
{
for (count = 0; JukeboxSongs[count]!=NULL; count++) {}
if (!count)
{
char absolute_path[PATH_MAX + 1];
PHYSFS_removeFromSearchPath(GameCfg.CMLevelMusicPath);
PHYSFSX_getRealPath(GameCfg.CMLevelMusicPath,absolute_path);
memcpy(GameCfg.CMLevelMusicPath,absolute_path,sizeof(char)*PATH_MAX);
PHYSFS_addToSearchPath(GameCfg.CMLevelMusicPath, 0);
JukeboxSongs = PHYSFSX_findabsoluteFiles("", GameCfg.CMLevelMusicPath, music_exts);
}
}
if (JukeboxSongs != NULL) if (JukeboxSongs != NULL)
{ {
for (count = 0; JukeboxSongs[count]!=NULL; count++) {} for (count = 0; JukeboxSongs[count]!=NULL; count++) {}