Emmanuel Maillard : winecoreaudio.drv: Implement MIDIOut_Data when device is a MOD_MIDIPORT.

Alexandre Julliard julliard at wine.codeweavers.com
Tue May 1 07:39:21 CDT 2007


Module: wine
Branch: master
Commit: 622ee1c4cc3b040c023d1ca9fe97aa6714fc920e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=622ee1c4cc3b040c023d1ca9fe97aa6714fc920e

Author: Emmanuel Maillard <mahanuu at free.fr>
Date:   Mon Apr 30 14:39:44 2007 +0200

winecoreaudio.drv: Implement MIDIOut_Data when device is a MOD_MIDIPORT.

Implement MIDIOut_Send.

---

 dlls/winecoreaudio.drv/coremidi.c |   13 +++++++++++++
 dlls/winecoreaudio.drv/coremidi.h |    2 ++
 dlls/winecoreaudio.drv/midi.c     |   25 +++++++++++++------------
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c
index 282d958..abe8454 100644
--- a/dlls/winecoreaudio.drv/coremidi.c
+++ b/dlls/winecoreaudio.drv/coremidi.c
@@ -26,6 +26,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(midi);
 
 #ifdef HAVE_COREAUDIO_COREAUDIO_H
 #include <CoreMIDI/CoreMIDI.h>
+#include <mach/mach_time.h>
 
 #include "coremidi.h"
 
@@ -72,4 +73,16 @@ void MIDIIn_ReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefC
         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);
+}
 #endif /* HAVE_COREAUDIO_COREAUDIO_H */
diff --git a/dlls/winecoreaudio.drv/coremidi.h b/dlls/winecoreaudio.drv/coremidi.h
index 405f999..c93edc6 100644
--- a/dlls/winecoreaudio.drv/coremidi.h
+++ b/dlls/winecoreaudio.drv/coremidi.h
@@ -76,6 +76,8 @@ extern MIDIClientRef CoreMIDI_CreateClient(CFStringRef name);
 extern void CoreMIDI_GetObjectName(MIDIObjectRef obj, char *name, int size);
 extern void MIDIIn_ReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon);
 
+extern void MIDIOut_Send(MIDIPortRef port, MIDIEndpointRef dest, UInt8 *buffer, unsigned length);
+
 /* midi.c */
 void MIDIIn_SendMessage(MIDIMessage msg);
 
diff --git a/dlls/winecoreaudio.drv/midi.c b/dlls/winecoreaudio.drv/midi.c
index c8bec5c..d5d82b7 100644
--- a/dlls/winecoreaudio.drv/midi.c
+++ b/dlls/winecoreaudio.drv/midi.c
@@ -303,10 +303,6 @@ static DWORD MIDIOut_Open(WORD wDevID, LPMIDIOPENDESC lpDesc, DWORD dwFlags)
             return MMSYSERR_ERROR;
         }
     }
-    else
-    {
-        FIXME("MOD_MIDIPORT\n");
-    }
     dest->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK);
     dest->midiDesc = *lpDesc;
 
@@ -326,8 +322,6 @@ static DWORD MIDIOut_Close(WORD wDevID)
 
     if (destinations[wDevID].caps.wTechnology == MOD_SYNTH)
         SynthUnit_Close(destinations[wDevID].graph);
-    else
-        FIXME("MOD_MIDIPORT\n");
 
     destinations[wDevID].graph = 0;
     destinations[wDevID].synth = 0;
@@ -344,10 +338,7 @@ static DWORD MIDIOut_Close(WORD wDevID)
 static DWORD MIDIOut_Data(WORD wDevID, DWORD dwParam)
 {
     WORD evt = LOBYTE(LOWORD(dwParam));
-    WORD d1  = HIBYTE(LOWORD(dwParam));
-    WORD d2  = LOBYTE(HIWORD(dwParam));
     UInt8 chn = (evt & 0x0F);
-    OSStatus err = noErr;
 
     TRACE("wDevID=%d dwParam=%08X\n", wDevID, dwParam);
 
@@ -356,10 +347,12 @@ static DWORD MIDIOut_Data(WORD wDevID, DWORD dwParam)
 	return MMSYSERR_BADDEVICEID;
     }
 
-    TRACE("evt=%08x d1=%04x d2=%04x (evt & 0xF0)=%04x chn=%d\n", evt, d1, d2, (evt & 0xF0), chn);
-
     if (destinations[wDevID].caps.wTechnology == MOD_SYNTH)
     {
+        WORD d1  = HIBYTE(LOWORD(dwParam));
+        WORD d2  = LOBYTE(HIWORD(dwParam));
+        OSStatus err = noErr;
+
         err = MusicDeviceMIDIEvent(destinations[wDevID].synth, (evt & 0xF0) | chn, d1, d2, 0);
         if (err != noErr)
         {
@@ -367,7 +360,15 @@ static DWORD MIDIOut_Data(WORD wDevID, DWORD dwParam)
             return MMSYSERR_ERROR;
         }
     }
-    else FIXME("MOD_MIDIPORT\n");
+    else
+    {
+        UInt8 buffer[3];
+        buffer[0] = (evt & 0xF0) | chn;
+        buffer[1] = HIBYTE(LOWORD(dwParam));
+        buffer[2] = LOBYTE(HIWORD(dwParam));
+
+        MIDIOut_Send(MIDIOutPort, destinations[wDevID].dest, buffer, 3);
+    }
 
     return MMSYSERR_NOERROR;
 }




More information about the wine-cvs mailing list