Browse Source

Updates to support sample-rate conversion in cmApBuf.h/cpp.

master
kevin.larke 4 years ago
parent
commit
0aee816083
14 changed files with 421 additions and 177 deletions
  1. 263
    59
      cmApBuf.c
  2. 3
    3
      cmApBuf.h
  3. 1
    0
      cmAudDsp.c
  4. 3
    2
      cmAudioAggDev.c
  5. 6
    3
      cmAudioPort.c
  6. 10
    2
      cmAudioSys.c
  7. 1
    0
      cmAudioSys.h
  8. 2
    2
      cmRtSys.c
  9. 1
    0
      cmRtSys.h
  10. 1
    1
      dsp/cmDspClass.c
  11. 95
    89
      dsp/cmDspKr.c
  12. 32
    15
      dsp/cmDspPgm.c
  13. 2
    0
      dsp/cmDspPgmKrTimeLineLite.c
  14. 1
    1
      dsp/cmDspSys.c

+ 263
- 59
cmApBuf.c View File

40
   output ch:  client   audio  both
40
   output ch:  client   audio  both
41
   
41
   
42
   The fn variable however is not thread-safe and therefore care must be taken as
42
   The fn variable however is not thread-safe and therefore care must be taken as
43
-  to how it is read and updated.
44
-  
45
-  
46
-  
43
+  to how it is read and updated.  
47
  */
44
  */
48
 
45
 
49
 enum { kInApIdx=0, kOutApIdx=1, kIoApCnt=2 };
46
 enum { kInApIdx=0, kOutApIdx=1, kIoApCnt=2 };
61
   cmApSample_t* m;    // m[mn] meter sample sum  
58
   cmApSample_t* m;    // m[mn] meter sample sum  
62
   unsigned      mn;   // length of m[]
59
   unsigned      mn;   // length of m[]
63
   unsigned      mi;   // next ele of m[] to rcv sum
60
   unsigned      mi;   // next ele of m[] to rcv sum
61
+  cmApSample_t  s0;   // buffered sample used for srate conversion
64
 } cmApCh;
62
 } cmApCh;
65
 
63
 
66
 typedef struct
64
 typedef struct
67
 {
65
 {
68
-  unsigned     chCnt;
69
-  cmApCh*      chArray;
66
+  unsigned     chCnt;      // Count of channels
67
+  cmApCh*      chArray;    // chArray[chCnt] channel record array
70
 
68
 
71
-  unsigned     n;     // length of b[] (multiple of dspFrameCnt)  bufCnt*framesPerCycle
72
-  double       srate; // device sample rate;
69
+  unsigned     n;          // Length of b[] (multiple of dspFrameCnt)  bufCnt*framesPerCycle
70
+  double       srate;      // Device sample rate;
71
+  int          srateMult;  // Internal sample rate multiplier (negative values for dividing). This srateMult*srate is the sample rate of
72
+                           // signals held in the chApCh[] input and output buffers. Sample rate conversion to/from this rate
73
+                           // occurs in cmApBufUpdate() as signals go from/to the audio device.
73
 
74
 
74
-  unsigned     faultCnt;
75
-  unsigned     framesPerCycle;
76
-  unsigned     dspFrameCnt;
77
-  cmTimeSpec_t timeStamp;    // base (starting) time stamp for this device
78
-  unsigned     ioFrameCnt;   // count of frames input or output for this device
75
+  unsigned     faultCnt;       // error count since start
76
+  unsigned     framesPerCycle; // expected count of frames per channel to/from the audio device on each call to cmApBufUpdate()
77
+  unsigned     dspFrameCnt;    // number of frames per channel in buffers returned by cmApBufGet().
78
+  cmTimeSpec_t timeStamp;      // base (starting) time stamp for this device
79
+  unsigned     ioFrameCnt;     // count of frames input or output for this device
79
 
80
 
80
 } cmApIO;
81
 } cmApIO;
81
 
82
 
93
 
94
 
94
   cmApSample_t* zeroBuf;    // buffer of zeros 
95
   cmApSample_t* zeroBuf;    // buffer of zeros 
95
   unsigned      zeroBufCnt; // max of all dspFrameCnt for all devices.
96
   unsigned      zeroBufCnt; // max of all dspFrameCnt for all devices.
97
+
98
+
99
+  unsigned     abufIdx;
100
+  cmApSample_t abuf[ 16384 ];
96
 } cmApBuf;
101
 } cmApBuf;
97
 
102
 
98
 cmApBuf _cmApBuf;
103
 cmApBuf _cmApBuf;
99
 
104
 
100
 
105
 
106
+// Copy the source channel (srcChIdx) to the destination buffer and apply up-sampling.
107
+// 'src' is an interleaved buffer with 'srcN' samples per channel and 'srcChN' channels (total size in samples = srcN*srcChN)
108
+// 'dst' is a non-interleaved (single channel) circular buffer of length 'dstN' where 'dstIdx' is the index of the first dst slot to receive a sample..
109
+// Return the index into dst[] of the next location to receive an incoming sample.
110
+unsigned  _cmApCopyInUpSample( const cmApSample_t* src, unsigned srcN, unsigned srcChN, unsigned srcChIdx, cmApSample_t* dst, unsigned dstN, unsigned dstIdx, unsigned mult, double gain, cmApSample_t* s0_Ref )
111
+{
112
+  cmApSample_t s0 = *s0_Ref;
113
+  unsigned si,k,di=dstIdx;
114
+  
115
+  for(si=0; si<srcN; ++si)
116
+  {
117
+    cmApSample_t s1 = src[si*srcChN+srcChIdx];
118
+    
119
+    for(k=1; k<mult; ++k)
120
+    {
121
+      dst[di] = gain * (s0 + (s1 - s0) * k / mult );
122
+      di = (di+1) % dstN;
123
+    }
124
+
125
+    dst[di] = gain * s1;
126
+    di      = (di+1) % dstN;
127
+    s0     = s1;    
128
+  }
129
+  
130
+  *s0_Ref = s0;
131
+  
132
+  return di;
133
+}
134
+
135
+// Copy the source channel (srcChIdx) to the destination buffer and apply down-sampling.
136
+// 'src' is an interleaved linear buffer with 'srcN' samples per channel and 'srcChN' channels,
137
+// 'dst' is a non-interleaved circular buffer of length 'dstN' where 'dstIdx' is the index of the first dst slot to receive a sample..
138
+// Return the index into dst[] of the next location to receive an incoming sample.
139
+unsigned  _cmApCopyInDnSample( const cmApSample_t* src, unsigned srcN, unsigned srcChN, unsigned srcChIdx, cmApSample_t* dst, unsigned dstN, unsigned dstIdx, unsigned div, double gain )
140
+{
141
+  unsigned si,di=dstIdx;
142
+  
143
+  for(si=0; si<srcN; si+=div)
144
+  {
145
+    dst[di] = gain * src[si*srcChN+srcChIdx];
146
+    di      = (di+1) % dstN;
147
+  }
148
+  return di;
149
+}
150
+
151
+
152
+// Copy samples from an interleaved src buffer to a non-interleaved dst buffer with sample rate conversion
153
+unsigned  _cmApCopyInSamples( const cmApSample_t* src, unsigned srcN, unsigned srcChN, unsigned srcChIdx, cmApSample_t* dst, unsigned dstN, unsigned dstIdx, int srateMult, double gain, cmApSample_t* s0_Ref )
154
+{
155
+  if( srateMult < 1 )
156
+    return _cmApCopyInDnSample( src, srcN, srcChN, srcChIdx, dst, dstN, dstIdx, -srateMult, gain );
157
+
158
+  return _cmApCopyInUpSample( src, srcN, srcChN, srcChIdx, dst, dstN, dstIdx, srateMult, gain, s0_Ref );
159
+}
160
+
161
+void printBuf( const cmApSample_t* src, unsigned srcN, unsigned bi, unsigned n )
162
+{
163
+  unsigned i,j;
164
+  for(i=bi,j=0; j<n; ++i,++j)
165
+  {
166
+    i = i % srcN;
167
+    printf("(%i,%i,%f),\n",j,i,src[i]);
168
+  }
169
+  printf("-----\n");
170
+}
171
+
172
+
173
+// Copy 
174
+// 'src' is a non-interleaved circular buf of total length 'srcN', with the first sample coming at 'srcIdx'.
175
+// 'dst' is an interleaved buffer of length 'dstN' with 'dstChN' channels
176
+// Return the index of the next src sample.
177
+unsigned _cmApCopyOutUpSample( const cmApSample_t* src, unsigned srcN, unsigned srcIdx, cmApSample_t* dst, unsigned dstN, unsigned dstChN, unsigned dstChIdx, int mult, double gain, cmApSample_t* s0_Ref )
178
+{
179
+  unsigned di,si=srcIdx;
180
+  cmApSample_t s0 = *s0_Ref;
181
+  
182
+  for(di=0; di<dstN; ++di)
183
+  {
184
+    cmApSample_t s1 = src[si];
185
+    unsigned     k;
186
+    for(k=1; k<mult && di<dstN; ++di,++k)
187
+    {
188
+      dst[di*dstChN+dstChIdx] = gain * (s0 + (s1 - s0) * k / mult );      
189
+    }
190
+
191
+    if( di < dstN )
192
+    {
193
+      dst[di*dstChN+dstChIdx] = gain * s1;
194
+      ++di;
195
+    }
196
+
197
+    si = (si + 1) % srcN;
198
+    
199
+    s0 = s1;
200
+  }
201
+
202
+  *s0_Ref = s0;
203
+  return si;
204
+}
205
+
206
+// 'src' is a non-interleaved (single channel) circular buf of total length 'srcN', with the first sample coming at 'srcIdx'.
207
+// 'dst' is an interleaved buffer of length 'dstN' with 'dstChN' channels
208
+// Return the index of the next src sample.
209
+unsigned _cmApCopyOutDnSample( const cmApSample_t* src, unsigned srcN, unsigned srcIdx, cmApSample_t* dst, unsigned dstN, unsigned dstChN, unsigned dstChIdx, int div, double gain )
210
+{
211
+  unsigned di,si;
212
+
213
+  // The total count of output samples is determined by 'dstN'
214
+  // Downsampling is acheived by advancing the src index by 'div' samples.
215
+  
216
+  for(di=0,si=srcIdx; di<dstN; ++di)
217
+  {
218
+    dst[di*dstChN+dstChIdx] = gain * src[si];
219
+    si = (si + div) % srcN;
220
+  }
221
+  
222
+  return si;  
223
+}
224
+
225
+
226
+// Copy samples from a non-interleaved src buffer to an interleaved dst buffer with sample rate conversion
227
+unsigned   _cmApCopyOutSamples( const cmApSample_t* src, unsigned srcN, unsigned srcIdx, cmApSample_t* dst, unsigned dstN, unsigned dstChN, unsigned dstChIdx, int srateMult, double gain, cmApSample_t* s0_Ref )
228
+{
229
+  if( srateMult > 0  )
230
+    return _cmApCopyOutDnSample(src, srcN, srcIdx, dst, dstN, dstChN, dstChIdx, srateMult, gain );
231
+
232
+  return _cmApCopyOutUpSample( src, srcN, srcIdx, dst, dstN, dstChN, dstChIdx, -srateMult, gain, s0_Ref );
233
+}
234
+
235
+
101
 cmApSample_t _cmApMeterValue( const cmApCh* cp )
