Huw Davies : winecoreaudio: Combine MIDIIn_SendMessage into MIDIIn_ReadProc.
Alexandre Julliard
julliard at winehq.org
Fri Nov 26 15:46:28 CST 2021
Module: wine
Branch: master
Commit: dcbbe185197b6c81b5a9cd9fdcdb9cfd64c4aab7
URL: https://source.winehq.org/git/wine.git/?a=commit;h=dcbbe185197b6c81b5a9cd9fdcdb9cfd64c4aab7
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Nov 25 11:03:37 2021 +0000
winecoreaudio: Combine MIDIIn_SendMessage into MIDIIn_ReadProc.
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
More information about the wine-cvs
mailing list