Parcourir la source

cmDspBuiltIn.c : cmDspMidiIn now outputs MIDI timestamps.

Fixed bug in cmDspCheckbox which prevented correct symbols from being stored.
Added cmSyncRecdClassCons to the built in processor list.
master
kevin il y a 10 ans
Parent
révision
94da1333af
1 fichiers modifiés avec 26 ajouts et 8 suppressions
  1. 26
    8
      dsp/cmDspBuiltIn.c

+ 26
- 8
dsp/cmDspBuiltIn.c Voir le fichier

@@ -25,6 +25,7 @@
25 25
 #include "cmThread.h"
26 26
 #include "cmUdpPort.h"
27 27
 #include "cmUdpNet.h"
28
+#include "cmTime.h"
28 29
 #include "cmAudioSys.h"
29 30
 #include "cmDspSys.h"
30 31
 
@@ -995,7 +996,9 @@ enum
995 996
   kSmpIdxMiId,
996 997
   kStatusMiId,
997 998
   kD0MiId,
998
-  kD1MiId
999
+  kD1MiId,
1000
+  kSecMiId,
1001
+  kNSecMiId
999 1002
 };
1000 1003
 
1001 1004
 
@@ -1006,6 +1009,7 @@ typedef struct
1006 1009
   cmDspInst_t inst;
1007 1010
   unsigned midiSymId;
1008 1011
   unsigned prevSmpIdx;
1012
+  cmTimeSpec_t prevTimeStamp;
1009 1013
 } cmDspMidiIn_t;
1010 1014
 
1011 1015
 cmDspInst_t*  _cmDspMidiInAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
@@ -1018,6 +1022,8 @@ cmDspInst_t*  _cmDspMidiInAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigne
1018 1022
     { "status", kStatusMiId, 0,  0,  kOutDsvFl | kUIntDsvFl, "MIDI status" },
1019 1023
     { "d0",     kD0MiId,     0,  0,  kOutDsvFl | kUIntDsvFl, "MIDI channel message d0" },
1020 1024
     { "d1",     kD1MiId,     0,  0,  kOutDsvFl | kUIntDsvFl, "MIDI channel message d1" },
1025
+    { "sec",    kSecMiId,    0,  0,  kOutDsvFl | kUIntDsvFl, "Time stamp integer seconds."},
1026
+    { "nsec",   kNSecMiId,   0,  0,  kOutDsvFl | kUIntDsvFl, "Time stamp fractional second (nanoseconds)."},
1021 1027
     { NULL, 0, 0, 0, 0 }
1022 1028
   };
1023 1029
 
