cmAudDsp.h/c, cmAudioNrtDev.c,cmAudioSys.h : Audio devices are now set in aud_dsp.js by their name rather than their index.

This commit is contained in:
kevin 2020-07-27 17:36:43 -04:00
parent 4d5e88e766
commit 186f815636
4 changed files with 62 additions and 14 deletions

View File

@ -354,10 +354,15 @@ cmAdRC_t _cmAdParseSysJsonTree( cmAd_t* p )
{ {
cmAudioSysArgs_t* asap = &p->asCfgArray[i].cfg.ssArray[j].args; cmAudioSysArgs_t* asap = &p->asCfgArray[i].cfg.ssArray[j].args;
const cmJsonNode_t* argsNodePtr = cmJsonArrayElementC(ssArrayNodePtr,j); const cmJsonNode_t* argsNodePtr = cmJsonArrayElementC(ssArrayNodePtr,j);
asap->inDevIdx = cmInvalidIdx;
asap->outDevIdx = cmInvalidIdx;
asap->inDevLabel = NULL;
asap->outDevLabel = NULL;
if((jsRC = cmJsonMemberValues( argsNodePtr, &errLabelPtr, if((jsRC = cmJsonMemberValues( argsNodePtr, &errLabelPtr,
"inDevIdx", kIntTId, &asap->inDevIdx, "inDevLabel", kStringTId, &asap->inDevLabel,
"outDevIdx", kIntTId, &asap->outDevIdx, "outDevLabel", kStringTId, &asap->outDevLabel,
"syncToInputFl", kTrueTId, &asap->syncInputFl, "syncToInputFl", kTrueTId, &asap->syncInputFl,
"msgQueueByteCnt", kIntTId, &asap->msgQueueByteCnt, "msgQueueByteCnt", kIntTId, &asap->msgQueueByteCnt,
"devFramesPerCycle", kIntTId, &asap->devFramesPerCycle, "devFramesPerCycle", kIntTId, &asap->devFramesPerCycle,
@ -443,6 +448,35 @@ cmAdRC_t _cmAdCreateAggDevices( cmAd_t* p )
return rc; return rc;
} }
cmAdRC_t _cmAdResolveDeviceLabels( cmAd_t* p )
{
cmAdRC_t rc = kOkAdRC;
unsigned i,j;
// for each cmAsAudioSysCfg record in audioSysCfgArray[]
for(i=0; i<p->asCfgCnt; ++i)
{
// for each audio system sub-subsystem
for(j=0; j<p->asCfgArray[i].cfg.ssCnt; ++j)
{
cmAudioSysArgs_t* asap = &p->asCfgArray[i].cfg.ssArray[j].args;
if((asap->inDevIdx = cmApDeviceLabelToIndex( asap->inDevLabel )) == cmInvalidId )
{
rc = cmErrMsg(&p->err,kInvalidAudioDevIdxAdRC,"The audio input device '%s' could not be found.", cmStringNullGuard(asap->inDevLabel));
goto errLabel;
}
if((asap->outDevIdx = cmApDeviceLabelToIndex( asap->outDevLabel )) == cmInvalidId )
{
rc = cmErrMsg(&p->err,kInvalidAudioDevIdxAdRC,"The audio input device '%s' could not be found.", cmStringNullGuard(asap->inDevLabel));
goto errLabel;
}
}
}
errLabel:
return rc;
}
cmAdRC_t _cmAdCreateNrtDevices( cmAd_t* p ) cmAdRC_t _cmAdCreateNrtDevices( cmAd_t* p )
{ {
cmAdRC_t rc = kOkAdRC; cmAdRC_t rc = kOkAdRC;
@ -721,10 +755,11 @@ cmAdRC_t cmAudDspAlloc( cmCtx_t* ctx, cmAdH_t* hp, cmMsgSendFuncPtr_t cbFunc, vo
if((rc = _cmAdParseSysJsonTree(p)) != kOkAdRC ) if((rc = _cmAdParseSysJsonTree(p)) != kOkAdRC )
goto errLabel; goto errLabel;
// create the aggregate device // create the aggregate device
if( _cmAdCreateAggDevices(p) != kOkAdRC ) if( _cmAdCreateAggDevices(p) != kOkAdRC )
goto errLabel; goto errLabel;
// create the non-real-time devices // create the non-real-time devices
if( _cmAdCreateNrtDevices(p) != kOkAdRC ) if( _cmAdCreateNrtDevices(p) != kOkAdRC )
goto errLabel; goto errLabel;
@ -740,6 +775,12 @@ cmAdRC_t cmAudDspAlloc( cmCtx_t* ctx, cmAdH_t* hp, cmMsgSendFuncPtr_t cbFunc, vo
goto errLabel; goto errLabel;
} }
if( _cmAdResolveDeviceLabels(p) != kOkApRC )
{
rc = cmErrMsg(&p->err,kAudioPortFailAdRC,"Audio device labels could not be resolved..");
goto errLabel;
}
// initialize the audio buffer // initialize the audio buffer
if( cmApBufInitialize( cmApDeviceCount(), p->meterMs ) != kOkApRC ) if( cmApBufInitialize( cmApDeviceCount(), p->meterMs ) != kOkApRC )
{ {

View File

@ -27,7 +27,8 @@ extern "C" {
kAggDevCreateFailAdRC, kAggDevCreateFailAdRC,
kNrtDevSysFailAdRC, kNrtDevSysFailAdRC,
kAfpDevSysFailAdRC, kAfpDevSysFailAdRC,
kNetSysFailAdRC kNetSysFailAdRC,
kInvalidAudioDevIdxAdRC
}; };

View File

@ -189,6 +189,10 @@ cmApRC_t cmApNrtAllocate( cmRpt_t* rpt )
cmApRC_t cmApNrtFree() cmApRC_t cmApNrtFree()
{ {
cmApRC_t rc = kOkApRC; cmApRC_t rc = kOkApRC;
if( _cmNrt == NULL )
return rc;
cmApNrtDev_t* dp = _cmNrt->devs; cmApNrtDev_t* dp = _cmNrt->devs;
while( dp != NULL ) while( dp != NULL )
{ {

View File

@ -130,16 +130,18 @@ extern "C" {
// Audio device sub-sytem configuration record // Audio device sub-sytem configuration record
typedef struct cmAudioSysArgs_str typedef struct cmAudioSysArgs_str
{ {
cmRpt_t* rpt; // system console object cmRpt_t* rpt; // system console object
unsigned inDevIdx; // input audio device const cmChar_t* inDevLabel; // input audio device text label
unsigned outDevIdx; // output audio device const cmChar_t* outDevLabel; // output audio device text label
bool syncInputFl; // true/false sync the DSP update callbacks with audio input/output unsigned inDevIdx; // input audio device index
unsigned msgQueueByteCnt; // Size of the internal msg queue used to buffer msgs arriving via cmAudioSysDeliverMsg(). unsigned outDevIdx; // output audio device index
unsigned devFramesPerCycle; // (512) Audio device samples per channel per device update buffer. bool syncInputFl; // true/false sync the DSP update callbacks with audio input/output
unsigned dspFramesPerCycle; // (64) Audio samples per channel per DSP cycle. unsigned msgQueueByteCnt; // Size of the internal msg queue used to buffer msgs arriving via cmAudioSysDeliverMsg().
unsigned audioBufCnt; // (3) Audio device buffers. unsigned devFramesPerCycle; // (512) Audio device samples per channel per device update buffer.
double srate; // Audio sample rate. unsigned dspFramesPerCycle; // (64) Audio samples per channel per DSP cycle.
int srateMult; // Sample rate multiplication factor (negative for divide) unsigned audioBufCnt; // (3) Audio device buffers.
double srate; // Audio sample rate.
int srateMult; // Sample rate multiplication factor (negative for divide)
} cmAudioSysArgs_t; } cmAudioSysArgs_t;
// Audio sub-system configuration record. // Audio sub-system configuration record.