From 40be9c68319018c6e4513e5e2a1d74dd869f2d34 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Wed, 13 Nov 2002 04:34:45 +0000 Subject: [PATCH] An ugly hack to allow music looping in simon1talkie Most likely better wat to do this... svn-id: r5525 --- simon/midi.cpp | 96 ++++++++++++++++++++++++++++++++++++++++++------- simon/midi.h | 8 ++--- simon/simon.cpp | 12 +++---- 3 files changed, 92 insertions(+), 24 deletions(-) diff --git a/simon/midi.cpp b/simon/midi.cpp index 391aa5dbfac..50c4709b8ce 100644 --- a/simon/midi.cpp +++ b/simon/midi.cpp @@ -31,7 +31,7 @@ // FIXME: This is a horrible place to put this, but for now.... #include "sound/midistreamer.cpp" -void MidiPlayer::read_all_songs(File *in) +void MidiPlayer::read_all_songs(File *in, uint music) { uint i, num; @@ -40,11 +40,11 @@ void MidiPlayer::read_all_songs(File *in) num = in->readByte(); for (i = 0; i != num; i++) { - read_one_song(in, &_songs[i]); + read_one_song(in, &_songs[i], music); } } -void MidiPlayer::read_all_songs_old(File *in) +void MidiPlayer::read_all_songs_old(File *in, uint music) { uint i, num; @@ -53,11 +53,11 @@ void MidiPlayer::read_all_songs_old(File *in) num = 1; for (i = 0; i != num; i++) { - read_one_song(in, &_songs[i]); + read_one_song(in, &_songs[i], music); } } -void MidiPlayer::read_mthd(File *in, Song *s, bool old) +void MidiPlayer::read_mthd(File *in, Song *s, bool old, uint music) { Track *t; uint i; @@ -88,11 +88,81 @@ void MidiPlayer::read_mthd(File *in, Song *s, bool old) t->data_size = in->readUint32BE(); } else { - uint32 pos = in->pos(); - in->seek(0, SEEK_END); - uint32 end = in->pos(); - in->seek(pos, SEEK_SET); - t->data_size = end - pos; + //FIXME We currently don't know how to find out music track size for GMF midi format + // So we use music files sizes minues header for now to allow looping + if (music == 0) + t->data_size = 8900; + if (music == 1) + t->data_size = 12166; + if (music == 2) + t->data_size = 2848; + if (music == 3) + t->data_size = 3442; + if (music == 4) + t->data_size = 4034; + if (music == 5) + t->data_size = 4508; + if (music == 6) + t->data_size = 7064; + if (music == 7) + t->data_size = 9730; + if (music == 8) + t->data_size = 6014; + if (music == 9) + t->data_size = 4742; + if (music == 10) + t->data_size = 3138; + if (music == 11) + t->data_size = 6570; + if (music == 12) + t->data_size = 5384; + if (music == 13) + t->data_size = 8909; + if (music == 14) + t->data_size = 6457; + if (music == 15) + t->data_size = 16321; + if (music == 16) + t->data_size = 2742; + if (music == 17) + t->data_size = 8968; + if (music == 18) + t->data_size = 4804; + if (music == 19) + t->data_size = 8442; + if (music == 20) + t->data_size = 7717; + if (music == 21) + t->data_size = 9444; + if (music == 22) + t->data_size = 5800; + if (music == 23) + t->data_size = 1381; + if (music == 24) + t->data_size = 5660; + if (music == 25) + t->data_size = 6684; + if (music == 26) + t->data_size = 2456; + if (music == 27) + t->data_size = 4744; + if (music == 28) + t->data_size = 2455; + if (music == 29) + t->data_size = 1177; + if (music == 30) + t->data_size = 1232; + if (music == 31) + t->data_size = 17256; + if (music == 32) + t->data_size = 5103; + if (music == 33) + t->data_size = 8794; + if (music == 34) + t->data_size = 4884; + if (music == 35) + t->data_size = 16; + t->data_size = t->data_size - 8; } t->data_ptr = (byte *)calloc(t->data_size, 1); @@ -117,7 +187,7 @@ void MidiPlayer::read_mthd(File *in, Song *s, bool old) } } -void MidiPlayer::read_one_song(File *in, Song *s) +void MidiPlayer::read_one_song(File *in, Song *s, uint music) { _lastDelay = 0; @@ -130,12 +200,12 @@ void MidiPlayer::read_one_song(File *in, Song *s) switch (id) { case 'MThd': - read_mthd(in, s, false); + read_mthd(in, s, false, music); break; case 'GMF\x1': warning("Old style songs not properly supported yet"); - read_mthd(in, s, true); + read_mthd(in, s, true, music); break; default: diff --git a/simon/midi.h b/simon/midi.h index 63281f36b3a..a3f443b99a6 100644 --- a/simon/midi.h +++ b/simon/midi.h @@ -28,8 +28,8 @@ struct MidiEvent; class MidiPlayer { public: - void read_all_songs(File *in); - void read_all_songs_old(File *in); + void read_all_songs(File *in, uint music); + void read_all_songs_old(File *in, uint music); void initialize(); void shutdown(); void play(); @@ -69,9 +69,9 @@ private: uint32 _volumeTable[16]; - void read_mthd(File *in, Song *s, bool old); + void read_mthd(File *in, Song *s, bool old, uint music); - void read_one_song(File *in, Song *s); + void read_one_song(File *in, Song *s, uint music); static uint32 track_read_gamma(Track *t); static byte track_read_byte(Track *t); diff --git a/simon/simon.cpp b/simon/simon.cpp index 573ae536bde..1bd6c169533 100644 --- a/simon/simon.cpp +++ b/simon/simon.cpp @@ -4991,14 +4991,12 @@ void SimonState::playAmbient(uint sound) void SimonState::playMusic(uint music) { - /* FIXME: not properly implemented */ - /* Simon 1 dos talkie music doesn't detect correct size of music data */ - /* Simon 2 dos talkie music isn't supported */ - /* Simon 2 dos music isn't supported */ + /* TODO */ + /* Simon 2 dos / talkie music requires xmi midi format support */ if (_game & GAME_WIN) { midi.shutdown(); _game_file->seek(_game_offsets_ptr[gss->MUSIC_INDEX_BASE + music], SEEK_SET); - midi.read_all_songs(_game_file); + midi.read_all_songs(_game_file, music); midi.initialize(); midi.play(); @@ -5007,7 +5005,7 @@ void SimonState::playMusic(uint music) if (_game & GAME_TALKIE) { _game_file->seek(_game_offsets_ptr[gss->MUSIC_INDEX_BASE + music], SEEK_SET); - midi.read_all_songs_old(_game_file); + midi.read_all_songs_old(_game_file, music); } else { char buf[50]; File *f = new File(); @@ -5017,7 +5015,7 @@ void SimonState::playMusic(uint music) warning("Cannot load music from '%s'", buf); return; } - midi.read_all_songs_old(f); + midi.read_all_songs_old(f, music); delete f; }