From dfc94439da5896949f45d20d7750f4f1fec6427e Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Mon, 29 Sep 2014 12:01:10 -0700 Subject: [PATCH 01/12] cmProc2.h/c : Added spectral input/output files to cmSpecDist(). Added phase modulation via _smSpecDistPhaseMod() to cmSpecDist(). Changed track score calculation in FrqTrk. Added attenuation delay state to FrqTrk attenution stage. --- cmProc2.c | 135 +++++++++++++++++++++++++++++++++++++++++++----------- cmProc2.h | 16 ++++++- 2 files changed, 124 insertions(+), 27 deletions(-) diff --git a/cmProc2.c b/cmProc2.c index 0cc1049..6f1c447 100644 --- a/cmProc2.c +++ b/cmProc2.c @@ -4779,6 +4779,7 @@ cmRC_t cmFrqTrkInit( cmFrqTrk* p, const cmFrqTrkArgs_t* a ) p->minTrkN = a->minTrkSec * a->srate / a->hopSmpCnt; p->nextTrkId = 1; p->aV = cmMemResizeZ(cmReal_t,p->aV,p->a.binCnt); + p->attenDlyPhsMax = cmMax(3,a->attenDlySec * a->srate / a->hopSmpCnt ); p->attenPhsMax = cmMax(3,a->attenAtkSec * a->srate / a->hopSmpCnt ); if( a->logFn != NULL ) @@ -5019,7 +5020,11 @@ void _cmFrqTrkScoreChs( cmFrqTrk* p ) c->hz_mean = cmVOR_Mean(c->hzV,n); c->hz_std = sqrt(cmVOR_Variance( c->hzV,n,&c->hz_mean)); - c->score = c->db / ((cmMin(0.1,c->db_std) + cmMin(0.1,c->hz_std))/2); + //c->score = c->db / ((cmMax(0.1,c->db_std) + cmMax(0.1,c->hz_std))/2); + + c->score = c->db - (c->db_std * 5) - (c->hz_std/50); + + //printf("%f %f %f %f %f\n",c->db,cmMin(0.1,c->db_std),c->hz,cmMin(0.1,c->hz_std),c->score); } } @@ -5082,8 +5087,9 @@ void _cmFrqTrkUpdateFilter( cmFrqTrk* p ) // if( c->score >= p->a.attenThresh && c->state == kNoStateFrqTrkId ) { + //printf("%f\n",c->score); c->attenPhsIdx = 0; - c->state = kAtkFrqTrkId; + c->state = kDlyFrqTrkId; } switch( c->state ) @@ -5091,8 +5097,16 @@ void _cmFrqTrkUpdateFilter( cmFrqTrk* p ) case kNoStateFrqTrkId: break; + case kDlyFrqTrkId: + c->attenPhsIdx += 1; + + if( c->attenPhsIdx >= p->attenDlyPhsMax && c->dN == 0 ) + c->state = kAtkFrqTrkId; + + break; + case kAtkFrqTrkId: - if( c->attenPhsIdx < p->attenPhsMax ) + if( c->attenPhsIdx < p->attenDlyPhsMax + p->attenPhsMax ) { c->attenGain = cmMin(1.0,p->a.attenGain * c->attenPhsIdx / p->attenPhsMax); @@ -5101,7 +5115,7 @@ void _cmFrqTrkUpdateFilter( cmFrqTrk* p ) } c->attenPhsIdx += 1; - if( c->attenPhsIdx >= p->attenPhsMax ) + if( c->attenPhsIdx >= p->attenDlyPhsMax + p->attenPhsMax ) c->state = kSusFrqTrkId; break; @@ -5275,7 +5289,7 @@ void _cmFrqTrkNewChs( cmFrqTrk* p, const cmReal_t* dbV, const cmReal_t* hzV, uns void _cmFrqTrkApplyFrqBias( cmFrqTrk* p, cmReal_t* xV ) { - // 1+2*([0:.01:1].^4) + // convert to decibel scale (0.0 - 100.0) and then scale to (0.0 to 1.0) unsigned i; for(i=0; ibN; ++i) xV[i] = cmMax(0.0, (20*log10( cmMax(xV[i]/1.5,0.00001)) + 100.0)/100.0); @@ -5318,20 +5332,20 @@ cmRC_t cmFrqTrkExec( cmFrqTrk* p, const cmReal_t* magV, const cmReal_t* phsV, co // copy p->dbV to dbM[hi,:] cmVOR_CopyN(p->dbM + p->hi, p->bN, p->hN, p->dbV, 1 ); - // increment hi + // increment hi to next column to fill in dbM[] p->hi = (p->hi + 1) % p->hN; - // Form the spectral magnitude profile by taking the mean over time - // of the last hN magnitude vectors + // Set dbV[] to spectral magnitude profile by taking the mean over time + // of the last hN magnitude vectors cmVOR_MeanM2(p->dbV, p->dbM, p->hN, p->bN, 0, cmMin(p->fN+1,p->hN)); //cmVOR_MeanM(p->dbV, p->dbM, p->hN, p->bN, 0); if( p->fN >= p->hN ) { - // set the indexes of the peaks above pkThreshDb in i0[] + // set pkiV[] to the indexes of the peaks above pkThreshDb in i0[] unsigned pkN = cmVOR_PeakIndexes(p->pkiV, p->bN, p->dbV, p->bN, p->a.pkThreshDb ); - // generate the peak frequencies from the magnitude + // set hzV[] to the peak frequencies assoc'd with peaks at dbV[ pkiV[] ]. _cmFrqTrkMagnToHz(p, p->dbV, p->pkiV, pkN, hzV ); // extend the existing trackers @@ -5485,6 +5499,7 @@ cmSpecDist_t* cmSpecDistAlloc( cmCtx* ctx,cmSpecDist_t* ap, unsigned procSmpCnt, { cmSpecDist_t* p = cmObjAlloc( cmSpecDist_t, ctx, ap ); + p->iSpecVa = cmVectArrayAlloc(ctx,kRealVaFl); p->oSpecVa = cmVectArrayAlloc(ctx,kRealVaFl); if( procSmpCnt != 0 ) @@ -5505,8 +5520,13 @@ cmRC_t cmSpecDistFree( cmSpecDist_t** pp ) cmSpecDist_t* p = *pp; cmSpecDistFinal(p); + cmVectArrayFree(&p->iSpecVa); cmVectArrayFree(&p->oSpecVa); cmMemPtrFree(&p->hzV); + cmMemPtrFree(&p->iSpecM); + cmMemPtrFree(&p->oSpecM); + cmMemPtrFree(&p->iSpecV); + cmMemPtrFree(&p->oSpecV); cmObjFree(pp); return cmOkRC; @@ -5523,6 +5543,7 @@ cmRC_t cmSpecDistInit( cmSpecDist_t* p, unsigned procSmpCnt, double srate, unsig unsigned flags = 0; + p->srate = srate; p->wndSmpCnt = wndSmpCnt; p->hopSmpCnt = (unsigned)floor(wndSmpCnt/hopFcmt); p->procSmpCnt = procSmpCnt; @@ -5550,9 +5571,10 @@ cmRC_t cmSpecDistInit( cmSpecDist_t* p, unsigned procSmpCnt, double srate, unsig fta.pkMaxHz = 20000; fta.whFiltCoeff = 0.33; - fta.attenThresh = 900.0; - fta.attenGain = 1.0; - fta.attenAtkSec = 0.25; + fta.attenThresh = 0.4; + fta.attenGain = 0.5; + fta.attenDlySec = 1.0; + fta.attenAtkSec = 1.0; fta.logFn = "/home/kevin/temp/frqtrk/trk_log.va"; fta.levelFn = "/home/kevin/temp/frqtrk/level.va"; @@ -5587,6 +5609,15 @@ cmRC_t cmSpecDistInit( cmSpecDist_t* p, unsigned procSmpCnt, double srate, unsig p->aeMin = 1000; p->aeMax = -1000; + + double histSecs = 0.05; + p->hN = cmMax(1,histSecs * p->srate / p->hopSmpCnt ); + p->iSpecM = cmMemResizeZ(cmReal_t,p->iSpecM,p->hN*p->pva->binCnt); + p->oSpecM = cmMemResizeZ(cmReal_t,p->oSpecM,p->hN*p->pva->binCnt); + p->iSpecV = cmMemResizeZ(cmReal_t,p->iSpecV, p->pva->binCnt); + p->oSpecV = cmMemResizeZ(cmReal_t,p->oSpecV, p->pva->binCnt); + p->hi = 0; + //p->bypOut = cmMemResizeZ(cmSample_t, p->bypOut, procSmpCnt ); @@ -5597,6 +5628,7 @@ cmRC_t cmSpecDistFinal(cmSpecDist_t* p ) { cmRC_t rc = cmOkRC; + cmVectArrayWrite(p->iSpecVa, "/home/kevin/temp/frqtrk/iSpec.va"); cmVectArrayWrite(p->oSpecVa, "/home/kevin/temp/frqtrk/oSpec.va"); cmPvAnlFree(&p->pva); @@ -5777,27 +5809,58 @@ void _cmSpecDistAmpEnvMode( cmSpecDist_t* p, cmReal_t* X1m ) } +void _cmSpecDistPhaseMod( cmSpecDist_t* p, cmReal_t* phsV, unsigned binCnt ) +{ + unsigned i; + cmReal_t offs = sin( 0.1 * 2.0 * M_PI * (p->phaseModIndex++) / (p->srate/p->hopSmpCnt) ); + + //printf("offs %f %i %i %f\n",offs,p->phaseModIndex,p->hopSmpCnt,p->srate); + + cmReal_t new_phs = phsV[0] + offs; + for(i=0; i M_PI ) + new_phs -= 2.0*M_PI; + + while( new_phs < -M_PI ) + new_phs += 2.0*M_PI; + + cmReal_t d = phsV[i+1] - phsV[i]; + + phsV[i] = new_phs; + + new_phs += d; + } + +} + cmRC_t cmSpecDistExec( cmSpecDist_t* p, const cmSample_t* sp, unsigned sn ) { assert( sn == p->procSmpCnt ); + bool recordFl = false; + // cmPvAnlExec() returns true when it calc's a new spectral output frame if( cmPvAnlExec( p->pva, sp, sn ) ) { cmReal_t X1m[p->pva->binCnt]; + // take the mean of the the input magntitude spectrum cmReal_t u0 = cmVOR_Mean(p->pva->magV,p->pva->binCnt); - //cmFrqTrkExec(p->ft, p->pva->magV, p->pva->phsV, NULL ); - - // apply the freq track suppression filter - //cmVOR_MultVVV(X1m, p->pva->binCnt,p->pva->magV, p->ft->aV ); + if(recordFl) + { + // store a time windowed average of the input spectrum to p->iSpecV + cmVOR_CopyN(p->iSpecM + p->hi, p->pva->binCnt, p->hN, X1m, 1 ); + cmVOR_MeanM2(p->iSpecV, p->iSpecM, p->hN, p->pva->binCnt, 0, cmMin(p->fi+1,p->hN)); + } cmVOR_AmplToDbVV(X1m, p->pva->binCnt, p->pva->magV, -1000.0 ); //cmVOR_AmplToDbVV(X1m, p->pva->binCnt, X1m, -1000.0 ); + switch( p->mode ) { case kBypassModeSdId: @@ -5838,22 +5901,25 @@ cmRC_t cmSpecDistExec( cmSpecDist_t* p, const cmSample_t* sp, unsigned sn ) break; } - //cmVectArrayAppendR(p->oSpecVa,X1m,p->pva->binCnt); - cmVOR_DbToAmplVV(X1m, p->pva->binCnt, X1m ); // run and apply the tracker/supressor - cmFrqTrkExec(p->ft, X1m, p->pva->phsV, NULL ); - cmVOR_MultVV(X1m, p->pva->binCnt,p->ft->aV ); + cmFrqTrkExec(p->ft, X1m, p->pva->phsV, NULL ); + //cmVOR_MultVV(X1m, p->pva->binCnt,p->ft->aV ); + // convert the mean input magnitude to db cmReal_t idb = 20*log10(u0); + + // get the mean output magnitude spectra cmReal_t u1 = cmVOR_Mean(X1m,p->pva->binCnt); if( idb > -150.0 ) { - p->ogain = u0/u1; + // set the output gain such that the mean output magnitude + // will match the mean input magnitude + p->ogain = u0/u1; } else { @@ -5861,17 +5927,34 @@ cmRC_t cmSpecDistExec( cmSpecDist_t* p, const cmSample_t* sp, unsigned sn ) p->ogain *= a0; } - //cmReal_t v[] = { u0, u1, idb, 20*log10(u1), p->ogain }; - //unsigned vn = sizeof(v)/sizeof(v[0]); - //cmVectArrayAppendR(p->oSpecVa,v,vn); - cmVOR_MultVS(X1m,p->pva->binCnt,cmMin(4.0,p->ogain)); //cmFbCtlExec(p->fbc,X1m); + //cmReal_t v[ p->pva->binCnt ]; + //cmVOR_Copy(v,p->pva->binCnt,p->pva->phsV); + //_cmSpecDistPhaseMod(p, v, p->pva->binCnt ); + + + if(recordFl) + { + + // store a time windowed average of the output spectrum to p->iSpecV + cmVOR_CopyN(p->oSpecM + p->hi, p->pva->binCnt, p->hN, X1m, 1 ); + cmVOR_MeanM2(p->oSpecV, p->oSpecM, p->hN, p->pva->binCnt, 0, cmMin(p->fi+1,p->hN)); + + // store iSpecV and oSpecV to iSpecVa and oSpecVa to create debugging files + cmVectArrayAppendR(p->iSpecVa,p->iSpecV,p->pva->binCnt); + cmVectArrayAppendR(p->oSpecVa,p->oSpecV,p->pva->binCnt); + + p->hi = (p->hi + 1) % p->hN; + } + + cmPvSynExec(p->pvs, X1m, p->pva->phsV ); + p->fi += 1; } return cmOkRC; diff --git a/cmProc2.h b/cmProc2.h index 94e3750..8891d83 100644 --- a/cmProc2.h +++ b/cmProc2.h @@ -902,6 +902,7 @@ extern "C" { typedef enum { kNoStateFrqTrkId, + kDlyFrqTrkId, kAtkFrqTrkId, kSusFrqTrkId, kDcyFrqTrkId @@ -924,6 +925,7 @@ extern "C" { cmReal_t attenThresh; cmReal_t attenGain; + cmReal_t attenDlySec; cmReal_t attenAtkSec; const char* logFn; // log file name or NULL if no file is to be written @@ -985,6 +987,7 @@ extern "C" { unsigned deadTrkCnt; cmReal_t* aV; + int attenDlyPhsMax; int attenPhsMax; cmWhFilt* wf; @@ -1106,9 +1109,20 @@ extern "C" { cmReal_t aeMax; cmReal_t aeUnit; - cmVectArray_t* oSpecVa; cmReal_t ogain; + unsigned phaseModIndex; + + unsigned fi; // total count of frames processed by cmSpecDistExec() + unsigned hN; + unsigned hi; + cmReal_t* iSpecM; // iSpecMtx[hN binN] + cmReal_t* iSpecV; // mean of rows of iSpecM + cmVectArray_t* iSpecVa; + cmReal_t* oSpecM; // oSpecMtx[hN binN] + cmReal_t* oSpecV; // mean of rows of oSpecM + cmVectArray_t* oSpecVa; + } cmSpecDist_t; cmSpecDist_t* cmSpecDistAlloc( cmCtx* ctx,cmSpecDist_t* ap, unsigned procSmpCnt, double srate, unsigned wndSmpCnt, unsigned hopFcmt, unsigned olaWndTypeId ); From 37b47e21fd169e5d191138bf1fe633a2a2fb26c3 Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Wed, 15 Oct 2014 11:08:26 -0700 Subject: [PATCH 02/12] cmRtNet.h/c : Corrected mispelling in #ifdef header guards. On failure of cmThreadMutexWaitOnCondVar() in _cmRtThreadCallback() the correct result code is now reported. --- cmRtNet.h | 6 +++--- cmRtSys.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmRtNet.h b/cmRtNet.h index bf6de81..b8472ed 100644 --- a/cmRtNet.h +++ b/cmRtNet.h @@ -1,5 +1,5 @@ -#ifndef cmNet_h -#define cmNet_h +#ifndef cmRtNet_h +#define cmRtNet_h #ifdef __cplusplus extern "C" { @@ -12,7 +12,7 @@ extern "C" { unique among all other nodes on the network. A node also has a set of application defined 'endpoints'. Each endpoint has a label and id that is unique among all other endpoints on the same node. Endpoints on different nodes however may share - use the same label and id. Endpoints are used by remote senders to identify + the same label and id. Endpoints are used by remote senders to identify a particular receiver which is sharing the node with other receivers. Endpoints are therefore analogous to port numbers on sockets. diff --git a/cmRtSys.c b/cmRtSys.c index 7be695c..79cebc0 100644 --- a/cmRtSys.c +++ b/cmRtSys.c @@ -419,7 +419,7 @@ bool _cmRtThreadCallback(void* arg) cmSleepMs(cp->noBlockSleepMs); else { - if( cmThreadMutexWaitOnCondVar(cp->engMutexH,false) != kOkRtRC ) + if( (rc = cmThreadMutexWaitOnCondVar(cp->engMutexH,false)) != kOkRtRC ) { cmThreadMutexUnlock(cp->engMutexH); _cmRtError(cp->p,rc,"The cmRtSys cond. var. wait failed."); From d1c1465f8852a1bb5c3a20bac491ad3777e7b449 Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Mon, 20 Oct 2014 10:13:50 -0700 Subject: [PATCH 03/12] cmProc2.c : Commented out cmFrqTrkExec() in cmSpecDistExec() due to crashing. Commented out cmFrqTrkPrint() in cmSpecDistInit(). --- cmProc2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmProc2.c b/cmProc2.c index 6f1c447..7fb8d95 100644 --- a/cmProc2.c +++ b/cmProc2.c @@ -5582,7 +5582,7 @@ cmRC_t cmSpecDistInit( cmSpecDist_t* p, unsigned procSmpCnt, double srate, unsig fta.attenFn = "/home/kevin/temp/frqtrk/atten.va"; p->ft = cmFrqTrkAlloc( p->obj.ctx, NULL, &fta ); - cmFrqTrkPrint(p->ft); + //cmFrqTrkPrint(p->ft); cmFbCtlArgs_t fba; fba.srate = srate; @@ -5905,7 +5905,7 @@ cmRC_t cmSpecDistExec( cmSpecDist_t* p, const cmSample_t* sp, unsigned sn ) // run and apply the tracker/supressor - cmFrqTrkExec(p->ft, X1m, p->pva->phsV, NULL ); + //cmFrqTrkExec(p->ft, X1m, p->pva->phsV, NULL ); //cmVOR_MultVV(X1m, p->pva->binCnt,p->ft->aV ); From 56e36d78d6f8c6869e4844c3a5f0620bb94e63d3 Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Mon, 20 Oct 2014 10:21:25 -0700 Subject: [PATCH 04/12] cnDspPgmKr.c : 1) Added two new audio inputs (ai2p,ai3p) and mixers (mx0p,mx1p) to allow contact mic's to be mixed with air mic's. 2) Added two new audio outputs (a02p,a03p) which are duplicates of ao0p and ao1p. 3) Added all pass filters to all four audio outputs to decorrelate output. 4) Added Bypass button to bypass the all pass filters. --- dsp/cmDspPgmKr.c | 122 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 94 insertions(+), 28 deletions(-) diff --git a/dsp/cmDspPgmKr.c b/dsp/cmDspPgmKr.c index 771b67e..43f3525 100644 --- a/dsp/cmDspPgmKr.c +++ b/dsp/cmDspPgmKr.c @@ -213,8 +213,8 @@ void _cmDspSys_TlXformChain1( cmDspSysH_t h, cmDspTlXform_t* c, unsigned preGrp cmDspInst_t* max_upr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Upr"), -1.0, 1.0, 0.001, 0.5); cmDspInst_t* min_lwr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Lwr"), 0.0, -1.0, 5.0, 1.0); cmDspInst_t* max_lwr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Lwr"), 0.0, -1.0, 5.0, 3.0); - cmDspInst_t* min_off_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Off"), 0.0, 50.0, 0.1, 30.0); - cmDspInst_t* max_off_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Off"), 0.0, 50.0, 0.1, 30.0); + cmDspInst_t* min_off_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Off"), -100.0, 100.0, 0.1, 30.0); + cmDspInst_t* max_off_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Off"), -100.0, 100.0, 0.1, 30.0); cmDspInst_t* min_wet_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Wet"), 0.0, 1.0, 0.01, 1.0); cmDspInst_t* max_wet_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Wet"), 0.0, 1.0, 0.01, 1.0); @@ -634,12 +634,15 @@ void _cmDspSys_TlXformChain( cmDspSysH_t h, cmDspTlXform_t* c, unsigned preGrpS cmDspSysInstallCb(h, modp, mlbl("thr"), thr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("upr"), upr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("lwr"), lwr_ctl, "val", NULL ); + cmDspSysInstallCb(h, modp, mlbl("off"), off_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("mint"), min_thr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("maxt"), max_thr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("minu"), min_upr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("maxu"), max_upr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("minl"), min_lwr_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("maxl"), max_lwr_ctl, "val", NULL ); + cmDspSysInstallCb(h, modp, mlbl("mino"), min_off_ctl, "val", NULL ); + cmDspSysInstallCb(h, modp, mlbl("maxo"), max_off_ctl, "val", NULL ); cmDspSysInstallCb(h, modp, mlbl("sw"), achan, "trig", NULL ); // See also: amp.sfloc->achan.trig c->achan = achan; @@ -671,6 +674,19 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) double recdPlayCurLaSecs = 0.1; double recdPlayFadeRateDbPerSec = 4.0; + + bool eqBypassFl = false; + unsigned eqModeSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"LP"); + double eqF0hz = 264.0; + double eqQ = 1.0; + double eqGain = 1.0; + + bool apfBypassFl = false; + unsigned apfModeSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"AP"); + double apfF0hz = 100.0; + double apfQ = 1.0; + double apfGain = 1.0; + /* bool cmpBypassFl = false; double cmpInGain = 3.0; @@ -691,6 +707,19 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* ai0p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 2); cmDspInst_t* ai1p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 3); + cmDspInst_t* ai2p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 4); + cmDspInst_t* ai3p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 5); + + + //cmDspInst_t* ieq0 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); + //cmDspInst_t* ieq1 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); + //cmDspInst_t* ieq2 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); + //cmDspInst_t* ieq3 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); + + + cmDspInst_t* mx0p = cmDspSysAllocInst( h, "AMix", NULL, 3, 2, 1.0, 1.0); + cmDspInst_t* mx1p = cmDspSysAllocInst( h, "AMix", NULL, 3, 2, 1.0, 1.0); + //cmDspInst_t* ci0p = cmDspSysAllocInst(h,"Compressor", NULL, 8, cmpBypassFl, cmpThreshDb, cmpRatio_num, cmpAtkMs, cmpRlsMs, cmpMakeup, cmpWndMs, cmpWndMaxMs ); //cmDspInst_t* ci1p = cmDspSysAllocInst(h,"Compressor", NULL, 8, cmpBypassFl, cmpThreshDb, cmpRatio_num, cmpAtkMs, cmpRlsMs, cmpMakeup, cmpWndMs, cmpWndMaxMs ); @@ -791,11 +820,15 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) } */ + cmDspInst_t* apf0 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, apfBypassFl, apfModeSymId, apfF0hz+0, apfQ, apfGain ); + cmDspInst_t* apf1 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, apfBypassFl, apfModeSymId, apfF0hz+100.0, apfQ, apfGain ); + cmDspInst_t* apf2 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, apfBypassFl, apfModeSymId, apfF0hz+200.0, apfQ, apfGain ); + cmDspInst_t* apf3 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, apfBypassFl, apfModeSymId, apfF0hz+300.0, apfQ, apfGain ); 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* ao2p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 2 ); + cmDspInst_t* ao3p = cmDspSysAllocInst(h,"AudioOut", NULL, 1, 3 ); cmDspSysNewPage(h,"Main"); cmDspInst_t* liveb= cmDspSysAllocInst(h,"Button", "live", 2, kCheckDuiId, 0.0 ); @@ -831,9 +864,13 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysNewColumn(h,0); cmDspInst_t* igain0 = cmDspSysAllocInst(h,"Scalar", "In Gain-0", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 ); cmDspInst_t* igain1 = cmDspSysAllocInst(h,"Scalar", "In Gain-1", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 ); + cmDspInst_t* igain2 = cmDspSysAllocInst(h,"Scalar", "In Gain-2", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 ); + cmDspInst_t* igain3 = cmDspSysAllocInst(h,"Scalar", "In Gain-3", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.0 ); cmDspInst_t* lasecs = cmDspSysAllocInst(h,"Scalar", "LA Secs", 5, kNumberDuiId, 0.0, recdPlayMaxLaSecs,0.01, recdPlayCurLaSecs ); cmDspInst_t* dbpsec = cmDspSysAllocInst(h,"Scalar", "Fade dBpSec", 5, kNumberDuiId, 0.0, 24.0, 0.01, recdPlayFadeRateDbPerSec); + cmDspInst_t* apfByp = cmDspSysAllocCheck( h, "APF-Bypass", 0.0 ); + cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain1 = cmDspSysAllocInst(h,"Scalar", "Out Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain2 = cmDspSysAllocInst(h,"Scalar", "Out Gain-2", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); @@ -849,6 +886,7 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* mi0p = cmDspSysAllocInst(h,"AMeter","In 0", 0); cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0); + if((rc = cmDspSysLastRC(h)) != kOkDspRC ) return rc; @@ -863,10 +901,15 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) // Audio connections cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phs -> wt + cmDspSysConnectAudio(h, ai0p, "out", mx0p, "in-0" ); + cmDspSysConnectAudio(h, ai1p, "out", mx1p, "in-0" ); + cmDspSysConnectAudio(h, ai2p, "out", mx0p, "in-1" ); + cmDspSysConnectAudio(h, ai3p, "out", mx1p, "in-1" ); + if( useWtFl ) { cmDspSysConnectAudio(h, wtp, "out", au0Sw, "a-in-0" ); // wt -> sw - cmDspSysConnectAudio(h, ai0p, "out", au0Sw, "a-in-1" ); // ain -> sw + cmDspSysConnectAudio(h, mx0p, "out", au0Sw, "a-in-1" ); // ain -> sw //cmDspSysConnectAudio(h, ci0p, "out", au0Sw, "a-in-1" ); cmDspSysConnectAudio(h, au0Sw, "a-out", rpp, "in-0"); // sw -> rcdply cmDspSysConnectAudio(h, au0Sw, "a-out", c0.kr0,"in" ); // sw -> kr @@ -875,10 +918,10 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) } else { - cmDspSysConnectAudio(h, ai0p, "out", rpp, "in-0"); // sw -> rcdply - cmDspSysConnectAudio(h, ai0p, "out", c0.kr0, "in" ); // ain -> sw - //cmDspSysConnectAudio(h, ai0p, "out", c0.kr1, "in" ); // ain -> sw - cmDspSysConnectAudio(h, ai0p, "out", mi0p, "in" ); + cmDspSysConnectAudio(h, mx0p, "out", rpp, "in-0"); // sw -> rcdply + cmDspSysConnectAudio(h, mx0p, "out", c0.kr0, "in" ); // ain -> sw + //cmDspSysConnectAudio(h, mx0p, "out", c0.kr1, "in" ); // ain -> sw + cmDspSysConnectAudio(h, mx0p, "out", mi0p, "in" ); } if( fragFl ) @@ -887,12 +930,18 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysConnectAudio(h, rpp, "out-0", c2.kr0,"in" ); //cmDspSysConnectAudio(h, rpp, "out-0", c2.kr1,"in" ); cmDspSysConnectAudio(h, c2.cmp, "out", mix0, "in-1"); // rpp -> mix 1 - cmDspSysConnectAudio(h, mix0, "out", ao0p, "in" ); // mix -> aout + cmDspSysConnectAudio(h, mix0, "out", apf0, "in" ); // mix -> aout + cmDspSysConnectAudio(h, apf0, "out", ao0p, "in" ); + } else { - cmDspSysConnectAudio(h, c0.cmp, "out", ao0p, "in" ); - //cmDspSysConnectAudio(h, wtp, "out", ao0p, "in" ); + cmDspSysConnectAudio(h, c0.cmp, "out", apf0, "in" ); + cmDspSysConnectAudio(h, c0.cmp, "out", apf2, "in" ); + cmDspSysConnectAudio(h, apf0, "out", ao0p, "in" ); + cmDspSysConnectAudio(h, apf2, "out", ao2p, "in" ); + + //cmDspSysConnectAudio(h, wtp, "out", apf0, "in" ); } @@ -901,7 +950,7 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) if( useWtFl ) { cmDspSysConnectAudio(h, wtp, "out", au1Sw, "a-in-0" ); // wt -> sw - cmDspSysConnectAudio(h, ai1p, "out", au1Sw, "a-in-1" ); // ain -> sw + cmDspSysConnectAudio(h, mx1p, "out", au1Sw, "a-in-1" ); // ain -> sw //cmDspSysConnectAudio(h, ci1p, "out", au1Sw, "a-in-1" ); cmDspSysConnectAudio(h, au1Sw, "a-out", rpp, "in-1"); // sw -> rcdply cmDspSysConnectAudio(h, au1Sw, "a-out", c1.kr0,"in" ); // sw -> kr @@ -910,10 +959,10 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) } else { - cmDspSysConnectAudio(h, ai1p, "out", rpp, "in-1"); // sw -> rcdply - cmDspSysConnectAudio(h, ai1p, "out", c1.kr0, "in" ); // ain -> sw - //cmDspSysConnectAudio(h, ai1p, "out", c1.kr1, "in" ); // ain -> sw - cmDspSysConnectAudio(h, ai1p, "out", mi1p, "in" ); + cmDspSysConnectAudio(h, mx1p, "out", rpp, "in-1"); // sw -> rcdply + cmDspSysConnectAudio(h, mx1p, "out", c1.kr0, "in" ); // ain -> sw + //cmDspSysConnectAudio(h, mx1p, "out", c1.kr1, "in" ); // ain -> sw + cmDspSysConnectAudio(h, mx1p, "out", mi1p, "in" ); } if( fragFl ) @@ -922,12 +971,18 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysConnectAudio(h, rpp, "out-1", c3.kr0, "in" ); //cmDspSysConnectAudio(h, rpp, "out-1", c3.kr1, "in" ); cmDspSysConnectAudio(h, c3.cmp, "out", mix1, "in-1"); // rpp -> mix 1 - cmDspSysConnectAudio(h, mix1, "out", ao1p, "in" ); // mix -> aout + cmDspSysConnectAudio(h, mix1, "out", apf1, "in" ); // mix -> aout + cmDspSysConnectAudio(h, apf1, "out", ao1p, "in" ); + } else { - cmDspSysConnectAudio(h, c1.cmp, "out", ao1p, "in" ); // cmp -> mix 0 - //cmDspSysConnectAudio(h, wtp, "out", ao1p, "in" ); + cmDspSysConnectAudio(h, c1.cmp, "out", apf1, "in" ); // cmp -> mix 0 + cmDspSysConnectAudio(h, c1.cmp, "out", apf3, "in" ); // cmp -> mix 0 + cmDspSysConnectAudio(h, apf1, "out", ao1p, "in" ); + cmDspSysConnectAudio(h, apf3, "out", ao3p, "in" ); + + //cmDspSysConnectAudio(h, wtp, "out", apf1, "in" ); } } @@ -1082,38 +1137,41 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb(h, scp, "sel", prp, "in", NULL ); // NOTE: THIS IS A DUPLICATE OF THE scp.sel CONNECTIONS + /* cmDspSysInstallCb(h, scLoc, "val", sfp, "index", NULL ); cmDspSysInstallCb(h, scLoc, "val", modp,"reset", NULL ); cmDspSysInstallCb(h, scLoc, "val", modr,"reset", NULL ); cmDspSysInstallCb(h, scLoc, "val", rpp, "initIdx", NULL ); cmDspSysInstallCb(h, scLoc, "val", prp, "in", NULL ); + */ //cmDspSysInstallCb(h, reload,"out", modp, "reload", NULL ); // MIDI file player to score follower cmDspSysInstallCb(h, mfp, "smpidx", siRt, "f-in",NULL ); - cmDspSysInstallCb(h, siRt, "f-out-0", sfp, "smpidx",NULL ); + cmDspSysInstallCb(h, siRt, "f-out-1", sfp, "smpidx",NULL ); // leave siRt.f-out-1 unconnected because it should be ignored in 'simulate mode' cmDspSysInstallCb(h, mfp, "d1", d1Rt, "f-in", NULL ); - cmDspSysInstallCb(h, d1Rt, "f-out-0", sfp, "d1", NULL ); + cmDspSysInstallCb(h, d1Rt, "f-out-1", sfp, "d1", NULL ); cmDspSysInstallCb(h, d1Rt, "f-out-1", nmp, "d1", NULL ); cmDspSysInstallCb(h, nmp, "d1", mop, "d1", NULL ); cmDspSysInstallCb(h, nmp, "d1", mo2p, "d1", NULL ); cmDspSysInstallCb(h, mfp, "d0", d0Rt, "f-in", NULL ); - cmDspSysInstallCb(h, d0Rt, "f-out-0", sfp, "d0", NULL ); + cmDspSysInstallCb(h, d0Rt, "f-out-1", sfp, "d0", NULL ); cmDspSysInstallCb(h, d0Rt, "f-out-1", nmp, "d0", NULL ); cmDspSysInstallCb(h, nmp, "d0", mop, "d0", NULL ); cmDspSysInstallCb(h, nmp, "d0", mo2p, "d0", NULL ); cmDspSysInstallCb(h, mfp, "status", stRt, "f-in", NULL ); - cmDspSysInstallCb(h, stRt, "f-out-0", sfp, "status",NULL ); + cmDspSysInstallCb(h, stRt, "f-out-1", sfp, "status",NULL ); cmDspSysInstallCb(h, stRt, "f-out-1", nmp, "status",NULL ); cmDspSysInstallCb(h, nmp, "status", mop, "status",NULL ); cmDspSysInstallCb(h, nmp, "status", mo2p, "status",NULL ); + // MIDI input port //cmDspSysInstallCb(h, mip, "smpidx", sfp, "smpidx", NULL ); //cmDspSysInstallCb(h, mip, "d1", sfp, "d1", NULL ); @@ -1122,9 +1180,9 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) // score follower to recd_play,modulator and printers //cmDspSysInstallCb(h, sfp, "out", rpp, "index", NULL ); - //cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL ); + cmDspSysInstallCb(h, sfp, "out", modp, "index", NULL ); //cmDspSysInstallCb(h, sfp, "out", modr, "index", NULL ); - //cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index + cmDspSysInstallCb(h, sfp, "recent", prp, "in", NULL ); // report 'recent' but only act on 'max' loc index //cmDspSysInstallCb(h, prtb, "sym", sfp, "cmd", NULL ); //cmDspSysInstallCb(h, qtb, "sym", sfp, "cmd", NULL ); @@ -1135,6 +1193,8 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb(h, igain0, "val", ai0p, "gain", NULL ); // input gain control cmDspSysInstallCb(h, igain1, "val", ai1p, "gain", NULL ); + cmDspSysInstallCb(h, igain2, "val", ai2p, "gain", NULL ); // input gain control + cmDspSysInstallCb(h, igain3, "val", ai3p, "gain", NULL ); if( fragFl ) { @@ -1144,10 +1204,16 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb(h, mutr, "out", mix1, "gain-1", NULL ); } + cmDspSysInstallCb(h, apfByp, "out", apf0, "bypass", NULL ); // APF bypass + cmDspSysInstallCb(h, apfByp, "out", apf1, "bypass", NULL ); // + cmDspSysInstallCb(h, apfByp, "out", apf2, "bypass", NULL ); // + cmDspSysInstallCb(h, apfByp, "out", apf3, "bypass", NULL ); // + + cmDspSysInstallCb(h, ogain0, "val", ao0p, "gain", NULL ); // output gain control cmDspSysInstallCb(h, ogain1, "val", ao1p, "gain", NULL ); - //cmDspSysInstallCb(h, ogain2, "val", ao2p, "gain", NULL ); - //cmDspSysInstallCb(h, ogain3, "val", ao3p, "gain", NULL ); + cmDspSysInstallCb(h, ogain2, "val", ao2p, "gain", NULL ); + cmDspSysInstallCb(h, ogain3, "val", ao3p, "gain", NULL ); return rc; } From 0579a50ed1cbf2358e1663c4b74a9b60591d354d Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Mon, 10 Nov 2014 17:21:05 -0800 Subject: [PATCH 05/12] cmDspPgmKr.c : Added input eq. Removed dead code _cmDspSys_TlXformChain1(). --- dsp/cmDspPgmKr.c | 585 +++++++++++++++++++++-------------------------- 1 file changed, 263 insertions(+), 322 deletions(-) diff --git a/dsp/cmDspPgmKr.c b/dsp/cmDspPgmKr.c index 43f3525..c24d6b6 100644 --- a/dsp/cmDspPgmKr.c +++ b/dsp/cmDspPgmKr.c @@ -89,285 +89,6 @@ const cmChar_t* _mlbl(const cmChar_t* prefix, unsigned ch ) #define mlbl(a) _mlbl(a,mch) #define lbl(a) cmDspSysPrintLabel(a,ch) -void _cmDspSys_TlXformChain1( cmDspSysH_t h, cmDspTlXform_t* c, unsigned preGrpSymId, unsigned cmpPreGrpSymId, cmDspInst_t* modp, unsigned ch, unsigned mch ) -{ - unsigned measRtrChCnt = 6; // note: router channel 6 is not connected - - int krWndSmpCnt = 2048; - int krHopFact = 4; - - unsigned xfadeChCnt = 2; - double xfadeMs = 50; - bool xfadeInitFl = true; - double mixGain = 1.0; - - bool cmpBypassFl = false; - double cmpInGain = 3.0; - double cmpThreshDb = -40.0; - double cmpRatio_num = 5.0; - double cmpAtkMs = 20.0; - double cmpRlsMs = 100.0; - double cmpMakeup = 1.0; - double cmpWndMaxMs = 1000.0; - double cmpWndMs = 200.0; - - cmDspInst_t* achan = cmDspSysAllocInst(h, "AvailCh", NULL, 1, xfadeChCnt ); - - // Measurement scale/range - cmDspInst_t* even_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.8, 1.1, 0.0, 1.0 ); - cmDspInst_t* dynm_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 4.0, 0.01, 1.0 ); - cmDspInst_t* tmpo_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 80.0, 120.0, 0.01, 1.0 ); - cmDspInst_t* cost_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 1.0, 0.001, 1.0 ); - - // Measurement -> parameter mappers - cmDspInst_t* even_rt = cmDspSysAllocInst(h, "Router", NULL, 2, measRtrChCnt, measRtrChCnt-1 ); - cmDspInst_t* dynm_rt = cmDspSysAllocInst(h, "Router", NULL, 2, measRtrChCnt, measRtrChCnt-1 ); - cmDspInst_t* tmpo_rt = cmDspSysAllocInst(h, "Router", NULL, 2, measRtrChCnt, measRtrChCnt-1 ); - cmDspInst_t* cost_rt = cmDspSysAllocInst(h, "Router", NULL, 2, measRtrChCnt, measRtrChCnt-1 ); - - // Scale/ranges applied to incoming measurements. - cmDspInst_t* thr_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 1.0, 0.01, 100.0 ); - cmDspInst_t* upr_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 1.0, -1.0, 5.0 ); - cmDspInst_t* lwr_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 1.0, -5.0, 5.0 ); - cmDspInst_t* off_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 1.0, 0.0, 100.0 ); - cmDspInst_t* wet_sr = cmDspSysAllocInst(h, "ScaleRange", NULL, 4, 0.0, 1.0, 0.0, 1.0 ); - - - // Parameter-> kr routers (routers used to cross-fade between the two kr units) - unsigned paramRtChCnt = 2; - cmDspInst_t* mod_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* wnd_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* hop_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* thr_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* upr_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* lwr_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* inv_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* off_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - cmDspInst_t* wet_rt = cmDspSysAllocInst(h, "Router", NULL, 2, paramRtChCnt, paramRtChCnt-1 ); - - // Audio processors - cmDspInst_t* kr0 = cmDspSysAllocInst(h, "Kr", NULL, 2, krWndSmpCnt, krHopFact ); - cmDspInst_t* kr1 = cmDspSysAllocInst(h, "Kr", NULL, 2, krWndSmpCnt, krHopFact ); - cmDspInst_t* xfad = cmDspSysAllocInst(h, "Xfader", NULL, 3, xfadeChCnt, xfadeMs, xfadeInitFl ); - cmDspInst_t* mix = cmDspSysAllocInst(h, "AMix", NULL, 3, xfadeChCnt, mixGain, mixGain ); - cmDspInst_t* cmp = cmDspSysAllocInst(h, "Compressor", NULL, 8, cmpBypassFl, cmpThreshDb, cmpRatio_num, cmpAtkMs, cmpRlsMs, cmpMakeup, cmpWndMs, cmpWndMaxMs ); - - - // Internal audio connections - cmDspSysConnectAudio(h, kr0, "out", xfad, "in-0"); - cmDspSysConnectAudio(h, kr1, "out", xfad, "in-1"); - cmDspSysConnectAudio(h, xfad, "out-0", mix, "in-0"); - cmDspSysConnectAudio(h, xfad, "out-1", mix, "in-1"); - cmDspSysConnectAudio(h, mix, "out", cmp, "in" ); - - // active channel <-> cross-fade connections - cmDspSysInstallCb(h, achan, "reset", xfad, "reset", NULL); - cmDspSysInstallCb(h, achan, "gate-0", xfad, "gate-0", NULL ); - cmDspSysInstallCb(h, achan, "gate-1", xfad, "gate-1", NULL ); - cmDspSysInstallCb(h, xfad, "state-0", achan, "dis-0", NULL ); - cmDspSysInstallCb(h, xfad, "state-1", achan, "dis-1", NULL ); - - - // Measurement Number Controls - cmDspInst_t* min_dynm_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min In Dyn"), 0.0, 10.0, 1.0, 0.0); - cmDspInst_t* max_dynm_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max In Dyn"), 0.0, 10.0, 1.0, 4.0); - cmDspInst_t* dynm_map_menu = cmDspSysAllocMsgListP(h,preGrpSymId, NULL, lbl("DynSel 0"), NULL, "measMenu", measRtrChCnt-1); - - cmDspInst_t* min_even_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min In Even"), 0.0, 1.0, 0.001, 0.75); - cmDspInst_t* max_even_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max In Even"), 0.0, 3.0, 0.001, 1.0); - cmDspInst_t* even_map_menu = cmDspSysAllocMsgListP( h,preGrpSymId, NULL, lbl("EvenSel"), NULL, "measMenu", measRtrChCnt-1); - - cmDspSysNewColumn(h,0); - cmDspInst_t* min_tmpo_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min In Tempo"), 0.0, 200.0, 1.0, 80.0); - cmDspInst_t* max_tmpo_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max In Tempo"), 0.0, 200.0, 1.0, 120.0); - cmDspInst_t* tmpo_map_menu = cmDspSysAllocMsgListP( h,preGrpSymId, NULL, lbl("TempoSel"), NULL, "measMenu", measRtrChCnt-1); - - cmDspInst_t* min_cost_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min In Cost"), 0.0, 1.0, 0.01, 0.0); - cmDspInst_t* max_cost_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max In Cost"), 0.0, 1.0, 0.01, 1.0); - cmDspInst_t* cost_map_menu = cmDspSysAllocMsgListP( h,preGrpSymId, NULL, lbl("CostSel"), NULL, "measMenu", measRtrChCnt-1); - - cmDspSysInstallCb(h, min_dynm_ctl, "val", dynm_sr, "min_in", NULL ); - cmDspSysInstallCb(h, max_dynm_ctl, "val", dynm_sr, "min_in", NULL ); - cmDspSysInstallCb(h, dynm_map_menu,"out", dynm_rt, "sel", NULL ); - cmDspSysInstallCb(h, dynm_sr, "val_out", dynm_rt, "f-in", NULL ); - - cmDspSysInstallCb(h, min_even_ctl, "val", even_sr, "min_in", NULL ); - cmDspSysInstallCb(h, max_even_ctl, "val", even_sr, "min_in", NULL ); - cmDspSysInstallCb(h, even_map_menu,"out", even_rt, "sel", NULL ); - cmDspSysInstallCb(h, even_sr, "val_out", even_rt, "f-in", NULL ); - - cmDspSysInstallCb(h, min_tmpo_ctl, "val", tmpo_sr, "min_in", NULL ); - cmDspSysInstallCb(h, max_tmpo_ctl, "val", tmpo_sr, "min_in", NULL ); - cmDspSysInstallCb(h, tmpo_map_menu,"out", tmpo_rt, "sel", NULL ); - cmDspSysInstallCb(h, tmpo_sr, "val_out", tmpo_rt, "f-in", NULL ); - - cmDspSysInstallCb(h, min_cost_ctl, "val", cost_sr, "min_in", NULL ); - cmDspSysInstallCb(h, max_cost_ctl, "val", cost_sr, "min_in", NULL ); - cmDspSysInstallCb(h, cost_map_menu,"out", cost_rt, "sel", NULL ); - cmDspSysInstallCb(h, cost_sr, "val_out", cost_rt, "f-in", NULL ); - - cmDspSysNewColumn(h,0); - cmDspInst_t* min_thr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Thresh"), 0.0,100.0, 1.0, 30.0); - cmDspInst_t* max_thr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Thresh"), 0.0,100.0, 1.0, 80.0); - cmDspInst_t* min_upr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Upr"), -1.0, 1.0, 0.001, -0.5); - cmDspInst_t* max_upr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Upr"), -1.0, 1.0, 0.001, 0.5); - cmDspInst_t* min_lwr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Lwr"), 0.0, -1.0, 5.0, 1.0); - cmDspInst_t* max_lwr_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Lwr"), 0.0, -1.0, 5.0, 3.0); - cmDspInst_t* min_off_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Off"), -100.0, 100.0, 0.1, 30.0); - cmDspInst_t* max_off_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Off"), -100.0, 100.0, 0.1, 30.0); - cmDspInst_t* min_wet_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Min Wet"), 0.0, 1.0, 0.01, 1.0); - cmDspInst_t* max_wet_ctl = cmDspSysAllocScalarP( h,preGrpSymId, NULL, lbl("Max Wet"), 0.0, 1.0, 0.01, 1.0); - - - // Parameter number controls - cmDspSysNewColumn(h,0); - cmDspInst_t* mod_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Mode"), 0.0, 4.0, 1.0, 1.0); - cmDspInst_t* wnd_ctl = cmDspSysAllocMsgListP(h,preGrpSymId,NULL, lbl("WndSmpCnt"), NULL, "wndSmpCnt", 2); - cmDspInst_t* hop_ctl = cmDspSysAllocMsgListP(h,preGrpSymId,NULL, lbl("HopFact"), NULL, "hopFact", 2); - cmDspInst_t* thr_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Threshold"), 0.0, 100.0, 1.0, 60.0 ); - cmDspInst_t* upr_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Upr slope"), 0.0, 10.0, 0.01, 0.0 ); - cmDspInst_t* lwr_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Lwr slope"), 0.3, 10.0, 0.01, 2.0 ); - cmDspInst_t* off_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Offset"), 0.0, 100.0, 0.01, 20.0 ); - cmDspInst_t* inv_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Invert"), 0.0, 1.0, 1.0, 0.0 ); - cmDspInst_t* wet_ctl = cmDspSysAllocScalarP( h,preGrpSymId,NULL, lbl("Wet Dry"), 0.0, 1.0, 0.001, 1.0 ); - - cmDspSysInstallCb(h, mod_ctl, "val", mod_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", mod_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, mod_rt, "f-out-0", kr0, "mode", NULL ); // mode->kr - cmDspSysInstallCb(h, mod_rt, "f-out-1", kr1, "mode", NULL ); // mode->kr - - cmDspSysInstallCb(h, wnd_ctl, "out", wnd_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", wnd_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, wnd_rt, "f-out-0", kr0, "wndn", NULL ); // wndn->kr - cmDspSysInstallCb(h, wnd_rt, "f-out-1", kr1, "wndn", NULL ); // wndn->kr - - cmDspSysInstallCb(h, hop_ctl, "out", hop_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", hop_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, hop_rt, "f-out-0", kr0, "hopf", NULL ); // hopf->kr - cmDspSysInstallCb(h, hop_rt, "f-out-1", kr1, "hopf", NULL ); // hopf->kr - - cmDspSysInstallCb(h, min_thr_ctl, "val", thr_sr, "min_out", NULL ); - cmDspSysInstallCb(h, max_thr_ctl, "val", thr_sr, "max_out", NULL ); - cmDspSysInstallCb(h, even_rt, "f-out-0", thr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, dynm_rt, "f-out-0", thr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, tmpo_rt, "f-out-0", thr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, cost_rt, "f-out-0", thr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, thr_sr, "val_out", thr_ctl,"val", NULL ); - cmDspSysInstallCb(h, thr_ctl, "val", thr_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", thr_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, thr_rt, "f-out-0", kr0, "thrh", NULL ); // thr->kr - cmDspSysInstallCb(h, thr_rt, "f-out-1", kr1, "thrh", NULL ); // thr->kr - - cmDspSysInstallCb(h, min_upr_ctl, "val", upr_sr, "min_out", NULL ); - cmDspSysInstallCb(h, max_upr_ctl, "val", upr_sr, "max_out", NULL ); - cmDspSysInstallCb(h, even_rt, "f-out-1", upr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, dynm_rt, "f-out-1", upr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, tmpo_rt, "f-out-1", upr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, cost_rt, "f-out-1", upr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, upr_sr, "val_out", upr_ctl,"val", NULL ); - cmDspSysInstallCb(h, upr_ctl, "val", upr_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", upr_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, upr_rt, "f-out-0", kr0, "uprs", NULL ); // upr->kr - cmDspSysInstallCb(h, upr_rt, "f-out-1", kr1, "uprs", NULL ); // upr->kr - - cmDspSysInstallCb(h, min_lwr_ctl, "val", lwr_sr, "min_out", NULL ); - cmDspSysInstallCb(h, max_lwr_ctl, "val", lwr_sr, "max_out", NULL ); - cmDspSysInstallCb(h, even_rt, "f-out-2", lwr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, dynm_rt, "f-out-2", lwr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, tmpo_rt, "f-out-2", lwr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, cost_rt, "f-out-2", lwr_sr, "val_in", NULL ); - cmDspSysInstallCb(h, lwr_sr, "val_out", lwr_ctl,"val", NULL ); - cmDspSysInstallCb(h, lwr_ctl, "val", lwr_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", lwr_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, lwr_rt, "f-out-0", kr0, "lwrs", NULL ); // lwr->kr - cmDspSysInstallCb(h, lwr_rt, "f-out-1", kr1, "lwrs", NULL ); // lwr->kr - - cmDspSysInstallCb(h, min_off_ctl, "val", off_sr, "min_out", NULL ); - cmDspSysInstallCb(h, max_off_ctl, "val", off_sr, "max_out", NULL ); - cmDspSysInstallCb(h, even_rt, "f-out-3", off_sr, "val_in", NULL ); - cmDspSysInstallCb(h, dynm_rt, "f-out-3", off_sr, "val_in", NULL ); - cmDspSysInstallCb(h, tmpo_rt, "f-out-3", off_sr, "val_in", NULL ); - cmDspSysInstallCb(h, cost_rt, "f-out-3", off_sr, "val_in", NULL ); - cmDspSysInstallCb(h, off_sr, "val_out", off_ctl,"val", NULL ); - cmDspSysInstallCb(h, off_ctl, "val", off_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", off_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, off_rt, "f-out-0", kr0, "offs", NULL ); // off->kr - cmDspSysInstallCb(h, off_rt, "f-out-1", kr1, "offs", NULL ); // off->kr - - cmDspSysInstallCb(h, inv_ctl, "val", inv_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", inv_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, inv_rt, "f-out-0", kr0, "invt", NULL ); // inv->kr - cmDspSysInstallCb(h, inv_rt, "f-out-1", kr1, "invt", NULL ); // inv->kr - - cmDspSysInstallCb(h, min_wet_ctl, "val", wet_sr, "min_out", NULL ); - cmDspSysInstallCb(h, max_wet_ctl, "val", wet_sr, "max_out", NULL ); - cmDspSysInstallCb(h, even_rt, "f-out-4", wet_sr, "val_in", NULL ); - cmDspSysInstallCb(h, dynm_rt, "f-out-4", wet_sr, "val_in", NULL ); - cmDspSysInstallCb(h, tmpo_rt, "f-out-4", wet_sr, "val_in", NULL ); - cmDspSysInstallCb(h, cost_rt, "f-out-4", wet_sr, "val_in", NULL ); - - cmDspSysInstallCb(h, wet_sr, "val_out", wet_ctl,"val", NULL ); - cmDspSysInstallCb(h, wet_ctl, "val", wet_rt, "f-in", NULL ); - cmDspSysInstallCb(h, achan, "ch", wet_rt, "sel", NULL ); // ach->rt sel - cmDspSysInstallCb(h, wet_rt, "f-out-0", kr0, "wet", NULL ); // wet->kr - cmDspSysInstallCb(h, wet_rt, "f-out-1", kr1, "wet", NULL ); // wet->kr - - - cmDspSysNewColumn(h,0); - cmDspInst_t* cmp_byp = cmDspSysAllocCheckP( h, cmpPreGrpSymId, NULL, lbl("Bypass"), 1.0 ); - cmDspInst_t* cmp_igain = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("In Gain"), 0.0, 10.0, 0.1, cmpInGain); - cmDspInst_t* cmp_thr = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("ThreshDb"), -100.0, 0.0, 0.1, cmpThreshDb); - cmDspInst_t* cmp_rat = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("Ratio"), 0.1, 100, 0.1, cmpRatio_num); - cmDspInst_t* cmp_atk = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("Atk Ms"), 0.0, 1000.0, 0.1, cmpAtkMs); - cmDspInst_t* cmp_rls = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("Rls Ms"), 0.0, 1000.0, 0.1, cmpRlsMs); - cmDspInst_t* cmp_mkup = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("Makeup"), 0.0, 10.0, 0.01, cmpMakeup); - cmDspInst_t* cmp_wnd = cmDspSysAllocScalarP( h, cmpPreGrpSymId, NULL, lbl("Wnd Ms"), 1.0, cmpWndMaxMs, 1.0, cmpWndMs ); - cmDspInst_t* cmp_mtr = cmDspSysAllocInst(h,"Meter",lbl("Env"), 3, 0.0, 0.0, 1.0); - - cmDspSysInstallCb(h, cmp_byp, "out", cmp, "bypass", NULL ); - cmDspSysInstallCb(h, cmp_igain,"val", cmp, "igain", NULL ); - cmDspSysInstallCb(h, cmp_thr, "val", cmp, "thr", NULL ); - cmDspSysInstallCb(h, cmp_rat, "val", cmp, "ratio", NULL ); - cmDspSysInstallCb(h, cmp_atk, "val", cmp, "atk", NULL ); - cmDspSysInstallCb(h, cmp_rls, "val", cmp, "rls", NULL ); - cmDspSysInstallCb(h, cmp_mkup, "val", cmp, "ogain", NULL ); - cmDspSysInstallCb(h, cmp_wnd, "val", cmp, "wnd", NULL ); - cmDspSysInstallCb(h, cmp, "env", cmp_mtr, "in", NULL ); - - cmDspSysInstallCb(h, modp, mlbl("cbyp"), cmp_byp, "in", NULL ); - cmDspSysInstallCb(h, modp, mlbl("cigain"), cmp_igain,"val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("cthrsh"), cmp_thr, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("cratio"), cmp_rat, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("catkms"), cmp_atk, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("crlsms"), cmp_rls, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("cmakeup"), cmp_mkup, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("cwndms"), cmp_wnd, "val", NULL ); - - // - cmDspInst_t* xfadMs = cmDspSysAllocInst(h,"Scalar", lbl("Xfade Ms"), 5, kNumberDuiId, 0.0, 1000.0,0.01, 50.0 ); - cmDspSysInstallCb(h, xfadMs, "val", xfad, "ms", NULL ); - cmDspSysInstallCb(h, modp, mlbl("xfad"), xfadMs, "val", NULL); - - cmDspSysInstallCb(h, modp, mlbl("win"), wnd_ctl, "sel", NULL ); - cmDspSysInstallCb(h, modp, mlbl("hop"), hop_ctl, "sel", NULL ); - cmDspSysInstallCb(h, modp, mlbl("mod"), mod_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("thr"), thr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("upr"), upr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("lwr"), lwr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("mint"), min_thr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("maxt"), max_thr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("minu"), min_upr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("maxu"), max_upr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("minl"), min_lwr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("maxl"), max_lwr_ctl, "val", NULL ); - cmDspSysInstallCb(h, modp, mlbl("sw"), achan, "trig", NULL ); // See also: amp.sfloc->achan.trig - - c->achan = achan; - c->kr0 = kr0; - c->kr1 = kr1; - c->cmp = cmp; - -} void _cmDspSys_TlXformChain( cmDspSysH_t h, cmDspTlXform_t* c, unsigned preGrpSymId, unsigned cmpPreGrpSymId, cmDspInst_t* modp, unsigned ch, unsigned mch ) { @@ -658,12 +379,13 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmCtx_t* cmCtx = cmDspSysPgmCtx(h); cmErr_t err; krRsrc_t r; - bool fragFl = false; - bool useWtFl = false; - bool useChain1Fl= true; - unsigned wtLoopCnt = 1; // 1=play once (-1=loop forever) - unsigned wtInitMode = 0; // initial wt mode is 'silence' - unsigned wtSmpCnt = floor(cmDspSysSampleRate(h)); // wt length == srate + bool fragFl = false; + bool useWtFl = false; + bool useChain1Fl = true; + bool useInputEqFl = false; + unsigned wtLoopCnt = 1; // 1=play once (-1=loop forever) + unsigned wtInitMode = 0; // initial wt mode is 'silence' + unsigned wtSmpCnt = floor(cmDspSysSampleRate(h)); // wt length == srate unsigned sfBufCnt = 7; // length of the MIDI event buffer unsigned sfMaxWndCnt = 10; // length of the score event buffer @@ -676,10 +398,21 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) bool eqBypassFl = false; - unsigned eqModeSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"LP"); - double eqF0hz = 264.0; - double eqQ = 1.0; - double eqGain = 1.0; + + unsigned eqLpSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"LP"); + double eqLpF0hz = 200.0; + double eqLpQ = 0.5; + double eqLpGain = 0.9; + + unsigned eqBpSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"BP"); + double eqBpF0hz = 350.0; + double eqBpQ = 0.6; + double eqBpGain = 1.0; + + unsigned eqHpSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"HP"); + double eqHpF0hz = 600.0; + double eqHpQ = 0.5; + double eqHpGain = 0.9; bool apfBypassFl = false; unsigned apfModeSymId = cmSymTblRegisterStaticSymbol(cmDspSysSymbolTable(h),"AP"); @@ -710,11 +443,26 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* ai2p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 4); cmDspInst_t* ai3p = cmDspSysAllocInst(h,"AudioIn", NULL, 1, 5); + cmDspInst_t* eqLpf_0 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqLpSymId,eqLpF0hz, eqLpQ, eqLpGain ) : NULL; + cmDspInst_t* eqLpf_1 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqLpSymId,eqLpF0hz, eqLpQ, eqLpGain ) : NULL; + cmDspInst_t* eqLpf_2 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqLpSymId,eqLpF0hz, eqLpQ, eqLpGain ) : NULL; + cmDspInst_t* eqLpf_3 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqLpSymId,eqLpF0hz, eqLpQ, eqLpGain ) : NULL; - //cmDspInst_t* ieq0 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); - //cmDspInst_t* ieq1 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); - //cmDspInst_t* ieq2 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); - //cmDspInst_t* ieq3 = cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqModeSymId,eqF0hz, eqQ, eqGain ); + cmDspInst_t* eqBpf_0 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqBpSymId,eqBpF0hz, eqBpQ, eqBpGain ) : NULL; + cmDspInst_t* eqBpf_1 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqBpSymId,eqBpF0hz, eqBpQ, eqBpGain ) : NULL; + cmDspInst_t* eqBpf_2 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqBpSymId,eqBpF0hz, eqBpQ, eqBpGain ) : NULL; + cmDspInst_t* eqBpf_3 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqBpSymId,eqBpF0hz, eqBpQ, eqBpGain ) : NULL; + + cmDspInst_t* eqHpf_0 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqHpSymId,eqHpF0hz, eqHpQ, eqHpGain ) : NULL; + cmDspInst_t* eqHpf_1 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqHpSymId,eqHpF0hz, eqHpQ, eqHpGain ) : NULL; + cmDspInst_t* eqHpf_2 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqHpSymId,eqHpF0hz, eqHpQ, eqHpGain ) : NULL; + cmDspInst_t* eqHpf_3 = useInputEqFl ? cmDspSysAllocInst(h,"BiQuadEq",NULL, 5, eqBypassFl, eqHpSymId,eqHpF0hz, eqHpQ, eqHpGain ) : NULL; + + double eqMixGain = 1.0/3.0; + cmDspInst_t* eqMx_0 = useInputEqFl ? cmDspSysAllocInst( h, "AMix", NULL, 4, 3, eqMixGain, eqMixGain, eqMixGain) : NULL; + cmDspInst_t* eqMx_1 = useInputEqFl ? cmDspSysAllocInst( h, "AMix", NULL, 4, 3, eqMixGain, eqMixGain, eqMixGain) : NULL; + cmDspInst_t* eqMx_2 = useInputEqFl ? cmDspSysAllocInst( h, "AMix", NULL, 4, 3, eqMixGain, eqMixGain, eqMixGain) : NULL; + cmDspInst_t* eqMx_3 = useInputEqFl ? cmDspSysAllocInst( h, "AMix", NULL, 4, 3, eqMixGain, eqMixGain, eqMixGain) : NULL; cmDspInst_t* mx0p = cmDspSysAllocInst( h, "AMix", NULL, 3, 2, 1.0, 1.0); @@ -730,7 +478,7 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* php = cmDspSysAllocInst(h,"Phasor", NULL, 1, cmDspSysSampleRate(h) ); cmDspInst_t* wtp = cmDspSysAllocInst(h,"WaveTable", NULL, 4, wtSmpCnt, wtInitMode, NULL, wtLoopCnt ); cmDspInst_t* pts = cmDspSysAllocInst(h,"PortToSym", NULL, 2, "on", "off" ); - cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 0 ); + //cmDspInst_t* mip = cmDspSysAllocInst(h,"MidiIn", NULL, 0 ); cmDspInst_t* mfp = cmDspSysAllocInst(h,"MidiFilePlay",NULL, 0 ); cmDspInst_t* nmp = cmDspSysAllocInst(h,"NanoMap", NULL, 0 ); @@ -837,8 +585,8 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* measb= cmDspSysAllocInst(h,"Button", "meas", 2, kCheckDuiId, 0.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* prtb = cmDspSysAllocInst(h,"Button", "print", 2, kButtonDuiId, 1.0 ); - cmDspInst_t* qtb = cmDspSysAllocInst(h,"Button", "quiet", 2, kButtonDuiId, 1.0 ); + //cmDspInst_t* prtb = cmDspSysAllocInst(h,"Button", "print", 2, kButtonDuiId, 1.0 ); + //cmDspInst_t* qtb = cmDspSysAllocInst(h,"Button", "quiet", 2, kButtonDuiId, 1.0 ); cmDspInst_t* mutm = cmDspSysAllocInst(h,"Checkbox","main", 1, "main","on","off",1.0,0.0,1.0 ); cmDspInst_t* mutr = cmDspSysAllocInst(h,"Checkbox","frag", 1, "frag","on","off",1.0,0.0,1.0 ); cmDspInst_t* prp = cmDspSysAllocInst(h,"Printer", NULL, 1, ">" ); @@ -871,12 +619,15 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* dbpsec = cmDspSysAllocInst(h,"Scalar", "Fade dBpSec", 5, kNumberDuiId, 0.0, 24.0, 0.01, recdPlayFadeRateDbPerSec); cmDspInst_t* apfByp = cmDspSysAllocCheck( h, "APF-Bypass", 0.0 ); + + + cmDspSysNewColumn(h,0); cmDspInst_t* ogain0 = cmDspSysAllocInst(h,"Scalar", "Out Gain-0", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain1 = cmDspSysAllocInst(h,"Scalar", "Out Gain-1", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain2 = cmDspSysAllocInst(h,"Scalar", "Out Gain-2", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); cmDspInst_t* ogain3 = cmDspSysAllocInst(h,"Scalar", "Out Gain-3", 5, kNumberDuiId, 0.0, 10.0,0.01, 1.0 ); - cmDspInst_t* scLoc = cmDspSysAllocInst(h,"Scalar", "Sc Loc", 5, kNumberDuiId, 0.0, 3000.0, 1.0, 0.0 ); + //cmDspInst_t* scLoc = cmDspSysAllocInst(h,"Scalar", "Sc Loc", 5, kNumberDuiId, 0.0, 3000.0, 1.0, 0.0 ); // Audio file recording cmDspInst_t* recdGain= cmDspSysAllocInst(h,"Scalar", "Recd Gain", 5, kNumberDuiId, 0.0, 100.0,0.01, 1.5 ); @@ -887,6 +638,106 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspInst_t* mi1p = cmDspSysAllocInst(h,"AMeter","In 1", 0); + //--------------- Preset controls + cmDspSysNewColumn(h,0); + cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, preGrpSymId ); + cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" ); + cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0); + cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0); + cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL); + cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL ); + cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL ); + + cmDspInst_t* prePath = cmDspSysAllocInst( h, "Fname", "prePath", 3, true,NULL,r.tlPrefixPath); + + + cmDspSysNewColumn(h,0); + + //--------------- Recorded performance evaluation and Active Measurement related controls + cmDspInst_t* clrBtn = cmDspSysAllocButton( h, "clear", 0); + cmDspInst_t* prtBtn = cmDspSysAllocButton( h, "dump", 0); + cmDspInst_t* mlst = cmDspSysAllocInst( h, "MsgList", NULL, 3, "meas", r.measFn, 2); + cmDspInst_t* amCmd = cmDspSysAllocInst( h, "PortToSym", NULL, 2, "add", "rewind" ); + + + + if( useInputEqFl ) cmDspSysNewPage(h,"In EQ"); + cmDspInst_t* eqLpByp0 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-LPF-Bypass-0", 0.0 ) : NULL; + cmDspInst_t* eqLpMode0 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-LPF-Mode-0", 3, "biQuadEqMode", NULL, 1) : NULL; + cmDspInst_t* eqLpFc0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Hz-0", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqLpF0hz ) : NULL; + cmDspInst_t* eqLpQ0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Q-0", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqLpQ ) : NULL; + cmDspInst_t* eqLpGain0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Gain-0", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqLpGain ) : NULL; + + cmDspInst_t* eqBpByp0 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-BPF-Bypass-0", 0.0 ) : NULL; + cmDspInst_t* eqBpMode0 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-BPF-Mode-0", 3, "biQuadEqMode", NULL, 3) : NULL; + cmDspInst_t* eqBpFc0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Hz-0", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqBpF0hz ) : NULL; + cmDspInst_t* eqBpQ0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Q-0", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqBpQ ) : NULL; + cmDspInst_t* eqBpGain0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Gain-0", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqBpGain ) : NULL; + + cmDspInst_t* eqHpByp0 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-HPF-Bypass-0", 0.0 ) : NULL; + cmDspInst_t* eqHpMode0 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-HPF-Mode-0", 3, "biQuadEqMode", NULL, 2) : NULL; + cmDspInst_t* eqHpFc0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Hz-0", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqHpF0hz ) : NULL; + cmDspInst_t* eqHpQ0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Q-0", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqHpQ ) : NULL; + cmDspInst_t* eqHpGain0 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Gain-0", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqHpGain ) : NULL; + + if( useInputEqFl ) cmDspSysNewColumn(h,0); + cmDspInst_t* eqLpByp1 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-LPF-Bypass-1", 0.0 ) : NULL; + cmDspInst_t* eqLpMode1 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-LPF-Mode-1", 3, "biQuadEqMode", NULL, 1) : NULL; + cmDspInst_t* eqLpFc1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Hz-1", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqLpF0hz ) : NULL; + cmDspInst_t* eqLpQ1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Q-1", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqLpQ ) : NULL; + cmDspInst_t* eqLpGain1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Gain-1", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqLpGain ) : NULL; + + cmDspInst_t* eqBpByp1 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-BPF-Bypass-1", 0.0 ) : NULL; + cmDspInst_t* eqBpMode1 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-BPF-Mode-1", 3, "biQuadEqMode", NULL, 3) : NULL; + cmDspInst_t* eqBpFc1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Hz-1", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqBpF0hz ) : NULL; + cmDspInst_t* eqBpQ1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Q-1", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqBpQ ) : NULL; + cmDspInst_t* eqBpGain1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Gain-1", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqBpGain ) : NULL; + + cmDspInst_t* eqHpByp1 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-HPF-Bypass-1", 0.0 ) : NULL; + cmDspInst_t* eqHpMode1 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-HPF-Mode-1", 3, "biQuadEqMode", NULL, 2) : NULL; + cmDspInst_t* eqHpFc1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Hz-1", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqHpF0hz ) : NULL; + cmDspInst_t* eqHpQ1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Q-1", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqHpQ ) : NULL; + cmDspInst_t* eqHpGain1 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Gain-1", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqHpGain ) : NULL; + + + if( useInputEqFl ) cmDspSysNewColumn(h,0); + cmDspInst_t* eqLpByp2 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-LPF-Bypass-2", 0.0 ) : NULL; + cmDspInst_t* eqLpMode2 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-LPF-Mode-2", 3, "biQuadEqMode", NULL, 1) : NULL; + cmDspInst_t* eqLpFc2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Hz-2", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqLpF0hz ) : NULL; + cmDspInst_t* eqLpQ2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Q-2", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqLpQ ) : NULL; + cmDspInst_t* eqLpGain2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Gain-2", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqLpGain ) : NULL; + + cmDspInst_t* eqBpByp2 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-BPF-Bypass-2", 0.0 ) : NULL; + cmDspInst_t* eqBpMode2 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-BPF-Mode-2", 3, "biQuadEqMode", NULL, 3) : NULL; + cmDspInst_t* eqBpFc2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Hz-2", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqBpF0hz ) : NULL; + cmDspInst_t* eqBpQ2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Q-2", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqBpQ ) : NULL; + cmDspInst_t* eqBpGain2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Gain-2", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqBpGain ) : NULL; + + cmDspInst_t* eqHpByp2 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-HPF-Bypass-2", 0.0 ) : NULL; + cmDspInst_t* eqHpMode2 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-HPF-Mode-2", 3, "biQuadEqMode", NULL, 2) : NULL; + cmDspInst_t* eqHpFc2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Hz-2", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqHpF0hz ) : NULL; + cmDspInst_t* eqHpQ2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Q-2", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqHpQ ) : NULL; + cmDspInst_t* eqHpGain2 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Gain-2", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqHpGain ) : NULL; + + if( useInputEqFl ) cmDspSysNewColumn(h,0); + cmDspInst_t* eqLpByp3 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-LPF-Bypass-3", 0.0 ) : NULL; + cmDspInst_t* eqLpMode3 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-LPF-Mode-3", 3, "biQuadEqMode", NULL, 1) : NULL; + cmDspInst_t* eqLpFc3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Hz-3", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqLpF0hz ) : NULL; + cmDspInst_t* eqLpQ3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Q-3", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqLpQ ) : NULL; + cmDspInst_t* eqLpGain3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-LPF-Gain-3", 5, kNumberDuiId, -300.0, 100.0, 0.5, eqLpGain ) : NULL; + + cmDspInst_t* eqBpByp3 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-BPF-Bypass-3", 0.0 ) : NULL; + cmDspInst_t* eqBpMode3 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-BPF-Mode-3", 3, "biQuadEqMode", NULL, 3) : NULL; + cmDspInst_t* eqBpFc3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Hz-3", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqBpF0hz ) : NULL; + cmDspInst_t* eqBpQ3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Q-3", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqBpQ ) : NULL; + cmDspInst_t* eqBpGain3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-BPF-Gain-3", 5, kNumberDuiId, -300.0, 100.0, 0.5, eqBpGain ) : NULL; + + cmDspInst_t* eqHpByp3 = useInputEqFl ? cmDspSysAllocCheck( h,"Eq-HPF-Bypass-3", 0.0 ) : NULL; + cmDspInst_t* eqHpMode3 = useInputEqFl ? cmDspSysAllocInst( h,"MsgList","Eq-HPF-Mode-3", 3, "biQuadEqMode", NULL, 2) : NULL; + cmDspInst_t* eqHpFc3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Hz-3", 5, kNumberDuiId, 0.0, 20000.0, 0.5, eqHpF0hz ) : NULL; + cmDspInst_t* eqHpQ3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Q-3", 5, kNumberDuiId, 0.0, 100.0, 0.01, eqHpQ ) : NULL; + cmDspInst_t* eqHpGain3 = useInputEqFl ? cmDspSysAllocInst( h,"Scalar", "Eq-HPF-Gain-3", 5, kNumberDuiId, -100.0, 100.0, 0.5, eqHpGain ) : NULL; + if((rc = cmDspSysLastRC(h)) != kOkDspRC ) return rc; @@ -901,10 +752,41 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) // Audio connections cmDspSysConnectAudio(h, php, "out", wtp, "phs" ); // phs -> wt - cmDspSysConnectAudio(h, ai0p, "out", mx0p, "in-0" ); - cmDspSysConnectAudio(h, ai1p, "out", mx1p, "in-0" ); - cmDspSysConnectAudio(h, ai2p, "out", mx0p, "in-1" ); - cmDspSysConnectAudio(h, ai3p, "out", mx1p, "in-1" ); + if( useInputEqFl ) + { + cmDspSysConnectAudio(h, ai0p, "out", eqLpf_0, "in" ); // ain->eq + cmDspSysConnectAudio(h, ai0p, "out", eqBpf_0, "in" ); + cmDspSysConnectAudio(h, ai0p, "out", eqHpf_0, "in" ); + cmDspSysConnectAudio(h, eqLpf_0, "out", eqMx_0, "in-0"); // eq -> eqmix + cmDspSysConnectAudio(h, eqBpf_0, "out", eqMx_0, "in-1"); + cmDspSysConnectAudio(h, eqHpf_0, "out", eqMx_0, "in-2"); + + cmDspSysConnectAudio(h, ai1p, "out", eqLpf_1, "in" ); // ain->eq + cmDspSysConnectAudio(h, ai1p, "out", eqBpf_1, "in" ); + cmDspSysConnectAudio(h, ai1p, "out", eqHpf_1, "in" ); + cmDspSysConnectAudio(h, eqLpf_1, "out", eqMx_1, "in-0"); // eq -> eqmix + cmDspSysConnectAudio(h, eqBpf_1, "out", eqMx_1, "in-1"); + cmDspSysConnectAudio(h, eqHpf_1, "out", eqMx_1, "in-2"); + + cmDspSysConnectAudio(h, ai2p, "out", eqLpf_2, "in" ); // ain->eq + cmDspSysConnectAudio(h, ai2p, "out", eqBpf_2, "in" ); + cmDspSysConnectAudio(h, ai2p, "out", eqHpf_2, "in" ); + cmDspSysConnectAudio(h, eqLpf_2, "out", eqMx_2, "in-0"); // eq -> eqmix + cmDspSysConnectAudio(h, eqBpf_2, "out", eqMx_2, "in-1"); + cmDspSysConnectAudio(h, eqHpf_2, "out", eqMx_2, "in-2"); + + cmDspSysConnectAudio(h, ai3p, "out", eqLpf_3, "in" ); // ain->eq + cmDspSysConnectAudio(h, ai3p, "out", eqBpf_3, "in" ); + cmDspSysConnectAudio(h, ai3p, "out", eqHpf_3, "in" ); + cmDspSysConnectAudio(h, eqLpf_3, "out", eqMx_3, "in-0"); // eq -> eqmix + cmDspSysConnectAudio(h, eqBpf_3, "out", eqMx_3, "in-1"); + cmDspSysConnectAudio(h, eqHpf_3, "out", eqMx_3, "in-2"); + } + + cmDspSysConnectAudio(h, useInputEqFl ? ai0p : eqMx_0, "out", mx0p, "in-0" ); // eqmix -> input mix + cmDspSysConnectAudio(h, useInputEqFl ? ai1p : eqMx_1, "out", mx1p, "in-0" ); + cmDspSysConnectAudio(h, useInputEqFl ? ai2p : eqMx_2, "out", mx0p, "in-1" ); + cmDspSysConnectAudio(h, useInputEqFl ? ai3p : eqMx_3, "out", mx1p, "in-1" ); if( useWtFl ) { @@ -997,27 +879,6 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) //cmDspSysConnectAudio(h, ai1p, "out", ao3p, "in" ); // output chs 2&3 - //--------------- Preset controls - cmDspSysNewColumn(h,0); - cmDspInst_t* preset = cmDspSysAllocInst( h, "Preset", NULL, 1, preGrpSymId ); - cmDspInst_t* presetLbl = cmDspSysAllocInst( h, "Text", "Preset", 1, "" ); - cmDspInst_t* storeBtn = cmDspSysAllocButton( h, "store", 0); - cmDspInst_t* recallBtn = cmDspSysAllocButton( h, "recall", 0); - cmDspSysInstallCb( h, presetLbl, "val", preset, "label",NULL); - cmDspSysInstallCb( h, storeBtn, "sym", preset, "cmd", NULL ); - cmDspSysInstallCb( h, recallBtn, "sym", preset, "cmd", NULL ); - - cmDspInst_t* prePath = cmDspSysAllocInst( h, "Fname", "prePath", 3, true,NULL,r.tlPrefixPath); - - - cmDspSysNewColumn(h,0); - - //--------------- Recorded performance evaluation and Active Measurement related controls - cmDspInst_t* clrBtn = cmDspSysAllocButton( h, "clear", 0); - cmDspInst_t* prtBtn = cmDspSysAllocButton( h, "dump", 0); - cmDspInst_t* mlst = cmDspSysAllocInst( h, "MsgList", NULL, 3, "meas", r.measFn, 2); - cmDspInst_t* amCmd = cmDspSysAllocInst( h, "PortToSym", NULL, 2, "add", "rewind" ); - cmDspSysInstallCb( h, clrBtn, "sym", amp, "cmd", NULL ); // clear active meas. @@ -1215,6 +1076,86 @@ cmDspRC_t _cmDspSysPgm_TimeLine(cmDspSysH_t h, void** userPtrPtr ) cmDspSysInstallCb(h, ogain2, "val", ao2p, "gain", NULL ); cmDspSysInstallCb(h, ogain3, "val", ao3p, "gain", NULL ); + + + + if( useInputEqFl ) + { + cmDspSysInstallCb(h, eqLpByp0, "out", eqLpf_0, "bypass", NULL); + cmDspSysInstallCb(h, eqLpMode0, "mode",eqLpf_0, "mode", NULL ); + cmDspSysInstallCb(h, eqLpFc0, "val", eqLpf_0, "f0", NULL ); + cmDspSysInstallCb(h, eqLpQ0, "val", eqLpf_0, "Q", NULL ); + cmDspSysInstallCb(h, eqLpGain0, "val", eqLpf_0, "gain", NULL ); + + cmDspSysInstallCb(h, eqBpByp0, "out", eqBpf_0, "bypass", NULL); + cmDspSysInstallCb(h, eqBpMode0, "mode",eqBpf_0, "mode", NULL ); + cmDspSysInstallCb(h, eqBpFc0, "val", eqBpf_0, "f0", NULL ); + cmDspSysInstallCb(h, eqBpQ0, "val", eqBpf_0, "Q", NULL ); + cmDspSysInstallCb(h, eqBpGain0, "val", eqBpf_0, "gain", NULL ); + + cmDspSysInstallCb(h, eqHpByp0, "out", eqHpf_0, "bypass", NULL); + cmDspSysInstallCb(h, eqHpMode0, "mode",eqHpf_0, "mode", NULL ); + cmDspSysInstallCb(h, eqHpFc0, "val", eqHpf_0, "f0", NULL ); + cmDspSysInstallCb(h, eqHpQ0, "val", eqHpf_0, "Q", NULL ); + cmDspSysInstallCb(h, eqHpGain0, "val", eqHpf_0, "gain", NULL ); + + + cmDspSysInstallCb(h, eqLpByp1, "out", eqLpf_1, "bypass", NULL); + cmDspSysInstallCb(h, eqLpMode1, "mode",eqLpf_1, "mode", NULL ); + cmDspSysInstallCb(h, eqLpFc1, "val", eqLpf_1, "f0", NULL ); + cmDspSysInstallCb(h, eqLpQ1, "val", eqLpf_1, "Q", NULL ); + cmDspSysInstallCb(h, eqLpGain1, "val", eqLpf_1, "gain", NULL ); + + cmDspSysInstallCb(h, eqBpByp1, "out", eqBpf_1, "bypass", NULL); + cmDspSysInstallCb(h, eqBpMode1, "mode",eqBpf_1, "mode", NULL ); + cmDspSysInstallCb(h, eqBpFc1, "val", eqBpf_1, "f0", NULL ); + cmDspSysInstallCb(h, eqBpQ1, "val", eqBpf_1, "Q", NULL ); + cmDspSysInstallCb(h, eqBpGain1, "val", eqBpf_1, "gain", NULL ); + + cmDspSysInstallCb(h, eqHpByp1, "out", eqHpf_1, "bypass", NULL); + cmDspSysInstallCb(h, eqHpMode1, "mode",eqHpf_1, "mode", NULL ); + cmDspSysInstallCb(h, eqHpFc1, "val", eqHpf_1, "f0", NULL ); + cmDspSysInstallCb(h, eqHpQ1, "val", eqHpf_1, "Q", NULL ); + cmDspSysInstallCb(h, eqHpGain1, "val", eqHpf_1, "gain", NULL ); + + + cmDspSysInstallCb(h, eqLpByp2, "out", eqLpf_2, "bypass", NULL); + cmDspSysInstallCb(h, eqLpMode2, "mode",eqLpf_2, "mode", NULL ); + cmDspSysInstallCb(h, eqLpFc2, "val", eqLpf_2, "f0", NULL ); + cmDspSysInstallCb(h, eqLpQ2, "val", eqLpf_2, "Q", NULL ); + cmDspSysInstallCb(h, eqLpGain2, "val", eqLpf_2, "gain", NULL ); + + cmDspSysInstallCb(h, eqBpByp2, "out", eqBpf_2, "bypass", NULL); + cmDspSysInstallCb(h, eqBpMode2, "mode",eqBpf_2, "mode", NULL ); + cmDspSysInstallCb(h, eqBpFc2, "val", eqBpf_2, "f0", NULL ); + cmDspSysInstallCb(h, eqBpQ2, "val", eqBpf_2, "Q", NULL ); + cmDspSysInstallCb(h, eqBpGain2, "val", eqBpf_2, "gain", NULL ); + + cmDspSysInstallCb(h, eqHpByp2, "out", eqHpf_2, "bypass", NULL); + cmDspSysInstallCb(h, eqHpMode2, "mode",eqHpf_2, "mode", NULL ); + cmDspSysInstallCb(h, eqHpFc2, "val", eqHpf_2, "f0", NULL ); + cmDspSysInstallCb(h, eqHpQ2, "val", eqHpf_2, "Q", NULL ); + cmDspSysInstallCb(h, eqHpGain2, "val", eqHpf_2, "gain", NULL ); + + cmDspSysInstallCb(h, eqLpByp3, "out", eqLpf_3, "bypass", NULL); + cmDspSysInstallCb(h, eqLpMode3, "mode",eqLpf_3, "mode", NULL ); + cmDspSysInstallCb(h, eqLpFc3, "val", eqLpf_3, "f0", NULL ); + cmDspSysInstallCb(h, eqLpQ3, "val", eqLpf_3, "Q", NULL ); + cmDspSysInstallCb(h, eqLpGain3, "val", eqLpf_3, "gain", NULL ); + + cmDspSysInstallCb(h, eqBpByp3, "out", eqBpf_3, "bypass", NULL); + cmDspSysInstallCb(h, eqBpMode3, "mode",eqBpf_3, "mode", NULL ); + cmDspSysInstallCb(h, eqBpFc3, "val", eqBpf_3, "f0", NULL ); + cmDspSysInstallCb(h, eqBpQ3, "val", eqBpf_3, "Q", NULL ); + cmDspSysInstallCb(h, eqBpGain3, "val", eqBpf_3, "gain", NULL ); + + cmDspSysInstallCb(h, eqHpByp3, "out", eqHpf_3, "bypass", NULL); + cmDspSysInstallCb(h, eqHpMode3, "mode",eqHpf_3, "mode", NULL ); + cmDspSysInstallCb(h, eqHpFc3, "val", eqHpf_3, "f0", NULL ); + cmDspSysInstallCb(h, eqHpQ3, "val", eqHpf_3, "Q", NULL ); + cmDspSysInstallCb(h, eqHpGain3, "val", eqHpf_3, "gain", NULL ); + } + return rc; } From 5c1056299c93cb5e5a4e4b105c4285afc9fde7ee Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 18 Nov 2014 16:54:37 -0800 Subject: [PATCH 06/12] cmMidi.c : Removed check for negative on unsigned 'rv' in cmSciPitchToMidi(). --- cmMidi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmMidi.c b/cmMidi.c index 1f666a1..b3a7dd8 100644 --- a/cmMidi.c +++ b/cmMidi.c @@ -245,7 +245,7 @@ cmMidiByte_t cmSciPitchToMidi( const char* sciPitchStr ) unsigned rv = (octave*12) + idx + 12; - if( 0 <= rv && rv <= 127 ) + if( rv <= 127 ) return rv; return kInvalidMidiPitch; From 5ccd9d1e365c53f2ba1b164d7f30fcaa72a5d955 Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 18 Nov 2014 16:55:00 -0800 Subject: [PATCH 07/12] cmUi.c : Removed unused variable from cmUiSelectPanel(). --- cmUi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmUi.c b/cmUi.c index 1ed7d8f..fc53268 100644 --- a/cmUi.c +++ b/cmUi.c @@ -1504,7 +1504,7 @@ cmUiRC_t cmUiClearPanel( cmUiH_t uiH, unsigned appId, unsigned panelId ) cmUiRC_t cmUiSelectPanel( cmUiH_t uiH, const cmChar_t* label ) { cmUiRC_t rc = kOkUiRC; - cmUi_t* p = _cmUiHandleToPtr(uiH); + //cmUi_t* p = _cmUiHandleToPtr(uiH); From 1931bfdd6d1b707f7fcd02e4b6f27b4c1d3ab99c Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 18 Nov 2014 16:55:51 -0800 Subject: [PATCH 08/12] cmDspPgm.c : Changed abeg[] and aend[] to double in _cmDspSysPgm_PickupFxFile() --- dsp/cmDspPgm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dsp/cmDspPgm.c b/dsp/cmDspPgm.c index 6fa4515..b75fd10 100644 --- a/dsp/cmDspPgm.c +++ b/dsp/cmDspPgm.c @@ -1378,8 +1378,8 @@ cmDspRC_t _cmDspSysPgm_PickupFxFile( cmDspSysH_t h, void** userPtrPtr ) bool cfFbFl = true; unsigned sgShapeId = 2; const cmChar_t* afn = "/home/kevin/media/audio/gate_detect/gate_detect0.aif"; - unsigned abeg[] = { 9.842046, 18.838291, 27.007957, 35.562079, 45.461793, 52.920218, 60.436312, 68.913543}; - unsigned aend[] = {11.399088, 20.645229, 28.891786, 37.311349, 47.287954, 54.131251, 62.473923, 72.142964}; + double abeg[] = { 9.842046, 18.838291, 27.007957, 35.562079, 45.461793, 52.920218, 60.436312, 68.913543}; + double aend[] = {11.399088, 20.645229, 28.891786, 37.311349, 47.287954, 54.131251, 62.473923, 72.142964}; bool cfBypassFl = false; unsigned i; From eddc01b445ccc15a3046068ae84fa4d483387dec Mon Sep 17 00:00:00 2001 From: kevin Date: Tue, 18 Nov 2014 16:57:44 -0800 Subject: [PATCH 09/12] vop/cmVectOpsTemplateCode/Hdr.h Changed fieldWidth and decPlCnt from unsigned to int in PrintF() Added #ifdef OS_OSX conditional compile around ilaenv_() in LUInverse(). --- vop/cmVectOpsTemplateCode.h | 8 ++++++-- vop/cmVectOpsTemplateHdr.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/vop/cmVectOpsTemplateCode.h b/vop/cmVectOpsTemplateCode.h index e160766..a0fa2fa 100644 --- a/vop/cmVectOpsTemplateCode.h +++ b/vop/cmVectOpsTemplateCode.h @@ -13,7 +13,7 @@ void VECT_OP_FUNC(VPrint)( cmRpt_t* rpt, const char* fmt, ... ) va_end(vl); } -void VECT_OP_FUNC(Printf)( cmRpt_t* rpt, unsigned rowCnt, unsigned colCnt, const VECT_OP_TYPE* sbp, unsigned fieldWidth, unsigned decPlCnt, const char* fmt, unsigned flags ) +void VECT_OP_FUNC(Printf)( cmRpt_t* rpt, unsigned rowCnt, unsigned colCnt, const VECT_OP_TYPE* sbp, int fieldWidth, int decPlCnt, const char* fmt, unsigned flags ) { unsigned cci; unsigned outColCnt = 10; @@ -1287,8 +1287,12 @@ VECT_OP_TYPE* VECT_OP_FUNC(LUInverse)(VECT_OP_TYPE* dp, int_lap_t* ipiv, int drn // Calculate the NB factor for LWORK - // The two args are length of string args 'funcNameStr' and ' '. // It is not clear how many 'n' args are requred so all are passed set to 'drn' +#ifdef OS_OSX + int nb = ilaenv_(&ispec, funcNameStr, " ", &n1,&n2,&n3,&n4 ); +#else int nb = ilaenv_(&ispec, funcNameStr, " ", &n1,&n2,&n3,&n4, strlen(funcNameStr), 1 ); - +#endif + VECT_OP_TYPE w[drn * nb]; // allocate working memory int_lap_t info; diff --git a/vop/cmVectOpsTemplateHdr.h b/vop/cmVectOpsTemplateHdr.h index 1069d00..f491b0c 100644 --- a/vop/cmVectOpsTemplateHdr.h +++ b/vop/cmVectOpsTemplateHdr.h @@ -2,7 +2,7 @@ /// Vector operations interface. /// Setting fieldWidth or decPltCnt to to negative values result in fieldWidth == 10 or decPlCnt == 4 -void VECT_OP_FUNC(Printf)( cmRpt_t* rpt, unsigned rn, unsigned cn, const VECT_OP_TYPE* dbp, unsigned fieldWidth, unsigned decPlCnt, const char* fmt, unsigned flags ); +void VECT_OP_FUNC(Printf)( cmRpt_t* rpt, unsigned rn, unsigned cn, const VECT_OP_TYPE* dbp, int fieldWidth, int decPlCnt, const char* fmt, unsigned flags ); void VECT_OP_FUNC(Print)( cmRpt_t* rpt, unsigned rn, unsigned cn, const VECT_OP_TYPE* dbp ); void VECT_OP_FUNC(PrintE)( cmRpt_t* rpt, unsigned rn, unsigned cn, const VECT_OP_TYPE* dbp ); From 1e4ace93ad7a357c12e434cde62600d37055778f Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Thu, 20 Nov 2014 15:51:44 -0800 Subject: [PATCH 10/12] cmAudioPortOsx.h : Added cmApOsxTest(). --- osx/cmAudioPortOsx.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osx/cmAudioPortOsx.h b/osx/cmAudioPortOsx.h index f7e4649..f87ba35 100644 --- a/osx/cmAudioPortOsx.h +++ b/osx/cmAudioPortOsx.h @@ -23,6 +23,8 @@ extern "C" { cmApRC_t cmApOsxDeviceStop( unsigned devIdx ); bool cmApOsxDeviceIsStarted( unsigned devIdx ); + void cmApOsxTest( cmRpt_t* ); + #ifdef __cplusplus } #endif From 2ca41539f9e2d91b80c9bae3b699ca29d662121c Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Thu, 20 Nov 2014 15:53:33 -0800 Subject: [PATCH 11/12] cmAudioPortOsx.c : Replaced deprecated Core Audio API. --- osx/cmAudioPortOsx.c | 1009 +++++++++++++++++++++++------------------- 1 file changed, 558 insertions(+), 451 deletions(-) diff --git a/osx/cmAudioPortOsx.c b/osx/cmAudioPortOsx.c index 063dff5..95cdf1e 100644 --- a/osx/cmAudioPortOsx.c +++ b/osx/cmAudioPortOsx.c @@ -45,21 +45,20 @@ typedef struct unsigned timeOutMs; AudioDeviceID fmtChangeDevId; - AudioStreamID fmtChangeStreamId; + AudioObjectID fmtChangeObjId; } cmApOsxDevRecd; typedef struct { - cmRpt_t* rpt; + cmRpt_t* rpt; cmApOsxDevRecd* devArray; - unsigned devCnt; + unsigned devCnt; } cmApOsxRoot; cmApOsxRoot _cmApOsxRoot = { NULL, NULL, 0 }; - const char* _cmApOsxOsStatusToText( OSStatus errCode ) { switch( errCode ) @@ -70,6 +69,7 @@ const char* _cmApOsxOsStatusToText( OSStatus errCode ) case kAudioHardwareUnknownPropertyError: return "Unknown property error"; case kAudioHardwareBadPropertySizeError: return "Bad property error"; case kAudioHardwareIllegalOperationError: return "Illegal operation error"; + case kAudioHardwareBadObjectError: return "Bad object error"; case kAudioHardwareBadDeviceError: return "Bad device error"; case kAudioHardwareBadStreamError: return "Bad stream error"; case kAudioHardwareUnsupportedOperationError: return "Unsupported operating error"; @@ -82,10 +82,19 @@ const char* _cmApOsxOsStatusToText( OSStatus errCode ) cmApRC_t _cmApOsxOsErrorRpt( OSStatus err, cmApOsxRoot* r, const char* func, const char* file, int line ) { + char errStr[5]; + unsigned i; + + for(i=0; i<4; ++i) + errStr[i] = (char)(err & (0x000000ff << i)); + + errStr[4] = 0; + + if( r->rpt != NULL ) { if( err != noErr ) - cmRptErrorf(r->rpt,"Audio Port Error %s in %s line:%i %s\n",_cmApOsxOsStatusToText(err),func,line,file); + cmRptErrorf(r->rpt,"Audio Port Error : %s in %s line:%i %s\n",_cmApOsxOsStatusToText(err),func,line,file); else cmRptErrorf(r->rpt,"Audio Port Error: Unknown\n"); } @@ -95,358 +104,21 @@ cmApRC_t _cmApOsxOsErrorRpt( OSStatus err, cmApOsxRoot* r, const char* func, con #define _cmApOsxOsError( err, root ) _cmApOsxOsErrorRpt( err, root, __FUNCTION__, __FILE__, __LINE__ ) -OSStatus _cmApOsxAllocDeviceCFString( AudioDeviceID devId, UInt32 ch, Boolean inputFl, AudioDevicePropertyID devPropId, char** strPtrPtr ) -{ - CFStringRef cfStr; - //Boolean outWritableFl = false; - UInt32 outByteCnt = sizeof(cfStr);; - OSStatus err = noErr; - - if((err = AudioDeviceGetProperty( devId, ch, inputFl, devPropId, &outByteCnt, &cfStr )) != noErr ) - return err; - - CFIndex cfLen = CFStringGetLength(cfStr) * 2; - - char* cStr = cmMemAllocZ( char, cfLen+1 ); - cStr[0] = 0; - - if( CFStringGetCString( cfStr, cStr, cfLen, kCFStringEncodingUTF8 ) ) - cStr[cfLen]=0; - - CFRelease(cfStr); - - *strPtrPtr = cStr; - - return noErr; -} - -// Note: the streamIdArray* allocated by this function must be released by the calling function. -OSStatus _cmApOsxAllocStreamIdArray( AudioDeviceID devId, Boolean inputFl, AudioStreamID** streamIdArrayPtr, unsigned* streamIdCntPtr ) -{ - UInt32 byteCnt = 0; - Boolean canWriteFl = false; - OSStatus err = noErr; - - *streamIdArrayPtr = NULL; - *streamIdCntPtr = 0; - - // get the length of the stream id array - if((err = AudioDeviceGetPropertyInfo( devId, 0, inputFl, kAudioDevicePropertyStreams, &byteCnt, &canWriteFl )) != noErr ) - return err; - - if( byteCnt <= 0 ) - goto doneLabel; - - // get the count of streams - *streamIdCntPtr = byteCnt / sizeof(AudioStreamID); - - // allocate the stream id array - *streamIdArrayPtr = cmMemAllocZ( AudioStreamID, *streamIdCntPtr ); - - // verify that the size of the stream id array is an integer multiple of the sizeof(AudioStreamID) - assert( *streamIdCntPtr * sizeof(AudioStreamID) == byteCnt ); - - // fill the stream id array - if((err = AudioDeviceGetProperty( devId, 0, inputFl, kAudioDevicePropertyStreams, &byteCnt, *streamIdArrayPtr )) != noErr ) - return err; - - doneLabel: - return noErr; -} - OSStatus cmApOsxSystemStreamPropertyListenerProc( - AudioStreamID inStream, - UInt32 inChannel, - AudioDevicePropertyID inPropertyID, - void* inClientData) + AudioObjectID audioObjId, + UInt32 channel, + const AudioObjectPropertyAddress* propertyAddr, + void* clientData) { - cmApOsxDevRecd* drp = (cmApOsxDevRecd*)inClientData; + cmApOsxDevRecd* drp = (cmApOsxDevRecd*)clientData; - drp->fmtChangeDevId = drp->devId; - drp->fmtChangeStreamId = inStream; + drp->fmtChangeDevId = drp->devId; + drp->fmtChangeObjId = audioObjId; return noErr; } -OSStatus _cmApOsxSetSampleRate( cmApOsxDevRecd* drp, bool inputFl, double newSampleRate ) -{ - AudioStreamID* streamIdArray = NULL; - unsigned streamCnt; - OSStatus err = noErr; - unsigned waitMs = 0; - unsigned i; - - // allocate a stream id array - if((err = _cmApOsxAllocStreamIdArray( drp->devId, inputFl, &streamIdArray, &streamCnt )) != noErr ) - return _cmApOsxOsError(err,&_cmApOsxRoot); - - // for each stream on this device - for(i=0; idevId, i, inputFl, kAudioDevicePropertyStreamFormat, &byteCnt, &canWriteFl )) != noErr ) - { - _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - assert( byteCnt == sizeof(sdr) ); - - // get the stream desc recd - if((err = AudioDeviceGetProperty( drp->devId, i, inputFl, kAudioDevicePropertyStreamFormat, &byteCnt, &sdr )) != noErr ) - { - _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - // if the format has not already been set - if( sdr.mSampleRate != newSampleRate ) - { - // change the sample rate - sdr.mSampleRate = newSampleRate; - - drp->fmtChangeDevId = -1; - drp->fmtChangeStreamId = -1; - - // attempt to change the sample rate - if((err = AudioStreamSetProperty(streamIdArray[i], NULL, 0, kAudioDevicePropertyStreamFormat, sizeof(sdr), &sdr)) != noErr ) - { - err = _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - // wait for confirmation - waitMs = 0; - while( drp->fmtChangeDevId != drp->devId - && drp->fmtChangeStreamId != streamIdArray[i] - && waitMs < drp->timeOutMs ) - { - const unsigned waitIncrMs = 20; - usleep(waitIncrMs*1000); - waitMs += waitIncrMs; - } - - // wait timed out - if( waitMs >= drp->timeOutMs ) - { - err = _cmApOsxOsError(kAudioHardwareUnspecifiedError,&_cmApOsxRoot); - goto errLabel; - } - else - { - // read back the format to be really sure it changed - if((err = AudioDeviceGetProperty( drp->devId, i, inputFl, kAudioDevicePropertyStreamFormat, &byteCnt, &sdr )) != noErr ) - { - _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - assert( sdr.mSampleRate == newSampleRate ); - } - } - - } - - errLabel: - cmMemPtrFree(&streamIdArray); - - return err; -} - -OSStatus _cmApOsxSetFramesPerCycle( cmApOsxDevRecd* drp, Boolean inputFl, unsigned newFramesPerCycle ) -{ - OSStatus err = noErr; - AudioTimeStamp when; - UInt32 ch = 0; - UInt32 devPropId = kAudioDevicePropertyBufferFrameSize; - UInt32 outByteCnt = sizeof(UInt32); - UInt32 curFramesPerCycle = 0; - - // set time stamp to zero to force the change to be immediate - when.mHostTime = 0; - when.mFlags = kAudioTimeStampHostTimeValid; - - // get the cur value off the param. to change - if((err = AudioDeviceGetProperty( drp->devId, ch, inputFl, devPropId, &outByteCnt, &curFramesPerCycle )) != noErr ) - return _cmApOsxOsError(err,&_cmApOsxRoot); - - // if the cur value is the same as the new value then there is nothing to do - if( curFramesPerCycle == newFramesPerCycle ) - return noErr; - - // attempt to set the new value - if((err = AudioDeviceSetProperty( drp->devId, &when, ch, inputFl, devPropId, sizeof(newFramesPerCycle), &newFramesPerCycle)) != noErr ) - return _cmApOsxOsError(err,&_cmApOsxRoot); - - // wait for the value to actually change - unsigned waitMs = 0; - while( waitMs < drp->timeOutMs ) - { - const unsigned waitIncrMs = 20; - usleep(waitIncrMs*1000); - - // read the parameter value - if((err = AudioDeviceGetProperty( drp->devId, ch, inputFl, devPropId, &outByteCnt, &curFramesPerCycle )) != noErr ) - return _cmApOsxOsError(err,&_cmApOsxRoot); - - // if the parameter value equals the new value then the change has taken effect - if( curFramesPerCycle == newFramesPerCycle ) - break; - - waitMs += waitIncrMs; - } - - // wait timed out - if( waitMs >= drp->timeOutMs ) - return _cmApOsxOsError(kAudioHardwareUnspecifiedError,&_cmApOsxRoot); - - return noErr; -} - - -// Note: *bufArrayPtr must be deallocated by the caller. - cmApRC_t _cmApOsxGetBufferCfg(unsigned devIdx, AudioDeviceID devId, Boolean inputFl, cmApOsxDevRecd* drp ) -{ - cmApRC_t rc = kOkApRC; - OSStatus err = noErr; - UInt32 byteCnt = 0; - Boolean canWriteFl = 0; - AudioBufferList* ablp = NULL; - unsigned streamCnt = 0; - AudioStreamID* streamIdArray = NULL; - unsigned i = 0; - unsigned chIdx = 0; - - // get the size of stream cfg buffer - if( (err = AudioDeviceGetPropertyInfo(devId,0,inputFl,kAudioDevicePropertyStreamConfiguration,&byteCnt,&canWriteFl)) != noErr ) - return _cmApOsxOsError(err,&_cmApOsxRoot); - - // allocate memory to hold the AudioBufferList - ablp = (AudioBufferList*)cmMemMallocZ(byteCnt); - - // get the audio buffer list array - if((err = AudioDeviceGetProperty(devId,0,inputFl,kAudioDevicePropertyStreamConfiguration,&byteCnt,ablp)) != noErr ) - { - rc = _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - // allocate a stream id array - if((err = _cmApOsxAllocStreamIdArray( devId, inputFl, &streamIdArray, &streamCnt )) != noErr ) - { - rc = _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - // the number of buffers and the number of frames must be the same - assert( streamCnt == ablp->mNumberBuffers); - - cmApAudioPacket_t* pktArray = cmMemAllocZ(cmApAudioPacket_t,ablp->mNumberBuffers); - - if( inputFl ) - { - drp->inPktCnt = ablp->mNumberBuffers; - drp->inPktArray = pktArray; - } - else - { - drp->outPktCnt = ablp->mNumberBuffers; - drp->outPktArray = pktArray; - } - - - for(i=0; imNumberBuffers; ++i) - { - AudioStreamBasicDescription sdr; - - // get the size of the stream desc recd - if((err = AudioDeviceGetPropertyInfo( devId, i, inputFl, kAudioDevicePropertyStreamFormat, &byteCnt, &canWriteFl )) != noErr ) - { - _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - assert( byteCnt == sizeof(sdr) ); - - // get the stream desc recd - if((err = AudioDeviceGetProperty( devId, i, inputFl, kAudioDevicePropertyStreamFormat, &byteCnt, &sdr )) != noErr ) - { - _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; - } - - // assert that the data format is packed float32 native endian - //assert( IsAudioFormatNativeEndian(sdr) ); - - // 0x6c70636d = lpcm - //printf("%s %i dev:%i sr:%f fmtId:0x%lx fmtFl:0x%lx bytesPerPkt:%li frmsPerPkt:%li bytesPerFrm:%li chsPerFrm:%li bitsPerCh:%li\n", - // inputFl?"i":"o",i,devIdx,sdr.mSampleRate,sdr.mFormatID,sdr.mFormatFlags,sdr.mBytesPerPacket,sdr.mFramesPerPacket,sdr.mBytesPerFrame,sdr.mChannelsPerFrame,sdr.mBitsPerChannel); - - - // assert that all buffers have the sample rate of the device - if( drp->srate == 0 ) - drp->srate = sdr.mSampleRate; - - assert( drp->srate == sdr.mSampleRate ); - - // install a stream property listener - AudioStreamAddPropertyListener( streamIdArray[i], - kAudioPropertyWildcardChannel, - kAudioPropertyWildcardPropertyID, - cmApOsxSystemStreamPropertyListenerProc, - drp ); - - pktArray[i].devIdx = devIdx; - pktArray[i].begChIdx = chIdx; - pktArray[i].chCnt = ablp->mBuffers[i].mNumberChannels; //sdr.mChannelsPerFrame; - pktArray[i].audioFramesCnt = ablp->mBuffers[i].mDataByteSize / (sizeof(cmApSample_t) * ablp->mBuffers[i].mNumberChannels); //sdr.mFramesPerPacket; - pktArray[i].flags = kInterleavedApFl | kFloatApFl; - pktArray[i].bitsPerSample = sizeof(cmApSample_t) * 8; - pktArray[i].audioBytesPtr = NULL; - pktArray[i].userCbPtr = NULL; // the userCbPtr value isn't availabe until the cmApOsxDeviceSetup() - - // verify that all buffers on this device have the same size - assert(i==0 || pktArray[i].audioFramesCnt == pktArray[i-1].audioFramesCnt ); - - - chIdx += ablp->mBuffers[i].mNumberChannels; //sdr.mChannelsPerFrame; - - if( inputFl ) - { - // track the total number of input channels on this device - drp->inChCnt = chIdx; - - // track the frames per cycle on this device - if( drp->inFramesPerCycle == 0 ) - drp->inFramesPerCycle = pktArray[i].audioFramesCnt; - - - assert( drp->inFramesPerCycle == pktArray[i].audioFramesCnt ); - } - else - { - drp->outChCnt = chIdx; - - if( drp->outFramesPerCycle == 0 ) - drp->outFramesPerCycle = pktArray[i].audioFramesCnt; - - assert( drp->outFramesPerCycle == pktArray[i].audioFramesCnt ); - - } - } - - errLabel: - cmMemPtrFree(&streamIdArray); - cmMemPtrFree(&ablp); - return rc; -} - - OSStatus _cmApOsxSystemDeviceIOProc( AudioDeviceID inDevice, const AudioTimeStamp* inNow, const AudioBufferList* iabl, @@ -468,9 +140,9 @@ OSStatus _cmApOsxSystemDeviceIOProc( AudioDeviceID inDevice, //assert( oabl->mNumberBuffers==0 || oabl->mNumberBuffers == drp->outPktCnt ); // setup the incoming packets (ADC->app) - AudioBuffer* bp = iabl->mBuffers; - AudioBuffer* ep = bp + iabl->mNumberBuffers; - cmApAudioPacket_t* pp = drp->inPktArray; + const AudioBuffer* bp = iabl->mBuffers; + const AudioBuffer* ep = bp + iabl->mNumberBuffers; + cmApAudioPacket_t* pp = drp->inPktArray; unsigned chIdx = 0; for(; bp 0 ); + addr.mSelector = sel; + addr.mScope = scope; + addr.mElement = ele; - // calc. the device count - _cmApOsxRoot.devCnt = outByteCnt / sizeof(AudioDeviceID); + if((err = AudioObjectGetPropertyData(devId, &addr, 0, NULL, &outByteCnt, &cfStr)) != noErr ) + return err; - assert( _cmApOsxRoot.devCnt*sizeof(AudioDeviceID) == outByteCnt ); - - // allocate space for the device id array and the device array - devIdArray = cmMemAllocZ( AudioDeviceID, _cmApOsxRoot.devCnt ); - devArray = cmMemAllocZ( cmApOsxDevRecd, _cmApOsxRoot.devCnt ); - _cmApOsxRoot.devArray = devArray; + CFIndex cfLen = CFStringGetLength(cfStr) * 2; + char* cStr = cmMemAllocZ( char, cfLen+1 ); - // get the device id array - if((err = AudioHardwareGetProperty( kAudioHardwarePropertyDevices, &outByteCnt, devIdArray )) != noErr ) + cStr[0] = 0; + + if( CFStringGetCString( cfStr, cStr, cfLen, kCFStringEncodingUTF8 ) ) + cStr[cfLen]=0; + + CFRelease(cfStr); + + *strPtrPtr = cStr; + + return noErr; +} + +// Note: the streamIdArray* allocated by this function must be released by the calling function. +OSStatus _cmApOsxAllocateStreamIdArray( AudioDeviceID devId, Boolean inputFl, AudioStreamID** streamIdArrayPtr, unsigned* streamIdCntPtr ) +{ + + UInt32 byteCnt = 0; + OSStatus err = noErr; + AudioObjectPropertyAddress addr = + { + kAudioHardwarePropertyDevices, + inputFl ? kAudioDevicePropertyScopeInput : kAudioObjectPropertyScopeOutput, + kAudioObjectPropertyElementMaster + }; + + *streamIdArrayPtr = NULL; + *streamIdCntPtr = 0; + + // get the length of the stream id array + addr.mSelector = kAudioDevicePropertyStreams; + if((err = AudioObjectGetPropertyDataSize(devId, &addr, 0, NULL, &byteCnt)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + if( byteCnt <= 0 ) + goto errLabel; + + // get the count of streams + *streamIdCntPtr = byteCnt / sizeof(AudioStreamID); + + // allocate the stream id array + *streamIdArrayPtr = cmMemAllocZ( AudioStreamID, *streamIdCntPtr ); + + // verify that the size of the stream id array is an integer multiple of the sizeof(AudioStreamID) + assert( *streamIdCntPtr * sizeof(AudioStreamID) == byteCnt ); + + // fill the stream id array + if ((err=AudioObjectGetPropertyData(devId, &addr, 0, NULL, &byteCnt, *streamIdArrayPtr)) != noErr ) + { + _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + errLabel: + return noErr; +} + + +// Note: *bufArrayPtr must be deallocated by the caller. +cmApRC_t _cmApOsxGetBufferConfig(unsigned devIdx, AudioDeviceID devId, Boolean inputFl, cmApOsxDevRecd* drp ) +{ + cmApRC_t rc = kOkApRC; + OSStatus err = noErr; + UInt32 byteCnt = 0; + AudioBufferList* ablp = NULL; + unsigned streamCnt = 0; + AudioStreamID* streamIdArray = NULL; + unsigned i = 0; + unsigned chIdx = 0; + + AudioObjectPropertyAddress addr = + { + kAudioDevicePropertyStreamConfiguration, + inputFl ? kAudioDevicePropertyScopeInput : kAudioObjectPropertyScopeOutput, + kAudioObjectPropertyElementMaster + }; + + // get the size of stream cfg buffer + if((err = AudioObjectGetPropertyDataSize(devId, &addr, 0, NULL, &byteCnt)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + // allocate memory to hold the AudioBufferList + ablp = (AudioBufferList*)cmMemMallocZ(byteCnt); + + // get the audio buffer list array + if ((err=AudioObjectGetPropertyData(devId, &addr, 0, NULL, &byteCnt, ablp)) != noErr ) + { + rc = _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + // allocate a stream id array + if((err = _cmApOsxAllocateStreamIdArray( devId, inputFl, &streamIdArray, &streamCnt )) != noErr ) { rc = _cmApOsxOsError(err,&_cmApOsxRoot); goto errLabel; } - // for each - for(i=0; i<_cmApOsxRoot.devCnt; ++i) + // the number of buffers and the number of frames must be the same + assert( streamCnt == ablp->mNumberBuffers); + + cmApAudioPacket_t* pktArray = cmMemAllocZ(cmApAudioPacket_t,ablp->mNumberBuffers); + + if( inputFl ) { - // device name - if((err = _cmApOsxAllocDeviceCFString(devIdArray[i], 0, false, kAudioDevicePropertyDeviceNameCFString, &devArray[i].nameStr )) != noErr ) + drp->inPktCnt = ablp->mNumberBuffers; + drp->inPktArray = pktArray; + } + else + { + drp->outPktCnt = ablp->mNumberBuffers; + drp->outPktArray = pktArray; + } + + + // + for(i=0; imNumberBuffers; ++i) + { + AudioStreamBasicDescription sdr; + + // get the size of the stream desc recd + addr.mSelector = kAudioDevicePropertyStreamFormat; + if((err = AudioObjectGetPropertyDataSize(devId, &addr, 0, NULL, &byteCnt)) != noErr ) { + _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + assert( byteCnt == sizeof(sdr) ); + + // get the stream desc recd + if((err=AudioObjectGetPropertyData(devId, &addr, 0, NULL, &byteCnt, &sdr)) != noErr ) + { rc = _cmApOsxOsError(err,&_cmApOsxRoot); goto errLabel; } - // device mfg - if((err = _cmApOsxAllocDeviceCFString(devIdArray[i], 0, false, kAudioDevicePropertyDeviceManufacturerCFString, &devArray[i].mfgStr )) != noErr ) + // assert that the data format is packed float32 native endian + // assert( IsAudioFormatNativeEndian(sdr) ); + + // 0x6c70636d = lpcm + // printf("%s %i dev:%i sr:%f fmtId:0x%lx fmtFl:0x%lx bytesPerPkt:%li frmsPerPkt:%li bytesPerFrm:%li chsPerFrm:%li bitsPerCh:%li\n", + // inputFl?"i":"o",i,devIdx,sdr.mSampleRate,sdr.mFormatID,sdr.mFormatFlags,sdr.mBytesPerPacket,sdr.mFramesPerPacket,sdr.mBytesPerFrame,sdr.mChannelsPerFrame,sdr.mBitsPerChannel); + + + // assert that all buffers have the sample rate of the device + if( drp->srate == 0 ) + drp->srate = sdr.mSampleRate; + + assert( drp->srate == sdr.mSampleRate ); + + AudioObjectPropertyAddress listenerAddr = + { + kAudioObjectPropertySelectorWildcard, + kAudioObjectPropertyScopeWildcard, + kAudioObjectPropertyElementWildcard + }; + + // install a stream property listener + AudioObjectAddPropertyListener(streamIdArray[i], &listenerAddr, cmApOsxSystemStreamPropertyListenerProc, drp ); + + + pktArray[i].devIdx = devIdx; + pktArray[i].begChIdx = chIdx; + pktArray[i].chCnt = ablp->mBuffers[i].mNumberChannels; + pktArray[i].audioFramesCnt = ablp->mBuffers[i].mDataByteSize / (sizeof(cmApSample_t) * ablp->mBuffers[i].mNumberChannels); //sdr.mFramesPerPacket; + pktArray[i].flags = kInterleavedApFl | kFloatApFl; + pktArray[i].bitsPerSample = sizeof(cmApSample_t) * 8; + pktArray[i].audioBytesPtr = NULL; + pktArray[i].userCbPtr = NULL; // the userCbPtr value isn't availabe until the cmApOsxDeviceSetup() + + // verify that all buffers on this device have the same size + assert(i==0 || pktArray[i].audioFramesCnt == pktArray[i-1].audioFramesCnt ); + + chIdx += ablp->mBuffers[i].mNumberChannels; + + if( inputFl ) { - rc = _cmApOsxOsError(err,&_cmApOsxRoot); - goto errLabel; + // track the total number of input channels on this device + drp->inChCnt = chIdx; + + // track the frames per cycle on this device + if( drp->inFramesPerCycle == 0 ) + drp->inFramesPerCycle = pktArray[i].audioFramesCnt; + + + assert( drp->inFramesPerCycle == pktArray[i].audioFramesCnt ); } + else + { + drp->outChCnt = chIdx; - // in buf array - if((rc = _cmApOsxGetBufferCfg(i,devIdArray[i], true, devArray + i )) != kOkApRC ) - goto errLabel; + if( drp->outFramesPerCycle == 0 ) + drp->outFramesPerCycle = pktArray[i].audioFramesCnt; - // out buf array - if((rc = _cmApOsxGetBufferCfg(i,devIdArray[i], false, devArray + i)) != kOkApRC ) - goto errLabel; + assert( drp->outFramesPerCycle == pktArray[i].audioFramesCnt ); - - devArray[i].devId = devIdArray[i]; - devArray[i].devIdx = i; - devArray[i].callbackPtr = NULL; - devArray[i].timeOutMs = 1000; - devArray[i].ioProcId = NULL; + } } errLabel: + cmMemPtrFree(&streamIdArray); + cmMemPtrFree(&ablp); + return rc; +} - if( devIdArray != NULL ) - cmMemFree(devIdArray); - if( rc == kOkApRC ) +OSStatus _cmApOsxSetSampleRate( cmApOsxDevRecd* drp, bool inputFl, double newSampleRate ) +{ + OSStatus err = noErr; + unsigned waitMs = 0; + AudioStreamID* streamIdArray = NULL; + AudioObjectPropertyAddress addr = + { + kAudioDevicePropertyStreamConfiguration, + inputFl ? kAudioDevicePropertyScopeInput : kAudioObjectPropertyScopeOutput, + kAudioObjectPropertyElementMaster + }; + + unsigned streamCnt; + unsigned i; + + // allocate a stream id array + if((err = _cmApOsxAllocateStreamIdArray( drp->devId, inputFl, &streamIdArray, &streamCnt )) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + // for each stream on this device + for(i=0; idevId, &addr, 0, NULL, &byteCnt)) != noErr ) + { + _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + assert( byteCnt == sizeof(sdr) ); + + // get the stream desc recd + if((err=AudioObjectGetPropertyData(drp->devId, &addr, 0, NULL, &byteCnt, &sdr)) != noErr ) + { + _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + // if the format has not already been set + if( sdr.mSampleRate != newSampleRate ) + { + + //printf("Changing %s stream %i sample rate from %f to %f.\n",(inputFl?"input":"output"),i,sdr.mSampleRate,newSampleRate); + + // change the sample rate + sdr.mSampleRate = newSampleRate; + + drp->fmtChangeDevId = -1; + drp->fmtChangeObjId = -1; + + // attempt to change the sample rate + addr.mSelector = kAudioDevicePropertyStreamFormat; + if((err = AudioObjectSetPropertyData( streamIdArray[i], &addr, 0, NULL, sizeof(sdr), &sdr)) != noErr ) + { + err = _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + // wait for confirmation + waitMs = 0; + while( drp->fmtChangeDevId != drp->devId + && drp->fmtChangeObjId != streamIdArray[i] + && waitMs < drp->timeOutMs ) + { + const unsigned waitIncrMs = 20; + usleep(waitIncrMs*1000); + waitMs += waitIncrMs; + } + + // wait timed out + if( waitMs >= drp->timeOutMs ) + { + err = _cmApOsxOsError(kAudioHardwareUnspecifiedError,&_cmApOsxRoot); + goto errLabel; + } + else + { + // read back the format to be really sure it changed + addr.mSelector = kAudioDevicePropertyStreamFormat; + if((err=AudioObjectGetPropertyData(drp->devId, &addr, 0, NULL, &byteCnt, &sdr)) != noErr ) + { + _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + + assert( sdr.mSampleRate == newSampleRate ); + } + } + + } + + errLabel: + cmMemPtrFree(&streamIdArray); + + return err; +} + +OSStatus _cmApOsxSetFramesPerCycle( cmApOsxDevRecd* drp, Boolean inputFl, unsigned newFramesPerCycle ) +{ + OSStatus err = noErr; + AudioValueRange r; + UInt32 outByteCnt = sizeof(r); + UInt32 curFramesPerCycle = 0; + AudioObjectPropertyAddress addr = + { + kAudioDevicePropertyBufferFrameSizeRange, + inputFl ? kAudioDevicePropertyScopeInput : kAudioObjectPropertyScopeOutput, + kAudioObjectPropertyElementMaster + }; + + + // get the frame size range + if ((err=AudioObjectGetPropertyData(drp->devId, &addr, 0, NULL, &outByteCnt, &r)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + // verify that the requested frame size is within the acceptable frame size range + if( newFramesPerCycledevId, &addr, 0, NULL, &outByteCnt, &curFramesPerCycle)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + + // if the cur value is the same as the new value then there is nothing to do + if( curFramesPerCycle == newFramesPerCycle ) + return noErr; + + //printf("Changing %s frames per cycle from %i to %i.\n",(inputFl?"input":"output"),curFramesPerCycle,newFramesPerCycle); + + // attempt to set the new value + if((err = AudioObjectSetPropertyData( drp->devId, &addr, 0, NULL, sizeof(newFramesPerCycle), &newFramesPerCycle)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + // wait for the value to actually change + unsigned waitMs = 0; + while( waitMs < drp->timeOutMs ) + { + const unsigned waitIncrMs = 20; + usleep(waitIncrMs*1000); + + // read the parameter value + outByteCnt = sizeof(curFramesPerCycle); + if ((err=AudioObjectGetPropertyData(drp->devId, &addr, 0, NULL, &outByteCnt, &curFramesPerCycle)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + + // if the parameter value equals the new value then the change has taken effect + if( curFramesPerCycle == newFramesPerCycle ) + break; + + waitMs += waitIncrMs; + } + + // wait timed out + if( waitMs >= drp->timeOutMs ) + return _cmApOsxOsError(kAudioHardwareUnspecifiedError,&_cmApOsxRoot); + + return noErr; +} + + +cmApRC_t cmApOsxInitialize( cmRpt_t* rpt, unsigned baseApDevIdx ) +{ + + cmApRC_t rc = kOkApRC; + cmApOsxRoot* p = &_cmApOsxRoot; + UInt32 outByteCnt = 0; + OSStatus err = noErr; + AudioDeviceID* devIdArray = NULL; + unsigned i = 0; + AudioObjectPropertyAddress thePropAddr = + { + kAudioHardwarePropertyDevices, + kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyElementMaster + }; + + if((rc = cmApOsxFinalize()) != kOkApRC ) return rc; + p->rpt = rpt; + p->devArray = NULL; - cmApOsxFinalize(); + // get the size of the device ID array in bytes + if((err = AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &thePropAddr, 0, NULL, &outByteCnt)) != noErr ) + return _cmApOsxOsError(err,&_cmApOsxRoot); + + assert( outByteCnt > 0 ); + + // calc. the device count + p->devCnt = outByteCnt / sizeof(AudioDeviceID); + + assert( p->devCnt*sizeof(AudioDeviceID) == outByteCnt ); + + // allocate space for the device id array and the device array + devIdArray = cmMemAllocZ( AudioDeviceID, p->devCnt ); + p->devArray = cmMemAllocZ( cmApOsxDevRecd, p->devCnt ); + + // get the deviceID array into devIdArray[ devCnt ] + if ((err=AudioObjectGetPropertyData(kAudioObjectSystemObject, &thePropAddr, 0, NULL, &outByteCnt, devIdArray)) != noErr ) + { + rc = _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + // for each device + for(i=0; idevCnt; ++i) + { + + // get device name + if(( err = _cmApOsxAllocPropertyCFString(devIdArray[i],kAudioObjectPropertyName,kAudioObjectPropertyScopeGlobal,kAudioObjectPropertyElementMaster,&p->devArray[i].nameStr)) != noErr) + { + rc = _cmApOsxOsError(err,&_cmApOsxRoot); + goto errLabel; + } + + // get manufacturer + if(( rc = _cmApOsxAllocPropertyCFString(devIdArray[i],kAudioObjectPropertyManufacturer,kAudioObjectPropertyScopeGlobal,kAudioObjectPropertyElementMaster,&p->devArray[i].mfgStr)) != noErr) + goto errLabel; + + if(( rc = _cmApOsxGetBufferConfig(i, devIdArray[i], true, p->devArray + i )) != kOkApRC ) + goto errLabel; + + if(( rc = _cmApOsxGetBufferConfig(i, devIdArray[i], false, p->devArray + i )) != kOkApRC ) + goto errLabel; + + //printf("%s %s\n",p->devArray[i].mfgStr,p->devArray[i].nameStr); + p->devArray[i].devId = devIdArray[i]; + p->devArray[i].devIdx = i; + p->devArray[i].callbackPtr = NULL; + p->devArray[i].timeOutMs = 1000; + p->devArray[i].ioProcId = NULL; + + } + + errLabel: + + cmMemFree(devIdArray); + + if( rc != noErr ) + cmApOsxFinalize(); return rc; } -cmApRC_t cmApOsxFinalize() +cmApRC_t cmApOsxFinalize() { - cmApOsxDevRecd* devArray = _cmApOsxRoot.devArray; - unsigned i = 0; - OSStatus err; + cmApRC_t rc = kOkApRC; + cmApOsxRoot* p = &_cmApOsxRoot; + unsigned i; + OSStatus err; - for(i=0; i<_cmApOsxRoot.devCnt; ++i) + for(i=0; idevCnt; ++i) { + cmApOsxDevRecd* drp = p->devArray + i; + + unsigned j; for(j=0; j<2; ++j) @@ -606,46 +678,40 @@ cmApRC_t cmApOsxFinalize() unsigned streamCnt; unsigned k; - if((err = _cmApOsxAllocStreamIdArray(devArray[i].devId, true,&streamIdArray,&streamCnt )) != noErr ) - _cmApOsxOsError(err,&_cmApOsxRoot); + if((err = _cmApOsxAllocateStreamIdArray(drp->devId, j==0, &streamIdArray,&streamCnt )) != noErr ) + _cmApOsxOsError(err,p); for(k=0; kioProcId != NULL ) + if((err = AudioDeviceDestroyIOProcID( drp->devId, drp->ioProcId )) != noErr ) + _cmApOsxOsError(err,p); + - if( devArray[i].nameStr != NULL ) - cmMemFree(devArray[i].nameStr); - - if( devArray[i].mfgStr != NULL ) - cmMemFree(devArray[i].mfgStr); - - if( devArray[i].inPktArray != NULL ) - cmMemFree( devArray[i].inPktArray ); - - if( devArray[i].outPktArray!= NULL ) - cmMemFree( devArray[i].outPktArray ); + cmMemFree(drp->nameStr); + cmMemFree(drp->mfgStr); + cmMemFree(drp->inPktArray); + cmMemFree(drp->outPktArray); } - if( devArray != NULL ) - { - cmMemFree(devArray); - _cmApOsxRoot.devArray = NULL; - _cmApOsxRoot.devCnt = 0; - } - - return kOkApRC; + cmMemFree(p->devArray); + return rc; } cmApRC_t cmApOsxDeviceCount() @@ -684,10 +750,10 @@ cmApRC_t cmApOsxDeviceSetup( { assert( devIdx < _cmApOsxRoot.devCnt ); - //cmApRC_t rc = kOkApRC; - OSStatus err; + cmApOsxRoot* p = &_cmApOsxRoot; cmApOsxDevRecd* drp = _cmApOsxRoot.devArray + devIdx; - unsigned j; + unsigned j; + OSStatus err; if( cmApOsxDeviceIsStarted(devIdx) ) cmApOsxDeviceStop(devIdx); @@ -729,20 +795,22 @@ cmApRC_t cmApOsxDeviceSetup( drp->callbackPtr = callbackPtr; + // if the io if( drp->ioProcId != NULL ) if((err = AudioDeviceDestroyIOProcID( drp->devId, drp->ioProcId )) != noErr ) - _cmApOsxOsError(err,&_cmApOsxRoot); + _cmApOsxOsError(err,p); // set the io proc drp->ioProcId = NULL; - //if( (err = AudioDeviceAddIOProc(drp->devId,_cmApOsxSystemDeviceIOProc,(void*)drp) ) != noErr ) + if( (err = AudioDeviceCreateIOProcID(drp->devId,_cmApOsxSystemDeviceIOProc,(void*)drp,&drp->ioProcId) ) != noErr ) { - _cmApOsxOsError(err,&_cmApOsxRoot); + _cmApOsxOsError(err,p); return kSysErrApRC; } + return kOkApRC; @@ -751,13 +819,11 @@ cmApRC_t cmApOsxDeviceSetup( return kSysErrApRC; } - cmApRC_t cmApOsxDeviceStart( unsigned devIdx ) { assert( devIdx < _cmApOsxRoot.devCnt ); OSStatus err; - //if( (err = AudioDeviceStart(_cmApOsxRoot.devArray[devIdx].devId,_cmApOsxSystemDeviceIOProc)) != noErr ) if( (err = AudioDeviceStart(_cmApOsxRoot.devArray[devIdx].devId,_cmApOsxRoot.devArray[devIdx].ioProcId)) != noErr ) { _cmApOsxOsError(err,&_cmApOsxRoot); @@ -773,7 +839,6 @@ cmApRC_t cmApOsxDeviceStop( unsigned devIdx ) OSStatus err; - //if( (err = AudioDeviceStop(_cmApOsxRoot.devArray[devIdx].devId,_cmApOsxSystemDeviceIOProc)) != noErr ) if( (err = AudioDeviceStop(_cmApOsxRoot.devArray[devIdx].devId,_cmApOsxRoot.devArray[devIdx].ioProcId)) != noErr ) { _cmApOsxOsError(err,&_cmApOsxRoot); @@ -783,11 +848,34 @@ cmApRC_t cmApOsxDeviceStop( unsigned devIdx ) return kOkApRC; } -bool cmApOsxDeviceIsStarted( unsigned devIdx ) +bool cmApOsxDeviceIsStarted( unsigned devIdx ) { assert( devIdx < _cmApOsxRoot.devCnt ); return false; } + + +void cmApOsxReport( cmRpt_t* rpt ) +{ + cmApOsxRoot* p = &_cmApOsxRoot; + unsigned i; + + for(i=0; idevCnt; ++i) + { + cmApOsxDevRecd* drp = p->devArray + i; + + cmRptPrintf(rpt,"in ch:%2i | out ch:%2i | started:%1i | sr:%7.1f %s %s\n", + drp->inChCnt, + drp->outChCnt, + drp->srate, + cmApOsxDeviceIsStarted( i ), + cmStringNullGuard(drp->mfgStr), + cmStringNullGuard(drp->nameStr)); + } + +} + + /* void apReport( apPrintFunc_t printFunc ) { @@ -799,3 +887,22 @@ void apReport( apPrintFunc_t printFunc ) } } */ + + +void cmApOsxTest( cmRpt_t* rpt ) +{ + printf("Start\n"); + cmApOsxInitialize(rpt,0); + + cmApOsxReport(rpt); + + if( cmApOsxDeviceSetup(2,48000.0,1024,NULL,NULL) != kOkApRC ) + printf("Setup failed.\n"); + + cmApOsxReport(rpt); + + cmApOsxFinalize(); + printf("Finish\n"); +} + + From 5da2967ab673504b6b39c3c01e222f2304a2854b Mon Sep 17 00:00:00 2001 From: Kevin Larke Date: Thu, 20 Nov 2014 15:58:17 -0800 Subject: [PATCH 12/12] cmAudioPort.h : Added result code kParamRangeErrorApRC. --- cmAudioPort.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cmAudioPort.h b/cmAudioPort.h index fc74bbf..711e343 100644 --- a/cmAudioPort.h +++ b/cmAudioPort.h @@ -38,6 +38,7 @@ extern "C" { kSysErrApRC, kInvalidDevIdApRC, kAudioPortFileFailApRC, + kParamRangeErrorApRC, kThreadFailApRC };