diff options
author | Travis Howell | 2002-11-13 04:34:45 +0000 |
---|---|---|
committer | Travis Howell | 2002-11-13 04:34:45 +0000 |
commit | 40be9c68319018c6e4513e5e2a1d74dd869f2d34 (patch) | |
tree | c45d748002869fa11c9f47b242024db8a9dcab8e /simon | |
parent | 66a6a1cbd53309f539dc140dcb3b9b3a7ad5194e (diff) | |
download | scummvm-rg350-40be9c68319018c6e4513e5e2a1d74dd869f2d34.tar.gz scummvm-rg350-40be9c68319018c6e4513e5e2a1d74dd869f2d34.tar.bz2 scummvm-rg350-40be9c68319018c6e4513e5e2a1d74dd869f2d34.zip |
An ugly hack to allow music looping in simon1talkie
Most likely better wat to do this...
svn-id: r5525
Diffstat (limited to 'simon')
-rw-r--r-- | simon/midi.cpp | 96 | ||||
-rw-r--r-- | simon/midi.h | 8 | ||||
-rw-r--r-- | simon/simon.cpp | 12 |
3 files changed, 92 insertions, 24 deletions
diff --git a/simon/midi.cpp b/simon/midi.cpp index 391aa5dbfa..50c4709b8c 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 63281f36b3..a3f443b99a 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 573ae536bd..1bd6c16953 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; } |