diff --git a/cwFlow.cpp b/cwFlow.cpp index e1e7350..adb4dd3 100644 --- a/cwFlow.cpp +++ b/cwFlow.cpp @@ -745,6 +745,18 @@ namespace cw return rc; network_destroy(p->net); + + global_var_t* gv=p->globalVarL; + while( gv != nullptr ) + { + global_var_t* gv0 = gv->link; + mem::release(gv->var_label); + mem::release(gv->blob); + mem::release(gv); + gv = gv0; + } + + _release_class_desc_array(p->classDescA,p->classDescN); _release_class_desc_array(p->udpDescA,p->udpDescN); diff --git a/cwFlowNet.cpp b/cwFlowNet.cpp index a37e6a3..78e787e 100644 --- a/cwFlowNet.cpp +++ b/cwFlowNet.cpp @@ -170,16 +170,6 @@ namespace cw mem::release(net->preset_pairA); net->preset_pairN = 0; - net_global_var_t* gv=net->globalVarL; - while( gv != nullptr ) - { - net_global_var_t* gv0 = gv->link; - mem::release(gv->var_label); - mem::release(gv->blob); - mem::release(gv); - gv = gv0; - } - _destroy_ui_net(net->ui_net); mem::release(net); diff --git a/cwFlowTypes.cpp b/cwFlowTypes.cpp index 585347c..60c89cb 100644 --- a/cwFlowTypes.cpp +++ b/cwFlowTypes.cpp @@ -641,6 +641,20 @@ void cw::flow::class_dict_print( flow_t* p ) } +cw::flow::external_device_t* cw::flow::external_device_find( flow_t* p, const char* device_label, unsigned typeId, unsigned inOrOutFl, const char* midiPortLabel ) +{ + for(unsigned i=0; ideviceN; ++i) + if( (device_label==nullptr || cw::textIsEqual(p->deviceA[i].devLabel,device_label)) + && p->deviceA[i].typeId==typeId + && cwIsFlag(p->deviceA[i].flags,inOrOutFl) + && (midiPortLabel==nullptr || cw::textIsEqual(p->deviceA[i].portLabel,midiPortLabel)) ) + return p->deviceA + i; + + cwLogError(kInvalidArgRC,"The %s device named '%s' could not be found.", cwIsFlag(inOrOutFl,kInFl) ? "in" : "out", device_label ); + + return nullptr; +} + void cw::flow::network_print( const network_t& net ) { // for each proc in the network @@ -689,51 +703,6 @@ void cw::flow::network_print( const network_t& net ) } } -void* cw::flow::network_global_var( proc_t* proc, const char* var_label ) -{ - net_global_var_t* gv; - - assert( proc->net != nullptr ); - - for(gv=proc->net->globalVarL; gv!=nullptr; gv=gv->link ) - if( textIsEqual(proc->class_desc->label,gv->class_label) && textIsEqual(gv->var_label,var_label) ) - return gv->blob; - - return nullptr; -} - -cw::rc_t cw::flow::network_global_var_alloc( proc_t* proc, const char* var_label, const void* blob, unsigned blobByteN ) -{ - rc_t rc = kOkRC; - net_global_var_t* gv; - void* v; - - unsigned allocWordN = 0; - - if((v = network_global_var(proc,var_label)) != nullptr ) - { - rc = cwLogError(kInvalidArgRC,"The global variable '%s:%s' already exists.",cwStringNullGuard(proc->class_desc->label),cwStringNullGuard(var_label)); - goto errLabel; - } - - gv = mem::allocZ(); - - allocWordN = std::max(blobByteN/sizeof(unsigned),1ul); - - gv->class_label = proc->class_desc->label; - gv->var_label = mem::duplStr(var_label); - gv->blob = mem::allocZ(allocWordN); - gv->blobByteN = blobByteN; - memcpy(gv->blob,blob,blobByteN); - - gv->link = proc->net->globalVarL; - proc->net->globalVarL = gv; - -errLabel: - return rc; -} - - const cw::flow::network_preset_t* cw::flow::network_preset_from_label( const network_t& net, const char* preset_label ) { for(unsigned i=0; ideviceN; ++i) - if( (device_label==nullptr || cw::textIsEqual(p->deviceA[i].devLabel,device_label)) - && p->deviceA[i].typeId==typeId - && cwIsFlag(p->deviceA[i].flags,inOrOutFl) - && (midiPortLabel==nullptr || cw::textIsEqual(p->deviceA[i].portLabel,midiPortLabel)) ) - return p->deviceA + i; + global_var_t* gv; - cwLogError(kInvalidArgRC,"The %s device named '%s' could not be found.", cwIsFlag(inOrOutFl,kInFl) ? "in" : "out", device_label ); + assert( proc->net != nullptr ); + + for(gv=proc->ctx->globalVarL; gv!=nullptr; gv=gv->link ) + if( textIsEqual(proc->class_desc->label,gv->class_label) && textIsEqual(gv->var_label,var_label) ) + return gv->blob; return nullptr; } +cw::rc_t cw::flow::global_var_alloc( proc_t* proc, const char* var_label, const void* blob, unsigned blobByteN ) +{ + rc_t rc = kOkRC; + global_var_t* gv; + void* v; + + unsigned allocWordN = 0; + + if((v = global_var(proc,var_label)) != nullptr ) + { + rc = cwLogError(kInvalidArgRC,"The global variable '%s:%s' already exists.",cwStringNullGuard(proc->class_desc->label),cwStringNullGuard(var_label)); + goto errLabel; + } + + gv = mem::allocZ(); + + allocWordN = std::max(blobByteN/sizeof(unsigned),1ul); + + gv->class_label = proc->class_desc->label; + gv->var_label = mem::duplStr(var_label); + gv->blob = mem::allocZ(allocWordN); + gv->blobByteN = blobByteN; + memcpy(gv->blob,blob,blobByteN); + + gv->link = proc->ctx->globalVarL; + proc->ctx->globalVarL = gv; + +errLabel: + return rc; +} + + void cw::flow::proc_print( proc_t* proc ) { cwLogPrint("%s:%i\n", proc->label,proc->label_sfx_id); @@ -936,8 +936,6 @@ char* cw::flow::proc_expand_filename( const proc_t* proc, const char* fname ) return fn1; } - - cw::rc_t cw::flow::var_create( proc_t* proc, const char* var_label, unsigned sfx_id, unsigned id, unsigned chIdx, const object_t* value_cfg, unsigned altTypeFl, variable_t*& varRef ) { rc_t rc = kOkRC; diff --git a/cwFlowTypes.h b/cwFlowTypes.h index 15e9e19..77f7254 100644 --- a/cwFlowTypes.h +++ b/cwFlowTypes.h @@ -184,16 +184,16 @@ namespace cw const value_t* value; // } network_preset_pair_t; - typedef struct net_global_var_str + typedef struct global_var_str { const char* class_label; char* var_label; void* blob; unsigned blobByteN; - struct net_global_var_str* link; + struct global_var_str* link; - } net_global_var_t; + } global_var_t; typedef struct network_str { @@ -210,8 +210,6 @@ namespace cw network_preset_pair_t* preset_pairA; unsigned preset_pairN; - net_global_var_t* globalVarL; - struct network_str* poly_link; unsigned poly_idx; @@ -266,6 +264,8 @@ namespace cw variable_t ui_var_stub; variable_t* ui_var_tail; + global_var_t* globalVarL; + } flow_t; @@ -293,7 +293,15 @@ namespace cw const class_preset_t* class_preset_find( const class_desc_t* cd, const char* preset_label ); - void class_dict_print( flow_t* p ); + //------------------------------------------------------------------------------------------------------------------------ + // + // Flow + // + + void class_dict_print( flow_t* p ); + + external_device_t* external_device_find( flow_t* p, const char* device_label, unsigned typeId, unsigned inOrOutFl, const char* midiPortLabel=nullptr ); + //------------------------------------------------------------------------------------------------------------------------ @@ -301,12 +309,6 @@ namespace cw // Network // - // Access a blob stored via network_global_var() - void* network_global_var( proc_t* proc, const char* var_label ); - - // Copy a named blob into the network global variable space. - rc_t network_global_var_alloc( proc_t* proc, const char* var_label, const void* blob, unsigned blobByteN ); - void network_print(const network_t& net ); @@ -330,8 +332,13 @@ namespace cw proc_t* proc_find( network_t& net, const char* proc_label, unsigned sfx_id ); rc_t proc_find( network_t& net, const char* proc_label, unsigned sfx_id, proc_t*& procPtrRef ); - external_device_t* external_device_find( flow_t* p, const char* device_label, unsigned typeId, unsigned inOrOutFl, const char* midiPortLabel=nullptr ); + // Access a blob stored via global_var() + void* global_var( proc_t* proc, const char* var_label ); + + // Copy a named blob into the network global variable space. + rc_t global_var_alloc( proc_t* proc, const char* var_label, const void* blob, unsigned blobByteN ); + void proc_print( proc_t* proc ); // Count of all var instances on this proc. This is a count of the length of proc->varL.