winecoreaudio: MIDIIn_MessageHandler: Fix non-SysEx messages parsing.
This commit is contained in:
parent
f203ed946b
commit
6ccb663953
|
@ -851,6 +851,8 @@ static CFDataRef MIDIIn_MessageHandler(CFMessagePortRef local, SInt32 msgid, CFD
|
||||||
int i = 0;
|
int i = 0;
|
||||||
MIDISource *src = NULL;
|
MIDISource *src = NULL;
|
||||||
DWORD sendData = 0;
|
DWORD sendData = 0;
|
||||||
|
int pos = 0;
|
||||||
|
DWORD currentTime;
|
||||||
|
|
||||||
switch (msgid)
|
switch (msgid)
|
||||||
{
|
{
|
||||||
|
@ -886,17 +888,32 @@ static CFDataRef MIDIIn_MessageHandler(CFMessagePortRef local, SInt32 msgid, CFD
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
EnterCriticalSection(&midiInLock);
|
EnterCriticalSection(&midiInLock);
|
||||||
if (msg->length == 3)
|
currentTime = GetTickCount() - src->startTime;
|
||||||
|
|
||||||
|
while (pos < msg->length)
|
||||||
{
|
{
|
||||||
sendData = (msg->data[2] << 16) |
|
sendData = 0;
|
||||||
(msg->data[1] << 8) |
|
switch (msg->data[pos] & 0xF0)
|
||||||
(msg->data[0] << 0);
|
{
|
||||||
|
case 0xF0:
|
||||||
|
sendData = (msg->data[pos] << 0);
|
||||||
|
pos++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0xC0:
|
||||||
|
case 0xD0:
|
||||||
|
sendData = (msg->data[pos + 1] << 8) | (msg->data[pos] << 0);
|
||||||
|
pos += 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sendData = (msg->data[pos + 2] << 16) |
|
||||||
|
(msg->data[pos + 1] << 8) |
|
||||||
|
(msg->data[pos] << 0);
|
||||||
|
pos += 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
MIDI_NotifyClient(msg->devID, MIM_DATA, sendData, currentTime);
|
||||||
}
|
}
|
||||||
if (msg->length == 2)
|
|
||||||
{
|
|
||||||
sendData = (msg->data[1] << 8) | (msg->data[0] << 0);
|
|
||||||
}
|
|
||||||
MIDI_NotifyClient(msg->devID, MIM_DATA, sendData, GetTickCount() - src->startTime);
|
|
||||||
LeaveCriticalSection(&midiInLock);
|
LeaveCriticalSection(&midiInLock);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue