Commit a45ffebe authored by Michał Wiernowolski's avatar Michał Wiernowolski Committed by Alexandre Julliard

winealsa: Improved handling of SysEx MIDI messages.

parent 73bec118
...@@ -351,17 +351,19 @@ static DWORD WINAPI midRecThread(LPVOID arg) ...@@ -351,17 +351,19 @@ static DWORD WINAPI midRecThread(LPVOID arg)
LPBYTE ptr = (BYTE*) ev->data.ext.ptr; LPBYTE ptr = (BYTE*) ev->data.ext.ptr;
LPMIDIHDR lpMidiHdr; LPMIDIHDR lpMidiHdr;
/* FIXME: Should handle sysex greater that a single buffer */ /* FIXME: Should handle sysex greater than lpMidiHdr->dwBufferLength */
EnterCriticalSection(&crit_sect); EnterCriticalSection(&crit_sect);
if ((lpMidiHdr = MidiInDev[wDevID].lpQueueHdr) != NULL) { if ((lpMidiHdr = MidiInDev[wDevID].lpQueueHdr) != NULL) {
if (len <= lpMidiHdr->dwBufferLength) { if (lpMidiHdr->dwBytesRecorded + len <= lpMidiHdr->dwBufferLength) {
lpMidiHdr->dwBytesRecorded = len; memcpy(lpMidiHdr->lpData + lpMidiHdr->dwBytesRecorded, ptr, len);
memcpy(lpMidiHdr->lpData, ptr, len); lpMidiHdr->dwBytesRecorded += len;
if (*(ptr + (len-1)) == 0xF7) {
lpMidiHdr->dwFlags &= ~MHDR_INQUEUE; lpMidiHdr->dwFlags &= ~MHDR_INQUEUE;
lpMidiHdr->dwFlags |= MHDR_DONE; lpMidiHdr->dwFlags |= MHDR_DONE;
MidiInDev[wDevID].lpQueueHdr = (LPMIDIHDR)lpMidiHdr->lpNext; MidiInDev[wDevID].lpQueueHdr = (LPMIDIHDR)lpMidiHdr->lpNext;
if (MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD)lpMidiHdr, dwTime) != MMSYSERR_NOERROR) if (MIDI_NotifyClient(wDevID, MIM_LONGDATA, (DWORD)lpMidiHdr, dwTime) != MMSYSERR_NOERROR)
WARN("Couldn't notify client\n"); WARN("Couldn't notify client\n");
}
} else } else
FIXME("No enough space in the buffer to store sysex!\n"); FIXME("No enough space in the buffer to store sysex!\n");
} else } else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment