Module: wine Branch: master Commit: dcbbe185197b6c81b5a9cd9fdcdb9cfd64c4aab7 URL: https://source.winehq.org/git/wine.git/?a=commit;h=dcbbe185197b6c81b5a9cd9fd...
Author: Huw Davies huw@codeweavers.com Date: Thu Nov 25 11:03:37 2021 +0000
winecoreaudio: Combine MIDIIn_SendMessage into MIDIIn_ReadProc.
Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Andrew Eikum aeikum@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winecoreaudio.drv/coremidi.c | 31 ++++++++++++++++++------- dlls/winecoreaudio.drv/coremidi.h | 8 ++++++- dlls/winecoreaudio.drv/midi.c | 48 +++++---------------------------------- 3 files changed, 36 insertions(+), 51 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c index 6d54d89cfac..92f52c972d3 100644 --- a/dlls/winecoreaudio.drv/coremidi.c +++ b/dlls/winecoreaudio.drv/coremidi.c @@ -1,7 +1,11 @@ /* - * Wine Midi driver for Mac OS X + * MIDI driver for macOS (unixlib) * - * Copyright 2006 Emmanuel Maillard + * Copyright 1994 Martin Ayotte + * Copyright 1998 Luiz Otavio L. Zorzella + * Copyright 1998, 1999 Eric POUECH + * Copyright 2005, 2006 Emmanuel Maillard + * Copyright 2021 Huw Davies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -56,14 +60,25 @@ void CoreMIDI_GetObjectName(MIDIObjectRef obj, char *name, int size) */ void MIDIIn_ReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon) { - unsigned int i; - + CFMessagePortRef msg_port = CFMessagePortCreateRemote(kCFAllocatorDefault, MIDIInThreadPortName); MIDIPacket *packet = (MIDIPacket *)pktlist->packet; - for (i = 0; i < pktlist->numPackets; ++i) { - UInt16 devID = *((UInt16 *)connRefCon); - - MIDIIn_SendMessage(devID, packet->data, packet->length); + CFMutableDataRef data; + MIDIMessage msg; + unsigned int i;
+ for (i = 0; i < pktlist->numPackets; ++i) + { + msg.devID = *(UInt16 *)connRefCon; + msg.length = packet->length; + data = CFDataCreateMutable(kCFAllocatorDefault, sizeof(msg) + packet->length); + if (data) + { + CFDataAppendBytes(data, (UInt8 *)&msg, sizeof(msg)); + CFDataAppendBytes(data, packet->data, packet->length); + CFMessagePortSendRequest(msg_port, 0, data, 0.0, 0.0, NULL, NULL); + CFRelease(data); + } packet = MIDIPacketNext(packet); } + CFRelease(msg_port); } diff --git a/dlls/winecoreaudio.drv/coremidi.h b/dlls/winecoreaudio.drv/coremidi.h index 3433a1d4342..47566345b54 100644 --- a/dlls/winecoreaudio.drv/coremidi.h +++ b/dlls/winecoreaudio.drv/coremidi.h @@ -73,6 +73,12 @@ extern void MIDIIn_ReadProc(const MIDIPacketList *pktlist, void *refCon, void *c extern void MIDIOut_Send(MIDIPortRef port, MIDIEndpointRef dest, UInt8 *buffer, unsigned length);
/* midi.c */ -void MIDIIn_SendMessage(UInt16 devID, const void *buffer, UInt16 length); +extern CFStringRef MIDIInThreadPortName; + +typedef struct { + UInt16 devID; + UInt16 length; + Byte data[]; +} MIDIMessage;
#endif diff --git a/dlls/winecoreaudio.drv/midi.c b/dlls/winecoreaudio.drv/midi.c index 32826cb658c..2c89f32b430 100644 --- a/dlls/winecoreaudio.drv/midi.c +++ b/dlls/winecoreaudio.drv/midi.c @@ -1,14 +1,11 @@ /* - * Sample MIDI Wine Driver for Mac OS X (based on OSS midi driver) + * MIDI driver for macOS (PE-side) * - * Copyright 1994 Martin Ayotte - * Copyright 1998 Luiz Otavio L. Zorzella (init procedures) - * Copyright 1998/1999 Eric POUECH : - * 98/7 changes for making this MIDI driver work on OSS - * current support is limited to MIDI ports of OSS systems - * 98/9 rewriting MCI code for MIDI - * 98/11 split in midi.c and mcimidi.c + * Copyright 1994 Martin Ayotte + * Copyright 1998 Luiz Otavio L. Zorzella + * Copyright 1998, 1999 Eric POUECH * Copyright 2005, 2006 Emmanuel Maillard + * Copyright 2021 Huw Davies * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -78,14 +75,8 @@ typedef struct tagMIDISource { DWORD startTime; } MIDISource;
-typedef struct { - UInt16 devID; - UInt16 length; - Byte data[]; -} MIDIMessage; - static CRITICAL_SECTION midiInLock; /* Critical section for MIDI In */ -static CFStringRef MIDIInThreadPortName = NULL; +CFStringRef MIDIInThreadPortName = NULL;
static DWORD WINAPI MIDIIn_MessageThread(LPVOID p);
@@ -798,33 +789,6 @@ static DWORD MIDIIn_Reset(WORD wDevID) /* * MIDI In Mach message handling */ - -/* - * Call from CoreMIDI IO threaded callback, - * we can't call Wine debug channels, critical section or anything using NtCurrentTeb here. - */ -void MIDIIn_SendMessage(UInt16 devID, const void *buffer, UInt16 length) -{ - MIDIMessage msg; - CFMutableDataRef data; - - CFMessagePortRef messagePort; - messagePort = CFMessagePortCreateRemote(kCFAllocatorDefault, MIDIInThreadPortName); - - msg.devID = devID; - msg.length = length; - - data = CFDataCreateMutable(kCFAllocatorDefault, sizeof(msg) + length); - if (data) - { - CFDataAppendBytes(data, (UInt8 *) &msg, sizeof(msg)); - CFDataAppendBytes(data, buffer, length); - CFMessagePortSendRequest(messagePort, 0, data, 0.0, 0.0, NULL, NULL); - CFRelease(data); - } - CFRelease(messagePort); -} - static CFDataRef MIDIIn_MessageHandler(CFMessagePortRef local, SInt32 msgid, CFDataRef data, void *info) { MIDIMessage *msg = NULL;