Huw Davies : winecoreaudio: Move midi_out_data to the unixlib.
Alexandre Julliard
julliard at winehq.org
Fri Nov 26 15:46:28 CST 2021
Module: wine
Branch: master
Commit: 1a1ef23079151840e1a44ad5fe7ba563cf2ab971
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1a1ef23079151840e1a44ad5fe7ba563cf2ab971
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Nov 25 11:03:41 2021 +0000
winecoreaudio: Move midi_out_data to the unixlib.
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 | 49 +++++++++++++++++++++++++++++++++++++++
dlls/winecoreaudio.drv/midi.c | 40 --------------------------------
2 files changed, 49 insertions(+), 40 deletions(-)
diff --git a/dlls/winecoreaudio.drv/coremidi.c b/dlls/winecoreaudio.drv/coremidi.c
index 6fddbd7d88a..4dc4166dda1 100644
--- a/dlls/winecoreaudio.drv/coremidi.c
+++ b/dlls/winecoreaudio.drv/coremidi.c
@@ -463,6 +463,52 @@ static DWORD midi_out_close(WORD dev_id, struct notify_context *notify)
return MMSYSERR_NOERROR;
}
+static void midi_send(MIDIPortRef port, MIDIEndpointRef dest, UInt8 *buffer, unsigned len)
+{
+ Byte packet_buf[512];
+ MIDIPacketList *packet_list = (MIDIPacketList *)packet_buf;
+ MIDIPacket *packet = MIDIPacketListInit(packet_list);
+
+ packet = MIDIPacketListAdd(packet_list, sizeof(packet_buf), packet, mach_absolute_time(), len, buffer);
+ if (packet) MIDISend(port, dest, packet_list);
+}
+
+static DWORD midi_out_data(WORD dev_id, DWORD data)
+{
+ struct midi_dest *dest;
+ UInt8 bytes[3];
+ OSStatus sc;
+
+ TRACE("dev_id = %d data = %08x\n", dev_id, data);
+
+ if (dev_id >= num_dests)
+ {
+ WARN("bad device ID : %d\n", dev_id);
+ return MMSYSERR_BADDEVICEID;
+ }
+
+ bytes[0] = data & 0xff;
+ bytes[1] = (data >> 8) & 0xff;
+ bytes[2] = (data >> 16) & 0xff;
+
+ dest = dests + dev_id;
+ if (dest->caps.wTechnology == MOD_SYNTH)
+ {
+ sc = MusicDeviceMIDIEvent(dest->synth, bytes[0], bytes[1], bytes[2], 0);
+ if (sc != noErr)
+ {
+ ERR("MusicDeviceMIDIEvent returns %s\n", wine_dbgstr_fourcc(sc));
+ return MMSYSERR_ERROR;
+ }
+ }
+ else
+ {
+ midi_send(midi_out_port, dest->dest, bytes, sizeof(bytes));
+ }
+
+ return MMSYSERR_NOERROR;
+}
+
NTSTATUS midi_out_message(void *args)
{
struct midi_out_message_params *params = args;
@@ -483,6 +529,9 @@ NTSTATUS midi_out_message(void *args)
case MODM_CLOSE:
*params->err = midi_out_close(params->dev_id, params->notify);
break;
+ case MODM_DATA:
+ *params->err = midi_out_data(params->dev_id, params->param_1);
+ break;
default:
TRACE("Unsupported message\n");
*params->err = MMSYSERR_NOTSUPPORTED;
diff --git a/dlls/winecoreaudio.drv/midi.c b/dlls/winecoreaudio.drv/midi.c
index e2418645968..98b0a17a147 100644
--- a/dlls/winecoreaudio.drv/midi.c
+++ b/dlls/winecoreaudio.drv/midi.c
@@ -163,44 +163,6 @@ static void MIDI_NotifyClient(UINT wDevID, WORD wMsg, DWORD_PTR dwParam1, DWORD_
DriverCallback(dwCallBack, uFlags, hDev, wMsg, dwInstance, dwParam1, dwParam2);
}
-static DWORD MIDIOut_Data(WORD wDevID, DWORD dwParam)
-{
- WORD evt = LOBYTE(LOWORD(dwParam));
- UInt8 chn = (evt & 0x0F);
-
- TRACE("wDevID=%d dwParam=%08X\n", wDevID, dwParam);
-
- if (wDevID >= MIDIOut_NumDevs) {
- WARN("bad device ID : %d\n", wDevID);
- return MMSYSERR_BADDEVICEID;
- }
-
- 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)
- {
- ERR("MusicDeviceMIDIEvent(%p, %04x, %04x, %04x, %d) return %s\n", destinations[wDevID].synth, (evt & 0xF0) | chn, d1, d2, 0, wine_dbgstr_fourcc(err));
- return MMSYSERR_ERROR;
- }
- }
- 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;
-}
-
static DWORD MIDIOut_LongData(WORD wDevID, LPMIDIHDR lpMidiHdr, DWORD dwSize)
{
LPBYTE lpData;
@@ -763,8 +725,6 @@ DWORD WINAPI CoreAudio_modMessage(UINT wDevID, UINT wMsg, DWORD_PTR dwUser, DWOR
TRACE("%d %08x %08lx %08lx %08lx\n", wDevID, wMsg, dwUser, dwParam1, dwParam2);
switch (wMsg) {
- case MODM_DATA:
- return MIDIOut_Data(wDevID, dwParam1);
case MODM_LONGDATA:
return MIDIOut_LongData(wDevID, (LPMIDIHDR)dwParam1, dwParam2);
case MODM_PREPARE:
More information about the wine-cvs
mailing list