diff options
author | Alyssa Milburn | 2014-01-27 00:13:58 +0100 |
---|---|---|
committer | Alyssa Milburn | 2014-01-27 00:20:50 +0100 |
commit | f92df4c6aab9ffb06ed241ae22779bdf11dc540c (patch) | |
tree | 4849c54c3be4ba2fc597ddf6e51cf7fa2fef2419 /audio | |
parent | 83ce4cfb5e72975805875000200e8ab2ff2c8319 (diff) | |
download | scummvm-rg350-f92df4c6aab9ffb06ed241ae22779bdf11dc540c.tar.gz scummvm-rg350-f92df4c6aab9ffb06ed241ae22779bdf11dc540c.tar.bz2 scummvm-rg350-f92df4c6aab9ffb06ed241ae22779bdf11dc540c.zip |
Revert "AUDIO: Simplify MidiTracker::processEvent return value"
MI2 deletes the parser object(!) so we can't access any member
variables here. Thanks to athrxx for finding this.
This reverts commit 86c2fe47e04449602e4c005fa0a9c183bc8bba39 and adds
a comment explaining why.
Diffstat (limited to 'audio')
-rw-r--r-- | audio/midiparser.cpp | 22 | ||||
-rw-r--r-- | audio/midiparser.h | 2 |
2 files changed, 14 insertions, 10 deletions
diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp index 2454575413..61f82c4ca4 100644 --- a/audio/midiparser.cpp +++ b/audio/midiparser.cpp @@ -214,13 +214,16 @@ void MidiParser::onTimer() { activeNote(info.channel(), info.basic.param1, true); } - processEvent(info); - - if (_abortParse) - break; + // Player::metaEvent() in SCUMM will delete the parser object, + // so return immediately if that might have happened. + bool ret = processEvent(info); + if (!ret) + return; - _position._lastEventTime = eventTime; - parseNextEvent(_nextEvent); + if (!_abortParse) { + _position._lastEventTime = eventTime; + parseNextEvent(_nextEvent); + } } if (!_abortParse) { @@ -229,7 +232,7 @@ void MidiParser::onTimer() { } } -void MidiParser::processEvent(const EventInfo &info, bool fireEvents) { +bool MidiParser::processEvent(const EventInfo &info, bool fireEvents) { if (info.event == 0xF0) { // SysEx event // Check for trailing 0xF7 -- if present, remove it. @@ -252,8 +255,7 @@ void MidiParser::processEvent(const EventInfo &info, bool fireEvents) { if (fireEvents) _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length); } - _abortParse = true; - return; + return false; } else if (info.ext.type == 0x51) { if (info.length >= 3) { setTempo(info.ext.data[0] << 16 | info.ext.data[1] << 8 | info.ext.data[2]); @@ -265,6 +267,8 @@ void MidiParser::processEvent(const EventInfo &info, bool fireEvents) { if (fireEvents) sendToDriver(info.event, info.basic.param1, info.basic.param2); } + + return true; } diff --git a/audio/midiparser.h b/audio/midiparser.h index 05d0cbe1db..9499d01512 100644 --- a/audio/midiparser.h +++ b/audio/midiparser.h @@ -294,7 +294,7 @@ protected: virtual void resetTracking(); virtual void allNotesOff(); virtual void parseNextEvent(EventInfo &info) = 0; - virtual void processEvent(const EventInfo &info, bool fireEvents = true); + virtual bool processEvent(const EventInfo &info, bool fireEvents = true); void activeNote(byte channel, byte note, bool active); void hangingNote(byte channel, byte note, uint32 ticksLeft, bool recycle = true); |