|
@@ -8,6 +8,7 @@
|
8
|
8
|
#include "cmMallocDebug.h"
|
9
|
9
|
#include "cmLinkedHeap.h"
|
10
|
10
|
#include "cmThread.h"
|
|
11
|
+#include "cmTime.h"
|
11
|
12
|
#include "cmMidi.h"
|
12
|
13
|
#include "cmMidiPort.h"
|
13
|
14
|
|
|
@@ -62,6 +63,8 @@ typedef struct
|
62
|
63
|
unsigned prvTimeMicroSecs; // time of last recognized event in microseconds
|
63
|
64
|
unsigned eventCnt; // count of recognized events
|
64
|
65
|
|
|
66
|
+ cmTimeSpec_t baseTimeStamp;
|
|
67
|
+
|
65
|
68
|
} cmMpRoot_t;
|
66
|
69
|
|
67
|
70
|
cmMpRoot_t* _cmMpRoot = NULL;
|
|
@@ -164,7 +167,7 @@ cmMpRC_t cmMpPoll()
|
164
|
167
|
//printf("dev:%i port:%i ch:%i %i\n",ev->source.client,ev->source.port,ev->data.note.channel,ev->data.note.note);
|
165
|
168
|
|
166
|
169
|
unsigned microSecs1 = (ev->time.time.tv_sec * 1000000) + (ev->time.time.tv_nsec/1000);
|
167
|
|
- unsigned deltaMicroSecs = p->prvTimeMicroSecs==0 ? 0 : microSecs1 - p->prvTimeMicroSecs;
|
|
170
|
+ //unsigned deltaMicroSecs = p->prvTimeMicroSecs==0 ? 0 : microSecs1 - p->prvTimeMicroSecs;
|
168
|
171
|
cmMidiByte_t d0 = 0xff;
|
169
|
172
|
cmMidiByte_t d1 = 0xff;
|
170
|
173
|
cmMidiByte_t status = 0;
|
|
@@ -254,8 +257,18 @@ cmMpRC_t cmMpPoll()
|
254
|
257
|
if( status != 0 )
|
255
|
258
|
{
|
256
|
259
|
cmMidiByte_t ch = ev->data.note.channel;
|
|
260
|
+ cmTimeSpec_t ts;
|
|
261
|
+ ts.tv_sec = p->baseTimeStamp.tv_sec + ev->time.time.tv_sec;
|
|
262
|
+ ts.tv_nsec = p->baseTimeStamp.tv_nsec + ev->time.time.tv_nsec;
|
|
263
|
+ if( ts.tv_nsec > 1000000000 )
|
|
264
|
+ {
|
|
265
|
+ ts.tv_nsec -= 1000000000;
|
|
266
|
+ ts.tv_sec += 1;
|
|
267
|
+ }
|
|
268
|
+
|
|
269
|
+ //printf("MIDI: %ld %ld : 0x%x %i %i\n",ts.tv_sec,ts.tv_nsec,status,d0,d1);
|
257
|
270
|
|
258
|
|
- cmMpParserMidiTriple(p->prvRcvPort->parserH, deltaMicroSecs, status | ch, d0, d1 );
|
|
271
|
+ cmMpParserMidiTriple(p->prvRcvPort->parserH, &ts, status | ch, d0, d1 );
|
259
|
272
|
|
260
|
273
|
p->prvTimeMicroSecs = microSecs1;
|
261
|
274
|
p->eventCnt += 1;
|
|
@@ -515,6 +528,9 @@ cmMpRC_t cmMpInitialize( cmCtx_t* ctx, cmMpCallback_t cbFunc, void* cbArg, unsig
|
515
|
528
|
|
516
|
529
|
// send any pending commands to the driver
|
517
|
530
|
snd_seq_drain_output(p->h);
|
|
531
|
+
|
|
532
|
+ // all time stamps will be an offset from this time stamp
|
|
533
|
+ clock_gettime(CLOCK_MONOTONIC,&p->baseTimeStamp);
|
518
|
534
|
|
519
|
535
|
if( cmThreadPause(p->thH,0) != kOkThRC )
|
520
|
536
|
rc = _cmMpErrMsg(&p->err,kThreadErrMpRC,0,"Thread start failed.");
|