diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/i_oplmusic.c | 23 | ||||
-rw-r--r-- | src/i_sdlmusic.c | 6 |
2 files changed, 20 insertions, 9 deletions
diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c index f38e7162..5f9ab462 100644 --- a/src/i_oplmusic.c +++ b/src/i_oplmusic.c @@ -47,7 +47,7 @@ #define PERCUSSION_LOG_LEN 16 // TODO: Figure out why this is needed. -#define TEMPO_FUDGE_FACTOR 0.26 +#define TEMPO_FUDGE_FACTOR 260 typedef struct { @@ -1016,6 +1016,12 @@ static void PitchBendEvent(opl_track_data_t *track, midi_event_t *event) } } +static void MetaSetTempo(unsigned int tempo) +{ + OPL_AdjustCallbacks((float) us_per_beat / tempo); + us_per_beat = tempo; +} + // Process a meta event. static void MetaEvent(opl_track_data_t *track, midi_event_t *event) @@ -1041,7 +1047,7 @@ static void MetaEvent(opl_track_data_t *track, midi_event_t *event) case MIDI_META_SET_TEMPO: if (data_len == 3) { - us_per_beat = (data[0] << 16) | (data[1] << 8) | data[2]; + MetaSetTempo((data[0] << 16) | (data[1] << 8) | data[2]); } break; @@ -1154,7 +1160,7 @@ static void TrackTimerCallback(void *arg) if (running_tracks <= 0 && song_looping) { - OPL_SetCallback(5, RestartSong, NULL); + OPL_SetCallback(5000, RestartSong, NULL); } return; @@ -1168,19 +1174,18 @@ static void TrackTimerCallback(void *arg) static void ScheduleTrack(opl_track_data_t *track) { unsigned int nticks; - unsigned int ms; - static int total = 0; + uint64_t us; - // Get the number of milliseconds until the next event. + // Get the number of microseconds until the next event. nticks = MIDI_GetDeltaTime(track->iter); - ms = (nticks * us_per_beat * TEMPO_FUDGE_FACTOR) / ticks_per_beat; - total += ms; + us = ((uint64_t) nticks * us_per_beat * TEMPO_FUDGE_FACTOR) + / ticks_per_beat; // Set a timer to be invoked when the next event is // ready to play. - OPL_SetCallback(ms, TrackTimerCallback, track); + OPL_SetCallback(us, TrackTimerCallback, track); } // Initialize a channel. diff --git a/src/i_sdlmusic.c b/src/i_sdlmusic.c index 81b28515..e7f0aacb 100644 --- a/src/i_sdlmusic.c +++ b/src/i_sdlmusic.c @@ -485,6 +485,11 @@ static char *GetFullPath(char *base_filename, char *path) } #endif + // Paths in the substitute filenames can contain Unix-style / + // path separators, but we should convert this to the separator + // for the native platform. + path = M_StringReplace(path, "/", DIR_SEPARATOR_S); + // Copy config filename and cut off the filename to just get the // parent dir. basedir = strdup(base_filename); @@ -499,6 +504,7 @@ static char *GetFullPath(char *base_filename, char *path) result = strdup(path); } free(basedir); + free(path); return result; } |