aboutsummaryrefslogtreecommitdiff
path: root/audio
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2013-09-21 00:21:08 +0200
committerWillem Jan Palenstijn2013-09-21 00:22:58 +0200
commitda81c593081ffebb33740ada85d9c2a5084f7d0a (patch)
tree35b7a75ef8d2dc8f5d15e6fc4ceba496d53616f2 /audio
parent6c5a5cd8e90fcaafae6fd6f409fde04b29fa7e7a (diff)
downloadscummvm-rg350-da81c593081ffebb33740ada85d9c2a5084f7d0a.tar.gz
scummvm-rg350-da81c593081ffebb33740ada85d9c2a5084f7d0a.tar.bz2
scummvm-rg350-da81c593081ffebb33740ada85d9c2a5084f7d0a.zip
AUDIO: Let jumpToTick use processEvent too
Diffstat (limited to 'audio')
-rw-r--r--audio/midiparser.cpp61
-rw-r--r--audio/midiparser.h2
2 files changed, 26 insertions, 37 deletions
diff --git a/audio/midiparser.cpp b/audio/midiparser.cpp
index 0a8183669d..23da903b6d 100644
--- a/audio/midiparser.cpp
+++ b/audio/midiparser.cpp
@@ -229,14 +229,16 @@ void MidiParser::onTimer() {
}
}
-bool MidiParser::processEvent(const EventInfo &info) {
+bool MidiParser::processEvent(const EventInfo &info, bool fireEvents) {
if (info.event == 0xF0) {
// SysEx event
// Check for trailing 0xF7 -- if present, remove it.
- if (info.ext.data[info.length-1] == 0xF7)
- _driver->sysEx(info.ext.data, (uint16)info.length-1);
- else
- _driver->sysEx(info.ext.data, (uint16)info.length);
+ if (fireEvents) {
+ if (info.ext.data[info.length-1] == 0xF7)
+ _driver->sysEx(info.ext.data, (uint16)info.length-1);
+ else
+ _driver->sysEx(info.ext.data, (uint16)info.length);
+ }
} else if (info.event == 0xFF) {
// META event
if (info.ext.type == 0x2F) {
@@ -247,7 +249,8 @@ bool MidiParser::processEvent(const EventInfo &info) {
parseNextEvent(_nextEvent);
} else {
stopPlaying();
- _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
+ if (fireEvents)
+ _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
}
return false;
} else if (info.ext.type == 0x51) {
@@ -255,9 +258,11 @@ bool MidiParser::processEvent(const EventInfo &info) {
setTempo(info.ext.data[0] << 16 | info.ext.data[1] << 8 | info.ext.data[2]);
}
}
- _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
+ if (fireEvents)
+ _driver->metaEvent(info.ext.type, info.ext.data, (uint16)info.length);
} else {
- sendToDriver(info.event, info.basic.param1, info.basic.param2);
+ if (fireEvents)
+ sendToDriver(info.event, info.basic.param1, info.basic.param2);
}
return true;
@@ -399,34 +404,18 @@ bool MidiParser::jumpToTick(uint32 tick, bool fireEvents, bool stopNotes, bool d
_position._playTick = _position._lastEventTick;
_position._playTime = _position._lastEventTime;
- if (info.event == 0xFF) {
- if (info.ext.type == 0x2F) { // End of track
- _position = currentPos;
- _nextEvent = currentEvent;
- return false;
- } else {
- if (info.ext.type == 0x51 && info.length >= 3) // Tempo
- setTempo(info.ext.data[0] << 16 | info.ext.data[1] << 8 | info.ext.data[2]);
- if (fireEvents)
- _driver->metaEvent(info.ext.type, info.ext.data, (uint16) info.length);
- }
- } else if (fireEvents) {
- if (info.event == 0xF0) {
- if (info.ext.data[info.length-1] == 0xF7)
- _driver->sysEx(info.ext.data, (uint16)info.length-1);
- else
- _driver->sysEx(info.ext.data, (uint16)info.length);
- } else {
- // The note on sending code is used by the SCUMM engine. Other engine using this code
- // (such as SCI) have issues with this, as all the notes sent can be heard when a song
- // is fast-forwarded. Thus, if the engine requests it, don't send note on events.
- if (info.command() == 0x9 && dontSendNoteOn) {
- // Don't send note on; doing so creates a "warble" with some instruments on the MT-32.
- // Refer to patch #3117577
- } else {
- sendToDriver(info.event, info.basic.param1, info.basic.param2);
- }
- }
+ // Some special processing for the fast-forward case
+ if (info.command() == 0x9 && dontSendNoteOn) {
+ // Don't send note on; doing so creates a "warble" with
+ // some instruments on the MT-32. Refer to patch #3117577
+ } else if (info.event == 0xFF && info.ext.type == 0x2F) {
+ // End of track
+ // This means that we failed to find the right tick.
+ _position = currentPos;
+ _nextEvent = currentEvent;
+ return false;
+ } else {
+ processEvent(info, fireEvents);
}
parseNextEvent(_nextEvent);
diff --git a/audio/midiparser.h b/audio/midiparser.h
index 4470d7d980..e9a8881cf6 100644
--- a/audio/midiparser.h
+++ b/audio/midiparser.h
@@ -293,7 +293,7 @@ protected:
virtual void resetTracking();
virtual void allNotesOff();
virtual void parseNextEvent(EventInfo &info) = 0;
- virtual bool processEvent(const EventInfo &info);
+ 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);