mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-26 11:46:54 +00:00
AUDIO: Clean up note request list reading
This commit is contained in:
parent
ac4c8cd335
commit
c5ab2fc95f
@ -54,50 +54,27 @@ private:
|
|||||||
ToneDescription tone;
|
ToneDescription tone;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef Common::Array<NoteRequest> NoteRequestList;
|
||||||
|
|
||||||
class MIDISampleDesc : public SampleDesc {
|
class MIDISampleDesc : public SampleDesc {
|
||||||
public:
|
public:
|
||||||
MIDISampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag);
|
MIDISampleDesc(Common::QuickTimeParser::Track *parentTrack, uint32 codecTag);
|
||||||
~MIDISampleDesc() {}
|
~MIDISampleDesc() {}
|
||||||
|
|
||||||
Common::Array<NoteRequest> _noteRequests;
|
NoteRequestList _noteRequests;
|
||||||
};
|
};
|
||||||
|
|
||||||
Common::String readString31();
|
Common::String readString31();
|
||||||
Common::Rational readFixed();
|
Common::Rational readFixed();
|
||||||
|
NoteRequestList readNoteRequestList();
|
||||||
};
|
};
|
||||||
|
|
||||||
Common::QuickTimeParser::SampleDesc *MidiParser_QT::readSampleDesc(Track *track, uint32 format) {
|
Common::QuickTimeParser::SampleDesc *MidiParser_QT::readSampleDesc(Track *track, uint32 format) {
|
||||||
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));
|
||||||
|
|
||||||
/* uint32 flags = */ _fd->readUint32BE(); // always 0
|
|
||||||
|
|
||||||
MIDISampleDesc *entry = new MIDISampleDesc(track, format);
|
MIDISampleDesc *entry = new MIDISampleDesc(track, format);
|
||||||
|
entry->_noteRequests = readNoteRequestList();
|
||||||
for (;;) {
|
|
||||||
uint32 event = _fd->readUint32BE();
|
|
||||||
|
|
||||||
if ((event & 0xF000FFFF) != 0xF0000017) // note request event
|
|
||||||
break;
|
|
||||||
|
|
||||||
NoteRequest request;
|
|
||||||
request.part = (event >> 16) & 0xFFF;
|
|
||||||
request.info.flags = _fd->readByte();
|
|
||||||
request.info.reserved = _fd->readByte();
|
|
||||||
request.info.polyphony = _fd->readUint16BE();
|
|
||||||
request.info.typicalPolyphony = readFixed();
|
|
||||||
request.tone.synthesizerType = _fd->readUint32BE();
|
|
||||||
request.tone.synthesizerName = readString31();
|
|
||||||
request.tone.instrumentName = readString31();
|
|
||||||
request.tone.instrumentNumber = _fd->readUint32BE();
|
|
||||||
request.tone.gmNumber = _fd->readUint32BE();
|
|
||||||
|
|
||||||
if (_fd->readUint32BE() != 0xC0010017) // general event note request
|
|
||||||
error("Invalid instrument end event");
|
|
||||||
|
|
||||||
entry->_noteRequests.push_back(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,3 +102,37 @@ Common::Rational MidiParser_QT::readFixed() {
|
|||||||
uint16 fractionalPart = _fd->readUint16BE();
|
uint16 fractionalPart = _fd->readUint16BE();
|
||||||
return integerPart + Common::Rational(fractionalPart, 0x10000);
|
return integerPart + Common::Rational(fractionalPart, 0x10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MidiParser_QT::NoteRequestList MidiParser_QT::readNoteRequestList() {
|
||||||
|
NoteRequestList requests;
|
||||||
|
|
||||||
|
/* uint32 flags = */ _fd->readUint32BE(); // always 0
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
uint32 event = _fd->readUint32BE();
|
||||||
|
|
||||||
|
if (event == 0x60000000) // marker event
|
||||||
|
break;
|
||||||
|
else if ((event & 0xF000FFFF) != 0xF0000017) // note request event
|
||||||
|
error("Invalid note request event");
|
||||||
|
|
||||||
|
NoteRequest request;
|
||||||
|
request.part = (event >> 16) & 0xFFF;
|
||||||
|
request.info.flags = _fd->readByte();
|
||||||
|
request.info.reserved = _fd->readByte();
|
||||||
|
request.info.polyphony = _fd->readUint16BE();
|
||||||
|
request.info.typicalPolyphony = readFixed();
|
||||||
|
request.tone.synthesizerType = _fd->readUint32BE();
|
||||||
|
request.tone.synthesizerName = readString31();
|
||||||
|
request.tone.instrumentName = readString31();
|
||||||
|
request.tone.instrumentNumber = _fd->readUint32BE();
|
||||||
|
request.tone.gmNumber = _fd->readUint32BE();
|
||||||
|
|
||||||
|
if (_fd->readUint32BE() != 0xC0010017) // general event note request
|
||||||
|
error("Invalid instrument end event");
|
||||||
|
|
||||||
|
requests.push_back(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
return requests;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user