/* * Wine Midi driver for Mac OS X * * Copyright 2006 Emmanuel Maillard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include <CoreMIDI/CoreMIDI.h> #include <mach/mach_time.h> #include "coremidi.h" MIDIClientRef CoreMIDI_CreateClient(CFStringRef name) { MIDIClientRef client = NULL; if (MIDIClientCreate(name, NULL /* FIXME use notify proc */, NULL, &client) != noErr) return NULL; return client; } void CoreMIDI_GetObjectName(MIDIObjectRef obj, char *name, int size) { OSStatus err = noErr; CFStringRef cfname; err = MIDIObjectGetStringProperty(obj, kMIDIPropertyName, &cfname); if (err == noErr) { CFStringGetCString(cfname, name, size, kCFStringEncodingASCII); CFRelease(cfname); } } /* * CoreMIDI IO threaded callback, * we can't call Wine debug channels, critical section or anything using NtCurrentTeb here. */ void MIDIIn_ReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon) { unsigned int i; MIDIMessage msg; MIDIPacket *packet = (MIDIPacket *)pktlist->packet; for (i = 0; i < pktlist->numPackets; ++i) { msg.devID = *((UInt16 *)connRefCon); msg.length = packet->length; memcpy(msg.data, packet->data, sizeof(packet->data)); MIDIIn_SendMessage(msg); packet = MIDIPacketNext(packet); } } void MIDIOut_Send(MIDIPortRef port, MIDIEndpointRef dest, UInt8 *buffer, unsigned length) { Byte packetBuff[512]; MIDIPacketList *packetList = (MIDIPacketList *)packetBuff; MIDIPacket *packet = MIDIPacketListInit(packetList); packet = MIDIPacketListAdd(packetList, sizeof(packetBuff), packet, mach_absolute_time(), length, buffer); if (packet) MIDISend(port, dest, packetList); }