cwFlowPerf.h/cpp : score_player now outputs a 'record' type.
This commit is contained in:
parent
5d748bdb7e
commit
5dd9330c98
@ -83,6 +83,11 @@ namespace cw
|
|||||||
msg_t* msgA; // msgA[ msgN ]
|
msg_t* msgA; // msgA[ msgN ]
|
||||||
midi::ch_msg_t* chMsgA; // chMsgA[ msgN ]
|
midi::ch_msg_t* chMsgA; // chMsgA[ msgN ]
|
||||||
|
|
||||||
|
recd_array_t* recd_array;
|
||||||
|
unsigned midi_fld_idx;
|
||||||
|
unsigned loc_fld_idx;
|
||||||
|
unsigned meas_fld_idx;
|
||||||
|
|
||||||
vel_tbl_t* velTblL; // List of vel. tables.
|
vel_tbl_t* velTblL; // List of vel. tables.
|
||||||
vel_tbl_t* activeVelTbl; // Currently active vel. table or null if no vel. tbl is active.
|
vel_tbl_t* activeVelTbl; // Currently active vel. table or null if no vel. tbl is active.
|
||||||
|
|
||||||
@ -311,6 +316,43 @@ namespace cw
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rc_t _alloc_recd_array( proc_t* proc, const char* var_label, unsigned sfx_id, unsigned chIdx, const recd_type_t* base, recd_array_t*& recd_array_ref )
|
||||||
|
{
|
||||||
|
rc_t rc = kOkRC;
|
||||||
|
variable_t* var = nullptr;
|
||||||
|
|
||||||
|
// find the record variable
|
||||||
|
if((rc = var_find( proc, var_label, sfx_id, chIdx, var )) != kOkRC )
|
||||||
|
{
|
||||||
|
rc = cwLogError(rc,"The record variable '%s:%i' could was not found.",cwStringNullGuard(var_label),sfx_id);
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
// verify that the variable has a record format
|
||||||
|
if( !var_has_recd_format(var) )
|
||||||
|
{
|
||||||
|
rc = cwLogError(kInvalidArgRC,"The variable does not have a valid record format.");
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
recd_fmt_t* recd_fmt = var->varDesc->fmt.recd_fmt;
|
||||||
|
|
||||||
|
// create the recd_array
|
||||||
|
if((rc = recd_array_create( recd_array_ref, recd_fmt->recd_type, base, recd_fmt->alloc_cnt )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
errLabel:
|
||||||
|
if( rc != kOkRC )
|
||||||
|
rc = cwLogError(rc,"Record array create failed on the variable '%s:%i ch:%i.",cwStringNullGuard(var_label),sfx_id,chIdx);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
rc_t _create( proc_t* proc, inst_t* p )
|
rc_t _create( proc_t* proc, inst_t* p )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
@ -359,9 +401,20 @@ namespace cw
|
|||||||
goto errLabel;
|
goto errLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allocate the output recd array
|
||||||
|
if((rc = _alloc_recd_array( proc, "out", kBaseSfxId, kAnyChIdx, nullptr, p->recd_array )) != kOkRC )
|
||||||
|
{
|
||||||
|
goto errLabel;
|
||||||
|
}
|
||||||
|
|
||||||
// create one output MIDI buffer
|
// create one output MIDI buffer
|
||||||
rc = var_register_and_set( proc, "out", kBaseSfxId, kOutPId, kAnyChIdx, nullptr, 0 );
|
rc = var_register_and_set( proc, "out", kBaseSfxId, kOutPId, kAnyChIdx, p->recd_array->type, nullptr, 0 );
|
||||||
|
|
||||||
|
p->midi_fld_idx = recd_type_field_index( p->recd_array->type, "midi");
|
||||||
|
p->loc_fld_idx = recd_type_field_index( p->recd_array->type, "loc");
|
||||||
|
p->meas_fld_idx = recd_type_field_index( p->recd_array->type, "meas");
|
||||||
|
|
||||||
|
|
||||||
errLabel:
|
errLabel:
|
||||||
return rc;
|
return rc;
|
||||||
@ -392,29 +445,38 @@ namespace cw
|
|||||||
rc_t _exec( proc_t* proc, inst_t* p )
|
rc_t _exec( proc_t* proc, inst_t* p )
|
||||||
{
|
{
|
||||||
rc_t rc = kOkRC;
|
rc_t rc = kOkRC;
|
||||||
mbuf_t* mbuf = nullptr;
|
rbuf_t* rbuf = nullptr;
|
||||||
bool done_fl = false;
|
bool done_fl = false;
|
||||||
|
|
||||||
p->sample_idx += proc->ctx->framesPerCycle;
|
p->sample_idx += proc->ctx->framesPerCycle;
|
||||||
|
|
||||||
// get the output variable
|
// get the output variable
|
||||||
if((rc = var_get(proc,kOutPId,kAnyChIdx,mbuf)) != kOkRC )
|
if((rc = var_get(proc,kOutPId,kAnyChIdx,rbuf)) != kOkRC )
|
||||||
rc = cwLogError(kInvalidStateRC,"The MIDI file instance '%s' does not have a valid MIDI output buffer.",proc->label);
|
rc = cwLogError(kInvalidStateRC,"The MIDI file instance '%s' does not have a valid MIDI output buffer.",proc->label);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mbuf->msgA = nullptr;
|
rbuf->recdA = nullptr;
|
||||||
mbuf->msgN = 0;
|
rbuf->recdN = 0;
|
||||||
|
|
||||||
while( p->msg_idx < p->msgN && p->sample_idx >= p->msgA[p->msg_idx].sample_idx )
|
while( p->msg_idx < p->msgN && p->sample_idx >= p->msgA[p->msg_idx].sample_idx )
|
||||||
{
|
{
|
||||||
if( mbuf->msgA == nullptr )
|
recd_t* r = p->recd_array->recdA + rbuf->recdN;
|
||||||
|
msg_t* m = p->msgA + p->msg_idx;
|
||||||
|
|
||||||
|
if( rbuf->recdA == nullptr )
|
||||||
|
rbuf->recdA = r;
|
||||||
|
|
||||||
|
if( rbuf->recdN >= p->recd_array->allocRecdN )
|
||||||
{
|
{
|
||||||
// Note we only set a pointer to the first msg in p->chMsgA[]
|
rc = cwLogError(kBufTooSmallRC,"The internal record buffer overflowed. (buf recd count:%i).",p->recd_array->allocRecdN);
|
||||||
// successive messages will be consecutively after it.
|
goto errLabel;
|
||||||
mbuf->msgA = p->msgA[p->msg_idx].midi;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recd_set( rbuf->type, nullptr, r, p->midi_fld_idx, m->midi );
|
||||||
|
recd_set( rbuf->type, nullptr, r, p->loc_fld_idx, m->loc );
|
||||||
|
recd_set( rbuf->type, nullptr, r, p->meas_fld_idx, m->meas );
|
||||||
|
|
||||||
mbuf->msgN += 1;
|
rbuf->recdN += 1;
|
||||||
|
|
||||||
p->msg_idx += 1;
|
p->msg_idx += 1;
|
||||||
|
|
||||||
@ -427,7 +489,7 @@ namespace cw
|
|||||||
var_set(proc, kDoneFlPId, kAnyChIdx, true );
|
var_set(proc, kDoneFlPId, kAnyChIdx, true );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
errLabel:
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -449,6 +511,7 @@ namespace cw
|
|||||||
//
|
//
|
||||||
// Midi To Msg
|
// Midi To Msg
|
||||||
//
|
//
|
||||||
|
/*
|
||||||
namespace midi_to_msg
|
namespace midi_to_msg
|
||||||
{
|
{
|
||||||
enum {
|
enum {
|
||||||
@ -461,6 +524,7 @@ namespace cw
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
recd_array_t* recd_array;
|
recd_array_t* recd_array;
|
||||||
|
rbuf_t* rbuf;
|
||||||
|
|
||||||
unsigned allocRecdN;
|
unsigned allocRecdN;
|
||||||
unsigned midiFieldIdx;
|
unsigned midiFieldIdx;
|
||||||
@ -477,7 +541,6 @@ namespace cw
|
|||||||
s[sn] = 0;
|
s[sn] = 0;
|
||||||
|
|
||||||
recd_type_t* recd_type = nullptr;
|
recd_type_t* recd_type = nullptr;
|
||||||
|
|
||||||
if((rc = recd_type_create( recd_type, nullptr, s )) != kOkRC )
|
if((rc = recd_type_create( recd_type, nullptr, s )) != kOkRC )
|
||||||
{
|
{
|
||||||
rc = cwLogError(kOpFailRC,"recd type failed on field strings:'%s'.",cwStringNullGuard(s));
|
rc = cwLogError(kOpFailRC,"recd type failed on field strings:'%s'.",cwStringNullGuard(s));
|
||||||
@ -598,7 +661,7 @@ namespace cw
|
|||||||
};
|
};
|
||||||
|
|
||||||
} // midi_to_msg
|
} // midi_to_msg
|
||||||
|
*/
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
|
@ -3,7 +3,7 @@ namespace cw
|
|||||||
namespace flow
|
namespace flow
|
||||||
{
|
{
|
||||||
namespace score_player { extern class_members_t members; }
|
namespace score_player { extern class_members_t members; }
|
||||||
namespace midi_to_msg { extern class_members_t members; }
|
//namespace midi_to_msg { extern class_members_t members; }
|
||||||
namespace score_follower { extern class_members_t members; }
|
namespace score_follower { extern class_members_t members; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user