diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp index c26fbe3..045fd9d 100644 --- a/engines/agos/midi.cpp +++ b/engines/agos/midi.cpp @@ -52,7 +52,7 @@ MidiPlayer::MidiPlayer() { _paused = false; _currentTrack = 255; - _loopTrack = 0; + _loopTrackDefault = false; _queuedTrack = 255; _loopQueuedTrack = 0; } @@ -166,13 +166,13 @@ void MidiPlayer::metaEvent(byte type, byte *data, uint16 length) { return; } else if (_current == &_sfx) { clearConstructs(_sfx); - } else if (_loopTrack) { + } else if (_current->loopTrack) { _current->parser->jumpToTick(0); } else if (_queuedTrack != 255) { _currentTrack = 255; byte destination = _queuedTrack; _queuedTrack = 255; - _loopTrack = _loopQueuedTrack; + _current->loopTrack = _loopQueuedTrack; _loopQueuedTrack = false; // Remember, we're still inside the locked mutex. @@ -300,7 +300,7 @@ void MidiPlayer::setVolume(int musicVol, int sfxVol) { void MidiPlayer::setLoop(bool loop) { Common::StackLock lock(_mutex); - _loopTrack = loop; + _loopTrackDefault = loop; } void MidiPlayer::queueTrack(int track, bool loop) { @@ -405,7 +405,7 @@ void MidiPlayer::loadSMF(Common::File *in, int song, bool sfx) { uint32 timerRate = _driver->getBaseTempo(); - if (!memcmp(p->data, "GMF\x1", 4)) { + if (isGMF) { // The GMF header // 3 BYTES: 'GMF' // 1 BYTE : Major version @@ -426,11 +426,9 @@ void MidiPlayer::loadSMF(Common::File *in, int song, bool sfx) { // It seems that 4 corresponds to our base tempo, so // this should be the right way to calculate it. timerRate = (4 * _driver->getBaseTempo()) / p->data[5]; - - // According to bug #1004919 calling setLoop() from - // within a lock causes a lockup, though I have no - // idea when this actually happens. - _loopTrack = (p->data[6] != 0); + p->loopTrack = (p->data[6] != 0); + } else { + p->loopTrack = _loopTrackDefault; } MidiParser *parser = MidiParser::createParser_SMF(); @@ -500,6 +498,8 @@ void MidiPlayer::loadMultipleSMF(Common::File *in, bool sfx) { p->song_sizes[i] = size; } + p->loopTrack = _loopTrackDefault; + if (!sfx) { _currentTrack = 255; resetVolumeTable(); @@ -531,6 +531,7 @@ void MidiPlayer::loadXMIDI(Common::File *in, bool sfx) { in->seek(pos, 0); p->data = (byte *)calloc(size, 1); in->read(p->data, size); + p->loopTrack = _loopTrackDefault; } else { error("Expected 'FORM' tag but found '%c%c%c%c' instead", buf[0], buf[1], buf[2], buf[3]); } @@ -575,6 +576,7 @@ void MidiPlayer::loadS1D(Common::File *in, bool sfx) { _currentTrack = 255; resetVolumeTable(); } + p->loopTrack = _loopTrackDefault; p->parser = parser; // That plugs the power cord into the wall } diff --git a/engines/agos/midi.h b/engines/agos/midi.h index 3efaddd..398e445 100644 --- a/engines/agos/midi.h +++ b/engines/agos/midi.h @@ -36,6 +36,7 @@ namespace AGOS { struct MusicInfo { MidiParser *parser; byte *data; + bool loopTrack; byte num_songs; // For Type 1 SMF resources byte *songs[16]; // For Type 1 SMF resources uint32 song_sizes[16]; // For Type 1 SMF resources @@ -46,6 +47,7 @@ struct MusicInfo { MusicInfo() { clear(); } void clear() { parser = 0; data = 0; num_songs = 0; + loopTrack = false; memset(songs, 0, sizeof(songs)); memset(song_sizes, 0, sizeof(song_sizes)); memset(channel, 0, sizeof(channel)); @@ -71,7 +73,7 @@ protected: // These are only used for music. byte _currentTrack; - bool _loopTrack; + bool _loopTrackDefault; byte _queuedTrack; bool _loopQueuedTrack;