diff --git a/cmApBuf.c b/cmApBuf.c index d034633..a277ac4 100644 --- a/cmApBuf.c +++ b/cmApBuf.c @@ -40,10 +40,7 @@ output ch: client audio both The fn variable however is not thread-safe and therefore care must be taken as - to how it is read and updated. - - - + to how it is read and updated. */ enum { kInApIdx=0, kOutApIdx=1, kIoApCnt=2 }; @@ -61,21 +58,25 @@ typedef struct cmApSample_t* m; // m[mn] meter sample sum unsigned mn; // length of m[] unsigned mi; // next ele of m[] to rcv sum + cmApSample_t s0; // buffered sample used for srate conversion } cmApCh; typedef struct { - unsigned chCnt; - cmApCh* chArray; + unsigned chCnt; // Count of channels + cmApCh* chArray; // chArray[chCnt] channel record array - unsigned n; // length of b[] (multiple of dspFrameCnt) bufCnt*framesPerCycle - double srate; // device sample rate; + unsigned n; // Length of b[] (multiple of dspFrameCnt) bufCnt*framesPerCycle + double srate; // Device sample rate; + int srateMult; // Internal sample rate multiplier (negative values for dividing). This srateMult*srate is the sample rate of + // signals held in the chApCh[] input and output buffers. Sample rate conversion to/from this rate + // occurs in cmApBufUpdate() as signals go from/to the audio device. - unsigned faultCnt; - unsigned framesPerCycle; - unsigned dspFrameCnt; - cmTimeSpec_t timeStamp; // base (starting) time stamp for this device - unsigned ioFrameCnt; // count of frames input or output for this device + unsigned faultCnt; // error count since start + unsigned framesPerCycle; // expected count of frames per channel to/from the audio device on each call to cmApBufUpdate() + unsigned dspFrameCnt; // number of frames per channel in buffers returned by cmApBufGet(). + cmTimeSpec_t timeStamp; // base (starting) time stamp for this device + unsigned ioFrameCnt; // count of frames input or output for this device } cmApIO; @@ -93,11 +94,145 @@ typedef struct cmApSample_t* zeroBuf; // buffer of zeros unsigned zeroBufCnt; // max of all dspFrameCnt for all devices. + + + unsigned abufIdx; + cmApSample_t abuf[ 16384 ]; } cmApBuf; cmApBuf _cmApBuf; +// Copy the source channel (srcChIdx) to the destination buffer and apply up-sampling. +// 'src' is an interleaved buffer with 'srcN' samples per channel and 'srcChN' channels (total size in samples = srcN*srcChN) +// '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.. +// Return the index into dst[] of the next location to receive an incoming sample. +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 ) +{ + cmApSample_t s0 = *s0_Ref; + unsigned si,k,di=dstIdx; + + for(si=0; si 0 ) + return _cmApCopyOutDnSample(src, srcN, srcIdx, dst, dstN, dstChN, dstChIdx, srateMult, gain ); + + return _cmApCopyOutUpSample( src, srcN, srcIdx, dst, dstN, dstChN, dstChIdx, -srateMult, gain, s0_Ref ); +} + + cmApSample_t _cmApMeterValue( const cmApCh* cp ) { double sum = 0; @@ -108,7 +243,7 @@ cmApSample_t _cmApMeterValue( const cmApCh* cp ) return cp->mn==0 ? 0 : (cmApSample_t)sqrt(sum/cp->mn); } -void _cmApSine( cmApCh* cp, cmApSample_t* b0, unsigned n0, cmApSample_t* b1, unsigned n1, unsigned stride, float srate ) +void _cmApSine0( cmApCh* cp, cmApSample_t* b0, unsigned n0, cmApSample_t* b1, unsigned n1, unsigned stride, float srate ) { unsigned i; @@ -119,6 +254,23 @@ void _cmApSine( cmApCh* cp, cmApSample_t* b0, unsigned n0, cmApSample_t* b1, uns b1[i*stride] = (float)(cp->gain * sin( 2.0 * M_PI * cp->hz * cp->phs / srate )); } +// Synthesize a sine signal of length sigN*srateMult starting at dst[dstidx] +// Assume dst[dstN] is a circular buffer +unsigned _cmApSine( cmApCh* cp, cmApSample_t* dst, unsigned dstN, unsigned dstIdx, unsigned dstChCnt, unsigned sigN, unsigned srateMult, float srate, double gain ) +{ + unsigned i,di; + + sigN = srateMult < 0 ? sigN/abs(srateMult) : sigN * srateMult; + for(i=0, di=dstIdx; iphs) + { + dst[di] = (cmApSample_t)(gain * sin( 2.0 * M_PI * cp->hz * cp->phs / srate )); + di = (di+dstChCnt) % dstN; + } + + return sigN; +} + + cmApSample_t _cmApMeter( const cmApSample_t* b, unsigned bn, unsigned stride ) { const cmApSample_t* ep = b + bn; @@ -151,6 +303,7 @@ void _cmApChInitialize( cmApCh* chPtr, unsigned n, unsigned mn ) chPtr->mn = mn; chPtr->m = cmMemAllocZ(cmApSample_t,mn); chPtr->mi = 0; + } void _cmApIoFinalize( cmApIO* ioPtr ) @@ -164,27 +317,31 @@ void _cmApIoFinalize( cmApIO* ioPtr ) ioPtr->n = 0; } -void _cmApIoInitialize( cmApIO* ioPtr, double srate, unsigned framesPerCycle, unsigned chCnt, unsigned n, unsigned meterBufN, unsigned dspFrameCnt ) +void _cmApIoInitialize( cmApIO* ioPtr, double srate, unsigned framesPerCycle, unsigned chCnt, unsigned n, unsigned meterBufN, unsigned dspFrameCnt, int srateMult ) { unsigned i; + if( srateMult == 0 ) + srateMult = 1; + _cmApIoFinalize(ioPtr); n += (n % dspFrameCnt); // force buffer size to be a multiple of dspFrameCnt ioPtr->chArray = chCnt==0 ? NULL : cmMemAllocZ( cmApCh, chCnt ); ioPtr->chCnt = chCnt; - ioPtr->n = n; + ioPtr->n = srateMult<0 ? n : n*srateMult; ioPtr->faultCnt = 0; ioPtr->framesPerCycle = framesPerCycle; ioPtr->srate = srate; + ioPtr->srateMult = srateMult; ioPtr->dspFrameCnt = dspFrameCnt; ioPtr->timeStamp.tv_sec = 0; ioPtr->timeStamp.tv_nsec = 0; ioPtr->ioFrameCnt = 0; for(i=0; ichArray + i, n, meterBufN ); + _cmApChInitialize( ioPtr->chArray + i, ioPtr->n, meterBufN ); } @@ -195,7 +352,7 @@ void _cmApDevFinalize( cmApDev* dp ) _cmApIoFinalize( dp->ioArray+i); } -void _cmApDevInitialize( cmApDev* dp, double srate, unsigned iFpC, unsigned iChCnt, unsigned iBufN, unsigned oFpC, unsigned oChCnt, unsigned oBufN, unsigned meterBufN, unsigned dspFrameCnt ) +void _cmApDevInitialize( cmApDev* dp, double srate, unsigned iFpC, unsigned iChCnt, unsigned iBufN, unsigned oFpC, unsigned oChCnt, unsigned oBufN, unsigned meterBufN, unsigned dspFrameCnt, int srateMult ) { unsigned i; @@ -203,10 +360,10 @@ void _cmApDevInitialize( cmApDev* dp, double srate, unsigned iFpC, unsigned iChC for(i=0; iioArray+i, srate, fpc, chCnt, bufN, meterBufN, dspFrameCnt ); + unsigned chCnt = i==kInApIdx ? iChCnt : oChCnt; + unsigned bufN = i==kInApIdx ? iBufN : oBufN; + unsigned fpc = i==kInApIdx ? iFpC : oFpC; + _cmApIoInitialize( dp->ioArray+i, srate, fpc, chCnt, bufN, meterBufN, dspFrameCnt, srateMult ); } @@ -222,6 +379,7 @@ cmAbRC_t cmApBufInitialize( unsigned devCnt, unsigned meterMs ) _cmApBuf.devArray = cmMemAllocZ( cmApDev, devCnt ); _cmApBuf.devCnt = devCnt; cmApBufSetMeterMs(meterMs); + return kOkAbRC; } @@ -236,6 +394,22 @@ cmAbRC_t cmApBufFinalize() _cmApBuf.devCnt = 0; + FILE* fp; + if(_cmApBuf.abufIdx>0 ) + { + if((fp = fopen("/home/kevin/temp/temp.csv","wt")) != NULL ) + { + int i; + for(i=0; i<_cmApBuf.abufIdx; ++i) + { + fprintf(fp,"%f,\n",_cmApBuf.abuf[i]); + } + fclose(fp); + } + } + + + return kOkAbRC; } @@ -247,14 +421,15 @@ cmAbRC_t cmApBufSetup( unsigned inChCnt, unsigned inFramesPerCycle, unsigned outChCnt, - unsigned outFramesPerCycle) + unsigned outFramesPerCycle, + int srateMult) { cmApDev* devPtr = _cmApBuf.devArray + devIdx; unsigned iBufN = bufCnt * inFramesPerCycle; unsigned oBufN = bufCnt * outFramesPerCycle; unsigned meterBufN = cmMax(1,floor(srate * _cmApBuf.meterMs / (1000.0 * outFramesPerCycle))); - _cmApDevInitialize( devPtr, srate, inFramesPerCycle, inChCnt, iBufN, outFramesPerCycle, outChCnt, oBufN, meterBufN, dspFrameCnt ); + _cmApDevInitialize( devPtr, srate, inFramesPerCycle, inChCnt, iBufN, outFramesPerCycle, outChCnt, oBufN, meterBufN, dspFrameCnt, srateMult ); if( inFramesPerCycle > _cmApBuf.zeroBufCnt || outFramesPerCycle > _cmApBuf.zeroBufCnt ) { @@ -325,8 +500,6 @@ cmAbRC_t cmApBufUpdate( for(j=0; jchCnt; ++j) { cmApCh* cp = ip->chArray + pp->begChIdx +j; // dest ch - unsigned n0 = ip->n - cp->ii; // first dest segment - unsigned n1 = 0; // second dest segment assert(pp->begChIdx + j < ip->chCnt ); @@ -339,16 +512,12 @@ cmAbRC_t cmApBufUpdate( // if the incoming samples would go off the end of the buffer then // copy in the samples in two segments (one at the end and another at begin of dest channel) - if( n0 < pp->audioFramesCnt ) - n1 = pp->audioFramesCnt-n0; - else - n0 = pp->audioFramesCnt; - + bool enaFl = cmIsFlag(cp->fl,kChApFl) && cmIsFlag(cp->fl,kMuteApFl)==false; const cmApSample_t* sp = enaFl ? ((cmApSample_t*)pp->audioBytesPtr) + j : _cmApBuf.zeroBuf; - unsigned ssn = enaFl ? pp->chCnt : 1; // stride (packet samples are interleaved) - cmApSample_t* dp = cp->b + cp->ii; - const cmApSample_t* ep = dp + n0; + //unsigned ssn = enaFl ? pp->chCnt : 1; // stride (packet samples are interleaved) + //cmApSample_t* dp = cp->b + cp->ii; + //const cmApSample_t* ep = dp + n0; // update the meter @@ -358,33 +527,41 @@ cmAbRC_t cmApBufUpdate( cp->mi = (cp->mi + 1) % cp->mn; } + unsigned incrSmpN = 0; + // if the test tone is enabled on this input channel if( enaFl && cmIsFlag(cp->fl,kToneApFl) ) { - _cmApSine(cp, dp, n0, cp->b, n1, 1, ip->srate ); + //_cmApSine(cp, dp, n0, cp->b, n1, 1, ip->srate ); + incrSmpN = _cmApSine( cp, cp->b, ip->n, cp->ii, 1, pp->audioFramesCnt, ip->srateMult, ip->srate, cp->gain ); + + } else // otherwise copy samples from the packet to the buffer { - // copy the first segment - for(; dp < ep; sp += ssn ) - *dp++ = cp->gain * *sp; - // if there is a second segment - if( n1 > 0 ) - { - // copy the second segment - dp = cp->b; - ep = dp + n1; - for(; dpgain * *sp; - } + unsigned pi = cp->ii; + + cp->ii = _cmApCopyInSamples( (cmApSample_t*)pp->audioBytesPtr, pp->audioFramesCnt, pp->chCnt, j, cp->b, ip->n, cp->ii, ip->srateMult, cp->gain, &cp->s0 ); + + if( false ) + if( j == 2 && _cmApBuf.abufIdx < 16384 ) + { + int ii; + for(ii=pi; ii!=cp->ii && _cmApBuf.abufIdx<16384; _cmApBuf.abufIdx++) + { + _cmApBuf.abuf[ _cmApBuf.abufIdx ] = cp->b[ii]; + ii = (ii + 1) % ip->n; + } + + } + + + incrSmpN = cp->ii > pi ? cp->ii-pi : (ip->n-pi) + cp->ii; + } - - // advance the input channel buffer - cp->ii = n1>0 ? n1 : cp->ii + n0; - //cp->fn += pp->audioFramesCnt; - cmThUIntIncr(&cp->fn,pp->audioFramesCnt); + cmThUIntIncr(&cp->fn,incrSmpN); } } } @@ -423,7 +600,6 @@ cmAbRC_t cmApBufUpdate( // ... otherwise decrease the count of returned samples pp->audioFramesCnt = fn; - } // if the outgong segments would go off the end of the buffer then @@ -433,19 +609,42 @@ cmAbRC_t cmApBufUpdate( else n0 = pp->audioFramesCnt; - cmApSample_t* dp = ((cmApSample_t*)pp->audioBytesPtr) + j; + cmApSample_t* bpp = ((cmApSample_t*)pp->audioBytesPtr) + j; + cmApSample_t* dp = bpp; bool enaFl = cmIsFlag(cp->fl,kChApFl) && cmIsFlag(cp->fl,kMuteApFl)==false; + unsigned decrSmpN = 0; + // if the tone is enabled on this channel if( enaFl && cmIsFlag(cp->fl,kToneApFl) ) { - _cmApSine(cp, dp, n0, dp + n0*pp->chCnt, n1, pp->chCnt, op->srate ); + //_cmApSine(cp, dp, n0, dp + n0*pp->chCnt, n1, pp->chCnt, op->srate ); + decrSmpN = _cmApSine( cp, (cmApSample_t*)pp->audioBytesPtr, pp->audioFramesCnt, 0, pp->chCnt, pp->audioFramesCnt, op->srateMult, op->srate, cp->gain ); + } else // otherwise copy samples from the output buffer to the packet { const cmApSample_t* sp = enaFl ? cp->b + cp->oi : _cmApBuf.zeroBuf; const cmApSample_t* ep = sp + n0; + unsigned pi = cp->oi; + 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 ); + + decrSmpN = cp->oi>pi ? cp->oi-pi : (op->n-pi) + cp->oi; + + if( true ) + if( j == 2 && _cmApBuf.abufIdx < 16384 ) + { + int ii; + for(ii=pi; ii!=cp->oi && _cmApBuf.abufIdx<16384; _cmApBuf.abufIdx++) + { + _cmApBuf.abuf[ _cmApBuf.abufIdx ] = cp->b[ii]; + ii = (ii + 1) % op->n; + } + + } + + /* // copy the first segment for(; sp < ep; dp += pp->chCnt ) *dp = cp->gain * *sp++; @@ -460,6 +659,7 @@ cmAbRC_t cmApBufUpdate( *dp = cp->gain * *sp++; } + */ } // update the meter @@ -470,9 +670,13 @@ cmAbRC_t cmApBufUpdate( } // advance the output channel buffer + /* cp->oi = n1>0 ? n1 : cp->oi + n0; - //cp->fn -= pp->audioFramesCnt; cmThUIntDecr(&cp->fn,pp->audioFramesCnt); + */ + + //cp->fn -= pp->audioFramesCnt; + cmThUIntDecr(&cp->fn,decrSmpN); } } } @@ -657,7 +861,6 @@ void cmApBufGet( unsigned devIdx, unsigned flags, cmApSample_t* bufArray[], unsi unsigned idx = flags & kInApFl ? kInApIdx : kOutApIdx; const cmApIO* ioPtr = _cmApBuf.devArray[devIdx].ioArray + idx; unsigned n = bufChCnt < ioPtr->chCnt ? bufChCnt : ioPtr->chCnt; - //unsigned offs = flags & kInApFl ? ioPtr->oi : ioPtr->ii; cmApCh* cp = ioPtr->chArray; for(i=0; idspFramesPerCycle, "audioBufCnt", kIntTId, &asap->audioBufCnt, "srate", kRealTId, &asap->srate, + "srateMult", kIntTId, &asap->srateMult, NULL )) != kOkJsRC ) { rc = _cmAdParseMemberErr(p, jsRC, errLabelPtr, cmStringNullGuard(p->asCfgArray[i].label)); diff --git a/cmAudioAggDev.c b/cmAudioAggDev.c index ec5e23e..921d896 100644 --- a/cmAudioAggDev.c +++ b/cmAudioAggDev.c @@ -738,6 +738,7 @@ int cmApAggTest( bool runFl, cmCtx_t* ctx, int argc, const char* argv[] ) cmApAggPortTestRecd r; unsigned i; cmRpt_t* rpt = &ctx->rpt; + int srateMult = 1; if( _cmApAggGetOpt(argc,argv,"-h",0,true) ) _cmApAggPrintUsage(rpt); @@ -839,11 +840,11 @@ int cmApAggTest( bool runFl, cmCtx_t* ctx, int argc, const char* argv[] ) cmApBufInitialize( cmApDeviceCount(), r.meterMs ); // setup the buffer for the output device - cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle ); + cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle, srateMult ); // setup the buffer for the input device if( r.inDevIdx != r.outDevIdx ) - cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle ); + cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle, srateMult ); // setup an input device if( cmApDeviceSetup(r.inDevIdx,r.srate,r.framesPerCycle,_cmApAggPortCb2,&r) != kOkApRC ) diff --git a/cmAudioPort.c b/cmAudioPort.c index ba79f9d..17c32d3 100644 --- a/cmAudioPort.c +++ b/cmAudioPort.c @@ -663,7 +663,8 @@ int cmApPortTest( bool runFl, cmRpt_t* rpt, int argc, const char* argv[] ) { cmApPortTestRecd r; unsigned i; - int result = 0; + int result = 0; + int srateMult = 1; if( _cmApGetOpt(argc,argv,"-h",0,true) ) _cmApPrintUsage(rpt); @@ -698,6 +699,8 @@ int cmApPortTest( bool runFl, cmRpt_t* rpt, int argc, const char* argv[] ) r.ilog = ilog; r.cbCnt = 0; + + 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); if( cmApFileAllocate(rpt) != kOkApRC ) @@ -737,11 +740,11 @@ int cmApPortTest( bool runFl, cmRpt_t* rpt, int argc, const char* argv[] ) cmApBufInitialize( cmApDeviceCount(), r.meterMs ); // setup the buffer for the output device - cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle ); + cmApBufSetup( r.outDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.outDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.outDevIdx,false), r.framesPerCycle, srateMult ); // setup the buffer for the input device if( r.inDevIdx != r.outDevIdx ) - cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle ); + cmApBufSetup( r.inDevIdx, r.srate, r.framesPerCycle, r.bufCnt, cmApDeviceChannelCount(r.inDevIdx,true), r.framesPerCycle, cmApDeviceChannelCount(r.inDevIdx,false), r.framesPerCycle, srateMult ); cmApBufEnableMeter( r.inDevIdx, -1, kEnableApFl ); diff --git a/cmAudioSys.c b/cmAudioSys.c index d819ae6..215390f 100644 --- a/cmAudioSys.c +++ b/cmAudioSys.c @@ -514,6 +514,14 @@ void _cmAudioSysSerialPortCallback( void* cbArg, const void* byteA, unsigned byt //_cmAsCfg_t* p (_cmAsCfg_t*)cbArg; // TODO: handle serial receive + /* + int i; + for(i=0; iargs.inDevIdx != cmInvalidIdx ) - 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 ) + 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 ) { rc = _cmAsError(p,kAudioBufSetupErrAsRC,"Audio buffer input setup failed."); goto errLabel; @@ -815,7 +823,7 @@ cmAsRC_t cmAudioSysInitialize( cmAudioSysH_t h, const cmAudioSysCfg_t* cfg ) // setup the output device buffer if( ss->args.outDevIdx != ss->args.inDevIdx ) - 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 ) + 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 ) return _cmAsError(p,kAudioBufSetupErrAsRC,"Audio buffer ouput device setup failed."); // setup the output audio buffer ptr array - used to recv output audio from the DSP system in _cmAsDspExecCallback() diff --git a/cmAudioSys.h b/cmAudioSys.h index 4c7c5c3..9a5b28e 100644 --- a/cmAudioSys.h +++ b/cmAudioSys.h @@ -139,6 +139,7 @@ extern "C" { unsigned dspFramesPerCycle; // (64) Audio samples per channel per DSP cycle. unsigned audioBufCnt; // (3) Audio device buffers. double srate; // Audio sample rate. + int srateMult; // Sample rate multiplication factor (negative for divide) } cmAudioSysArgs_t; // Audio sub-system configuration record. diff --git a/cmRtSys.c b/cmRtSys.c index 79cebc0..a42527b 100644 --- a/cmRtSys.c +++ b/cmRtSys.c @@ -887,7 +887,7 @@ cmRtRC_t cmRtSysCfg( cmRtSysH_t h, const cmRtSysSubSys_t* ss, unsigned rtSubIdx // setup the input device buffer if( ss->args.inDevIdx != cmInvalidIdx ) - 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 ) + 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 ) { rc = _cmRtError(p,kAudioBufSetupErrRtRC,"Audio buffer input setup failed."); goto errLabel; @@ -902,7 +902,7 @@ cmRtRC_t cmRtSysCfg( cmRtSysH_t h, const cmRtSysSubSys_t* ss, unsigned rtSubIdx // setup the output device buffer if( ss->args.outDevIdx != ss->args.inDevIdx ) - 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 ) + 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 ) return _cmRtError(p,kAudioBufSetupErrRtRC,"Audio buffer ouput device setup failed."); // setup the output audio buffer ptr array - used to recv output audio from the DSP system in _cmRtDspExecCallback() diff --git a/cmRtSys.h b/cmRtSys.h index e889d73..3f01342 100644 --- a/cmRtSys.h +++ b/cmRtSys.h @@ -153,6 +153,7 @@ extern "C" { unsigned dspFramesPerCycle; // (64) Audio samples per channel per DSP cycle. unsigned audioBufCnt; // (3) Audio device buffers. double srate; // Audio sample rate. + int srateMult; } cmRtSysArgs_t; // Audio sub-system configuration record. diff --git a/dsp/cmDspClass.c b/dsp/cmDspClass.c index c82c475..afeaa7b 100644 --- a/dsp/cmDspClass.c +++ b/dsp/cmDspClass.c @@ -667,7 +667,7 @@ cmDspRC_t cmDspVarPresetRdWr( cmDspCtx_t* ctx, cmDspInst_t* inst, unsigned } double cmDspSampleRate( cmDspCtx_t* ctx ) -{ return ctx->ctx->ss->args.srate; } +{ return ctx->ctx->ss->args.srate * ctx->ctx->ss->args.srateMult; } unsigned cmDspSamplesPerCycle( cmDspCtx_t * ctx ) { return ctx->ctx->ss->args.dspFramesPerCycle; } diff --git a/dsp/cmDspKr.c b/dsp/cmDspKr.c index 173f06d..5af96bb 100644 --- a/dsp/cmDspKr.c +++ b/dsp/cmDspKr.c @@ -2812,6 +2812,7 @@ enum kStatusPcId, kD0PcId, kD1PcId, + kAllOffPcId }; cmDspClass_t _cmPicadaeDC; @@ -2933,95 +2934,95 @@ typedef struct cmDspPicadaeDuty_t cmDspPicadaeDutyMap[] = { - 21, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 22, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 23, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 24, {{ 0, 75 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 25, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 26, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 27, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 28, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 29, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 30, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 31, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 32, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 33, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 34, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 35, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 36, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 37, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 38, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 39, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 40, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 41, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 42, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 43, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 44, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 45, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 46, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 47, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 48, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 49, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 50, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 51, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 52, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 53, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 54, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 55, {{ 0, 50 }, { 22000, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 56, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 57, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 58, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 59, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 60, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 61, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 62, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 63, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 64, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 65, {{ 0, 50 }, { 17000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 66, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 67, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 68, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 69, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 70, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 71, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 72, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 73, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 74, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 75, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 76, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 77, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, }, - 78, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 79, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, }, - 80, {{ 0, 45 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 81, {{ 0, 50 }, { 15000, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 82, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }, - 83, {{ 0, 50 }, { 15000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 84, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }, - 85, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }, - 86, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }, - 87, {{ 0, 50 }, { 14000, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 88, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }, - 89, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }, - 90, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 91, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }, - 92, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 93, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }, - 94, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 95, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }, - 96, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }, - 97, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 98, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 99, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 100, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 101, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 102, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 103, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 104, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 105, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 106, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 107, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 108, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, - 0, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }, + {21, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {22, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {23, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {24, {{ 0, 75 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {25, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {26, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {27, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {28, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {29, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {30, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {31, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {32, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {33, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {34, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {35, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {36, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {37, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {38, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {39, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {40, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {41, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {42, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {43, {{ 0, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {44, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {45, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {46, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {47, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {48, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {49, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {50, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {51, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {52, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {53, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {54, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {55, {{ 0, 50 }, { 22000, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {56, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {57, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {58, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {59, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {60, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {61, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {62, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {63, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {64, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {65, {{ 0, 50 }, { 17000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {66, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {67, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {68, {{ 0, 53 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {69, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {70, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {71, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {72, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {73, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {74, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {75, {{ 0, 55 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {76, {{ 0, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {77, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, }}, + {78, {{ 0, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {79, {{ 0, 50 }, { 15000, 60 }, { 19000, 70 }, { -1, -1 }, { -1, -1 }, }}, + {80, {{ 0, 45 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {81, {{ 0, 50 }, { 15000, 70 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {82, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }}, + {83, {{ 0, 50 }, { 15000, 65 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {84, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }}, + {85, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }}, + {86, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }}, + {87, {{ 0, 50 }, { 14000, 60 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {88, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }}, + {89, {{ 0, 50 }, { 12500, 60 }, { 14000, 65 }, { 17000, 70 }, { -1, -1 }, }}, + {90, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {91, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }}, + {92, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {93, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }}, + {94, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {95, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }}, + {96, {{ 0, 40 }, { 12500, 50 }, { 14000, 60 }, { 17000, 65 }, { -1, -1 }, }}, + {97, {{ 0, 40 }, { 14000, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {98, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {99, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {100, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {101, {{ 0, 50 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {102, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {103, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {104, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {105, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {106, {{ -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {107, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + {108, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, + { 0, {{ -1, -1}, { -1, -1 }, { -1, -1 }, { -1, -1 }, { -1, -1 }, }}, }; @@ -3135,6 +3136,7 @@ cmDspInst_t* _cmDspPicadaeAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsign { "status", kStatusPcId, 0, 0, kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI status" }, { "d0", kD0PcId, 0, 0, kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI channel message d0" }, { "d1", kD1PcId, 0, 0, kOutDsvFl | kInDsvFl | kUIntDsvFl | kOptArgDsvFl, "MIDI channel message d1" }, + { "alloff", kAllOffPcId, 0, 0, kOutDsvFl | kInDsvFl | kSymDsvFl | kOptArgDsvFl, "All notes off."}, { NULL, 0, 0, 0, 0 } }; @@ -3205,6 +3207,10 @@ cmDspRC_t _cmDspPicadaeRecv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t } break; + case kAllOffPcId: + printf("Picadae All Off\n"); + _cmDspPicadaReset( ctx, inst ); + break; default: // store diff --git a/dsp/cmDspPgm.c b/dsp/cmDspPgm.c index 91823af..9b063fa 100644 --- a/dsp/cmDspPgm.c +++ b/dsp/cmDspPgm.c @@ -131,11 +131,11 @@ cmDspRC_t _cmDspSysPgm_MidiFilePlay( cmDspSysH_t h, void** userPtrPtr ) cmDspRC_t rc = kOkDspRC; - //const cmChar_t* deviceName = "Scarlett 18i20 USB"; - //const cmChar_t* portName = "Scarlett 18i20 USB MIDI 1"; + const cmChar_t* deviceName = "Scarlett 18i20 USB"; + const cmChar_t* portName = "Scarlett 18i20 USB MIDI 1"; - const cmChar_t* deviceName = "Fastlane"; - const cmChar_t* portName = "Fastlane MIDI A"; + //const cmChar_t* deviceName = "Fastlane"; + //const cmChar_t* portName = "Fastlane MIDI A"; //const cmChar_t* deviceName = "DKV-M4"; //const cmChar_t* portName = "DKV-M4 MIDI 1"; @@ -150,7 +150,8 @@ cmDspRC_t _cmDspSysPgm_MidiFilePlay( cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 3 ); cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 ); - cmDspInst_t* mop = cmDspSysAllocInst( h,"MidiOut", NULL, 2, deviceName, portName); + cmDspInst_t* pic = cmDspSysAllocInst(h,"Picadae", NULL, 0 ); + cmDspInst_t* mop = cmDspSysAllocInst( h,"MidiOut", NULL, 2, deviceName, portName); cmDspInst_t* start = cmDspSysAllocInst( h,"Button", "start", 2, kButtonDuiId, 0.0 ); cmDspInst_t* stop = cmDspSysAllocInst( h,"Button", "stop", 2, kButtonDuiId, 0.0 ); @@ -159,10 +160,10 @@ cmDspRC_t _cmDspSysPgm_MidiFilePlay( cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* beg = cmDspSysAllocInst(h,"Scalar", "Beg Samp", 5, kNumberDuiId, 0.0, 1000000000.0, 1.0, 0.0 ); cmDspInst_t* end = cmDspSysAllocInst(h,"Scalar", "End Samp", 5, kNumberDuiId, 0.0, 1000000000.0, 1.0, 1000000000.0 ); - cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 0 ); - cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 1 ); - cmDspInst_t* ao2p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 2 ); - cmDspInst_t* ao3p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 3 ); + cmDspInst_t* ao0p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 2 ); + cmDspInst_t* ao1p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 3 ); + cmDspInst_t* ao2p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 4 ); + cmDspInst_t* ao3p = cmDspSysAllocInst(h,"AudioOut",NULL, 1, 5 ); cmDspInst_t* im0p = cmDspSysAllocInst(h,"AMeter","In 0", 0); cmDspInst_t* im1p = cmDspSysAllocInst(h,"AMeter","In 1", 0); @@ -190,11 +191,25 @@ cmDspRC_t _cmDspSysPgm_MidiFilePlay( cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb( h, stop, "sym", mfp, "sel", NULL); cmDspSysInstallCb( h, cont, "sym", mfp, "sel", NULL); + bool usePicadaeFl = false; + + if( usePicadaeFl ) + { + cmDspSysInstallCb( h, mfp, "d1", pic, "d1", NULL); + cmDspSysInstallCb( h, mfp, "d0", pic, "d0", NULL); + cmDspSysInstallCb( h, mfp, "status", pic, "status", NULL); - cmDspSysInstallCb( h, mfp, "d1", mop, "d1", NULL); - cmDspSysInstallCb( h, mfp, "d0", mop, "d0", NULL); - cmDspSysInstallCb( h, mfp, "status", mop, "status", NULL); - + cmDspSysInstallCb( h, pic, "d1", mop, "d1", NULL); + cmDspSysInstallCb( h, pic, "d0", mop, "d0", NULL); + cmDspSysInstallCb( h, pic, "status", mop, "status", NULL); + } + else + { + cmDspSysInstallCb( h, mfp, "d1", mop, "d1", NULL); + cmDspSysInstallCb( h, mfp, "d0", mop, "d0", NULL); + cmDspSysInstallCb( h, mfp, "status", mop, "status", NULL); + } + //cmDspSysConnectAudio(h, ai0p, "out", ao0p, "in"); //cmDspSysConnectAudio(h, ai1p, "out", ao1p, "in"); @@ -357,7 +372,7 @@ cmDspRC_t _cmDspSysPgm_Test_Pedals( cmDspSysH_t h, void** userPtrPtr ) cmDspRC_t _cmDspSysPgm_Stereo_Through( cmDspSysH_t h, void** userPtrPtr ) { - cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0); + cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 0.0); //cmDspInst_t* ognp = cmDspSysAllocInst( h,"Scalar", "Out Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0); cmDspInst_t* hzp = cmDspSysAllocInst(h,"Scalar", "Hz", 5, kNumberDuiId, 0.0, 10.0, 0.001, 1.0); @@ -403,7 +418,9 @@ cmDspRC_t _cmDspSysPgm_Stereo_Through( cmDspSysH_t h, void** userPtrPtr ) return kOkDspRC; } - +//------------------------------------------------------------------------------ +//) +//( { label:cmDspSysPgm_All_In_And_Out file_desc:"Meter all the input channels and pass two channels to the output." kw:[spgm] } cmDspRC_t _cmDspSysPgm_All_In_And_Out( cmDspSysH_t h, void** userPtrPtr ) { cmDspInst_t* ignp = cmDspSysAllocInst( h,"Scalar", "In Gain", 5, kNumberDuiId, 0.0, 4.0, 0.01, 1.0); diff --git a/dsp/cmDspPgmKrTimeLineLite.c b/dsp/cmDspPgmKrTimeLineLite.c index 714cee2..c909428 100644 --- a/dsp/cmDspPgmKrTimeLineLite.c +++ b/dsp/cmDspPgmKrTimeLineLite.c @@ -95,6 +95,7 @@ cmDspRC_t _cmDspSysPgm_TimeLineLite(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* ao3 = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 3 ); // 3 2 cmDspSysNewPage(h,"Main"); + cmDspInst_t* notesOffb= cmDspSysAllocInst(h,"Button", "notesOff", 2, kButtonDuiId, 1.0 ); cmDspInst_t* onb = cmDspSysAllocInst(h,"Button", "start", 2, kButtonDuiId, 1.0 ); cmDspInst_t* offb = cmDspSysAllocInst(h,"Button", "stop", 2, kButtonDuiId, 1.0 ); cmDspInst_t* mod_sel = cmDspSysAllocMsgList(h, NULL, "mod_sel", 1 ); @@ -233,6 +234,7 @@ cmDspRC_t _cmDspSysPgm_TimeLineLite(cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb(h, prePath, "out", tlp, "path", NULL ); + cmDspSysInstallCb(h, notesOffb, "sym", pic, "alloff", NULL ); // start connections cmDspSysInstallCb(h, onb, "sym", tlRt, "s-in", NULL ); diff --git a/dsp/cmDspSys.c b/dsp/cmDspSys.c index b466964..1473fd5 100644 --- a/dsp/cmDspSys.c +++ b/dsp/cmDspSys.c @@ -1547,7 +1547,7 @@ cmDspRC_t cmDspSysInstallCb1NN1M2( cmDspSysH_t h, cmDspInst_t* srcInstPtr, cons double cmDspSysSampleRate( cmDspSysH_t h ) { cmDsp_t* p = _cmDspHandleToPtr(h); - return p->ctx.ctx->ss->args.srate; + return cmDspSampleRate( &p->ctx ); } cmJsonH_t cmDspSysPgmRsrcHandle( cmDspSysH_t h )