diff --git a/audio/midiparser.h b/audio/midiparser.h index 5896cd47b2d..1604b05160d 100644 --- a/audio/midiparser.h +++ b/audio/midiparser.h @@ -492,7 +492,7 @@ public: static MidiParser *createParser_SMF(int8 source = -1); static MidiParser *createParser_XMIDI(XMidiCallbackProc proc = defaultXMidiCallback, void *refCon = 0, int source = -1); - static MidiParser *createParser_QT(); + static MidiParser *createParser_QT(int8 source = -1); static void timerCallback(void *data) { ((MidiParser *) data)->onTimer(); } }; /** @} */ diff --git a/audio/midiparser_qt.cpp b/audio/midiparser_qt.cpp index 87bc96ab2b9..7b4fb6cad92 100644 --- a/audio/midiparser_qt.cpp +++ b/audio/midiparser_qt.cpp @@ -21,6 +21,7 @@ */ #include "audio/midiparser_qt.h" +#include "audio/mididrv.h" #include "common/debug.h" #include "common/memstream.h" @@ -399,6 +400,22 @@ void MidiParser_QT::resetTracking() { _partMap.clear(); } +void MidiParser_QT::sendToDriver(uint32 b) { + if (_source < 0) { + MidiParser::sendToDriver(b); + } else { + _driver->send(_source, b); + } +} + +void MidiParser_QT::sendMetaEventToDriver(byte type, byte *data, uint16 length) { + if (_source < 0) { + MidiParser::sendMetaEventToDriver(type, data, length); + } else { + _driver->metaEvent(_source, type, data, length); + } +} + Common::QuickTimeParser::SampleDesc *MidiParser_QT::readSampleDesc(Track *track, uint32 format, uint32 descSize) { if (track->codecType == CODEC_TYPE_MIDI) { debug(0, "MIDI Codec FourCC '%s'", tag2str(format)); @@ -495,6 +512,6 @@ uint32 MidiParser_QT::readUint32() { return value; } -MidiParser *MidiParser::createParser_QT() { - return new MidiParser_QT(); +MidiParser *MidiParser::createParser_QT(int8 source) { + return new MidiParser_QT(source); } diff --git a/audio/midiparser_qt.h b/audio/midiparser_qt.h index d7d9a435fbf..e5e67f35979 100644 --- a/audio/midiparser_qt.h +++ b/audio/midiparser_qt.h @@ -55,12 +55,12 @@ */ class MidiParser_QT : public MidiParser, public Common::QuickTimeParser { public: - MidiParser_QT() {} + MidiParser_QT(int8 source = -1) : _source(source) {} ~MidiParser_QT() {} // MidiParser - bool loadMusic(byte *data, uint32 size); - void unloadMusic(); + bool loadMusic(byte *data, uint32 size) override; + void unloadMusic() override; /** * Load the MIDI from a 'Tune' resource @@ -79,11 +79,23 @@ public: protected: // MidiParser - void parseNextEvent(EventInfo &info); - void resetTracking(); + void parseNextEvent(EventInfo &info) override; + void resetTracking() override; + + void sendToDriver(uint32 b) override; + void sendMetaEventToDriver(byte type, byte *data, uint16 length) override; // QuickTimeParser - SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize); + SampleDesc *readSampleDesc(Track *track, uint32 format, uint32 descSize) override; + + /** + * The source number to use when sending MIDI messages to the driver. + * When using multiple sources, use source 0 and higher. This must be + * used when source volume or channel locking is used. + * By default this is -1, which means the parser is the only source + * of MIDI messages and multiple source functionality is disabled. + */ + int8 _source; private: struct MIDITrackInfo {