236
 cmApSample_t _cmApMeterValue( const cmApCh* cp )
102
 {
237
 {
103
   double sum = 0;
238
   double sum = 0;
108
   return cp->mn==0 ? 0 : (cmApSample_t)sqrt(sum/cp->mn);
243
   return cp->mn==0 ? 0 : (cmApSample_t)sqrt(sum/cp->mn);
109
 }
244
 }
110
 
245
 
111
-void _cmApSine( cmApCh* cp, cmApSample_t* b0, unsigned n0, cmApSample_t* b1, unsigned n1, unsigned stride, float srate )
246
+void _cmApSine0( cmApCh* cp, cmApSample_t* b0, unsigned n0, cmApSample_t* b1, unsigned n1, unsigned stride, float srate )
112
 {
247
 {
113
   unsigned i;
248
   unsigned i;
114
 
249
 
119
     b1[i*stride] = (float)(cp->gain * sin( 2.0 * M_PI * cp->hz * cp->phs / srate ));
254
     b1[i*stride] = (float)(cp->gain * sin( 2.0 * M_PI * cp->hz * cp->phs / srate ));
120
 }
255
 }
121
 
256
 
257
+// Synthesize a sine signal of length sigN*srateMult starting at dst[dstidx]
258
+// Assume dst[dstN] is a circular buffer
259
+unsigned  _cmApSine( cmApCh* cp, cmApSample_t* dst, unsigned dstN, unsigned dstIdx,  unsigned dstChCnt, unsigned sigN, unsigned srateMult, float srate, double gain )
260
+{
261
+  unsigned i,di;
262
+  
263
+  sigN = srateMult < 0 ? sigN/abs(srateMult) : sigN * srateMult;
264
+  for(i=0, di=dstIdx; i<sigN; ++i,++cp->phs)
265
+  {
266
+    dst[di] = (cmApSample_t)(gain * sin( 2.0 * M_PI * cp->hz * cp->phs / srate ));
267
+    di = (di+dstChCnt) % dstN;
268
+  }
269
+
270
+  return sigN;
271
+}
272
+
273
+
122
 cmApSample_t _cmApMeter( const cmApSample_t* b, unsigned bn, unsigned stride )
274
 cmApSample_t _cmApMeter( const cmApSample_t* b, unsigned bn, unsigned stride )
123
 {
275
 {
124
   const cmApSample_t* ep  = b + bn;
276
   const cmApSample_t* ep  = b + bn;
151
   chPtr->mn   = mn;
303
   chPtr->mn   = mn;
152
   chPtr->m    = cmMemAllocZ(cmApSample_t,mn);
304
   chPtr->m    = cmMemAllocZ(cmApSample_t,mn);
153
   chPtr->mi   = 0;
305
   chPtr->mi   = 0;
306
+
154
 }
307
 }
155
 
308
 
156
 void _cmApIoFinalize( cmApIO* ioPtr )
309
 void _cmApIoFinalize( cmApIO* ioPtr )
164
   ioPtr->n     = 0;
317
   ioPtr->n     = 0;
165
 }
318
 }
166
 
319
 
167
-void _cmApIoInitialize( cmApIO* ioPtr, double srate, unsigned framesPerCycle, unsigned chCnt, unsigned n, unsigned meterBufN, unsigned dspFrameCnt )
320
+void _cmApIoInitialize( cmApIO* ioPtr, double srate, unsigned framesPerCycle, unsigned chCnt, unsigned n, unsigned meterBufN, unsigned dspFrameCnt, int srateMult )
168
 {
321
 {
169
   unsigned i;
322
   unsigned i;
170
 
323
 
324
+  if( srateMult == 0 )
325
+    srateMult = 1;
326
+
171
   _cmApIoFinalize(ioPtr);
327
   _cmApIoFinalize(ioPtr);
172
 
328
 
173
   n += (n % dspFrameCnt); // force buffer size to be a multiple of dspFrameCnt
329
   n += (n % dspFrameCnt); // force buffer size to be a multiple of dspFrameCnt
174
   
330
   
175
   ioPtr->chArray           = chCnt==0 ? NULL : cmMemAllocZ( cmApCh, chCnt );
331
   ioPtr->chArray           = chCnt==0 ? NULL : cmMemAllocZ( cmApCh, chCnt );
176
   ioPtr->chCnt             = chCnt;
332
   ioPtr->chCnt             = chCnt;
177
-  ioPtr->n                 = n;
333
+  ioPtr->n                 = srateMult<0 ?  n : n*srateMult;
178
   ioPtr->faultCnt          = 0;
334
   ioPtr->faultCnt          = 0;
179
   ioPtr->framesPerCycle    = framesPerCycle;
335
   ioPtr->framesPerCycle    = framesPerCycle;
180
   ioPtr->srate             = srate;
336
   ioPtr->srate             = srate;
337
+  ioPtr->srateMult         = srateMult;
181
   ioPtr->dspFrameCnt       = dspFrameCnt;
338
   ioPtr->dspFrameCnt       = dspFrameCnt;
182
   ioPtr->timeStamp.tv_sec  = 0;
339
   ioPtr->timeStamp.tv_sec  = 0;
183
   ioPtr->timeStamp.tv_nsec = 0;
340
   ioPtr->timeStamp.tv_nsec = 0;
184
   ioPtr->ioFrameCnt        = 0;
341
   ioPtr->ioFrameCnt        = 0;
185
 
342
 
186
   for(i=0; i<chCnt; ++i )
343
   for(i=0; i<chCnt; ++i )
187
-    _cmApChInitialize( ioPtr->chArray + i, n, meterBufN );
344
+    _cmApChInitialize( ioPtr->chArray + i, ioPtr->n, meterBufN );
188
 
345
 
189
 }
346
 }
