int MidiParser::parse(midi_byte_t* input, unsigned int length){ unsigned int consumedBytes = 0; for(unsigned int n = 0; n < length; n++){ consumedBytes++; if(waitingForStatus == true){ int statusByte = input[n]; MidiMessageType newType = kmmNone; if (statusByte >= 0x80){//it actually is a status byte for(int n = 0; n < midiMessageStatusBytesLength; n++){ //find the statusByte in the array if(midiMessageStatusBytes[n] == (statusByte&0xf0)){ newType = (MidiMessageType)n; break; } } elapsedDataBytes = 0; waitingForStatus = false; messages[writePointer].setType(newType); messages[writePointer].setChannel((midi_byte_t)(statusByte&0xf)); consumedBytes++; } else { // either something went wrong or it's a system message continue; } } else { messages[writePointer].setDataByte(elapsedDataBytes, input[n]); elapsedDataBytes++; if(elapsedDataBytes == messages[writePointer].getNumDataBytes()){ // done with the current message // call the callback if available if(isCallbackEnabled() == true){ messageReadyCallback(getNextChannelMessage(), callbackArg); } waitingForStatus = true; writePointer++; if(writePointer == messages.size()){ writePointer = 0; } } } } return consumedBytes; };
void MoodBoxServer::getNextChannelMessage(Callback callback, qint32 channelId, qint32 lastMessageId, bool skipMessage) { getNextChannelMessage(callback, QVariant(), channelId, lastMessageId, skipMessage); }