winecoreaudio : implement MIDIOut_Data when device is a MOD_MIDIPORT
Emmanuel Maillard
mahanuu at free.fr
Mon Apr 30 09:26:44 CDT 2007
Changelog :
- implement MIDIOut_Data when device is a MOD_MIDIPORT
- implement MIDIOut_Send
-------------- next part --------------
From b9fc46a948b2c23056583efc8b43a0996a1e6743 Mon Sep 17 00:00:00 2001
From: Emmanuel Maillard <mahanuu at free.fr>
Date: Mon, 30 Apr 2007 14:39:44 +0200
Subject: [PATCH] - 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 | 27 ++++++++++++++-------------
3 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c
index 282d958..2304800 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 MIDIPacketLis
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_CreateClie
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 30c9a14..e9dd0e6 100644
--- a/dlls/winecoreaudio.drv/midi.c
+++ b/dlls/winecoreaudio.drv/midi.c
@@ -303,10 +303,6 @@ static DWORD MIDIOut_Open(WORD wDevID, L
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, D
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,8 +360,16 @@ static DWORD MIDIOut_Data(WORD wDevID, D
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;
}
--
1.4.4
More information about the wine-patches
mailing list