diff --git a/arch/sdl/mixmusic.c b/arch/sdl/mixmusic.c index a7b87c541..a42a6779a 100644 --- a/arch/sdl/mixmusic.c +++ b/arch/sdl/mixmusic.c @@ -9,10 +9,7 @@ #include #include #include -#include #include -#include -#include #include "args.h" #include "hmp2mid.h" @@ -22,8 +19,6 @@ #define MUSIC_FADE_TIME 500 //milliseconds #define MUSIC_EXTENSION_ARG "-music_ext" -#define DESCENT_DATA_PATH "" //FIXME: we need PhysFS - Mix_Music *current_music = NULL; void music_done() { @@ -34,34 +29,35 @@ void music_done() { void convert_hmp(char *filename, char *mid_filename) { - if (access(mid_filename, R_OK) != 0) { - if (MIX_MUSIC_DEBUG) printf("convert_hmp: converting %s to %s\n", filename, mid_filename); - + if (!PHYSFS_exists(mid_filename)) + { const char *err; - CFILE *hmp_in; - FILE *mid_out = fopen(mid_filename, "w"); + PHYSFS_File *hmp_in; + PHYSFS_File *mid_out = PHYSFSX_openWriteBuffered(mid_filename); if (!mid_out) { - fprintf(stderr, "Error could not open: %s for writing: %s\n", mid_filename, strerror(errno)); + fprintf(stderr, "Error could not open: %s for writing: %s\n", mid_filename, PHYSFS_getLastError()); return; } - hmp_in = cfopen(filename, "rb"); + if (MIX_MUSIC_DEBUG) printf("convert_hmp: converting %s to %s\n", filename, mid_filename); + + hmp_in = PHYSFSX_openReadBuffered(filename); if (!hmp_in) { fprintf(stderr, "Error could not open: %s\n", filename); - fclose(mid_out); + PHYSFS_close(mid_out); return; } - err = hmp2mid((hmp2mid_read_func_t) cfread, hmp_in, mid_out); + err = hmp2mid(hmp_in, mid_out); - fclose(mid_out); - cfclose(hmp_in); + PHYSFS_close(mid_out); + PHYSFS_close(hmp_in); if (err) { fprintf(stderr, "%s\n", err); - unlink(mid_filename); + PHYSFS_delete(mid_filename); return; } } @@ -74,10 +70,9 @@ void mix_play_music(char *filename, int loop) { loop *= -1; int i, t, got_end=0; - int fn_buf_len = strlen(DESCENT_DATA_PATH) + strlen(filename) + 16; - char real_filename[fn_buf_len]; - char midi_filename[16]; + char real_filename[PATH_MAX]; + char rel_filename[16]; // just the filename of the actual music file used char music_title[16]; char music_file_extension[8]; @@ -98,18 +93,16 @@ void mix_play_music(char *filename, int loop) { t = FindArg(MUSIC_EXTENSION_ARG); if (t > 0) { sprintf(music_file_extension, "%.3s", Args[t+1]); - // Building absolute path to the file - sprintf(real_filename, "%s%s.%s", DESCENT_DATA_PATH, music_title, music_file_extension); + sprintf(rel_filename, "%s.%s", music_title, music_file_extension); } else { - sprintf(midi_filename, "%s.mid", music_title); - convert_hmp(filename, midi_filename); - // Relative path for now (we're using $HOME/.d1x-rebirth/ as working dir) - strcpy(real_filename, midi_filename); + sprintf(rel_filename, "%s.mid", music_title); + convert_hmp(filename, rel_filename); } + PHYSFSX_getRealPath(rel_filename, real_filename); if ((current_music = Mix_LoadMUS(real_filename))) { - printf("Now playing: %s\n", real_filename); + printf("Now playing: %s\n", rel_filename); if (Mix_PlayingMusic()) { // Fade-in effect sounds cleaner if we're already playing something Mix_FadeInMusic(current_music, loop, MUSIC_FADE_TIME); @@ -120,7 +113,7 @@ void mix_play_music(char *filename, int loop) { Mix_HookMusicFinished(music_done); } else { - printf("Music %s could not be loaded\n", real_filename); + printf("Music %s could not be loaded\n", rel_filename); Mix_HaltMusic(); } } diff --git a/dxx-changelog.txt b/dxx-changelog.txt index 870f5c18f..51ad7f812 100755 --- a/dxx-changelog.txt +++ b/dxx-changelog.txt @@ -1,5 +1,9 @@ D2X-Rebirth Changelog +20061230 +-------- +arch/sdl/mixmusic.c, include/cfile.h, include/hmp2mid.h, misc/hmp2mid.c: use PhysicsFS to write MIDI file, make hmp2mid use PhysicsFS exclusively + 20061229 -------- arch/ogl/gr.c, arch/ogl/ogl.c: allocate 'pixels' and 'texbuf' according to current screen resolution, saving over a hundred megabytes of memory diff --git a/include/cfile.h b/include/cfile.h index f3fd40065..1959274a6 100755 --- a/include/cfile.h +++ b/include/cfile.h @@ -33,17 +33,17 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #define CFILE PHYSFS_file #define cfopen(f,m) PHYSFSX_openReadBuffered(f) -//killed by MD2211 - see cfread() below -//#define cfread(p,s,n,fp) PHYSFS_read(fp,p,s,n) +#define cfread(p,s,n,fp) PHYSFS_read(fp,p,s,n) #define cfclose PHYSFS_close #define cftell PHYSFS_tell #define cfexist PHYSFS_exists #define cfilelength PHYSFS_fileLength //MD2211: hmp2mid needs a function pointer, so a macro won't do the job -static inline size_t cfread(void *p, size_t s, size_t n, CFILE *fp) { - return PHYSFS_read(fp,p,s,n); -} +//Kreator: no longer needed, hmp2mid now uses PhysicsFS implicitly +//static inline size_t cfread(void *p, size_t s, size_t n, CFILE *fp) { +// return PHYSFS_read(fp,p,s,n); +//} //Specify the name of the hogfile. Returns 1 if hogfile found & had files static inline int cfile_init(char *hogname) diff --git a/include/hmp2mid.h b/include/hmp2mid.h index 287d044b1..41ee8c62f 100644 --- a/include/hmp2mid.h +++ b/include/hmp2mid.h @@ -20,12 +20,13 @@ */ #ifndef __HMP2MID_H #define __HMP2MID_H -#include +//#include +#include -typedef size_t (*hmp2mid_read_func_t)(void *ptr, size_t size, size_t nmemb, - void *stream); +//typedef size_t (*hmp2mid_read_func_t)(void *ptr, size_t size, size_t nmemb, +// void *stream); /* Returns NULL on success, otherwise a c-string with an error message */ -const char *hmp2mid(hmp2mid_read_func_t read_func, void *hmp_in, FILE* mid_out); +const char *hmp2mid(/*hmp2mid_read_func_t read_func, */PHYSFS_File *hmp_in, PHYSFS_File* mid_out); #endif diff --git a/misc/hmp2mid.c b/misc/hmp2mid.c index d567dbebc..cd11862cc 100644 --- a/misc/hmp2mid.c +++ b/misc/hmp2mid.c @@ -19,15 +19,16 @@ Boston, MA 02111-1307, USA. */ #include -#include #include +#include +#include #include "hmp2mid.h" /* Some convience macros to keep the code below more readable */ #define HMP_READ(buf, count) \ {\ - if (read_func(buf, 1, count, hmp_in) != (count)) \ + if (PHYSFS_read(hmp_in, buf, 1, count) != (count)) \ { \ free(mid_track_buf); \ return hmp_read_error; \ @@ -45,11 +46,11 @@ } #define MID_WRITE(buf, count) \ - if (fwrite(buf, 1, count, mid_out) != (count)) \ + if (PHYSFS_write(mid_out, buf, 1, count) != (count)) \ { \ free(mid_track_buf); \ snprintf(hmp2mid_error, sizeof(hmp2mid_error), mid_write_error_templ, \ - strerror(errno)); \ + PHYSFS_getLastError); \ return hmp2mid_error; \ } @@ -79,7 +80,7 @@ static const char midi_header1[10] = { 'M', 'T', 'h', 'd', 0, 0, 0, 6, 0, 1 }; static const char midi_header2[21] = { 0, 0xC0, 'M', 'T', 'r', 'k', 0, 0, 0, 0x0B, 0, 0xFF, 0x51, 0x03, 0x18, 0x80, 0, 0, 0xFF, 0x2F, 0 }; -const char *hmp2mid(hmp2mid_read_func_t read_func, void *hmp_in, FILE* mid_out) +const char *hmp2mid(PHYSFS_File *hmp_in, PHYSFS_File *mid_out) { unsigned char last_com = 0, buf[0x300]; unsigned int num_tracks, track_length = 0, i, t;