aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorTorbjörn Andersson2014-08-18 13:45:20 +0200
committerTorbjörn Andersson2014-08-18 13:45:20 +0200
commit46d1c106ca560c285c556a0b02b54d76bc6a29ba (patch)
tree4698d244baf773b0b221e9b1d718e43a15627486 /engines
parent09d1dee599de4e345e93b17af76d000870d340eb (diff)
downloadscummvm-rg350-46d1c106ca560c285c556a0b02b54d76bc6a29ba.tar.gz
scummvm-rg350-46d1c106ca560c285c556a0b02b54d76bc6a29ba.tar.bz2
scummvm-rg350-46d1c106ca560c285c556a0b02b54d76bc6a29ba.zip
AGOS: Give each MIDI track its own loop flag
This is needed because the MIDI resources have their own loop flag that overrides the global one. This makes a difference for games that use MIDI both for music and sound effects, such as (limited to?) the floppy version of Simon the Sorcerer 1.
Diffstat (limited to 'engines')
-rw-r--r--engines/agos/midi.cpp22
-rw-r--r--engines/agos/midi.h4
2 files changed, 15 insertions, 11 deletions
diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp
index c26fbe3331..045fd9dac5 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 3efadddc2f..398e445535 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;