Skip to content

Commit 9dbc8e9

Browse files
committed
FIX: MIDI implementation for macOS so it works same like on Windows
1 parent 952d76f commit 9dbc8e9

File tree

1 file changed

+29
-2
lines changed

1 file changed

+29
-2
lines changed

src/os/osx/dev-midi.c

+29-2
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#endif
4747

4848
#ifdef INCLUDE_MIDI_DEVICE
49+
//#define DEBUG_MIDI
4950

5051
#ifdef TO_MACOS
5152

@@ -121,6 +122,15 @@ static REBSER *CFString_To_REBSER(CFStringRef source)
121122
return ser;
122123
}
123124

125+
static void Send_Event(REBMID *midi_port, REBINT type) {
126+
REBEVT evt;
127+
CLEARS(&evt);
128+
evt.model = EVM_MIDI;
129+
evt.type = type;
130+
evt.port = midi_port->port;
131+
RL_Update_Event(&evt);
132+
}
133+
124134
/***********************************************************************
125135
**
126136
*/ static int Midi_Push_Buffer(REBSER* buffer, u32 data)
@@ -165,6 +175,17 @@ static void MidiInProc(const MIDIPacketList *pktlist, void *refCon, void *connRe
165175
{
166176
REBMID midi_port;
167177
REBU64 id = (REBU64)refCon;
178+
uint64_t elapsed;
179+
uint64_t elapsedMs;
180+
static mach_timebase_info_data_t sTimebaseInfo;
181+
182+
// If this is the first time we've run, get the timebase.
183+
// We can use denom == 0 to indicate that sTimebaseInfo is
184+
// uninitialised because it makes no sense to have a zero
185+
// denominator is a fraction.
186+
if ( sTimebaseInfo.denom == 0 ) {
187+
(void) mach_timebase_info(&sTimebaseInfo);
188+
}
168189

169190
if (id >= Midi_Ports_Pool.count) return;
170191

@@ -176,10 +197,13 @@ static void MidiInProc(const MIDIPacketList *pktlist, void *refCon, void *connRe
176197
if (packet->data[0] >= 0x80 && packet->data[0] < 0xF0) {
177198
Midi_Push_Buffer(midi_port.inp_buffer, ((u32*)packet->data)[0]);
178199
// report timestamp in miliseconds like on Windows
179-
Midi_Push_Buffer(midi_port.inp_buffer, (u32)((packet->timeStamp - midi_port.started) / 1000000UL));
200+
elapsed = packet->timeStamp - midi_port.started;
201+
elapsedMs = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom / 1e6;
202+
Midi_Push_Buffer(midi_port.inp_buffer, (u32)elapsedMs);
180203
}
181204
packet = MIDIPacketNext(packet);
182205
}
206+
Send_Event(&midi_port, EVT_READ);
183207
}
184208

185209

@@ -301,6 +325,9 @@ static void PrintMidiDevices()
301325
}
302326
req->handle = (void*)midi_port;
303327
SET_OPEN(req);
328+
329+
Send_Event(midi_port, EVT_OPEN);
330+
304331
return DR_DONE;
305332
}
306333

@@ -327,7 +354,7 @@ static void PrintMidiDevices()
327354
midi_port->started = 0;
328355
midi_port->out_device = 0;
329356
}
330-
357+
Send_Event(midi_port, EVT_CLOSE);
331358
midi_port->port = NULL;
332359
req->handle = NULL;
333360
SET_CLOSED(req);

0 commit comments

Comments
 (0)