cmDspBuiltIn.c : The AudioFileOut object no longer creates an output

file when the object is created. It now waits until it is sent an
'open' symbol to create the audio output file.

If the AudioFileOut object is sent a directory rather than a file then
it automatically generates a file name in the given directory.
This commit is contained in:
kevin 2013-09-28 12:39:43 -07:00
parent a4a2b601a9
commit 9567d9211d

View File

@ -1474,6 +1474,7 @@ typedef struct
cmAudioFileH_t afH;
unsigned openSymId;
unsigned closeSymId;
const cmChar_t* afn;
} cmDspAudioFileOut_t;
cmDspRC_t _cmDspAudioFileOutCreateFile( cmDspCtx_t* ctx, cmDspInst_t* inst, unsigned chCnt )
@ -1485,6 +1486,17 @@ cmDspRC_t _cmDspAudioFileOutCreateFile( cmDspCtx_t* ctx, cmDspInst_t* inst, unsi
if(cmAudioFileIsValid(p->afH) )
cmAudioFileDelete(&p->afH);
// if the supplied audio file name is actually a directory name then generate a file name
if( cmFsIsDir(fn) )
{
cmMemPtrFree(&p->afn);
if( cmFsGenFn(fn,"recd","aiff",&p->afn) != kOkFsRC )
return cmDspInstErr(ctx,&p->inst,kFileSysFailDspRC,"An output audio file name could not be generated.");
fn = p->afn;
}
if( cmAudioFileIsValid(p->afH = cmAudioFileNewCreate(fn, cmDspSampleRate(ctx), p->bits, chCnt, &rc, ctx->rpt )) == false )
rc = cmDspClassErr(ctx,inst->classPtr,kVarArgParseFailDspRC,"The output audio file '%s' create failed.",fn);
@ -1495,7 +1507,7 @@ cmDspInst_t* _cmDspAudioFileOutAlloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, u
{
cmDspVarArg_t args[] =
{
{ "fn", kFnAofId, 0, 0, kInDsvFl | kStrzDsvFl | kReqArgDsvFl, "Audio file name"},
{ "fn", kFnAofId, 0, 0, kInDsvFl | kStrzDsvFl | kReqArgDsvFl, "Audio file or directory name"},
{ "chs", kChCntAofId, 0, 0, kInDsvFl | kUIntDsvFl | kReqArgDsvFl, "Channel count"},
{ "gain0", kGain0AofId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Output gain 0 multiplier"},
{ "gain1", kGain1AofId, 0, 0, kInDsvFl | kDoubleDsvFl | kOptArgDsvFl, "Output gain 1 multiplier"},
@ -1534,7 +1546,7 @@ cmDspRC_t _cmDspAudioFileOutReset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDs
p->smpCnt = cmDspSamplesPerCycle(ctx) * chCnt;
p->smpBuf = cmLhResizeN(ctx->lhH, cmSample_t, p->smpBuf, p->smpCnt);
rc = _cmDspAudioFileOutCreateFile( ctx, inst, chCnt );
//rc = _cmDspAudioFileOutCreateFile( ctx, inst, chCnt );
return rc;
}
@ -1548,6 +1560,10 @@ cmDspRC_t _cmDspAudioFileOutExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDsp
cmSample_t* chArray[chCnt];
unsigned i,j;
if(!cmAudioFileIsValid(p->afH) )
return rc;
for(i=0,j=0; i<chCnt; ++i)
{
unsigned chVarId = i == 0 ? kIn0AofId : kIn1AofId; // get audio buf var id for this ch
@ -1561,7 +1577,7 @@ cmDspRC_t _cmDspAudioFileOutExec(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDsp
{
cmSample_t gain = cmDspSample(inst,i==0?kGain0AofId:kGain1AofId); // get ch gain
chArray[j] = cmDspAudioBuf(ctx,inst,chVarId,i); // get incoming audio buf ptr
chArray[j] = cmDspAudioBuf(ctx,inst,chVarId,0); // get incoming audio buf ptr
if( gain != 1.0 )
cmVOS_MultVVS(chArray[j], iSmpCnt, chArray[j], gain); // apply gain
@ -1625,6 +1641,8 @@ cmDspRC_t _cmDspAudioFileOutFree( cmDspCtx_t* ctx, struct cmDspInst_str* inst,
if(cmAudioFileIsValid(p->afH) )
cmAudioFileDelete(&p->afH);
cmMemPtrFree(&p->afn);
return kOkDspRC;
}