46
46
#endif
47
47
48
48
#ifdef INCLUDE_MIDI_DEVICE
49
+ //#define DEBUG_MIDI
49
50
50
51
#ifdef TO_MACOS
51
52
@@ -121,6 +122,15 @@ static REBSER *CFString_To_REBSER(CFStringRef source)
121
122
return ser ;
122
123
}
123
124
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
+
124
134
/***********************************************************************
125
135
**
126
136
*/ static int Midi_Push_Buffer (REBSER * buffer , u32 data )
@@ -165,6 +175,17 @@ static void MidiInProc(const MIDIPacketList *pktlist, void *refCon, void *connRe
165
175
{
166
176
REBMID midi_port ;
167
177
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
+ }
168
189
169
190
if (id >= Midi_Ports_Pool .count ) return ;
170
191
@@ -176,10 +197,13 @@ static void MidiInProc(const MIDIPacketList *pktlist, void *refCon, void *connRe
176
197
if (packet -> data [0 ] >= 0x80 && packet -> data [0 ] < 0xF0 ) {
177
198
Midi_Push_Buffer (midi_port .inp_buffer , ((u32 * )packet -> data )[0 ]);
178
199
// 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 );
180
203
}
181
204
packet = MIDIPacketNext (packet );
182
205
}
206
+ Send_Event (& midi_port , EVT_READ );
183
207
}
184
208
185
209
@@ -301,6 +325,9 @@ static void PrintMidiDevices()
301
325
}
302
326
req -> handle = (void * )midi_port ;
303
327
SET_OPEN (req );
328
+
329
+ Send_Event (midi_port , EVT_OPEN );
330
+
304
331
return DR_DONE ;
305
332
}
306
333
@@ -327,7 +354,7 @@ static void PrintMidiDevices()
327
354
midi_port -> started = 0 ;
328
355
midi_port -> out_device = 0 ;
329
356
}
330
-
357
+ Send_Event ( midi_port , EVT_CLOSE );
331
358
midi_port -> port = NULL ;
332
359
req -> handle = NULL ;
333
360
SET_CLOSED (req );
0 commit comments