cmDspBuiltIn.c cmDspWaveTable can now report the current audio file sample index periodically rather than on every exec.

This commit is contained in:
kevin 2013-01-13 16:40:00 -08:00
parent a40294f9a9
commit ab0589a216

View File

@ -2779,7 +2779,8 @@ typedef struct
unsigned offSymId;
unsigned doneSymId;
bool useThreadFl;
unsigned wt_oi;
unsigned minAfIndexRptCnt; // min count of audio samples between transmitting the current audio file index
unsigned afIndexRptCnt; // current audio file sample index count
} cmDspWaveTable_t;
bool _cmDspWaveTableThreadFunc( void* param);
@ -2812,7 +2813,10 @@ cmDspInst_t* _cmDspWaveTableAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsi
p->offSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"off");
p->onSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"on");
p->doneSymId= cmSymTblRegisterStaticSymbol(ctx->stH,"done");
p->doneSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"done");
double adCurFileIdxRptPeriodMs = 100.0;
p->minAfIndexRptCnt = floor(adCurFileIdxRptPeriodMs * cmDspSampleRate(ctx) / 1000.0);
cmDspSetDefaultUInt( ctx, &p->inst, kLenWtId, 0, cmDspSampleRate(ctx));
cmDspSetDefaultUInt( ctx, &p->inst, kShapeWtId, 0, kSilenceWtId );
@ -3202,56 +3206,6 @@ cmDspRC_t _cmDspWaveTableReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEv
}
cmDspRC_t _cmDspWaveTableExec1(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{
cmDspRC_t rc = kOkDspRC;
cmDspWaveTable_t* p = (cmDspWaveTable_t*)inst;
unsigned mode = cmDspSymbol(inst,kCmdWtId);
unsigned srcId = cmDspUInt(inst,kShapeWtId);
if( mode == p->offSymId || srcId == kSilenceWtId )
{
cmDspZeroAudioBuf(ctx,inst,kOutWtId);
return kOkDspRC;
}
cmSample_t* outV = cmDspAudioBuf(ctx,inst,kOutWtId,0);
unsigned outCnt = cmDspVarRows(inst,kOutWtId);
unsigned wtSmpCnt = cmDspUInt(inst,kLenWtId);
double gain = cmDspDouble(inst,kGainWtId);
unsigned i;
// for each output sample
for(i=0; i<outCnt; ++i)
{
p->wt_oi = (p->wt_oi + 1) % wtSmpCnt;
outV[i] = gain * p->wt[p->wt_oi];
}
// if we are reading from a file ...
if( srcId == kFileWtId )
{
unsigned rdSmpCnt = 8192; // file read block sample count
p->wtn += outCnt;
// ... and there are rdSmpCnt avail locations in the wave table
if( p->wtn >= rdSmpCnt )
rc = _cmDspWaveTableReadAudioFile(ctx, p, wtSmpCnt, rdSmpCnt );
// send the current audio file index
if( p->doneFl && p->cfi < p->cfn && p->cfn <= (p->cfi + outCnt) )
cmDspSetSymbol(ctx,inst,kDoneWtId,p->doneSymId);
else
cmDspSetUInt(ctx,inst,kFIdxWtId,p->cfi);
p->cfi += outCnt;
}
return rc;
}
cmDspRC_t _cmDspWaveTableExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
{
@ -3315,10 +3269,20 @@ cmDspRC_t _cmDspWaveTableExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt
// send the current audio file index
if( p->doneFl && p->cfi < p->cfn && p->cfn <= (p->cfi + outCnt) )
{
cmDspSetUInt(ctx,inst,kFIdxWtId,p->cfn);
cmDspSetSymbol(ctx,inst,kDoneWtId,p->doneSymId);
}
else
{
if( p->afIndexRptCnt >= p->minAfIndexRptCnt )
{
p->afIndexRptCnt -= p->minAfIndexRptCnt;
cmDspSetUInt(ctx,inst,kFIdxWtId,p->cfi);
}
}
p->afIndexRptCnt += outCnt;
p->cfi += outCnt;
}