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
 #include "cmMallocDebug.h"
8
 #include "cmMallocDebug.h"
9
 #include "cmLinkedHeap.h"
9
 #include "cmLinkedHeap.h"
10
 #include "cmThread.h"
10
 #include "cmThread.h"
11
+#include "cmTime.h"
11
 #include "cmMidi.h"
12
 #include "cmMidi.h"
12
 #include "cmMidiPort.h"
13
 #include "cmMidiPort.h"
13
 
14
 
62
   unsigned        prvTimeMicroSecs; // time of last recognized event in microseconds
63
   unsigned        prvTimeMicroSecs; // time of last recognized event in microseconds
63
   unsigned        eventCnt;     // count of recognized events
64
   unsigned        eventCnt;     // count of recognized events
64
   
65
   
66
+  cmTimeSpec_t    baseTimeStamp;
67
+
65
 } cmMpRoot_t;
68
 } cmMpRoot_t;
66
 
69
 
67
 cmMpRoot_t* _cmMpRoot = NULL;
70
 cmMpRoot_t* _cmMpRoot = NULL;
164
       //printf("dev:%i port:%i ch:%i %i\n",ev->source.client,ev->source.port,ev->data.note.channel,ev->data.note.note);
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
       unsigned     microSecs1     = (ev->time.time.tv_sec * 1000000) + (ev->time.time.tv_nsec/1000);
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
       cmMidiByte_t d0             = 0xff;
171
       cmMidiByte_t d0             = 0xff;
169
       cmMidiByte_t d1             = 0xff;
172
       cmMidiByte_t d1             = 0xff;
170
       cmMidiByte_t status         = 0;
173
       cmMidiByte_t status         = 0;
254
       if( status != 0 )
257
       if( status != 0 )
255
       {
258
       {
256
         cmMidiByte_t ch = ev->data.note.channel;
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
         p->prvTimeMicroSecs  = microSecs1;
273
         p->prvTimeMicroSecs  = microSecs1;
261
         p->eventCnt         += 1;
274
         p->eventCnt         += 1;
515
   
528
   
516
   // send any pending commands to the driver
529
   // send any pending commands to the driver
517
   snd_seq_drain_output(p->h);
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
   if( cmThreadPause(p->thH,0) != kOkThRC )
535
   if( cmThreadPause(p->thH,0) != kOkThRC )
520
     rc = _cmMpErrMsg(&p->err,kThreadErrMpRC,0,"Thread start failed.");
536
     rc = _cmMpErrMsg(&p->err,kThreadErrMpRC,0,"Thread start failed.");

Loading…
Cancel
Save