cmDspFx.h/c Initial code for cmAvailCh DSP object.
This commit is contained in:
parent
2b6c5327c6
commit
a659c4a2bf
122
dsp/cmDspFx.c
122
dsp/cmDspFx.c
@ -5653,6 +5653,128 @@ struct cmDspClass_str* cmRouterClassCons( cmDspCtx_t* ctx )
|
|||||||
return &_cmRouter_DC;
|
return &_cmRouter_DC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==========================================================================================================================================
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
kChCntAvId,
|
||||||
|
kTrigAvId,
|
||||||
|
kChIdxAvId,
|
||||||
|
kBaseInDisAvId,
|
||||||
|
};
|
||||||
|
|
||||||
|
cmDspClass_t _cmAvailCh_DC;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
cmDspInst_t inst;
|
||||||
|
unsigned chCnt;
|
||||||
|
unsigned baseOutEnaAvId;
|
||||||
|
unsigned baseInDisAvId;
|
||||||
|
unsigned enableSymId;
|
||||||
|
unsigned disableSymId;
|
||||||
|
bool* stateArray;
|
||||||
|
} cmDspAvailCh_t;
|
||||||
|
|
||||||
|
cmDspInst_t* _cmDspAvailCh_Alloc(cmDspCtx_t* ctx, cmDspClass_t* classPtr, unsigned storeSymId, unsigned instSymId, unsigned id, unsigned va_cnt, va_list vl )
|
||||||
|
{
|
||||||
|
if( va_cnt < 1 )
|
||||||
|
{
|
||||||
|
cmDspClassErr(ctx,classPtr,kVarArgParseFailDspRC,"The 'AvailCh' constructor must be given an channel count.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_list vl1;
|
||||||
|
va_copy(vl1,vl);
|
||||||
|
|
||||||
|
int chCnt = va_arg(vl,int);
|
||||||
|
|
||||||
|
if( chCnt <= 0 )
|
||||||
|
{
|
||||||
|
cmDspClassErr(ctx,classPtr,kInvalidArgDspRC,"The 'AvailCh' constructor must be given a positive channel count.");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned baseInDisAvId = kBaseInDisAvId;
|
||||||
|
unsigned baseOutEnaAvId = baseInDisAvId + chCnt;
|
||||||
|
|
||||||
|
cmDspAvailCh_t* p = cmDspInstAllocV(cmDspAvailCh_t,ctx,classPtr,instSymId,id,storeSymId,va_cnt,vl1,
|
||||||
|
1, "chs", kChCntAvId, 0, 0, kUIntDsvFl | kReqArgDsvFl, "Channel count.",
|
||||||
|
1, "trig", kTrigAvId, 0, 0, kTypeDsvMask | kInDsvFl, "Trigger the unit to select the next available channel.",
|
||||||
|
1, "ch", kChIdxAvId, 0, 0, kUIntDsvFl | kReqArgDsvFl | kInDsvFl, "Currently selected channel.",
|
||||||
|
chCnt, "dis", baseInDisAvId, 0, 0, kTypeDsvMask | kInDsvFl, "Disable inputs.",
|
||||||
|
chCnt, "ena", baseOutEnaAvId, 0, 0, kSymDsvFl | kOutDsvFl, "'enable' outputs",
|
||||||
|
0 );
|
||||||
|
|
||||||
|
p->chCnt = chCnt;
|
||||||
|
|
||||||
|
p->baseInDisAvId = baseInDisAvId;
|
||||||
|
p->baseOutEnaAvId = baseOutEnaAvId;
|
||||||
|
p->enableSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"enable");
|
||||||
|
p->disableSymId = cmSymTblRegisterStaticSymbol(ctx->stH,"disable");
|
||||||
|
|
||||||
|
unsigned i;
|
||||||
|
for(i=0; i<chCnt; ++i)
|
||||||
|
cmDspSetDefaultSymbol( ctx, &p->inst, baseOutEnaAvId+i, p->disableSymId );
|
||||||
|
|
||||||
|
cmDspSetDefaultUInt( ctx, &p->inst, kChIdxAvId, 0, cmInvalidIdx );
|
||||||
|
|
||||||
|
return &p->inst;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmDspRC_t _cmDspAvailCh_Free(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
||||||
|
{
|
||||||
|
return kOkDspRC;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmDspRC_t _cmDspAvailCh_Reset(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
||||||
|
{
|
||||||
|
return cmDspApplyAllDefaults(ctx,inst);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
cmDspRC_t _cmDspAvailCh_Recv(cmDspCtx_t* ctx, cmDspInst_t* inst, const cmDspEvt_t* evt )
|
||||||
|
{
|
||||||
|
cmDspRC_t rc = kOkDspRC;
|
||||||
|
cmDspAvailCh_t* p = (cmDspAvailCh_t*)inst;
|
||||||
|
|
||||||
|
// if this is a trigger
|
||||||
|
if( evt->dstVarId == kTrigAvId )
|
||||||
|
{
|
||||||
|
unsigned i;
|
||||||
|
for(i=0; i<p->chCnt; ++i)
|
||||||
|
if( cmDspSymbol(inst,p->baseOutEnaAvId+i) == p->disableSymId )
|
||||||
|
{
|
||||||
|
cmDspSetUInt(ctx,inst,kChIdxAvId,i);
|
||||||
|
cmDspSetSymbol(ctx,inst,p->baseOutEnaAvId,p->enableSymId);
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if this is an incoming disable message.
|
||||||
|
if( p->baseInDisAvId <= evt->dstVarId && evt->dstVarId < p->baseInDisAvId+p->chCnt )
|
||||||
|
{
|
||||||
|
cmDspSetSymbol(ctx,inst,p->baseOutEnaAvId,p->disableSymId);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cmDspClass_str* cmAvailChClassCons( cmDspCtx_t* ctx )
|
||||||
|
{
|
||||||
|
cmDspClassSetup(&_cmAvailCh_DC,ctx,"AvailCh",
|
||||||
|
NULL,
|
||||||
|
_cmDspAvailCh_Alloc,
|
||||||
|
_cmDspAvailCh_Free,
|
||||||
|
_cmDspAvailCh_Reset,
|
||||||
|
NULL,
|
||||||
|
_cmDspAvailCh_Recv,
|
||||||
|
NULL,NULL,
|
||||||
|
"Enable the next availabled channel");
|
||||||
|
|
||||||
|
return &_cmAvailCh_DC;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//==========================================================================================================================================
|
//==========================================================================================================================================
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ extern "C" {
|
|||||||
struct cmDspClass_str* cmGateToSymClassCons( cmDspCtx_t* ctx );
|
struct cmDspClass_str* cmGateToSymClassCons( cmDspCtx_t* ctx );
|
||||||
struct cmDspClass_str* cmPortToSymClassCons( cmDspCtx_t* ctx );
|
struct cmDspClass_str* cmPortToSymClassCons( cmDspCtx_t* ctx );
|
||||||
struct cmDspClass_str* cmRouterClassCons( cmDspCtx_t* ctx );
|
struct cmDspClass_str* cmRouterClassCons( cmDspCtx_t* ctx );
|
||||||
|
struct cmDspClass_str* cmAvailChClassCons( cmDspCtx_t* ctx );
|
||||||
struct cmDspClass_str* cmPresetClassCons( cmDspCtx_t* ctx );
|
struct cmDspClass_str* cmPresetClassCons( cmDspCtx_t* ctx );
|
||||||
struct cmDspClass_str* cmBcastSymClassCons( cmDspCtx_t* ctx );
|
struct cmDspClass_str* cmBcastSymClassCons( cmDspCtx_t* ctx );
|
||||||
struct cmDspClass_str* cmSegLineClassCons( cmDspCtx_t* ctx );
|
struct cmDspClass_str* cmSegLineClassCons( cmDspCtx_t* ctx );
|
||||||
|
Loading…
Reference in New Issue
Block a user