From 408831be4e3f435af1ea86f7f3fe6fdf17c37f35 Mon Sep 17 00:00:00 2001 From: Bradley Bell Date: Fri, 30 Jan 2015 02:13:43 -0800 Subject: [PATCH] get midi working with sdl_mixer and the hmp2midi from d2x-rebirth --- Makefile.am | 8 +- arch/cocoa/SDL_mixer.h | 3 + arch/sdl/digi.c | 47 +++------- arch/sdl/midi.c | 160 ++++++++++++++++++++++++++++++++++ configure.ac | 5 ++ d2x.xcodeproj/project.pbxproj | 16 ++++ libmve/mveplay.c | 30 ++----- main/menu.c | 11 +-- main/songs.c | 16 +--- misc/hmp.c | 14 ++- 10 files changed, 226 insertions(+), 84 deletions(-) create mode 100644 arch/cocoa/SDL_mixer.h create mode 100644 arch/sdl/midi.c diff --git a/Makefile.am b/Makefile.am index ca4a85f2..0f504f55 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,7 @@ d2x_SOURCES = \ 2d/bitmap.c 2d/circle.c 2d/gpixel.c 2d/palette.c \ 3d/clipper.c 3d/globvars.c 3d/interp.c 3d/points.c 3d/setup.c 3d/draw.c 3d/instance.c \ 3d/matrix.c 3d/rod.c \ -arch/sdl/digi.c arch/sdl/init.c arch/sdl/rbaudio.c arch/sdl/timer.c \ +arch/sdl/digi.c arch/sdl/init.c arch/sdl/midi.c arch/sdl/rbaudio.c arch/sdl/timer.c \ iff/iff.c \ libmve/decoder16.c libmve/decoder8.c libmve/mve_audio.c libmve/mvelib.c libmve/mveplay.c \ main/ai.c main/ai2.c main/aipath.c main/automap.c main/bm.c main/cmd.c \ @@ -29,7 +29,7 @@ main/wall.c main/weapon.c \ maths/vecmat.c maths/rand.c maths/tables.c \ mem/mem.c \ misc/args.c misc/error.c misc/strio.c misc/ignorecase.c misc/physfsrwops.c \ -misc/hash.c misc/strutil.c \ +misc/hash.c misc/hmp.c misc/strutil.c \ texmap/ntmap.c texmap/scanline.c d2x_LDFLAGS = @@ -97,11 +97,11 @@ d2x_svga_LDFLAGS = $(d2x_LDFLAGS) d2x_svga_LDADD = $(d2x_LDADD) -lvga -lvgagl -d2x_sdl_CPPFLAGS = $(d2x_CPPFLAGS) $(SDL_CFLAGS) +d2x_sdl_CPPFLAGS = $(d2x_CPPFLAGS) $(SDL_CFLAGS) $(SDLMIXER_CFLAGS) _d2x_sdl_SOURCES = $(d2x_SOURCES) arch/sdl/event.c arch/sdl/key.c arch/sdl/mouse.c d2x_sdl_SOURCES = $(_d2x_sdl_SOURCES) arch/sdl/vid.c texmap/tmapflat.c d2x_sdl_LDFLAGS = $(d2x_LDFLAGS) -d2x_sdl_LDADD = $(d2x_LDADD) $(SDL_LIBS) $(SDLIMAGE_LIBS) +d2x_sdl_LDADD = $(d2x_LDADD) $(SDL_LIBS) $(SDLIMAGE_LIBS) $(SDLMIXER_LIBS) if MINGW32 d2x_sdl_CPPFLAGS += -I$(top_srcdir)/arch/win32/include diff --git a/arch/cocoa/SDL_mixer.h b/arch/cocoa/SDL_mixer.h new file mode 100644 index 00000000..4250df12 --- /dev/null +++ b/arch/cocoa/SDL_mixer.h @@ -0,0 +1,3 @@ + +/* Use the Framework path */ +#include diff --git a/arch/sdl/digi.c b/arch/sdl/digi.c index 6da1e567..d715a9b6 100644 --- a/arch/sdl/digi.c +++ b/arch/sdl/digi.c @@ -13,7 +13,8 @@ #include #include -#include +#include "SDL.h" +#include "SDL_mixer.h" #include "error.h" #include "mono.h" @@ -111,7 +112,7 @@ static const Uint8 mix8[] = int digi_volume = SOUND_MAX_VOLUME; //end edit by adb -static int Digi_initialized = 0; +int Digi_initialized = 0; struct sound_slot { int soundno; @@ -128,8 +129,6 @@ struct sound_slot { int persistent; // This can't be pre-empted } SoundSlots[MAX_SOUND_SLOTS]; -static SDL_AudioSpec WaveSpec; - static int digi_max_channels = 16; static int next_channel = 0; @@ -189,23 +188,18 @@ int digi_init() if (SDL_InitSubSystem(SDL_INIT_AUDIO)<0) { Error("SDL audio initialisation failed: %s.",SDL_GetError()); } - - WaveSpec.freq = digi_sample_rate; - //added/changed by Sam Lantinga on 12/01/98 for new SDL version - WaveSpec.format = AUDIO_U8; - WaveSpec.channels = 2; - //end this section addition/change - SL - WaveSpec.samples = SOUND_BUFFER_SIZE; - WaveSpec.callback = audio_mixcallback; - - if ( SDL_OpenAudio(&WaveSpec, NULL) < 0 ) { + + if ( Mix_OpenAudio(digi_sample_rate, AUDIO_U8, 2, SOUND_BUFFER_SIZE) < 0 ) { //edited on 10/05/98 by Matt Mueller - should keep running, just with no sound. Warning("\nError: Couldn't open audio: %s\n", SDL_GetError()); //killed exit(2); return 1; //end edit -MM } - SDL_PauseAudio(0); + + Mix_SetPostMix(audio_mixcallback, NULL); + + Mix_Resume(-1); atexit(digi_close); Digi_initialized = 1; @@ -219,11 +213,15 @@ void digi_reset() { } void digi_close() { if (!Digi_initialized) return; + + digi_stop_current_song(); + Digi_initialized = 0; + #ifdef __MINGW32__ SDL_Delay(500); // CloseAudio hangs if it's called too soon after opening? #endif - SDL_CloseAudio(); + Mix_CloseAudio(); } void digi_stop_all_channels() @@ -435,23 +433,6 @@ void digi_end_sound(int channel) } -#ifndef _WIN32 -// MIDI stuff follows. -void digi_set_midi_volume( int mvolume ) { } -void digi_play_midi_song( char * filename, char * melodic_bank, char * drum_bank, int loop ) {} -void digi_stop_current_song() -{ -#ifdef HMIPLAY - char buf[10]; - - sprintf(buf,"s"); - send_ipc(buf); -#endif -} -void digi_pause_midi() {} -void digi_resume_midi() {} -#endif - #ifndef NDEBUG void digi_debug() { diff --git a/arch/sdl/midi.c b/arch/sdl/midi.c new file mode 100644 index 00000000..cb4bdacc --- /dev/null +++ b/arch/sdl/midi.c @@ -0,0 +1,160 @@ +/* + * + * SDL midi support + * + * + */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include "SDL.h" +#include "SDL_mixer.h" + +#include "mono.h" +#include "inferno.h" +#include "u_mem.h" +#include "physfsrwops.h" +#include "hmp.h" + + +extern int Digi_initialized; + +static int midi_volume = 128 / 2; // Max volume +char digi_last_midi_song[16] = ""; +char digi_last_melodic_bank[16] = ""; +char digi_last_drum_bank[16] = ""; + +// handle for the initialized MIDI song +Mix_Music *SongHandle = NULL; +ubyte *SongData = NULL; +unsigned int SongSize; + + +void digi_set_midi_volume( int mvolume ) +{ + int old_volume = midi_volume; + + if ( mvolume > 127 ) + midi_volume = 127; + else if ( mvolume < 0 ) + midi_volume = 0; + else + midi_volume = mvolume; + + if (!Redbook_playing && (old_volume < 1) && ( midi_volume > 1 ) ) { + if (!SongHandle) + digi_play_midi_song( digi_last_midi_song, digi_last_melodic_bank, digi_last_drum_bank, 1 ); + } + Mix_VolumeMusic(midi_volume); +} + + +void digi_play_midi_song( char *filename, char *melodic_bank, char *drum_bank, int loop ) +{ + SDL_RWops *rw = NULL; + + if (!Digi_initialized) return; + + digi_stop_current_song(); + + if ( filename == NULL ) return; + + strcpy( digi_last_midi_song, filename ); + strcpy( digi_last_melodic_bank, melodic_bank ); + strcpy( digi_last_drum_bank, drum_bank ); + + if ( midi_volume < 1 ) + return; // Don't play song if volume == 0; + + // initialize the song + mprintf((0, "Loading %s\n", filename)); + hmp2mid(filename, &SongData, &SongSize); + rw = SDL_RWFromConstMem(SongData, SongSize); + SongHandle = Mix_LoadMUS_RW(rw); + + if (!SongHandle) { + char fname[128]; + CFILE *fp; + int sl; + + // load .mid version, if available + sl = (int)strlen( filename ); + strcpy( fname, filename ); + fname[sl-3] = 'm'; + fname[sl-2] = 'i'; + fname[sl-1] = 'd'; + + mprintf((0, "Loading %s\n", fname)); + fp = cfopen( fname, "rb" ); + + SongSize = cfilelength( fp ); + SongData = d_calloc(SongSize, 1); + if (SongData == NULL) { + cfclose(fp); + mprintf( (1, "Error allocating %d bytes for '%s'", SongSize, filename )); + return; + } + + if ( cfread ( SongData, SongSize, 1, fp ) != 1 ) { + mprintf( (1, "Error reading midi file, '%s'", filename )); + cfclose(fp); + d_free(SongData); + return; + } + + cfclose(fp); + + rw = SDL_RWFromConstMem(SongData, SongSize); + SongHandle = Mix_LoadMUS_RW(rw); + } + + if (!SongHandle) { + mprintf( (1, "MIDI Error : %s\n", Mix_GetError())); + if (SongData) + d_free(SongData); + return; + } + + // start the song playing + Mix_PlayMusic(SongHandle, (loop ? -1 : 1)); + Mix_HookMusicFinished(digi_stop_current_song); + + return; +} + + +void digi_stop_current_song() +{ + if (!Digi_initialized) return; + + // Stop last song... + if (SongHandle) { + // stop the last MIDI song from playing + Mix_HaltMusic(); + // uninitialize the last MIDI song + Mix_FreeMusic( SongHandle ); + SongHandle = NULL; + } + if (SongData) { + d_free(SongData); + SongData = NULL; + } +} + + +void digi_pause_midi() +{ + if (!Digi_initialized) return; + + Mix_PauseMusic(); +} + + +void digi_resume_midi() +{ + if (!Digi_initialized) return; + + Mix_ResumeMusic(); +} diff --git a/configure.ac b/configure.ac index 16dab384..f4f4e2da 100644 --- a/configure.ac +++ b/configure.ac @@ -187,6 +187,11 @@ else AC_DEFINE(SDL_IMAGE,,[Define if you have the SDL_image library])) AC_SUBST(SDLIMAGE_LIBS) + # Check for SDL_mixer + PKG_CHECK_MODULES(SDLMIXER, SDL_mixer) + AC_SUBST(SDLIMAGE_CFLAGS) + AC_SUBST(SDLIMAGE_LIBS) + # Check for libpng have_libpng=no #PKG_CHECK_MODULES(LIBPNG, libpng, diff --git a/d2x.xcodeproj/project.pbxproj b/d2x.xcodeproj/project.pbxproj index 5eeae992..06557044 100644 --- a/d2x.xcodeproj/project.pbxproj +++ b/d2x.xcodeproj/project.pbxproj @@ -7,6 +7,12 @@ objects = { /* Begin PBXBuildFile section */ + 140D3B411A7DB909005D0E95 /* midi.c in Sources */ = {isa = PBXBuildFile; fileRef = 140D3B401A7DB909005D0E95 /* midi.c */; }; + 140D3B421A7DB909005D0E95 /* midi.c in Sources */ = {isa = PBXBuildFile; fileRef = 140D3B401A7DB909005D0E95 /* midi.c */; }; + 140D3B431A7DB909005D0E95 /* midi.c in Sources */ = {isa = PBXBuildFile; fileRef = 140D3B401A7DB909005D0E95 /* midi.c */; }; + 140D3B451A7DB977005D0E95 /* hmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 146695C41A2729860070D41D /* hmp.c */; }; + 140D3B461A7DB978005D0E95 /* hmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 146695C41A2729860070D41D /* hmp.c */; }; + 140D3B471A7DB979005D0E95 /* hmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 146695C41A2729860070D41D /* hmp.c */; }; 142869B51A672E6300A095F6 /* tmapflat.c in Sources */ = {isa = PBXBuildFile; fileRef = 1466976C1A2729870070D41D /* tmapflat.c */; }; 142869B61A672E6300A095F6 /* vid.c in Sources */ = {isa = PBXBuildFile; fileRef = 146695961A2729860070D41D /* vid.c */; }; 142869B71A672E6300A095F6 /* SDLMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 146695051A2729860070D41D /* SDLMain.m */; }; @@ -547,6 +553,8 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 140D3B401A7DB909005D0E95 /* midi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = midi.c; sourceTree = ""; }; + 140D3B441A7DB940005D0E95 /* SDL_mixer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SDL_mixer.h; sourceTree = ""; }; 141635EB1A4CB5B3005E575E /* d2x-soft */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "d2x-soft"; sourceTree = BUILT_PRODUCTS_DIR; }; 141635EC1A4CB5B3005E575E /* d2x-opengl */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "d2x-opengl"; sourceTree = BUILT_PRODUCTS_DIR; }; 141FE1001A2D36A600A4FB18 /* Makefile.am */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.am; sourceTree = ""; }; @@ -1318,6 +1326,7 @@ 146695041A2729860070D41D /* SDLMain.h */, 146695051A2729860070D41D /* SDLMain.m */, 14804D661A4C9FE0001CB0FB /* SDL.h */, + 140D3B441A7DB940005D0E95 /* SDL_mixer.h */, ); path = cocoa; sourceTree = ""; @@ -1550,6 +1559,7 @@ 146695981A2729860070D41D /* joy.c */, 146695991A2729860070D41D /* joydefs.c */, 1466959A1A2729860070D41D /* key.c */, + 140D3B401A7DB909005D0E95 /* midi.c */, 1466959D1A2729860070D41D /* mouse.c */, 1466959E1A2729860070D41D /* rbaudio.c */, 1466959F1A2729860070D41D /* timer.c */, @@ -2246,6 +2256,7 @@ 142869D21A672E6300A095F6 /* strio.c in Sources */, 14286A4E1A67313E00A095F6 /* eglobal.c in Sources */, 142869D31A672E6300A095F6 /* strutil.c in Sources */, + 140D3B451A7DB977005D0E95 /* hmp.c in Sources */, 142869D41A672E6300A095F6 /* mem.c in Sources */, 142869D51A672E6300A095F6 /* rand.c in Sources */, 142869D61A672E6300A095F6 /* tables.c in Sources */, @@ -2386,6 +2397,7 @@ 14286A341A672E6300A095F6 /* disc.c in Sources */, 14286A641A67313E00A095F6 /* med.c in Sources */, 14286A7F1A67330000A095F6 /* menubar.c in Sources */, + 140D3B411A7DB909005D0E95 /* midi.c in Sources */, 14286A351A672E6300A095F6 /* font.c in Sources */, 14286A361A672E6300A095F6 /* gpixel.c in Sources */, 14286A371A672E6300A095F6 /* ibitblt.c in Sources */, @@ -2462,6 +2474,7 @@ 14F0D5331A4CA50D00682BB0 /* crypt.c in Sources */, 14F0D5341A4CA50D00682BB0 /* cvar.c in Sources */, 14F0D5351A4CA50D00682BB0 /* digiobj.c in Sources */, + 140D3B431A7DB909005D0E95 /* midi.c in Sources */, 144BC0341A74C612001A6048 /* gr.c in Sources */, 14F0D5361A4CA50D00682BB0 /* effects.c in Sources */, 14F0D5371A4CA50D00682BB0 /* endlevel.c in Sources */, @@ -2507,6 +2520,7 @@ 14F0D5601A4CA50D00682BB0 /* slew.c in Sources */, 14F0D5611A4CA50D00682BB0 /* songs.c in Sources */, 14F0D5621A4CA50D00682BB0 /* state.c in Sources */, + 140D3B471A7DB979005D0E95 /* hmp.c in Sources */, 14F0D5631A4CA50D00682BB0 /* switch.c in Sources */, 14F0D5641A4CA50D00682BB0 /* terrain.c in Sources */, 14F0D5651A4CA50D00682BB0 /* texmerge.c in Sources */, @@ -2607,6 +2621,7 @@ 14F0D5B41A4CB34F00682BB0 /* rand.c in Sources */, 14F0D5B51A4CB34F00682BB0 /* tables.c in Sources */, 14F0D5B61A4CB34F00682BB0 /* vecmat.c in Sources */, + 140D3B461A7DB978005D0E95 /* hmp.c in Sources */, 14F0D5B71A4CB34F00682BB0 /* ai.c in Sources */, 14F0D5B81A4CB34F00682BB0 /* ai2.c in Sources */, 14F0D5B91A4CB34F00682BB0 /* aipath.c in Sources */, @@ -2661,6 +2676,7 @@ 14F0D5EB1A4CB34F00682BB0 /* powerup.c in Sources */, 14F0D5EC1A4CB34F00682BB0 /* render.c in Sources */, 14F0D5ED1A4CB34F00682BB0 /* robot.c in Sources */, + 140D3B421A7DB909005D0E95 /* midi.c in Sources */, 14F0D5EE1A4CB34F00682BB0 /* scores.c in Sources */, 14F0D5EF1A4CB34F00682BB0 /* segment.c in Sources */, 14F0D5F01A4CB34F00682BB0 /* slew.c in Sources */, diff --git a/libmve/mveplay.c b/libmve/mveplay.c index 4bce32d9..db44792f 100644 --- a/libmve/mveplay.c +++ b/libmve/mveplay.c @@ -27,6 +27,7 @@ #if defined(AUDIO) #include +#include "SDL_mixer.h" #endif #include "mvelib.h" @@ -253,7 +254,7 @@ static int mve_audio_playing=0; static int mve_audio_canplay=0; static int mve_audio_compressed=0; static int mve_audio_enabled = 1; -static SDL_AudioSpec *mve_audio_spec=NULL; + static void mve_audio_callback(void *userdata, unsigned char *stream, int len) { @@ -364,24 +365,20 @@ static int create_audiobuf_handler(unsigned char major, unsigned char minor, uns fprintf(stderr, "sample rate = %d, stereo = %d, bitsize = %d, compressed = %d\n", sample_rate, stereo, bitsize ? 16 : 8, compressed); - mve_audio_spec = (SDL_AudioSpec *)mve_alloc(sizeof(SDL_AudioSpec)); - mve_audio_spec->freq = sample_rate; - mve_audio_spec->format = format; - mve_audio_spec->channels = (stereo) ? 2 : 1; - mve_audio_spec->samples = 4096; - mve_audio_spec->callback = mve_audio_callback; - mve_audio_spec->userdata = NULL; - if (SDL_OpenAudio(mve_audio_spec, NULL) >= 0) + if (!Mix_OpenAudio(sample_rate, format, stereo ? 2 : 1, 4096) >= 0) { fprintf(stderr, " success\n"); mve_audio_canplay = 1; } else { - fprintf(stderr, " failure : %s\n", SDL_GetError()); + fprintf(stderr, " failure : %s\n", Mix_GetError()); mve_audio_canplay = 0; } + Mix_SetPostMix(mve_audio_callback, NULL); + mve_audio_canplay = 1; + memset(mve_audio_buffers, 0, sizeof(mve_audio_buffers)); memset(mve_audio_buflens, 0, sizeof(mve_audio_buflens)); #endif @@ -394,7 +391,7 @@ static int play_audio_handler(unsigned char major, unsigned char minor, unsigned #ifdef AUDIO if (mve_audio_canplay && !mve_audio_playing && mve_audio_bufhead != mve_audio_buftail) { - SDL_PauseAudio(0); + Mix_Resume(-1); mve_audio_playing = 1; } #endif @@ -409,9 +406,6 @@ static int audio_data_handler(unsigned char major, unsigned char minor, unsigned int nsamp; if (mve_audio_canplay) { - if (mve_audio_playing) - SDL_LockAudio(); - chan = get_ushort(data + 2); nsamp = get_ushort(data + 4); if (chan & selected_chan) @@ -445,9 +439,6 @@ static int audio_data_handler(unsigned char major, unsigned char minor, unsigned if (mve_audio_buftail == mve_audio_bufhead) fprintf(stderr, "d'oh! buffer ring overrun (%d)\n", mve_audio_bufhead); } - - if (mve_audio_playing) - SDL_UnlockAudio(); } #endif @@ -729,7 +720,7 @@ void MVE_rmEndMovie() #ifdef AUDIO if (mve_audio_canplay) { // only close audio if we opened it - SDL_CloseAudio(); + Mix_CloseAudio(); mve_audio_canplay = 0; } for (i = 0; i < TOTAL_AUDIO_BUFFERS; i++) @@ -743,9 +734,6 @@ void MVE_rmEndMovie() mve_audio_playing=0; mve_audio_canplay=0; mve_audio_compressed=0; - if (mve_audio_spec) - mve_free(mve_audio_spec); - mve_audio_spec=NULL; audiobuf_created = 0; #endif diff --git a/main/menu.c b/main/menu.c index 29f5f48a..8b304e5e 100644 --- a/main/menu.c +++ b/main/menu.c @@ -1249,15 +1249,8 @@ void do_sound_menu() } #endif - - if ( Config_midi_volume.intval < 1 ) { - #ifndef MACINTOSH - digi_play_midi_song( NULL, NULL, NULL, 0 ); - #else - digi_play_midi_song(-1, 0); - #endif - } - + if ( Config_midi_volume.intval < 1 ) + digi_play_midi_song( NULL, NULL, NULL, 0 ); } diff --git a/main/songs.c b/main/songs.c index 7a2b55b0..341297b3 100644 --- a/main/songs.c +++ b/main/songs.c @@ -470,14 +470,8 @@ void songs_play_song( int songnum, int repeat ) else if (songnum == SONG_CREDITS) play_redbook_track(REDBOOK_CREDITS_TRACK,0); - if (!Redbook_playing) { //not playing redbook, so play midi - - #ifndef MACINTOSH - digi_play_midi_song( Songs[songnum].filename, Songs[songnum].melodic_bank_file, Songs[songnum].drum_bank_file, repeat ); - #else - digi_play_midi_song(songnum, repeat); - #endif - } + if (!Redbook_playing) // not playing redbook, so play midi + digi_play_midi_song( Songs[songnum].filename, Songs[songnum].melodic_bank_file, Songs[songnum].drum_bank_file, repeat ); } int current_song_level; @@ -519,11 +513,7 @@ void songs_play_level_song( int levelnum ) songnum = SONG_FIRST_LEVEL_SONG + (songnum % NumLevelSongs); - #ifndef MACINTOSH - digi_play_midi_song( Songs[songnum].filename, Songs[songnum].melodic_bank_file, Songs[songnum].drum_bank_file, 1 ); - #else - digi_play_midi_song( songnum, 1 ); - #endif + digi_play_midi_song( Songs[songnum].filename, Songs[songnum].melodic_bank_file, Songs[songnum].drum_bank_file, 1 ); } } diff --git a/misc/hmp.c b/misc/hmp.c index d8f92c75..8e2202df 100644 --- a/misc/hmp.c +++ b/misc/hmp.c @@ -5,13 +5,21 @@ * - Convert HMP to MIDI for further use * Based on work of Arne de Bruijn and the JFFEE project */ + +#ifdef HAVE_CONFIG_H +#include +#endif + #include #include #include #include + #include "hmp.h" #include "u_mem.h" #include "cfile.h" +#include "byteswap.h" + #ifdef WORDS_BIGENDIAN #define MIDIINT(x) (x) @@ -35,12 +43,10 @@ void hmp_close(hmp_file *hmp) } hmp_file *hmp_open(const char *filename) { - int i; + int i, data, num_tracks, tempo; char buf[256]; - long data; CFILE *fp; hmp_file *hmp; - int num_tracks; unsigned char *p; if (!(fp = cfopen((char *)filename, "rb"))) @@ -234,7 +240,7 @@ ubyte tempo [19] = {'M','T','r','k',0,0,0,11,0,0xFF,0x51,0x03,0x18,0x80,0x00,0,0 void hmp2mid(char *hmp_name, unsigned char **midbuf, unsigned int *midlen) { int mi, i; - short ms; + short ms, time_div = 0xC0; hmp_file *hmp=NULL; hmp = hmp_open(hmp_name); -- 2.39.2