190
 
347
 
195
     _cmApIoFinalize( dp->ioArray+i);
352
     _cmApIoFinalize( dp->ioArray+i);
196
 }
353
 }
197
 
354
 
198
-void _cmApDevInitialize( cmApDev* dp, double srate, unsigned iFpC, unsigned iChCnt, unsigned iBufN, unsigned oFpC, unsigned oChCnt, unsigned oBufN, unsigned meterBufN, unsigned dspFrameCnt )
355
+void _cmApDevInitialize( cmApDev* dp, double srate, unsigned iFpC, unsigned iChCnt, unsigned iBufN, unsigned oFpC, unsigned oChCnt, unsigned oBufN, unsigned meterBufN, unsigned dspFrameCnt, int srateMult )
199
 {
356
 {
200
   unsigned i;
357
   unsigned i;
201
 
358
 
203
 
360
 
204
   for(i=0; i<kIoApCnt; ++i)
361
   for(i=0; i<kIoApCnt; ++i)
205
   {
362
   {
206
-    unsigned chCnt = i==kInApIdx ? iChCnt : oChCnt;
207
-    unsigned bufN  = i==kInApIdx ? iBufN  : oBufN;
208
-    unsigned fpc   = i==kInApIdx ? iFpC   : oFpC;
209
-    _cmApIoInitialize( dp->ioArray+i, srate, fpc, chCnt, bufN, meterBufN, dspFrameCnt );
363
+    unsigned chCnt = i==kInApIdx ? iChCnt     : oChCnt;
364
+    unsigned bufN  = i==kInApIdx ? iBufN      : oBufN;
365
+    unsigned fpc   = i==kInApIdx ? iFpC       : oFpC;
366
+    _cmApIoInitialize( dp->ioArray+i, srate, fpc, chCnt, bufN, meterBufN, dspFrameCnt, srateMult );
210
 
367
 
211
   }
368
   }
212
       
369
       
222
   _cmApBuf.devArray        = cmMemAllocZ( cmApDev, devCnt );
379
   _cmApBuf.devArray        = cmMemAllocZ( cmApDev, devCnt );
223
   _cmApBuf.devCnt          = devCnt;
380
   _cmApBuf.devCnt          = devCnt;
224
   cmApBufSetMeterMs(meterMs);
381
   cmApBufSetMeterMs(meterMs);
382
+
225
   return kOkAbRC;
383
   return kOkAbRC;
226
 }
384
 }
227
 
385
 
236
   
394
   
237
   _cmApBuf.devCnt          = 0;
395
   _cmApBuf.devCnt          = 0;
238
 
396
 
397
+  FILE* fp;
398
+  if(_cmApBuf.abufIdx>0 )
399
+  {
400
+    if((fp = fopen("/home/kevin/temp/temp.csv","wt")) != NULL )
401
+    {
402
+      int i;
403
+      for(i=0; i<_cmApBuf.abufIdx; ++i)
404
+      {
405
+        fprintf(fp,"%f,\n",_cmApBuf.abuf[i]);
406
+      }
407
+      fclose(fp);
408
+    }
409
+  }
410
+  
411
+
412
+  
239
   return kOkAbRC;
413
   return kOkAbRC;
240
 }
414
 }
241
 
415
 
247
   unsigned inChCnt, 
421
   unsigned inChCnt, 
248
   unsigned inFramesPerCycle,
422
   unsigned inFramesPerCycle,
249
   unsigned outChCnt, 
423
   unsigned outChCnt, 
250
-  unsigned outFramesPerCycle)
424
+  unsigned outFramesPerCycle,
425
+  int      srateMult)
251
 {
426
 {
252
   cmApDev* devPtr    = _cmApBuf.devArray + devIdx;
427
   cmApDev* devPtr    = _cmApBuf.devArray + devIdx;
253
   unsigned iBufN     = bufCnt * inFramesPerCycle;
428
   unsigned iBufN     = bufCnt * inFramesPerCycle;
254
   unsigned oBufN     = bufCnt * outFramesPerCycle;
429
   unsigned oBufN     = bufCnt * outFramesPerCycle;
255
   unsigned meterBufN = cmMax(1,floor(srate * _cmApBuf.meterMs / (1000.0 * outFramesPerCycle)));
430
   unsigned meterBufN = cmMax(1,floor(srate * _cmApBuf.meterMs / (1000.0 * outFramesPerCycle)));
256
 
431
 
257
-  _cmApDevInitialize( devPtr, srate, inFramesPerCycle, inChCnt, iBufN, outFramesPerCycle, outChCnt, oBufN, meterBufN, dspFrameCnt );
432
+  _cmApDevInitialize( devPtr, srate, inFramesPerCycle, inChCnt, iBufN, outFramesPerCycle, outChCnt, oBufN, meterBufN, dspFrameCnt, srateMult );
258
 
433
 
259
   if( inFramesPerCycle > _cmApBuf.zeroBufCnt || outFramesPerCycle > _cmApBuf.zeroBufCnt )
434
   if( inFramesPerCycle > _cmApBuf.zeroBufCnt || outFramesPerCycle > _cmApBuf.zeroBufCnt )
260
   {
435
   {
325
       for(j=0; j<pp->chCnt; ++j)
500
       for(j=0; j<pp->chCnt; ++j)
326
       {
501
       {
327
         cmApCh*  cp = ip->chArray + pp->begChIdx +j; // dest ch
502
         cmApCh*  cp = ip->chArray + pp->begChIdx +j; // dest ch
328
-        unsigned n0 = ip->n - cp->ii;                // first dest segment
329
-        unsigned n1 = 0;                             // second dest segment
330
 
503
 
331
         assert(pp->begChIdx + j < ip->chCnt );
504
         assert(pp->begChIdx + j < ip->chCnt );
332
 
505
 
339
 
512
 
340
         // if the incoming samples would go off the end of the buffer then 
513
         // if the incoming samples would go off the end of the buffer then 
341
         // copy in the samples in two segments (one at the end and another at begin of dest channel)
514
         // copy in the samples in two segments (one at the end and another at begin of dest channel)
342
-        if( n0 < pp->audioFramesCnt )
343
-          n1 = pp->audioFramesCnt-n0;
344
-        else
345
-          n0 = pp->audioFramesCnt;
346
-
515
+        
347
         bool                enaFl = cmIsFlag(cp->fl,kChApFl) && cmIsFlag(cp->fl,kMuteApFl)==false;
516
         bool                enaFl = cmIsFlag(cp->fl,kChApFl) && cmIsFlag(cp->fl,kMuteApFl)==false;
348
         const cmApSample_t* sp    = enaFl ? ((cmApSample_t*)pp->audioBytesPtr) + j : _cmApBuf.zeroBuf;
517
         const cmApSample_t* sp    = enaFl ? ((cmApSample_t*)pp->audioBytesPtr) + j : _cmApBuf.zeroBuf;
349
-        unsigned            ssn   = enaFl ? pp->chCnt : 1;  // stride (packet samples are interleaved)
350
-        cmApSample_t*       dp    = cp->b + cp->ii;
351
-        const cmApSample_t* ep    = dp    + n0;
518
+        //unsigned            ssn   = enaFl ? pp->chCnt : 1;  // stride (packet samples are interleaved)
519
+        //cmApSample_t*       dp    = cp->b + cp->ii;
520
+        //const cmApSample_t* ep    = dp    + n0;
352
 
521
 
353
 
522
 
354
         // update the meter
523
         // update the meter
358
           cp->mi = (cp->mi + 1) % cp->mn;
527
           cp->mi = (cp->mi + 1) % cp->mn;
359
         }
528
         }
360
 
529
 
530
+        unsigned incrSmpN = 0;
531
+
361
         // if the test tone is enabled on this input channel
532
         // if the test tone is enabled on this input channel
362
         if( enaFl && cmIsFlag(cp->fl,kToneApFl) )
533
         if( enaFl && cmIsFlag(cp->fl,kToneApFl) )
363
         {
534
         {
364
-          _cmApSine(cp, dp, n0, cp->b, n1, 1, ip->srate );
535
+          //_cmApSine(cp, dp, n0, cp->b, n1, 1, ip->srate );
536
+          incrSmpN =  _cmApSine( cp, cp->b, ip->n, cp->ii,  1, pp->audioFramesCnt, ip->srateMult, ip->srate, cp->gain );
537
+
538
+          
365
         }
539
         }
366
         else // otherwise copy samples from the packet to the buffer
540
         else // otherwise copy samples from the packet to the buffer
367
         {
541
         {
368
-          // copy the first segment
369
-          for(; dp < ep; sp += ssn )
370
-            *dp++ = cp->gain * *sp;
371
 
542
 
372
-          // if there is a second segment
373
-          if( n1 > 0 )
374
-          {
375
-            // copy the second segment
376
-            dp = cp->b;
377
-            ep = dp + n1;
378
-            for(; dp<ep; sp += ssn )
379
-              *dp++ = cp->gain * *sp;
380
-          }
543
+          unsigned pi = cp->ii;
544
+          
545
+          cp->ii =  _cmApCopyInSamples( (cmApSample_t*)pp->audioBytesPtr, pp->audioFramesCnt, pp->chCnt, j, cp->b, ip->n, cp->ii, ip->srateMult, cp->gain, &cp->s0 );
546
+
547
+          if( false )
548
+            if( j == 2 && _cmApBuf.abufIdx < 16384 )
549
+            {
550
+              int ii;
551
+              for(ii=pi; ii!=cp->ii && _cmApBuf.abufIdx<16384; _cmApBuf.abufIdx++)
552
+              {
553
+                _cmApBuf.abuf[ _cmApBuf.abufIdx ] = cp->b[ii];
554
+                ii = (ii + 1) % ip->n;
555
+              }
556
+
557
+            }
558
+
559
+
560
+          incrSmpN = cp->ii > pi ? cp->ii-pi : (ip->n-pi) + cp->ii;
561
+                    
381
         }
562
         }
382
 
563
 
383
-        
384
-        // advance the input channel buffer
385
-        cp->ii  = n1>0 ? n1 : cp->ii + n0;
386
-        //cp->fn += pp->audioFramesCnt;
387
-        cmThUIntIncr(&cp->fn,pp->audioFramesCnt);
564
+        cmThUIntIncr(&cp->fn,incrSmpN);
388
       }
565
       }
389
     }
566
     }
