diff --git a/src/music/allegro_m.cpp b/src/music/allegro_m.cpp index 77b4881..d434304 100644 --- a/src/music/allegro_m.cpp +++ b/src/music/allegro_m.cpp @@ -58,7 +58,7 @@ void MusicDriver_Allegro::Stop() if (--_allegro_instance_count == 0) allegro_exit(); } -void MusicDriver_Allegro::PlaySong(const char *filename) +void MusicDriver_Allegro::PlaySong(const char *filename, int time_start, int time_end, bool loop) { if (_midi != NULL) destroy_midi(_midi); _midi = load_midi(filename); diff --git a/src/music/allegro_m.h b/src/music/allegro_m.h index 69cf595..68cac0d 100644 --- a/src/music/allegro_m.h +++ b/src/music/allegro_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/bemidi.cpp b/src/music/bemidi.cpp index 2bc2074..a34e5a1 100644 --- a/src/music/bemidi.cpp +++ b/src/music/bemidi.cpp @@ -34,7 +34,7 @@ void MusicDriver_BeMidi::Stop() midiSynthFile.UnloadFile(); } -void MusicDriver_BeMidi::PlaySong(const char *filename) +void MusicDriver_BeMidi::PlaySong(const char *filename, int time_start, int time_end, bool loop) { this->Stop(); entry_ref midiRef; diff --git a/src/music/bemidi.h b/src/music/bemidi.h index 23c6249..fb8ce1c 100644 --- a/src/music/bemidi.h +++ b/src/music/bemidi.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/cocoa_m.cpp b/src/music/cocoa_m.cpp index 925dc21..b68ee6e 100644 --- a/src/music/cocoa_m.cpp +++ b/src/music/cocoa_m.cpp @@ -143,7 +143,7 @@ void MusicDriver_Cocoa::Stop() * * @param filename Path to a MIDI file. */ -void MusicDriver_Cocoa::PlaySong(const char *filename) +void MusicDriver_Cocoa::PlaySong(const char *filename, int time_start, int time_end, bool loop) { DEBUG(driver, 2, "cocoa_m: trying to play '%s'", filename); diff --git a/src/music/cocoa_m.h b/src/music/cocoa_m.h index 1963bef..cc9d453 100644 --- a/src/music/cocoa_m.h +++ b/src/music/cocoa_m.h @@ -20,7 +20,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/dmusic.cpp b/src/music/dmusic.cpp index de3bda8..bfc94f3 100644 --- a/src/music/dmusic.cpp +++ b/src/music/dmusic.cpp @@ -216,7 +216,7 @@ void MusicDriver_DMusic::Stop() } -void MusicDriver_DMusic::PlaySong(const char *filename) +void MusicDriver_DMusic::PlaySong(const char *filename, int time_start, int time_end, bool loop) { /* set up the loader object info */ DMUS_OBJECTDESC obj_desc; diff --git a/src/music/dmusic.h b/src/music/dmusic.h index 7287623..8a31eb5 100644 --- a/src/music/dmusic.h +++ b/src/music/dmusic.h @@ -23,7 +23,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/extmidi.cpp b/src/music/extmidi.cpp index d39a050..572e11a 100644 --- a/src/music/extmidi.cpp +++ b/src/music/extmidi.cpp @@ -83,7 +83,7 @@ void MusicDriver_ExtMidi::Stop() this->DoStop(); } -void MusicDriver_ExtMidi::PlaySong(const char *filename) +void MusicDriver_ExtMidi::PlaySong(const char *filename, int time_start, int time_end, bool loop) { strecpy(this->song, filename, lastof(this->song)); this->DoStop(); diff --git a/src/music/extmidi.h b/src/music/extmidi.h index cfbd894..5724b34 100644 --- a/src/music/extmidi.h +++ b/src/music/extmidi.h @@ -28,7 +28,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/libtimidity.cpp b/src/music/libtimidity.cpp index 1cb2adc..a50991e 100644 --- a/src/music/libtimidity.cpp +++ b/src/music/libtimidity.cpp @@ -96,7 +96,7 @@ void MusicDriver_LibTimidity::Stop() mid_exit(); } -void MusicDriver_LibTimidity::PlaySong(const char *filename) +void MusicDriver_LibTimidity::PlaySong(const char *filename, int time_start, int time_end, bool loop) { this->StopSong(); diff --git a/src/music/libtimidity.h b/src/music/libtimidity.h index abe17e7..2ee7ecc 100644 --- a/src/music/libtimidity.h +++ b/src/music/libtimidity.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/music_driver.hpp b/src/music/music_driver.hpp index be09d3e..5a0d5f5 100644 --- a/src/music/music_driver.hpp +++ b/src/music/music_driver.hpp @@ -21,7 +21,7 @@ public: * Play a particular song. * @param filename The name of file with the song to play. */ - virtual void PlaySong(const char *filename) = 0; + virtual void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false) = 0; /** * Stop playing the current song. diff --git a/src/music/null_m.h b/src/music/null_m.h index df9f7d8..0e615bd 100644 --- a/src/music/null_m.h +++ b/src/music/null_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop() { } - /* virtual */ void PlaySong(const char *filename) { } + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false) { } /* virtual */ void StopSong() { } diff --git a/src/music/os2_m.cpp b/src/music/os2_m.cpp index d7fb97d..622008e 100644 --- a/src/music/os2_m.cpp +++ b/src/music/os2_m.cpp @@ -49,7 +49,7 @@ static long CDECL MidiSendCommand(const char *cmd, ...) /** OS/2's music player's factory. */ static FMusicDriver_OS2 iFMusicDriver_OS2; -void MusicDriver_OS2::PlaySong(const char *filename) +void MusicDriver_OS2::PlaySong(const char *filename, int time_start, int time_end, bool loop) { MidiSendCommand("close all"); diff --git a/src/music/os2_m.h b/src/music/os2_m.h index f35e2fd..f01b0bf 100644 --- a/src/music/os2_m.h +++ b/src/music/os2_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/qtmidi.cpp b/src/music/qtmidi.cpp index 9bc6a61..4219695 100644 --- a/src/music/qtmidi.cpp +++ b/src/music/qtmidi.cpp @@ -258,7 +258,7 @@ void MusicDriver_QtMidi::Stop() * * @param filename Path to a MIDI file. */ -void MusicDriver_QtMidi::PlaySong(const char *filename) +void MusicDriver_QtMidi::PlaySong(const char *filename, int time_start, int time_end, bool loop) { if (!_quicktime_started) return; diff --git a/src/music/qtmidi.h b/src/music/qtmidi.h index f0e1708..4b29324 100644 --- a/src/music/qtmidi.h +++ b/src/music/qtmidi.h @@ -20,7 +20,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music/win32_m.cpp b/src/music/win32_m.cpp index fff0376..e1e7f07 100644 --- a/src/music/win32_m.cpp +++ b/src/music/win32_m.cpp @@ -31,7 +31,7 @@ static struct { static FMusicDriver_Win32 iFMusicDriver_Win32; -void MusicDriver_Win32::PlaySong(const char *filename) +void MusicDriver_Win32::PlaySong(const char *filename, int time_start, int time_end, bool loop) { assert(filename != NULL); strecpy(_midi.start_song, filename, lastof(_midi.start_song)); diff --git a/src/music/win32_m.h b/src/music/win32_m.h index 3efee32..cec1b1c 100644 --- a/src/music/win32_m.h +++ b/src/music/win32_m.h @@ -21,7 +21,7 @@ public: /* virtual */ void Stop(); - /* virtual */ void PlaySong(const char *filename); + /* virtual */ void PlaySong(const char *filename, int time_start = 0, int time_end = 0, bool loop = false); /* virtual */ void StopSong(); diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 32cf65d..84dc8c3 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -183,10 +183,16 @@ static void MusicVolumeChanged(byte new_vol) static void DoPlaySong() { char filename[MAX_PATH]; - if (FioFindFullPath(filename, lastof(filename), BASESET_DIR, BaseMusic::GetUsedSet()->files[_music_wnd_cursong - 1].filename) == NULL) { - FioFindFullPath(filename, lastof(filename), OLD_GM_DIR, BaseMusic::GetUsedSet()->files[_music_wnd_cursong - 1].filename); + int songid = _music_wnd_cursong - 1; + const MusicSet &set = *BaseMusic::GetUsedSet(); + if (FioFindFullPath(filename, lastof(filename), BASESET_DIR, set.files[songid].filename) == NULL) { + FioFindFullPath(filename, lastof(filename), OLD_GM_DIR, set.files[songid].filename); } - MusicDriver::GetInstance()->PlaySong(filename); + bool loop = false; + if (_music_wnd_cursong == 1 && _game_mode == GM_MENU) { + loop = true; + } + MusicDriver::GetInstance()->PlaySong(filename, set.override_start[songid], set.override_end[songid], loop); SetWindowDirty(WC_MUSIC_WINDOW, 0); }