From 622ee1c4cc3b040c023d1ca9fe97aa6714fc920e Mon Sep 17 00:00:00 2001 From: Emmanuel Maillard Date: Mon, 30 Apr 2007 14:39:44 +0200 Subject: [PATCH] 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 282d95818b4..abe845431ff 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 +#include #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 405f9990fcd..c93edc6c31d 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 c8bec5cdb26..d5d82b7949c 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; }