390
   }
567
   }
423
 
600
 
424
           // ... otherwise decrease the count of returned samples
601
           // ... otherwise decrease the count of returned samples
425
           pp->audioFramesCnt = fn;
602
           pp->audioFramesCnt = fn;
426
-
427
         }
603
         }
428
 
604
 
429
         // if the outgong segments would go off the end of the buffer then 
605
         // if the outgong segments would go off the end of the buffer then 
433
         else
609
         else
434
           n0 = pp->audioFramesCnt;
610
           n0 = pp->audioFramesCnt;
435
 
611
 
436
-        cmApSample_t* dp    = ((cmApSample_t*)pp->audioBytesPtr) + j;
612
+        cmApSample_t* bpp   = ((cmApSample_t*)pp->audioBytesPtr) + j;
613
+        cmApSample_t* dp    = bpp;
437
         bool          enaFl = cmIsFlag(cp->fl,kChApFl) && cmIsFlag(cp->fl,kMuteApFl)==false;
614
         bool          enaFl = cmIsFlag(cp->fl,kChApFl) && cmIsFlag(cp->fl,kMuteApFl)==false;
438
 
615
 
616
+        unsigned decrSmpN = 0;
617
+        
439
         // if the tone is enabled on this channel
618
         // if the tone is enabled on this channel
440
         if( enaFl && cmIsFlag(cp->fl,kToneApFl) )
619
         if( enaFl && cmIsFlag(cp->fl,kToneApFl) )
441
         {
620
         {
442
-          _cmApSine(cp, dp, n0, dp + n0*pp->chCnt, n1, pp->chCnt, op->srate );
621
+          //_cmApSine(cp, dp, n0, dp + n0*pp->chCnt, n1, pp->chCnt, op->srate );
622
+          decrSmpN =  _cmApSine( cp, (cmApSample_t*)pp->audioBytesPtr, pp->audioFramesCnt, 0,  pp->chCnt, pp->audioFramesCnt, op->srateMult, op->srate, cp->gain );
623
+
443
         }
624
         }
444
         else                    // otherwise copy samples from the output buffer to the packet
625
         else                    // otherwise copy samples from the output buffer to the packet
445
         {
626
         {
446
           const cmApSample_t* sp = enaFl ? cp->b + cp->oi : _cmApBuf.zeroBuf;
627
           const cmApSample_t* sp = enaFl ? cp->b + cp->oi : _cmApBuf.zeroBuf;
447
           const cmApSample_t* ep = sp + n0;
628
           const cmApSample_t* ep = sp + n0;
448
 
629
 
630
+          unsigned pi = cp->oi;
631
+          cp->oi = _cmApCopyOutSamples( enaFl ? cp->b : _cmApBuf.zeroBuf, op->n, cp->oi, (cmApSample_t*)pp->audioBytesPtr, pp->audioFramesCnt, pp->chCnt, j, op->srateMult, cp->gain, &cp->s0 );
632
+
633
+          decrSmpN = cp->oi>pi ? cp->oi-pi : (op->n-pi) + cp->oi;
634
+
635
+          if( true )
636
+            if( j == 2 && _cmApBuf.abufIdx < 16384 )
637
+            {
638
+              int ii;
639
+              for(ii=pi; ii!=cp->oi && _cmApBuf.abufIdx<16384; _cmApBuf.abufIdx++)
640
+              {
641
+                _cmApBuf.abuf[ _cmApBuf.abufIdx ] = cp->b[ii];
642
+                ii = (ii + 1) % op->n;
643
+              }
644
+
645
+            }
646
+          
647
+          /*
449
           // copy the first segment
648
           // copy the first segment
450
           for(; sp < ep; dp += pp->chCnt )
649
           for(; sp < ep; dp += pp->chCnt )
451
             *dp = cp->gain * *sp++;
650
             *dp = cp->gain * *sp++;
460
               *dp = cp->gain * *sp++;
659
               *dp = cp->gain * *sp++;
461
 
660
 
462
           }
661
           }
662
+          */
463
         }
663
         }
464
 
664
 
465
         // update the meter
665
         // update the meter
470
         }
670
         }
471
 
671
 
472
         // advance the output channel buffer
672
         // advance the output channel buffer
673
+        /*
473
         cp->oi  = n1>0 ? n1 : cp->oi + n0;
674
         cp->oi  = n1>0 ? n1 : cp->oi + n0;
474
-        //cp->fn -= pp->audioFramesCnt;
475
         cmThUIntDecr(&cp->fn,pp->audioFramesCnt);
675
         cmThUIntDecr(&cp->fn,pp->audioFramesCnt);
676
+        */
677
+        
678
+        //cp->fn -= pp->audioFramesCnt;
679
+        cmThUIntDecr(&cp->fn,decrSmpN);
476
       }
680
       }
477
     }    
681
     }    
478
   }
682
   }
657
   unsigned      idx   = flags & kInApFl ? kInApIdx : kOutApIdx;
861
   unsigned      idx   = flags & kInApFl ? kInApIdx : kOutApIdx;
658
   const cmApIO* ioPtr = _cmApBuf.devArray[devIdx].ioArray + idx;
862
   const cmApIO* ioPtr = _cmApBuf.devArray[devIdx].ioArray + idx;
659
   unsigned      n     = bufChCnt < ioPtr->chCnt ? bufChCnt : ioPtr->chCnt;
863
   unsigned      n     = bufChCnt < ioPtr->chCnt ? bufChCnt : ioPtr->chCnt;
660
-  //unsigned      offs  = flags & kInApFl ? ioPtr->oi : ioPtr->ii; 
661
   cmApCh*       cp    = ioPtr->chArray;
864
   cmApCh*       cp    = ioPtr->chArray;
662
 
865
 
663
   for(i=0; i<n; ++i,++cp)
866
   for(i=0; i<n; ++i,++cp)
