Преглед на файлове

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 преди 10 години
родител
ревизия
94da1333af
променени са 1 файла, в които са добавени 26 реда и са изтрити 8 реда
  1. 26
    8
      dsp/cmDspBuiltIn.c

+ 26
- 8
dsp/cmDspBuiltIn.c Целия файл

@@ -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
 

Loading…
Отказ
Запис