AUDIO/MIDI: Add multisource support to QuickTime MIDI parser

Adds support for passing a source number to the MIDI driver to the QuickTime
MIDI parser.
This commit is contained in:
Coen Rampen 2021-07-09 15:17:02 +02:00
parent 9f96a86fec
commit 3c16991c05
3 changed files with 38 additions and 9 deletions

View file

@ -492,7 +492,7 @@ public:
static MidiParser *createParser_SMF(int8 source = -1); static MidiParser *createParser_SMF(int8 source = -1);
static MidiParser *createParser_XMIDI(XMidiCallbackProc proc = defaultXMidiCallback, void *refCon = 0, int 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(); } static void timerCallback(void *data) { ((MidiParser *) data)->onTimer(); }
}; };
/** @} */ /** @} */

View file

@ -21,6 +21,7 @@
*/ */
#include "audio/midiparser_qt.h" #include "audio/midiparser_qt.h"
#include "audio/mididrv.h"
#include "common/debug.h" #include "common/debug.h"
#include "common/memstream.h" #include "common/memstream.h"
@ -399,6 +400,22 @@ void MidiParser_QT::resetTracking() {
_partMap.clear(); _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) { Common::QuickTimeParser::SampleDesc *MidiParser_QT::readSampleDesc(Track *track, uint32 format, uint32 descSize) {
if (track->codecType == CODEC_TYPE_MIDI) { if (track->codecType == CODEC_TYPE_MIDI) {
debug(0, "MIDI Codec FourCC '%s'", tag2str(format)); debug(0, "MIDI Codec FourCC '%s'", tag2str(format));
@ -495,6 +512,6 @@ uint32 MidiParser_QT::readUint32() {
return value; return value;
} }
MidiParser *MidiParser::createParser_QT() { MidiParser *MidiParser::createParser_QT(int8 source) {
return new MidiParser_QT(); return new MidiParser_QT(source);
} }

View file

@ -55,12 +55,12 @@
*/ */
class MidiParser_QT : public MidiParser, public Common::QuickTimeParser { class MidiParser_QT : public MidiParser, public Common::QuickTimeParser {
public: public:
MidiParser_QT() {} MidiParser_QT(int8 source = -1) : _source(source) {}
~MidiParser_QT() {} ~MidiParser_QT() {}
// MidiParser // MidiParser
bool loadMusic(byte *data, uint32 size); bool loadMusic(byte *data, uint32 size) override;
void unloadMusic(); void unloadMusic() override;
/** /**
* Load the MIDI from a 'Tune' resource * Load the MIDI from a 'Tune' resource
@ -79,11 +79,23 @@ public:
protected: protected:
// MidiParser // MidiParser
void parseNextEvent(EventInfo &info); void parseNextEvent(EventInfo &info) override;
void resetTracking(); void resetTracking() override;
void sendToDriver(uint32 b) override;
void sendMetaEventToDriver(byte type, byte *data, uint16 length) override;
// QuickTimeParser // 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: private:
struct MIDITrackInfo { struct MIDITrackInfo {