881
   unsigned sigN           = cycleCnt*framesPerCycle*inChCnt;
1084
   unsigned sigN           = cycleCnt*framesPerCycle*inChCnt;
882
   double   srate          = 44100.0;
1085
   double   srate          = 44100.0;
883
   unsigned meterMs        = 50;
1086
   unsigned meterMs        = 50;
884
-
1087
+  int      srateMult      = 1;
1088
+  
885
   unsigned          bufChCnt= inChCnt;
1089
   unsigned          bufChCnt= inChCnt;
886
   cmApSample_t*     inBufArray[ bufChCnt ];
1090
   cmApSample_t*     inBufArray[ bufChCnt ];
887
   cmApSample_t*     outBufArray[ bufChCnt ];
1091
   cmApSample_t*     outBufArray[ bufChCnt ];
910
   cmApBufInitialize(devCnt,meterMs);
1114
   cmApBufInitialize(devCnt,meterMs);
911
 
1115
 
912
   // setup the buffer with the specific parameters to by used by the host audio ports
1116
   // setup the buffer with the specific parameters to by used by the host audio ports
913
-  cmApBufSetup(devIdx,srate,dspFrameCnt,cycleCnt,inChCnt,framesPerCycle,outChCnt,framesPerCycle);
1117
+  cmApBufSetup(devIdx,srate,dspFrameCnt,cycleCnt,inChCnt,framesPerCycle,outChCnt,framesPerCycle, srateMult);
914
 
1118
 
915
   // simulate cylcing through sigN buffer transactions
1119
   // simulate cylcing through sigN buffer transactions
916
   for(i=0; i<sigN; i+=framesPerCycle*inChCnt)
1120
   for(i=0; i<sigN; i+=framesPerCycle*inChCnt)

+ 3
- 3
cmApBuf.h View File

56
   cmAbRC_t cmApBufSetup( 
56
   cmAbRC_t cmApBufSetup( 
57
     unsigned devIdx,              //< device to setup
57
     unsigned devIdx,              //< device to setup
58
     double   srate,               //< device sample rate (only required for synthesizing the correct test-tone frequency)
58
     double   srate,               //< device sample rate (only required for synthesizing the correct test-tone frequency)
59
-    unsigned dspFrameCnt,         // dspFrameCnt - count of samples in channel buffers returned via cmApBufGet() 
59
+    unsigned dspFrameCnt,         //< dspFrameCnt - count of samples in channel buffers returned via cmApBufGet() 
60
     unsigned cycleCnt,            //< number of audio port cycles to store 
60
     unsigned cycleCnt,            //< number of audio port cycles to store 
61
     unsigned inChCnt,             //< input channel count on this device
61
     unsigned inChCnt,             //< input channel count on this device
62
     unsigned inFramesPerCycle,    //< maximum number of incoming sample frames on an audio port cycle
62
     unsigned inFramesPerCycle,    //< maximum number of incoming sample frames on an audio port cycle
63
     unsigned outChCnt,            //< output channel count on this device
63
     unsigned outChCnt,            //< output channel count on this device
64
-    unsigned outFramesPerCycle    //< maximum number of outgoing sample frames in an audio port cycle
65
-                         );
64
+    unsigned outFramesPerCycle,   //< maximum number of outgoing sample frames in an audio port cycle
65
+    int      srateMult );         //< sample rate cvt (positive for upsample, negative for downsample)
66
 
66
 
67
   // Prime the buffer with 'audioCycleCnt' * outFramesPerCycle samples ready to be played
67
   // Prime the buffer with 'audioCycleCnt' * outFramesPerCycle samples ready to be played
68
   cmAbRC_t cmApBufPrimeOutput( unsigned devIdx, unsigned audioCycleCnt );
68
   cmAbRC_t cmApBufPrimeOutput( unsigned devIdx, unsigned audioCycleCnt );

+ 1
- 0
cmAudDsp.c View File

364
           "dspFramesPerCycle",  kIntTId,  &asap->dspFramesPerCycle,
364
           "dspFramesPerCycle",  kIntTId,  &asap->dspFramesPerCycle,
365
           "audioBufCnt",        kIntTId,  &asap->audioBufCnt,
365
           "audioBufCnt",        kIntTId,  &asap->audioBufCnt,
366
           "srate",              kRealTId, &asap->srate,
366
           "srate",              kRealTId, &asap->srate,
367
+            "srateMult",        kIntTId,  &asap->srateMult,
367
             NULL )) != kOkJsRC )
368
             NULL )) != kOkJsRC )
368
       {
369
       {
369
         rc = _cmAdParseMemberErr(p, jsRC, errLabelPtr, cmStringNullGuard(p->asCfgArray[i].label));
370
         rc = _cmAdParseMemberErr(p, jsRC, errLabelPtr, cmStringNullGuard(p->asCfgArray[i].label));

+ 3
- 2
cmAudioAggDev.c View File

738
   cmApAggPortTestRecd r;
738
   cmApAggPortTestRecd r;
739
   unsigned         i;
739
   unsigned         i;
740
   cmRpt_t* rpt = &ctx->rpt;
740
   cmRpt_t* rpt = &ctx->rpt;
741
+  int  srateMult = 1;
741
 
742
 
742
   if( _cmApAggGetOpt(argc,argv,"-h",0,true) )
743
   if( _cmApAggGetOpt(argc,argv,"-h",0,true) )
743
     _cmApAggPrintUsage(rpt);
744
     _cmApAggPrintUsage(rpt);
839
     cmApBufInitialize( cmApDeviceCount(), r.meterMs );
840
     cmApBufInitialize( cmApDeviceCount(), r.meterMs );
840
 
841
 
841
     // setup the buffer for the output device
842
     // setup the buffer for the output device
842
-    cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle );
843
+    cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle, srateMult );
843
 
844
 
844
     // setup the buffer for the input device
845
     // setup the buffer for the input device
845
     if( r.inDevIdx != r.outDevIdx )
846
     if( r.inDevIdx != r.outDevIdx )
846
-      cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle ); 
847
+      cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle, srateMult ); 
847
 
848
 
848
     // setup an input device
849
     // setup an input device
849
     if( cmApDeviceSetup(r.inDevIdx,r.srate,r.framesPerCycle,_cmApAggPortCb2,&r) != kOkApRC )
850
     if( cmApDeviceSetup(r.inDevIdx,r.srate,r.framesPerCycle,_cmApAggPortCb2,&r) != kOkApRC )

+ 6
- 3
cmAudioPort.c View File

663
 {
663
 {
664
   cmApPortTestRecd r;
664
   cmApPortTestRecd r;
665
   unsigned         i;
665
   unsigned         i;
666
-  int              result = 0;
666
+  int              result    = 0;
667
+  int              srateMult = 1;
667
 
668
 
668
   if( _cmApGetOpt(argc,argv,"-h",0,true) )
669
   if( _cmApGetOpt(argc,argv,"-h",0,true) )
669
     _cmApPrintUsage(rpt);
670
     _cmApPrintUsage(rpt);
698
   r.ilog       = ilog;
699
   r.ilog       = ilog;
699
   r.cbCnt      = 0;
700
   r.cbCnt      = 0;
700
 
701
 
702
+
703
+
701
   cmRptPrintf(rpt,"%s in:%i out:%i chidx:%i chs:%i bufs=%i frm=%i rate=%f\n",runFl?"exec":"rpt",r.inDevIdx,r.outDevIdx,r.chIdx,r.chCnt,r.bufCnt,r.framesPerCycle,r.srate);
704
   cmRptPrintf(rpt,"%s in:%i out:%i chidx:%i chs:%i bufs=%i frm=%i rate=%f\n",runFl?"exec":"rpt",r.inDevIdx,r.outDevIdx,r.chIdx,r.chCnt,r.bufCnt,r.framesPerCycle,r.srate);
702
 
705
 
703
   if( cmApFileAllocate(rpt) != kOkApRC )
706
   if( cmApFileAllocate(rpt) != kOkApRC )
737
     cmApBufInitialize( cmApDeviceCount(), r.meterMs );
740
     cmApBufInitialize( cmApDeviceCount(), r.meterMs );
738
 
741
 
739
     // setup the buffer for the output device
742
     // setup the buffer for the output device
740
-    cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle );
743
+    cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle, srateMult );
741
     
744
     
742
     // setup the buffer for the input device
745
     // setup the buffer for the input device
