cwFlow,cwFlowNet,cwFlowTypes,cwFlowProc : Many changes.
Added ability to set types at proc instantiation time. Added ability to have multi-type variables which get resolved at proc. instantiation time. Added ability to proc 'log' attribute to print selected variables as they change. Values are now coerced to the variable type in var_set(). Added new proc's : list,add,preset.
This commit is contained in:
parent
4619fc43a1
commit
b57693f4e4
@ -34,8 +34,8 @@ namespace cw
|
|||||||
{ "midi_out", &midi_out::members },
|
{ "midi_out", &midi_out::members },
|
||||||
{ "audio_in", &audio_in::members },
|
{ "audio_in", &audio_in::members },
|
||||||
{ "audio_out", &audio_out::members },
|
{ "audio_out", &audio_out::members },
|
||||||
{ "audioFileIn", &audioFileIn::members },
|
{ "audio_file_in", &audio_file_in::members },
|
||||||
{ "audioFileOut", &audioFileOut::members },
|
{ "audio_file_out", &audio_file_out::members },
|
||||||
{ "audio_gain", &audio_gain::members },
|
{ "audio_gain", &audio_gain::members },
|
||||||
{ "audio_split", &audio_split::members },
|
{ "audio_split", &audio_split::members },
|
||||||
{ "audio_duplicate", &audio_duplicate::members },
|
{ "audio_duplicate", &audio_duplicate::members },
|
||||||
@ -58,6 +58,9 @@ namespace cw
|
|||||||
{ "number", &number::members },
|
{ "number", &number::members },
|
||||||
{ "timer", &timer::members },
|
{ "timer", &timer::members },
|
||||||
{ "counter", &counter::members },
|
{ "counter", &counter::members },
|
||||||
|
{ "list", &list::members },
|
||||||
|
{ "add", &add::members },
|
||||||
|
{ "preset", &preset::members },
|
||||||
{ nullptr, nullptr }
|
{ nullptr, nullptr }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -621,7 +624,7 @@ cw::rc_t cw::flow::test( const object_t* cfg, int argc, const char* argv[] )
|
|||||||
// find the user requested test case
|
// find the user requested test case
|
||||||
if((test_cfg = test_cases_cfg->find_child(argv[1])) == nullptr )
|
if((test_cfg = test_cases_cfg->find_child(argv[1])) == nullptr )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kInvalidArgRC,"The test case named '%s' was not found.",argv[0]);
|
rc = cwLogError(kInvalidArgRC,"The test case named '%s' was not found.",argv[1]);
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
138
cwFlowNet.cpp
138
cwFlowNet.cpp
@ -66,8 +66,10 @@ namespace cw
|
|||||||
void _connect_vars( variable_t* src_var, variable_t* in_var )
|
void _connect_vars( variable_t* src_var, variable_t* in_var )
|
||||||
{
|
{
|
||||||
// connect in_var into src_var's outgoing var chain
|
// connect in_var into src_var's outgoing var chain
|
||||||
in_var->connect_link = src_var->connect_link;
|
in_var->dst_link = src_var->dst_tail;
|
||||||
src_var->connect_link = in_var;
|
src_var->dst_tail = in_var;
|
||||||
|
if( src_var->dst_head == nullptr )
|
||||||
|
src_var->dst_head = in_var;
|
||||||
|
|
||||||
assert( src_var->value != nullptr );
|
assert( src_var->value != nullptr );
|
||||||
|
|
||||||
@ -171,7 +173,42 @@ namespace cw
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_t _set_log_flags(instance_t* proc, const object_t* log_labels)
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
|
if( log_labels == nullptr )
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
if( !log_labels->is_dict() )
|
||||||
|
{
|
||||||
|
rc = cwLogError(kSyntaxErrorRC,"The log spec on '%s:%i' is not a dictionary.",cwStringNullGuard(proc->label),proc->label_sfx_id);
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(unsigned i=0; i<log_labels->child_count(); ++i)
|
||||||
|
{
|
||||||
|
const object_t* pair;
|
||||||
|
unsigned sfx_id;
|
||||||
|
|
||||||
|
if((pair = log_labels->child_ele(i)) == nullptr || pair->pair_label()==nullptr || pair->pair_value()==nullptr || (rc=pair->pair_value()->value(sfx_id))!=kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(kSyntaxErrorRC,"Syntax error on log var identifier.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
if((rc = var_set_flags( proc, kAnyChIdx, pair->pair_label(), sfx_id, kLogVarFl )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Unable to set var flags on '%s:%i' var:'%s:%i'.",cwStringNullGuard(proc->label),proc->label_sfx_id,pair->pair_label(),sfx_id);
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
rc_t _call_value_func_on_all_variables( instance_t* inst )
|
rc_t _call_value_func_on_all_variables( instance_t* inst )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
@ -181,40 +218,49 @@ namespace cw
|
|||||||
if( inst->varMapA[i] != nullptr && inst->varMapA[i]->vid != kInvalidId )
|
if( inst->varMapA[i] != nullptr && inst->varMapA[i]->vid != kInvalidId )
|
||||||
{
|
{
|
||||||
variable_t* var = inst->varMapA[i];
|
variable_t* var = inst->varMapA[i];
|
||||||
|
|
||||||
if((rc = var->inst->class_desc->members->value( var->inst, var )) != kOkRC )
|
if((rc = var_call_custom_value_func( var )) != kOkRC )
|
||||||
rc1 = cwLogError(rc,"The proc instance '%s:%i' reported an invalid valid on variable:%s chIdx:%i.", var->inst->label, var->inst->label_sfx_id, var->label, var->chIdx );
|
rc1 = cwLogError(rc,"The proc instance '%s:%i' reported an invalid valid on variable:%s chIdx:%i.", var->inst->label, var->inst->label_sfx_id, var->label, var->chIdx );
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc1;
|
return rc1;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_t _var_channelize( instance_t* inst, const char* preset_label, const char* type_src_label, const char* value_label, const object_t* value )
|
rc_t _var_channelize( instance_t* inst, const char* preset_label, const char* type_src_label, const char* var_label, const object_t* value )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
|
|
||||||
variable_t* dummy = nullptr;
|
variable_t* dummy = nullptr;
|
||||||
|
var_desc_t* vd = nullptr;
|
||||||
|
|
||||||
// verify that a valid value exists
|
// verify that a valid value exists
|
||||||
if( value == nullptr )
|
if( value == nullptr )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kSyntaxErrorRC,"Unexpected missig value on %s preset '%s' instance '%s' variable '%s'.", type_src_label, preset_label, inst->label, cwStringNullGuard(value_label) );
|
rc = cwLogError(kSyntaxErrorRC,"Unexpected missig value on %s preset '%s' instance '%s' variable '%s'.", type_src_label, preset_label, inst->label, cwStringNullGuard(var_label) );
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// if a list of values was given
|
|
||||||
if( value->is_list() )
|
|
||||||
{
|
{
|
||||||
for(unsigned chIdx=0; chIdx<value->child_count(); ++chIdx)
|
bool is_var_cfg_type_fl = (vd = var_desc_find( inst->class_desc, var_label ))!=nullptr && cwIsFlag(vd->type,kCfgTFl);
|
||||||
if((rc = var_channelize( inst, value_label, kBaseSfxId, chIdx, value->child_ele(chIdx), kInvalidId, dummy )) != kOkRC )
|
bool is_list_fl = value->is_list();
|
||||||
goto errLabel;
|
bool is_list_of_list_fl = is_list_fl && value->child_count() > 0 && value->child_ele(0)->is_list();
|
||||||
}
|
bool parse_list_fl = (is_list_fl && !is_var_cfg_type_fl) || (is_list_of_list_fl && is_var_cfg_type_fl);
|
||||||
else // otherwise a single value was given
|
|
||||||
{
|
|
||||||
if((rc = var_channelize( inst, value_label, kBaseSfxId, kAnyChIdx, value, kInvalidId, dummy )) != kOkRC )
|
|
||||||
goto errLabel;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// if a list of values was given and the var type is not a 'cfg' type or if a list of lists was given
|
||||||
|
if( parse_list_fl )
|
||||||
|
{
|
||||||
|
// then each value in the list is assigned to the associated channel
|
||||||
|
for(unsigned chIdx=0; chIdx<value->child_count(); ++chIdx)
|
||||||
|
if((rc = var_channelize( inst, var_label, kBaseSfxId, chIdx, value->child_ele(chIdx), kInvalidId, dummy )) != kOkRC )
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
else // otherwise a single value was given
|
||||||
|
{
|
||||||
|
if((rc = var_channelize( inst, var_label, kBaseSfxId, kAnyChIdx, value, kInvalidId, dummy )) != kOkRC )
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
@ -236,12 +282,12 @@ namespace cw
|
|||||||
// for each preset variable
|
// for each preset variable
|
||||||
for(unsigned i=0; i<preset_cfg->child_count(); ++i)
|
for(unsigned i=0; i<preset_cfg->child_count(); ++i)
|
||||||
{
|
{
|
||||||
const object_t* value = preset_cfg->child_ele(i)->pair_value();
|
const object_t* value = preset_cfg->child_ele(i)->pair_value();
|
||||||
const char* value_label = preset_cfg->child_ele(i)->pair_label();
|
const char* var_label = preset_cfg->child_ele(i)->pair_label();
|
||||||
|
|
||||||
//cwLogInfo("variable:%s",value_label);
|
//cwLogInfo("variable:%s",value_label);
|
||||||
|
|
||||||
if((rc = _var_channelize( inst, preset_label, type_src_label, value_label, value )) != kOkRC )
|
if((rc = _var_channelize( inst, preset_label, type_src_label, var_label, value )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
|
|
||||||
@ -707,6 +753,7 @@ namespace cw
|
|||||||
const char* arg_label; //
|
const char* arg_label; //
|
||||||
const object_t* preset_labels; //
|
const object_t* preset_labels; //
|
||||||
const object_t* arg_cfg; //
|
const object_t* arg_cfg; //
|
||||||
|
const object_t* log_labels; //
|
||||||
const object_t* in_dict; // cfg. node to the in-list
|
const object_t* in_dict; // cfg. node to the in-list
|
||||||
in_stmt_t* in_array; // in_array[ in_arrayN ] in-stmt array
|
in_stmt_t* in_array; // in_array[ in_arrayN ] in-stmt array
|
||||||
unsigned in_arrayN; // count of in-stmt's in the in-list.
|
unsigned in_arrayN; // count of in-stmt's in the in-list.
|
||||||
@ -1253,9 +1300,16 @@ namespace cw
|
|||||||
{
|
{
|
||||||
in_stmt_t& in_stmt = pstate.in_array[i];
|
in_stmt_t& in_stmt = pstate.in_array[i];
|
||||||
const object_t* in_pair = pstate.in_dict->child_ele(i); // in:src pair
|
const object_t* in_pair = pstate.in_dict->child_ele(i); // in:src pair
|
||||||
const char* in_var_str = in_pair->pair_label(); // 'in' var string
|
const char* in_var_str = nullptr;
|
||||||
const char* src_proc_var_str = nullptr;
|
const char* src_proc_var_str = nullptr;
|
||||||
|
|
||||||
|
// validate the basic syntax
|
||||||
|
if( in_pair == nullptr || (in_var_str = in_pair->pair_label()) == nullptr || in_pair->pair_value()==nullptr )
|
||||||
|
{
|
||||||
|
cwLogError(rc,"Malformed dictionary encountered in 'in' statement.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
// get the src net/proc/var string
|
// get the src net/proc/var string
|
||||||
if((rc = in_pair->pair_value()->value(src_proc_var_str)) != kOkRC )
|
if((rc = in_pair->pair_value()->value(src_proc_var_str)) != kOkRC )
|
||||||
{
|
{
|
||||||
@ -1282,6 +1336,7 @@ namespace cw
|
|||||||
kInvalidId,
|
kInvalidId,
|
||||||
kAnyChIdx,
|
kAnyChIdx,
|
||||||
in_stmt.in_var_desc->val_cfg,
|
in_stmt.in_var_desc->val_cfg,
|
||||||
|
kInvalidTFl,
|
||||||
dum )) != kOkRC )
|
dum )) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(rc,"in-stmt var create failed on '%s:%s'.",cwStringNullGuard(in_var_str),cwStringNullGuard(src_proc_var_str));
|
rc = cwLogError(rc,"in-stmt var create failed on '%s:%s'.",cwStringNullGuard(in_var_str),cwStringNullGuard(src_proc_var_str));
|
||||||
@ -1432,9 +1487,10 @@ namespace cw
|
|||||||
|
|
||||||
// parse the optional args
|
// parse the optional args
|
||||||
if((rc = proc_inst_cfg->pair_value()->getv_opt("args", arg_dict,
|
if((rc = proc_inst_cfg->pair_value()->getv_opt("args", arg_dict,
|
||||||
"in", pstate.in_dict,
|
"in", pstate.in_dict,
|
||||||
"argLabel", pstate.arg_label,
|
"argLabel", pstate.arg_label,
|
||||||
"preset", pstate.preset_labels)) != kOkRC )
|
"preset", pstate.preset_labels,
|
||||||
|
"log", pstate.log_labels )) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kSyntaxErrorRC,"The instance cfg. '%s' missing: 'type'.",pstate.inst_label);
|
rc = cwLogError(kSyntaxErrorRC,"The instance cfg. '%s' missing: 'type'.",pstate.inst_label);
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
@ -1550,16 +1606,16 @@ namespace cw
|
|||||||
|
|
||||||
// Instantiate all the variables in the class description - that were not already created in _parse_in_list()
|
// Instantiate all the variables in the class description - that were not already created in _parse_in_list()
|
||||||
for(var_desc_t* vd=class_desc->varDescL; vd!=nullptr; vd=vd->link)
|
for(var_desc_t* vd=class_desc->varDescL; vd!=nullptr; vd=vd->link)
|
||||||
if( !_is_var_inst_already_created( vd->label, pstate ) )
|
if( !_is_var_inst_already_created( vd->label, pstate ) && cwIsNotFlag(vd->type,kRuntimeTFl) )
|
||||||
{
|
{
|
||||||
variable_t* var = nullptr;
|
variable_t* var = nullptr;
|
||||||
if((rc = var_create( inst, vd->label, kBaseSfxId, kInvalidId, kAnyChIdx, vd->val_cfg, var )) != kOkRC )
|
if((rc = var_create( inst, vd->label, kBaseSfxId, kInvalidId, kAnyChIdx, vd->val_cfg, kInvalidTFl, var )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// All the variables that can be used by this instance have now been created
|
// All the variables that can be used by this instance have now been created
|
||||||
// and the chIdx of each variable is set to 'any'.
|
// and the chIdx of each variable is set to 'any'.
|
||||||
|
|
||||||
// If a 'preset' field was included in the class cfg then apply the specified class preset
|
// If a 'preset' field was included in the class cfg then apply the specified class preset
|
||||||
if( pstate.preset_labels != nullptr )
|
if( pstate.preset_labels != nullptr )
|
||||||
if((rc = _class_apply_presets(inst, pstate.preset_labels )) != kOkRC )
|
if((rc = _class_apply_presets(inst, pstate.preset_labels )) != kOkRC )
|
||||||
@ -1584,36 +1640,52 @@ namespace cw
|
|||||||
// Connect the in-list variables to their sources.
|
// Connect the in-list variables to their sources.
|
||||||
if((rc = _connect_in_vars(net, inst, pstate)) != kOkRC )
|
if((rc = _connect_in_vars(net, inst, pstate)) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(rc,"Creation of the proc instance '%s:%i' failed during input connection processing.",cwStringNullGuard(inst->label),inst->label_sfx_id);
|
rc = cwLogError(rc,"Input connection processing failed.");
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Complete the instantiation of the proc instance by calling the custom instance creation function.
|
// Complete the instantiation of the proc instance by calling the custom instance creation function.
|
||||||
|
|
||||||
// Call the custom instance create() function.
|
// Call the custom instance create() function.
|
||||||
if((rc = class_desc->members->create( inst )) != kOkRC )
|
if((rc = class_desc->members->create( inst )) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kInvalidArgRC,"Instantiation failed on instance '%s:%i'.", inst->label,inst->label_sfx_id );
|
rc = cwLogError(kInvalidArgRC,"Custom instantiation failed." );
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the instance->varMap[] lookup array
|
// Create the instance->varMap[] lookup array
|
||||||
if((rc =_create_instance_var_map( inst )) != kOkRC )
|
if((rc =_create_instance_var_map( inst )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Variable map creation failed.");
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
// the custom creation function may have added channels to in-list vars fix up those connections here.
|
// the custom creation function may have added channels to in-list vars fix up those connections here.
|
||||||
_complete_input_connections(inst);
|
_complete_input_connections(inst);
|
||||||
|
|
||||||
|
// set the log flags again so that vars created by the instance can be included in the log output
|
||||||
|
if((rc = _set_log_flags(inst,pstate.log_labels)) != kOkRC )
|
||||||
|
goto errLabel;
|
||||||
|
|
||||||
// call the 'value()' function to inform the instance of the current value of all of it's variables.
|
// call the 'value()' function to inform the instance of the current value of all of it's variables.
|
||||||
if((rc = _call_value_func_on_all_variables( inst )) != kOkRC )
|
if((rc = _call_value_func_on_all_variables( inst )) != kOkRC )
|
||||||
goto errLabel;
|
goto errLabel;
|
||||||
|
|
||||||
|
if((rc = instance_validate(inst)) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Proc instance validation failed.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
inst_ref = inst;
|
inst_ref = inst;
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
if( rc != kOkRC )
|
if( rc != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"Proc instantiation failed on '%s:%i'.",cwStringNullGuard(pstate.inst_label),sfx_id);
|
||||||
_destroy_inst(inst);
|
_destroy_inst(inst);
|
||||||
|
}
|
||||||
|
|
||||||
_destroy_pstate(pstate);
|
_destroy_pstate(pstate);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
859
cwFlowProc.cpp
859
cwFlowProc.cpp
File diff suppressed because it is too large
Load Diff
@ -7,8 +7,8 @@ namespace cw
|
|||||||
namespace midi_out { extern class_members_t members; }
|
namespace midi_out { extern class_members_t members; }
|
||||||
namespace audio_in { extern class_members_t members; }
|
namespace audio_in { extern class_members_t members; }
|
||||||
namespace audio_out { extern class_members_t members; }
|
namespace audio_out { extern class_members_t members; }
|
||||||
namespace audioFileIn { extern class_members_t members; }
|
namespace audio_file_in { extern class_members_t members; }
|
||||||
namespace audioFileOut { extern class_members_t members; }
|
namespace audio_file_out { extern class_members_t members; }
|
||||||
namespace audio_gain { extern class_members_t members; }
|
namespace audio_gain { extern class_members_t members; }
|
||||||
namespace audio_split { extern class_members_t members; }
|
namespace audio_split { extern class_members_t members; }
|
||||||
namespace audio_merge { extern class_members_t members; }
|
namespace audio_merge { extern class_members_t members; }
|
||||||
@ -31,6 +31,9 @@ namespace cw
|
|||||||
namespace number { extern class_members_t members; }
|
namespace number { extern class_members_t members; }
|
||||||
namespace timer { extern class_members_t members; }
|
namespace timer { extern class_members_t members; }
|
||||||
namespace counter { extern class_members_t members; }
|
namespace counter { extern class_members_t members; }
|
||||||
|
namespace list { extern class_members_t members; }
|
||||||
|
namespace add { extern class_members_t members; }
|
||||||
|
namespace preset { extern class_members_t members; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
965
cwFlowTypes.cpp
965
cwFlowTypes.cpp
File diff suppressed because it is too large
Load Diff
143
cwFlowTypes.h
143
cwFlowTypes.h
@ -40,11 +40,11 @@ namespace cw
|
|||||||
unsigned* maxBinN_V; // max value that binN_V[i] is allowed to take
|
unsigned* maxBinN_V; // max value that binN_V[i] is allowed to take
|
||||||
unsigned* binN_V; // binN_V[ chN ] count of sample frames per channel
|
unsigned* binN_V; // binN_V[ chN ] count of sample frames per channel
|
||||||
unsigned* hopSmpN_V; // hopSmpN_V[ chN ] hop sample count
|
unsigned* hopSmpN_V; // hopSmpN_V[ chN ] hop sample count
|
||||||
fd_sample_t** magV; // magV[ chN ][ binN ]
|
fd_sample_t** magV; // magV[ chN ][ binN ]
|
||||||
fd_sample_t** phsV; // phsV[ chN ][ binN ]
|
fd_sample_t** phsV; // phsV[ chN ][ binN ]
|
||||||
fd_sample_t** hzV; // hzV[ chN ][ binN ]
|
fd_sample_t** hzV; // hzV[ chN ][ binN ]
|
||||||
bool* readyFlV; // readyFlV[chN] true if this channel is ready to be processed (used to sync. fbuf rate to abuf rate)
|
bool* readyFlV; // readyFlV[chN] true if this channel is ready to be processed (used to sync. fbuf rate to abuf rate)
|
||||||
fd_sample_t* buf; // memory used by this buffer (or NULL if magV,phsV,hzV point are proxied to another buffer)
|
fd_sample_t* buf; // memory used by this buffer (or NULL if magV,phsV,hzV point are proxied to another buffer)
|
||||||
} fbuf_t;
|
} fbuf_t;
|
||||||
|
|
||||||
typedef struct mbuf_str
|
typedef struct mbuf_str
|
||||||
@ -78,6 +78,8 @@ namespace cw
|
|||||||
|
|
||||||
kTypeMask = 0x0000ffff,
|
kTypeMask = 0x0000ffff,
|
||||||
|
|
||||||
|
kRuntimeTFl = 0x80000000
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct mtx_str
|
typedef struct mtx_str
|
||||||
@ -92,7 +94,8 @@ namespace cw
|
|||||||
|
|
||||||
typedef struct value_str
|
typedef struct value_str
|
||||||
{
|
{
|
||||||
unsigned flags;
|
unsigned tflag;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
bool b;
|
bool b;
|
||||||
uint_t u;
|
uint_t u;
|
||||||
@ -108,6 +111,7 @@ namespace cw
|
|||||||
char* s;
|
char* s;
|
||||||
|
|
||||||
const object_t* cfg;
|
const object_t* cfg;
|
||||||
|
void* p;
|
||||||
|
|
||||||
} u;
|
} u;
|
||||||
|
|
||||||
@ -116,8 +120,9 @@ namespace cw
|
|||||||
} value_t;
|
} value_t;
|
||||||
|
|
||||||
|
|
||||||
inline bool is_numeric( const value_t* v ) { return cwIsFlag(v->flags,kBoolTFl|kUIntTFl|kIntTFl|kFloatTFl|kDoubleTFl); }
|
inline void set_null( value_t& v, unsigned tflag ) { v.tflag=tflag; v.u.p=nullptr; }
|
||||||
inline bool is_matrix( const value_t* v ) { return cwIsFlag(v->flags,kBoolMtxTFl|kUIntMtxTFl|kIntMtxTFl|kFloatMtxTFl|kDoubleMtxTFl); }
|
inline bool is_numeric( const value_t* v ) { return cwIsFlag(v->tflag,kBoolTFl|kUIntTFl|kIntTFl|kFloatTFl|kDoubleTFl); }
|
||||||
|
inline bool is_matrix( const value_t* v ) { return cwIsFlag(v->tflag,kBoolMtxTFl|kUIntMtxTFl|kIntMtxTFl|kFloatMtxTFl|kDoubleMtxTFl); }
|
||||||
|
|
||||||
struct instance_str;
|
struct instance_str;
|
||||||
struct variable_str;
|
struct variable_str;
|
||||||
@ -170,24 +175,40 @@ namespace cw
|
|||||||
unsigned polyLimitN; // max. poly copies of this class per network_t or 0 if no limit
|
unsigned polyLimitN; // max. poly copies of this class per network_t or 0 if no limit
|
||||||
} class_desc_t;
|
} class_desc_t;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
kInvalidVarFl = 0x00,
|
||||||
|
kLogVarFl = 0x01
|
||||||
|
};
|
||||||
|
|
||||||
// Note: The concatenation of 'vid' and 'chIdx' should form a unique identifier among all variables
|
// Note: The concatenation of 'vid' and 'chIdx' should form a unique identifier among all variables
|
||||||
// on a given 'instance'.
|
// on a given 'instance'.
|
||||||
typedef struct variable_str
|
typedef struct variable_str
|
||||||
{
|
{
|
||||||
struct instance_str* inst; // pointer to this variables instance
|
struct instance_str* inst; // pointer to this variables instance
|
||||||
|
|
||||||
char* label; // this variables label
|
char* label; // this variables label
|
||||||
unsigned label_sfx_id; // the label suffix id of this variable or kInvalidIdx if this has no suffix
|
unsigned label_sfx_id; // the label suffix id of this variable or kInvalidIdx if this has no suffix
|
||||||
unsigned vid; // this variables numeric id ( cat(vid,chIdx) forms a unique variable identifier on this 'inst'
|
unsigned vid; // this variables numeric id ( cat(vid,chIdx) forms a unique variable identifier on this 'inst'
|
||||||
var_desc_t* varDesc; // the variable description for this variable
|
|
||||||
value_t local_value[ kLocalValueN ]; // the local value instance (actual value if this is not a 'src' variable)
|
|
||||||
unsigned local_value_idx; // local_value[] is double buffered to allow the cur value of the buf[] to be held while the next value is validated (see _var_set_template())
|
|
||||||
value_t* value; // pointer to the value associated with this variable
|
|
||||||
unsigned chIdx; // channel index
|
unsigned chIdx; // channel index
|
||||||
struct variable_str* src_var; // pointer to this input variables source link (or null if it uses the local_value)
|
unsigned flags; // kLogVarFl
|
||||||
struct variable_str* var_link; // instance.varL link list
|
unsigned type; // This is the value type as established when the var is initialized - it never changes for the life of the var.
|
||||||
struct variable_str* connect_link; // list of outgoing connections
|
|
||||||
|
var_desc_t* classVarDesc; // pointer to this variables class var desc
|
||||||
|
var_desc_t* localVarDesc; // pointer to this variables local var desc - if it doesn't match classVarDesc.
|
||||||
|
var_desc_t* varDesc; // the effective variable description for this variable (set to classVarDesc or localVarDesc)
|
||||||
|
|
||||||
|
value_t local_value[ kLocalValueN ]; // the local value instance (actual value if this is not a 'src' variable)
|
||||||
|
unsigned local_value_idx; // local_value[] is double buffered to allow the cur value of the buf[] to be held while the next value is validated (see _var_set_template())
|
||||||
|
struct variable_str* src_var; // pointer to this input variables source link (or null if it uses the local_value)
|
||||||
|
value_t* value; // pointer to the value associated with this variable
|
||||||
|
|
||||||
|
struct variable_str* var_link; // instance.varL list link
|
||||||
struct variable_str* ch_link; // list of channels that share this variable (rooted on 'any' channel - in order by channel number)
|
struct variable_str* ch_link; // list of channels that share this variable (rooted on 'any' channel - in order by channel number)
|
||||||
|
|
||||||
|
struct variable_str* dst_head; // Pointer to list of out-going connections (null on var's that do not have out-going connections)
|
||||||
|
struct variable_str* dst_tail; //
|
||||||
|
struct variable_str* dst_link; // Link used by dst_head list.
|
||||||
|
|
||||||
} variable_t;
|
} variable_t;
|
||||||
|
|
||||||
|
|
||||||
@ -277,11 +298,13 @@ namespace cw
|
|||||||
void mbuf_destroy( mbuf_t*& buf );
|
void mbuf_destroy( mbuf_t*& buf );
|
||||||
mbuf_t* mbuf_duplicate( const mbuf_t* src );
|
mbuf_t* mbuf_duplicate( const mbuf_t* src );
|
||||||
|
|
||||||
inline bool value_is_abuf( const value_t* v ) { return v->flags & kABufTFl; }
|
inline bool value_is_abuf( const value_t* v ) { return v->tflag & kABufTFl; }
|
||||||
inline bool value_is_fbuf( const value_t* v ) { return v->flags & kFBufTFl; }
|
inline bool value_is_fbuf( const value_t* v ) { return v->tflag & kFBufTFl; }
|
||||||
|
|
||||||
unsigned value_type_label_to_flag( const char* type_desc );
|
unsigned value_type_label_to_flag( const char* type_desc );
|
||||||
|
const char* value_type_flag_to_label( unsigned flag );
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
// Class and Variable Description
|
// Class and Variable Description
|
||||||
@ -305,6 +328,8 @@ namespace cw
|
|||||||
//
|
//
|
||||||
// Instance
|
// Instance
|
||||||
//
|
//
|
||||||
|
|
||||||
|
rc_t instance_validate( instance_t* inst );
|
||||||
|
|
||||||
instance_t* instance_find( network_t& net, const char* inst_label, unsigned sfx_id );
|
instance_t* instance_find( network_t& net, const char* inst_label, unsigned sfx_id );
|
||||||
rc_t instance_find( network_t& net, const char* inst_label, unsigned sfx_id, instance_t*& instPtrRef );
|
rc_t instance_find( network_t& net, const char* inst_label, unsigned sfx_id, instance_t*& instPtrRef );
|
||||||
@ -313,6 +338,9 @@ namespace cw
|
|||||||
|
|
||||||
void instance_print( instance_t* inst );
|
void instance_print( instance_t* inst );
|
||||||
|
|
||||||
|
// Count of all var instances on this proc. This is a count of the length of inst->varL.
|
||||||
|
unsigned instance_var_count( instance_t* inst );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -321,13 +349,26 @@ namespace cw
|
|||||||
//
|
//
|
||||||
|
|
||||||
// Create a variable but do not assign it a value. Return a pointer to the new variable.
|
// Create a variable but do not assign it a value. Return a pointer to the new variable.
|
||||||
// Note: `value_cfg` is optional. Set it to NULL to ignore
|
// Notes:
|
||||||
rc_t var_create( instance_t* inst, const char* var_label, unsigned sfx_id, unsigned vid, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef );
|
// 1) `value_cfg` is optional. Set it to NULL to ignore
|
||||||
|
// 2) If `altTypeFl` is not set to kInvalidTFl then the var is assigned this type.
|
||||||
|
rc_t var_create( instance_t* inst, const char* var_label, unsigned sfx_id, unsigned vid, unsigned chIdx, const object_t* value_cfg, unsigned altTypeFlag, variable_t*& varRef );
|
||||||
|
|
||||||
// Channelizing creates a new var record with an explicit channel index to replace the
|
// Channelizing creates a new var record with an explicit channel index to replace the
|
||||||
// automatically generated variable whose channel index is set to 'all'.
|
// automatically generated variable whose channel index is set to 'all'.
|
||||||
rc_t var_channelize( instance_t* inst, const char* var_label, unsigned sfx_id, unsigned chIdx, const object_t* value_cfg, unsigned vid, variable_t*& varRef );
|
rc_t var_channelize( instance_t* inst, const char* var_label, unsigned sfx_id, unsigned chIdx, const object_t* value_cfg, unsigned vid, variable_t*& varRef );
|
||||||
|
|
||||||
|
// Set the var. type at runtime.
|
||||||
|
//rc_t var_set_type( instance_t* inst, unsigned chIdx, const char* var_label, unsigned sfx_id, unsigned type_flags );
|
||||||
|
|
||||||
|
// Wrapper around call to var->inst->members->value()
|
||||||
|
rc_t var_call_custom_value_func( variable_t* var );
|
||||||
|
|
||||||
|
// Sets and get the var->flags field
|
||||||
|
unsigned var_flags( instance_t* inst, unsigned chIdx, const char* var_label, unsigned sfx_id, unsigned& flags_ref );
|
||||||
|
rc_t var_set_flags( instance_t* inst, unsigned chIdx, const char* var_label, unsigned sfx_id, unsigned flags );
|
||||||
|
rc_t var_clr_flags( instance_t* inst, unsigned chIdx, const char* var_label, unsigned sfx_id, unsigned flags );
|
||||||
|
|
||||||
// `value_cfg` is optional. Set it to NULL to ignore
|
// `value_cfg` is optional. Set it to NULL to ignore
|
||||||
rc_t var_register( instance_t* inst, const char* var_label, unsigned sfx_id, unsigned vid, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef );
|
rc_t var_register( instance_t* inst, const char* var_label, unsigned sfx_id, unsigned vid, unsigned chIdx, const object_t* value_cfg, variable_t*& varRef );
|
||||||
|
|
||||||
@ -336,8 +377,9 @@ namespace cw
|
|||||||
|
|
||||||
// Return true if this var is acting as a source for another var.
|
// Return true if this var is acting as a source for another var.
|
||||||
bool is_a_source_var( const variable_t* var );
|
bool is_a_source_var( const variable_t* var );
|
||||||
|
|
||||||
|
rc_t var_mult_sfx_id_array( instance_t* inst, const char* var_label, unsigned* idA, unsigned idAllocN, unsigned& idN_ref );
|
||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
//
|
//
|
||||||
// var_register
|
// var_register
|
||||||
@ -461,18 +503,19 @@ namespace cw
|
|||||||
rc_t var_channel_count( const variable_t* var, unsigned& chCntRef );
|
rc_t var_channel_count( const variable_t* var, unsigned& chCntRef );
|
||||||
|
|
||||||
|
|
||||||
rc_t var_get( const variable_t* var, bool& valRef );
|
rc_t var_get( const variable_t* var, bool& valRef );
|
||||||
rc_t var_get( const variable_t* var, uint_t& valRef );
|
rc_t var_get( const variable_t* var, uint_t& valRef );
|
||||||
rc_t var_get( const variable_t* var, int_t& valRef );
|
rc_t var_get( const variable_t* var, int_t& valRef );
|
||||||
rc_t var_get( const variable_t* var, float& valRef );
|
rc_t var_get( const variable_t* var, float& valRef );
|
||||||
rc_t var_get( const variable_t* var, double& valRef );
|
rc_t var_get( const variable_t* var, double& valRef );
|
||||||
rc_t var_get( const variable_t* var, const char*& valRef );
|
rc_t var_get( const variable_t* var, const char*& valRef );
|
||||||
rc_t var_get( const variable_t* var, const abuf_t*& valRef );
|
rc_t var_get( const variable_t* var, const abuf_t*& valRef );
|
||||||
rc_t var_get( variable_t* var, abuf_t*& valRef );
|
rc_t var_get( variable_t* var, abuf_t*& valRef );
|
||||||
rc_t var_get( const variable_t* var, const fbuf_t*& valRef );
|
rc_t var_get( const variable_t* var, const fbuf_t*& valRef );
|
||||||
rc_t var_get( variable_t* var, fbuf_t*& valRef );
|
rc_t var_get( variable_t* var, fbuf_t*& valRef );
|
||||||
rc_t var_get( const variable_t* var, const mbuf_t*& valRef );
|
rc_t var_get( const variable_t* var, const mbuf_t*& valRef );
|
||||||
rc_t var_get( variable_t* var, mbuf_t*& valRef );
|
rc_t var_get( variable_t* var, mbuf_t*& valRef );
|
||||||
|
rc_t var_get( const variable_t* var, const object_t*& valRef );
|
||||||
|
|
||||||
template< typename T>
|
template< typename T>
|
||||||
rc_t var_get( instance_t* inst, unsigned vid, unsigned chIdx, T& valRef)
|
rc_t var_get( instance_t* inst, unsigned vid, unsigned chIdx, T& valRef)
|
||||||
@ -494,14 +537,28 @@ namespace cw
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, bool val );
|
rc_t var_set( variable_t* var, const value_t* val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, uint_t val );
|
rc_t var_set( variable_t* var, bool val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, int_t val );
|
rc_t var_set( variable_t* var, uint_t val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, float val );
|
rc_t var_set( variable_t* var, int_t val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, double val );
|
rc_t var_set( variable_t* var, float val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, const char* val );
|
rc_t var_set( variable_t* var, double val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, abuf_t* val );
|
rc_t var_set( variable_t* var, const char* val );
|
||||||
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, fbuf_t* val );
|
rc_t var_set( variable_t* var, abuf_t* val );
|
||||||
|
rc_t var_set( variable_t* var, fbuf_t* val );
|
||||||
|
rc_t var_set( variable_t* var, mbuf_t* val );
|
||||||
|
rc_t var_set( variable_t* var, const object_t* val );
|
||||||
|
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, const value_t* val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, bool val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, uint_t val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, int_t val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, float val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, double val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, const char* val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, abuf_t* val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, fbuf_t* val );
|
||||||
|
rc_t var_set( instance_t* inst, unsigned vid, unsigned chIdx, const object_t* val );
|
||||||
|
|
||||||
const preset_t* class_preset_find( class_desc_t* cd, const char* preset_label );
|
const preset_t* class_preset_find( class_desc_t* cd, const char* preset_label );
|
||||||
|
|
||||||
|
@ -23,7 +23,32 @@ and audio processing networks and the application of network state data.
|
|||||||
|
|
||||||
### Polyphonic Network.
|
### Polyphonic Network.
|
||||||
|
|
||||||
3. Network with sub-nets.
|
### Network with sub-nets.
|
||||||
|
|
||||||
|
## Proc Instance Syntax:
|
||||||
|
|
||||||
|
```
|
||||||
|
<label> : { 'class':<class>, "in":{<in_stmt>*}, "preset":<class_preset_label>, "log":<log_dict> "argLabel":<arg_preset_label>, "args":<args_dict> }
|
||||||
|
```
|
||||||
|
|
||||||
|
__args__ : This is a dictionary of named variable value records.
|
||||||
|
__preset__ : This string references a class preset to use for initializing this proc instance.
|
||||||
|
__argLabel__ : This string references an `args` dictionary parameter set to be applied after the __preset__ class preset.
|
||||||
|
If this argument is not given then it is automatically assigned the value "default". (What if there is not __arg__ record named default?
|
||||||
|
What if the are no __arg__ records at all?)
|
||||||
|
__log__ : This is a dictionary of `<var_label>:<sfx_id>` pairs whose value should be printed to the console when they change at runtime.
|
||||||
|
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
1. All fields except 'class' are optional.
|
||||||
|
2. The class preset named by __preset__ is always applied before the __arg__ values referenced by __argLabel__.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- When a preset is given as a list of values each entry in the list is taken as the value for
|
||||||
|
the associated channel. When a list value is given to a var that is of type 'cfg' the list is passed
|
||||||
|
as a single value.
|
||||||
|
|
||||||
|
|
||||||
## Processing Unit Class
|
## Processing Unit Class
|
||||||
@ -40,6 +65,7 @@ srate | (float) Sample rate type
|
|||||||
sample | (float) Audio sample type
|
sample | (float) Audio sample type
|
||||||
coeff | (float) Value that will be directly applied to a sample value (e.g added or multiplied)
|
coeff | (float) Value that will be directly applied to a sample value (e.g added or multiplied)
|
||||||
ftime | (double) Fractional seconds
|
ftime | (double) Fractional seconds
|
||||||
|
runtime| The type is left up to the processors custom 'create' function. These vars are not automatically created.
|
||||||
|
|
||||||
See list in cwFlowTypes.cpp : typeLabelFlagsA[]
|
See list in cwFlowTypes.cpp : typeLabelFlagsA[]
|
||||||
|
|
||||||
@ -166,6 +192,11 @@ uint | `uint32_t`
|
|||||||
real | `double`
|
real | `double`
|
||||||
audio | multi-channel audio
|
audio | multi-channel audio
|
||||||
spectrum | multi-channel spectrum
|
spectrum | multi-channel spectrum
|
||||||
|
cfg |
|
||||||
|
srate | platform defined sample rate type
|
||||||
|
sample | platform defined audio sample type
|
||||||
|
coeff | platform defined signal processing coefficient type
|
||||||
|
|
||||||
|
|
||||||
### Variable Flags:
|
### Variable Flags:
|
||||||
|
|
||||||
@ -180,7 +211,10 @@ Flag | Description
|
|||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
1. Unless the `no_src` attribute is set any variable may be connected to a source variable
|
1. Unless the `no_src` attribute is set any variable may be connected to a source variable
|
||||||
in the proc instantation 'in' statement.
|
in the proc instantation 'in' statement. `no_src` variables are output variables whose
|
||||||
|
value is calculated by the proc and therefore don't make sense to be fed from
|
||||||
|
some other entity.
|
||||||
|
|
||||||
|
|
||||||
2. By default all variables are created prior to the proc `create()` function being called.
|
2. By default all variables are created prior to the proc `create()` function being called.
|
||||||
Variable with the `no_dflt_create` attribute will not be created. This is useful in cases
|
Variable with the `no_dflt_create` attribute will not be created. This is useful in cases
|
||||||
|
Loading…
Reference in New Issue
Block a user