Browse Source

cmMidiAlsa.c : cmMpPoll() now generates a cmTimeSpec_t timestamp with each message.

master
kevin 10 years ago
parent
commit
2aa2938957
1 changed files with 18 additions and 2 deletions
  1. 18
    2
      linux/cmMidiAlsa.c

+ 18
- 2
linux/cmMidiAlsa.c View File

@@ -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.");

Loading…
Cancel
Save