743
     if( r.inDevIdx != r.outDevIdx )
746
     if( r.inDevIdx != r.outDevIdx )
744
-      cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle ); 
747
+      cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle, srateMult ); 
745
 
748
 
746
     cmApBufEnableMeter(  r.inDevIdx, -1, kEnableApFl );
749
     cmApBufEnableMeter(  r.inDevIdx, -1, kEnableApFl );
747
 
750
 

+ 10
- 2
cmAudioSys.c View File

514
   //_cmAsCfg_t* p (_cmAsCfg_t*)cbArg;
514
   //_cmAsCfg_t* p (_cmAsCfg_t*)cbArg;
515
   
515
   
516
   // TODO: handle serial receive
516
   // TODO: handle serial receive
517
+  /*
518
+  int i;
519
+  for(i=0; i<byteN; ++i)
520
+  {
521
+    printf("%02x ",((const uint8_t*)byteA)[i]);
522
+    fflush(stdout);
523
+  }
524
+  */
517
 }
525
 }
518
 
526
 
519
 cmAsRC_t cmAudioSysAllocate( cmAudioSysH_t* hp, cmRpt_t* rpt, const cmAudioSysCfg_t* cfg )
527
 cmAsRC_t cmAudioSysAllocate( cmAudioSysH_t* hp, cmRpt_t* rpt, const cmAudioSysCfg_t* cfg )
800
 
808
 
801
     // setup the input device buffer
809
     // setup the input device buffer
802
     if( ss->args.inDevIdx != cmInvalidIdx )
810
     if( ss->args.inDevIdx != cmInvalidIdx )
803
-      if((rc = cmApBufSetup( ss->args.inDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.inDevIdx, true),  ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.inDevIdx, false), ss->args.devFramesPerCycle )) != kOkAsRC )
811
+      if((rc = cmApBufSetup( ss->args.inDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.inDevIdx, true),  ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.inDevIdx, false), ss->args.devFramesPerCycle, ss->args.srateMult )) != kOkAsRC )
804
       {
812
       {
805
         rc = _cmAsError(p,kAudioBufSetupErrAsRC,"Audio buffer input  setup failed.");
813
         rc = _cmAsError(p,kAudioBufSetupErrAsRC,"Audio buffer input  setup failed.");
806
         goto errLabel;
814
         goto errLabel;
815
 
823
 
816
     // setup the output device buffer
824
     // setup the output device buffer
817
     if( ss->args.outDevIdx != ss->args.inDevIdx )
825
     if( ss->args.outDevIdx != ss->args.inDevIdx )
818
-      if((rc = cmApBufSetup( ss->args.outDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.outDevIdx, true), ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.outDevIdx, false), ss->args.devFramesPerCycle )) != kOkAsRC )
826
+      if((rc = cmApBufSetup( ss->args.outDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.outDevIdx, true), ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.outDevIdx, false), ss->args.devFramesPerCycle, ss->args.srateMult )) != kOkAsRC )
819
         return _cmAsError(p,kAudioBufSetupErrAsRC,"Audio buffer ouput device setup failed.");
827
         return _cmAsError(p,kAudioBufSetupErrAsRC,"Audio buffer ouput device setup failed.");
820
 
828
 
821
     // setup the output audio buffer ptr array - used to recv output audio from the DSP system in _cmAsDspExecCallback()
829
     // setup the output audio buffer ptr array - used to recv output audio from the DSP system in _cmAsDspExecCallback()

+ 1
- 0
cmAudioSys.h View File

139
     unsigned       dspFramesPerCycle; // (64)  Audio samples per channel per DSP cycle.
139
     unsigned       dspFramesPerCycle; // (64)  Audio samples per channel per DSP cycle.
140
     unsigned       audioBufCnt;       // (3)   Audio device buffers.
140
     unsigned       audioBufCnt;       // (3)   Audio device buffers.
141
     double         srate;             // Audio sample rate.
141
     double         srate;             // Audio sample rate.
142
+    int            srateMult;         // Sample rate multiplication factor (negative for divide)
142
   } cmAudioSysArgs_t;
143
   } cmAudioSysArgs_t;
143
 
144
 
144
   // Audio sub-system configuration record.
145
   // Audio sub-system configuration record.

+ 2
- 2
cmRtSys.c View File

887
 
887
 
888
   // setup the input device buffer
888
   // setup the input device buffer
889
   if( ss->args.inDevIdx != cmInvalidIdx )
889
   if( ss->args.inDevIdx != cmInvalidIdx )
890
-    if((rc = cmApBufSetup( ss->args.inDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.inDevIdx, true),  ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.inDevIdx, false), ss->args.devFramesPerCycle )) != kOkRtRC )
890
+    if((rc = cmApBufSetup( ss->args.inDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.inDevIdx, true),  ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.inDevIdx, false), ss->args.devFramesPerCycle, ss->args.srateMult )) != kOkRtRC )
891
     {
891
     {
892
       rc = _cmRtError(p,kAudioBufSetupErrRtRC,"Audio buffer input  setup failed.");
892
       rc = _cmRtError(p,kAudioBufSetupErrRtRC,"Audio buffer input  setup failed.");
893
       goto errLabel;
893
       goto errLabel;
902
 
902
 
903
   // setup the output device buffer
903
   // setup the output device buffer
904
   if( ss->args.outDevIdx != ss->args.inDevIdx )
904
   if( ss->args.outDevIdx != ss->args.inDevIdx )
905
-    if((rc = cmApBufSetup( ss->args.outDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.outDevIdx, true), ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.outDevIdx, false), ss->args.devFramesPerCycle )) != kOkRtRC )
905
+    if((rc = cmApBufSetup( ss->args.outDevIdx, ss->args.srate, ss->args.dspFramesPerCycle, ss->args.audioBufCnt, cmApDeviceChannelCount(ss->args.outDevIdx, true), ss->args.devFramesPerCycle, cmApDeviceChannelCount(ss->args.outDevIdx, false), ss->args.devFramesPerCycle, ss->args.srateMult )) != kOkRtRC )
906
       return _cmRtError(p,kAudioBufSetupErrRtRC,"Audio buffer ouput device setup failed.");
906
       return _cmRtError(p,kAudioBufSetupErrRtRC,"Audio buffer ouput device setup failed.");
907
 
907
 
908
   // setup the output audio buffer ptr array - used to recv output audio from the DSP system in _cmRtDspExecCallback()
908
   // setup the output audio buffer ptr array - used to recv output audio from the DSP system in _cmRtDspExecCallback()

+ 1
- 0
cmRtSys.h View File

153
     unsigned        dspFramesPerCycle; // (64)  Audio samples per channel per DSP cycle.
153
     unsigned        dspFramesPerCycle; // (64)  Audio samples per channel per DSP cycle.
154
     unsigned        audioBufCnt;       // (3)   Audio device buffers.
154
     unsigned        audioBufCnt;       // (3)   Audio device buffers.
155
     double          srate;             // Audio sample rate.
155
     double          srate;             // Audio sample rate.
156
+    int             srateMult;
156
   } cmRtSysArgs_t;
157
   } cmRtSysArgs_t;
157
 
158
 
158
   // Audio sub-system configuration record.
159
   // Audio sub-system configuration record.

+ 1
- 1
dsp/cmDspClass.c View File

667
 }
667
 }
668
 
668
 
669
 double      cmDspSampleRate(      cmDspCtx_t* ctx )
669
 double      cmDspSampleRate(      cmDspCtx_t* ctx )
670
-{ return ctx->ctx->ss->args.srate; }
670
+{ return ctx->ctx->ss->args.srate * ctx->ctx->ss->args.srateMult; }
671
 
671
 
672
 unsigned    cmDspSamplesPerCycle( cmDspCtx_t * ctx )
672
 unsigned    cmDspSamplesPerCycle( cmDspCtx_t * ctx )
673
 { return ctx->ctx->ss->args.dspFramesPerCycle; }
673
 { return ctx->ctx->ss->args.dspFramesPerCycle; }

+ 95
- 89
dsp/cmDspKr.c View File

2812
   kStatusPcId,
2812
   kStatusPcId,
2813
   kD0PcId,
2813
   kD0PcId,
2814
   kD1PcId,
2814
   kD1PcId,
2815
+  kAllOffPcId
2815
 };
2816
 };
2816
 
2817
 
2817
 cmDspClass_t _cmPicadaeDC;