@@ -1052,7 +1058,9 @@ cmDspRC_t  _cmDspMidiInRecvFunc(   cmDspCtx_t* ctx, struct cmDspInst_str* inst,
1052 1058
     for(i=0; i<pkt->msgCnt; ++i)
1053 1059
     {
1054 1060
       cmMidiMsg* m = pkt->msgArray + i;
1055
-      unsigned   deltaSmpCnt = floor((m->deltaUs * cmDspSampleRate(ctx)) / 1000000.0);
1061
+      unsigned   deltaSmpCnt = 0;
1062
+      if( p->prevTimeStamp.tv_sec!=0 && p->prevTimeStamp.tv_nsec!=0 )
1063
+        deltaSmpCnt = floor(cmTimeElapsedMicros(&p->prevTimeStamp,&m->timeStamp) * cmDspSampleRate(ctx) / 1000000.0);
1056 1064
 
1057 1065
       if( p->prevSmpIdx == 0 )
1058 1066
         p->prevSmpIdx = ctx->cycleCnt * cmDspSamplesPerCycle(ctx);
@@ -1060,9 +1068,13 @@ cmDspRC_t  _cmDspMidiInRecvFunc(   cmDspCtx_t* ctx, struct cmDspInst_str* inst,
1060 1068
         p->prevSmpIdx += deltaSmpCnt;
1061 1069
 
1062 1070
       cmDspSetUInt(ctx, inst, kSmpIdxMiId, p->prevSmpIdx );
1071
+      cmDspSetUInt(ctx, inst, kSecMiId,    m->timeStamp.tv_sec);
1072
+      cmDspSetUInt(ctx, inst, kNSecMiId,   m->timeStamp.tv_nsec);
1063 1073
       cmDspSetUInt(ctx, inst, kD1MiId,     m->d1 );
1064 1074
       cmDspSetUInt(ctx, inst, kD0MiId,     m->d0 );
1065 1075
       cmDspSetUInt(ctx, inst, kStatusMiId, m->status );
1076
+
1077
+      p->prevTimeStamp = m->timeStamp;
1066 1078
     }
1067 1079
   }
1068 1080
 
@@ -2199,18 +2211,23 @@ cmDspInst_t*  _cmDspCheckboxAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsig
2199 2211
 
2200 2212
   cmDspCheckbox_t* p = cmDspInstAlloc(cmDspCheckbox_t,ctx,classPtr,args,instSymId,id,storeSymId,va_cnt,vl);
2201 2213
 
2214
+  p->resetSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"_reset");
2215
+
2216
+  cmDspSetDefaultStrcz( ctx, &p->inst, kSym1CbId, NULL, "on");
2217
+  cmDspSetDefaultStrcz( ctx, &p->inst, kSym0CbId, NULL, "off");
2218
+
2219
+  p->onSymId    = cmSymTblRegisterSymbol(ctx->stH, cmDspDefaultStrcz(&p->inst,kSym1CbId));
2220
+  p->offSymId   = cmSymTblRegisterSymbol(ctx->stH, cmDspDefaultStrcz(&p->inst,kSym0CbId));
2221
+
2222
+
2223
+  bool fl = cmDspDefaultDouble(&p->inst,kOutCbId)!=0;
2202 2224
   
2203 2225
   cmDspSetDefaultDouble(ctx, &p->inst, kVal1CbId, 0.0, 1.0);
2204 2226
   cmDspSetDefaultDouble(ctx, &p->inst, kVal0CbId, 0.0, 0.0);
2205
-  cmDspSetDefaultStrcz( ctx, &p->inst, kSym1CbId, NULL, "on");
2206
-  cmDspSetDefaultStrcz( ctx, &p->inst, kSym0CbId, NULL, "off");
2207 2227
   cmDspSetDefaultDouble(ctx, &p->inst, kOutCbId,  0.0, 0.0);
2208
-  cmDspSetDefaultSymbol(ctx, &p->inst, kSymCbId,        instSymId );
2228
+  cmDspSetDefaultSymbol(ctx, &p->inst, kSymCbId,  fl ? p->onSymId : p->offSymId );
2209 2229
   cmDspSetDefaultStrcz( ctx, &p->inst, kLblCbId, NULL, cmSymTblLabel(ctx->stH,instSymId));
2210 2230
 
2211
-  p->resetSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"_reset");
2212
-  p->onSymId    = cmSymTblRegisterSymbol(ctx->stH, cmDspDefaultStrcz(&p->inst,kSym1CbId));
2213
-  p->offSymId   = cmSymTblRegisterSymbol(ctx->stH, cmDspDefaultStrcz(&p->inst,kSym0CbId));
2214 2231
 
2215 2232
   // create the UI control
2216 2233
   cmDspUiButtonCreate(ctx,&p->inst,kCheckDuiId,kOutCbId,kLblCbId);
@@ -5587,6 +5604,7 @@ cmDspClassConsFunc_t _cmDspClassBuiltInArray[] =
5587 5604
   cmNanoMapClassCons,
5588 5605
   cmRecdPlayClassCons,
5589 5606
   cmGoertzelClassCons,
5607
+  cmSyncRecdClassCons,
5590 5608
   NULL,
5591 5609
 };
5592 5610
 

Chargement…
Annuler
Enregistrer