2818
 cmDspClass_t _cmPicadaeDC;
2933
 
2934
 
2934
 cmDspPicadaeDuty_t cmDspPicadaeDutyMap[] =
2935
 cmDspPicadaeDuty_t cmDspPicadaeDutyMap[] =
2935
 {
2936
 {
2936
- 21, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2937
- 22, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2938
- 23, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2939
- 24, {{ 0, 75 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2940
- 25, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2941
- 26, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2942
- 27, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2943
- 28, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2944
- 29, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2945
- 30, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2946
- 31, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2947
- 32, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2948
- 33, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2949
- 34, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2950
- 35, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2951
- 36, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2952
- 37, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2953
- 38, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2954
- 39, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2955
- 40, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2956
- 41, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2957
- 42, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2958
- 43, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2959
- 44, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2960
- 45, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2961
- 46, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2962
- 47, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2963
- 48, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2964
- 49, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2965
- 50, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2966
- 51, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2967
- 52, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2968
- 53, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2969
- 54, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2970
- 55, {{ 0, 50 }, { 22000, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2971
- 56, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2972
- 57, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2973
- 58, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2974
- 59, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2975
- 60, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2976
- 61, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2977
- 62, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2978
- 63, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2979
- 64, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2980
- 65, {{ 0, 50 }, { 17000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2981
- 66, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2982
- 67, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2983
- 68, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2984
- 69, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2985
- 70, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2986
- 71, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2987
- 72, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2988
- 73, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2989
- 74, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2990
- 75, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2991
- 76, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2992
- 77, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, },
2993
- 78, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2994
- 79, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, },
2995
- 80, {{ 0, 45 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2996
- 81, {{ 0, 50 }, { 15000, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2997
- 82, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, },
2998
- 83, {{ 0, 50 }, { 15000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2999
- 84, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, },
3000
- 85, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, },
3001
- 86, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, },
3002
- 87, {{ 0, 50 }, { 14000, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3003
- 88, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, },
3004
- 89, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, },
3005
- 90, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3006
- 91, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }, 
3007
- 92, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3008
- 93, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, },
3009
- 94, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3010
- 95, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, },
3011
- 96, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, },
3012
- 97, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3013
- 98, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3014
- 99, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3015
- 100, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3016
- 101, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3017
- 102, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3018
- 103, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3019
- 104, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3020
- 105, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3021
- 106, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3022
- 107, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3023
- 108, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
3024
-   0, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, },
2937
+ {21, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2938
+ {22, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2939
+ {23, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2940
+ {24, {{ 0, 75 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2941
+ {25, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2942
+ {26, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2943
+ {27, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2944
+ {28, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2945
+ {29, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2946
+ {30, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2947
+ {31, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2948
+ {32, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2949
+ {33, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2950
+ {34, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2951
+ {35, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2952
+ {36, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2953
+ {37, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2954
+ {38, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2955
+ {39, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2956
+ {40, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2957
+ {41, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2958
+ {42, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2959
+ {43, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2960
+ {44, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2961
+ {45, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2962
+ {46, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2963
+ {47, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2964
+ {48, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2965
+ {49, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2966
+ {50, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2967
+ {51, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2968
+ {52, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2969
+ {53, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2970
+ {54, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2971
+ {55, {{ 0, 50 }, { 22000, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2972
+ {56, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2973
+ {57, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2974
+ {58, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2975
+ {59, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2976
+ {60, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2977
+ {61, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2978
+ {62, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2979
+ {63, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2980
+ {64, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2981
+ {65, {{ 0, 50 }, { 17000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2982
+ {66, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2983
+ {67, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2984
+ {68, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2985
+ {69, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2986
+ {70, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2987
+ {71, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2988
+ {72, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2989
+ {73, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2990
+ {74, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2991
+ {75, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2992
+ {76, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2993
+ {77, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, }},
2994
+ {78, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2995
+ {79, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, }},
2996
+ {80, {{ 0, 45 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2997
+ {81, {{ 0, 50 }, { 15000, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
2998
+ {82, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }},
2999
+ {83, {{ 0, 50 }, { 15000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3000
+ {84, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }},
3001
+ {85, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }},
3002
+ {86, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }},
3003
+ {87, {{ 0, 50 }, { 14000, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3004
+ {88, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }},
3005
+ {89, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }},
3006
+ {90, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3007
+ {91, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }}, 
3008
+ {92, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3009
+ {93, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }},
3010
+ {94, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3011
+ {95, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }},
3012
+ {96, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }},
3013
+ {97, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3014
+ {98, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3015
+ {99, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3016
+ {100, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3017
+ {101, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3018
+ {102, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3019
+ {103, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3020
+ {104, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3021
+ {105, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3022
+ {106, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3023
+ {107, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3024
+ {108, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3025
+ {  0, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }},
3025
 
3026
 
3026
 };
3027
 };
3027
 
3028
 
3135
     { "status", kStatusPcId, 0,  0,  kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI status" },
3136
     { "status", kStatusPcId, 0,  0,  kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI status" },
3136
     { "d0",     kD0PcId,     0,  0,  kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI channel message d0" },
3137
     { "d0",     kD0PcId,     0,  0,  kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI channel message d0" },
3137
     { "d1",     kD1PcId,     0,  0,  kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI channel message d1" },
3138
     { "d1",     kD1PcId,     0,  0,  kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI channel message d1" },
3139
+    { "alloff", kAllOffPcId, 0,  0,  kOutDsvFl | kInDsvFl | kSymDsvFl  | kOptArgDsvFl, "All notes off."}, 
3138
     { NULL, 0, 0, 0, 0 }
3140
     { NULL, 0, 0, 0, 0 }
3139
   };
3141
   };
3140
 
3142
 
3205
       }
3207
       }
3206
       break;
3208
       break;
3207
 
3209
 
3210
+    case kAllOffPcId:
3211
+      printf("Picadae All Off\n");
3212
+      _cmDspPicadaReset( ctx, inst );
3213
+      break;
3208
 
3214
 
3209
     default:
3215
     default:
3210
       // store 
3216
       // store 

+ 32
- 15
dsp/cmDspPgm.c View File

131
   cmDspRC_t rc = kOkDspRC;
131
   cmDspRC_t rc = kOkDspRC;
132
 
132
 
133
 
133
 
134
-  //const cmChar_t* deviceName = "Scarlett 18i20 USB";
135
-  //const cmChar_t* portName   = "Scarlett 18i20 USB MIDI 1";
134
+  const cmChar_t* deviceName = "Scarlett 18i20 USB";
135
+  const cmChar_t* portName   = "Scarlett 18i20 USB MIDI 1";
136
   
136
   
137
-  const cmChar_t* deviceName = "Fastlane";
138
-  const cmChar_t* portName   = "Fastlane MIDI A";
137
+  //const cmChar_t* deviceName = "Fastlane";
138
+  //const cmChar_t* portName   = "Fastlane MIDI A";
139
 
139
 
140
   //const cmChar_t* deviceName = "DKV-M4";
140
   //const cmChar_t* deviceName = "DKV-M4";
141
   //const cmChar_t* portName   = "DKV-M4 MIDI 1";
141
   //const cmChar_t* portName   = "DKV-M4 MIDI 1";
150
   cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL,   1, 3 );
150
   cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL,   1, 3 );
151
 
151
 
152
   cmDspInst_t* mfp   = cmDspSysAllocInst(h,"MidiFilePlay",NULL,  0 );
152
   cmDspInst_t* mfp   = cmDspSysAllocInst(h,"MidiFilePlay",NULL,  0 );
153
-  cmDspInst_t* mop   = cmDspSysAllocInst( h,"MidiOut", NULL,     2, deviceName, portName);
153
+  cmDspInst_t* pic   = cmDspSysAllocInst(h,"Picadae",     NULL,  0 );
154
+  cmDspInst_t* mop   = cmDspSysAllocInst( h,"MidiOut",    NULL,  2, deviceName, portName);
154
 
155
 
155
   cmDspInst_t* start = cmDspSysAllocInst( h,"Button", "start",    2, kButtonDuiId, 0.0 );
156
   cmDspInst_t* start = cmDspSysAllocInst( h,"Button", "start",    2, kButtonDuiId, 0.0 );
156
   cmDspInst_t* stop  = cmDspSysAllocInst( h,"Button", "stop",     2, kButtonDuiId, 0.0 );
157
   cmDspInst_t* stop  = cmDspSysAllocInst( h,"Button", "stop",     2, kButtonDuiId, 0.0 );
159
   cmDspInst_t* beg = cmDspSysAllocInst(h,"Scalar", "Beg Samp",    5, kNumberDuiId, 0.0, 1000000000.0, 1.0,   0.0 );  
160
   cmDspInst_t* beg = cmDspSysAllocInst(h,"Scalar", "Beg Samp",    5, kNumberDuiId, 0.0, 1000000000.0, 1.0,   0.0 );  
160
   cmDspInst_t* end = cmDspSysAllocInst(h,"Scalar", "End Samp",    5, kNumberDuiId, 0.0, 1000000000.0, 1.0,   1000000000.0 );  
161
   cmDspInst_t* end = cmDspSysAllocInst(h,"Scalar", "End Samp",    5, kNumberDuiId, 0.0, 1000000000.0, 1.0,   1000000000.0 );  
161
    
162
    
162
-  cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 0 );
163
-  cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 1 );
164
-  cmDspInst_t* ao2p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 2 );
165
-  cmDspInst_t* ao3p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 3 );
163
+  cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 2 );
164
+  cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 3 );
165
+  cmDspInst_t* ao2p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 4 );
166
+  cmDspInst_t* ao3p = cmDspSysAllocInst(h,"AudioOut",NULL,   1, 5 );
166
 
167
 
167
   cmDspInst_t* im0p = cmDspSysAllocInst(h,"AMeter","In 0",  0);
168
   cmDspInst_t* im0p = cmDspSysAllocInst(h,"AMeter","In 0",  0);
168
   cmDspInst_t* im1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
169
   cmDspInst_t* im1p = cmDspSysAllocInst(h,"AMeter","In 1", 0);
190
   cmDspSysInstallCb(   h, stop,  "sym",   mfp, "sel",    NULL);
191
   cmDspSysInstallCb(   h, stop,  "sym",   mfp, "sel",    NULL);
191
   cmDspSysInstallCb(   h, cont,  "sym",   mfp, "sel",    NULL);
192
   cmDspSysInstallCb(   h, cont,  "sym",   mfp, "sel",    NULL);
192
 
193
 
194
+  bool usePicadaeFl = false;
195
+  
196
+  if( usePicadaeFl )
197
+  {
198
+    cmDspSysInstallCb(   h, mfp,  "d1",     pic, "d1",     NULL);
199
+    cmDspSysInstallCb(   h, mfp,  "d0",     pic, "d0",     NULL);
200
+    cmDspSysInstallCb(   h, mfp,  "status", pic, "status", NULL);
193
 
201
 
194
-  cmDspSysInstallCb(   h, mfp,  "d1",     mop, "d1",     NULL);
195
-  cmDspSysInstallCb(   h, mfp,  "d0",     mop, "d0",     NULL);
196
-  cmDspSysInstallCb(   h, mfp,  "status", mop, "status", NULL);
197
-
202
+    cmDspSysInstallCb(   h, pic,  "d1",     mop, "d1",     NULL);
203
+    cmDspSysInstallCb(   h, pic,  "d0",     mop, "d0",     NULL);
204
+    cmDspSysInstallCb(   h, pic,  "status", mop, "status", NULL);
205
+  }
206
+  else
207
+  {
208
+    cmDspSysInstallCb(   h, mfp,  "d1",     mop, "d1",     NULL);
209
+    cmDspSysInstallCb(   h, mfp,  "d0",     mop, "d0",     NULL);
210
+    cmDspSysInstallCb(   h, mfp,  "status", mop, "status", NULL);
211
+  }
212
+  
198
   //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in"); 
213
   //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in"); 
199
   //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in"); 
214
   //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in"); 
200
 
215
 
357
 cmDspRC_t _cmDspSysPgm_Stereo_Through( cmDspSysH_t h, void** userPtrPtr )
372
 cmDspRC_t _cmDspSysPgm_Stereo_Through( cmDspSysH_t h, void** userPtrPtr )
358
 {
373
 {
359
 
374
 
360
-  cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain",  5, kNumberDuiId, 0.0,  4.0, 0.01,  1.0);
375
+  cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain",  5, kNumberDuiId, 0.0,  4.0, 0.01,  0.0);
361
   //cmDspInst_t* ognp = cmDspSysAllocInst( h,"Scalar", "Out Gain", 5, kNumberDuiId, 0.0,  4.0, 0.01,  1.0);
376
   //cmDspInst_t* ognp = cmDspSysAllocInst( h,"Scalar", "Out Gain", 5, kNumberDuiId, 0.0,  4.0, 0.01,  1.0);
362
   cmDspInst_t* hzp  =  cmDspSysAllocInst(h,"Scalar", "Hz",       5, kNumberDuiId, 0.0, 10.0, 0.001, 1.0);
377
   cmDspInst_t* hzp  =  cmDspSysAllocInst(h,"Scalar", "Hz",       5, kNumberDuiId, 0.0, 10.0, 0.001, 1.0);
363
 
378
 
403
   return kOkDspRC;
418
   return kOkDspRC;
404
 }
419
 }
405
 
420
 
406
-
421
+//------------------------------------------------------------------------------
422
+//)
423
+//( { label:cmDspSysPgm_All_In_And_Out file_desc:"Meter all the input channels and pass two channels to the output." kw:[spgm] }
407
 cmDspRC_t _cmDspSysPgm_All_In_And_Out( cmDspSysH_t h, void** userPtrPtr )
424
 cmDspRC_t _cmDspSysPgm_All_In_And_Out( cmDspSysH_t h, void** userPtrPtr )
408
 {
425
 {
409
   cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain",  5, kNumberDuiId, 0.0,  4.0, 0.01,  1.0);
426
   cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain",  5, kNumberDuiId, 0.0,  4.0, 0.01,  1.0);

+ 2
- 0
dsp/cmDspPgmKrTimeLineLite.c View File

95
   cmDspInst_t* ao3 = cmDspSysAllocInst(h,"AudioOut",    NULL,   1, 3 ); // 3          2
95
   cmDspInst_t* ao3 = cmDspSysAllocInst(h,"AudioOut",    NULL,   1, 3 ); // 3          2
96
 
96
 
97
   cmDspSysNewPage(h,"Main");
97
   cmDspSysNewPage(h,"Main");
98
+  cmDspInst_t* notesOffb= cmDspSysAllocInst(h,"Button", "notesOff",   2, kButtonDuiId, 1.0 );
98
   cmDspInst_t* onb     = cmDspSysAllocInst(h,"Button", "start",   2, kButtonDuiId, 1.0 );
99
   cmDspInst_t* onb     = cmDspSysAllocInst(h,"Button", "start",   2, kButtonDuiId, 1.0 );
99
   cmDspInst_t* offb    = cmDspSysAllocInst(h,"Button", "stop",    2, kButtonDuiId, 1.0 );
100
   cmDspInst_t* offb    = cmDspSysAllocInst(h,"Button", "stop",    2, kButtonDuiId, 1.0 );
100
   cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 );
101
   cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 );
233
 
234
 
234
   cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
235
   cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL );
235
 
236
 
237
+  cmDspSysInstallCb(h, notesOffb,  "sym",    pic, "alloff",  NULL );
236
   
238
   
237
   // start connections
239
   // start connections
238
   cmDspSysInstallCb(h, onb,  "sym",    tlRt, "s-in",  NULL );
240
   cmDspSysInstallCb(h, onb,  "sym",    tlRt, "s-in",  NULL );

+ 1
- 1
dsp/cmDspSys.c View File

1547
 double       cmDspSysSampleRate( cmDspSysH_t h )
1547
 double       cmDspSysSampleRate( cmDspSysH_t h )
1548
 {
1548
 {
1549
   cmDsp_t* p = _cmDspHandleToPtr(h);
1549
   cmDsp_t* p = _cmDspHandleToPtr(h);
1550
-  return p->ctx.ctx->ss->args.srate;
1550
+  return cmDspSampleRate( &p->ctx );
1551
 }
1551
 }
1552
 
1552
 
1553
 cmJsonH_t    cmDspSysPgmRsrcHandle( cmDspSysH_t h )
1553
 cmJsonH_t    cmDspSysPgmRsrcHandle( cmDspSysH_t h )

Loading…
Cancel
Save