Fail more informatively and gracefully if number of arguments from language side doesn't match server object's expectations

include/FluidSCWrapper.hpp
nix
Owen Green 7 years ago
parent dfa552131a
commit e6d4bacaf5

@ -33,23 +33,17 @@ struct FloatControlsIter
float next() float next()
{ {
assert(mCount < mSize && "Boundary error fail horror"); return mCount >= mSize ? 0 : *mValues[mCount++];
float f = *mValues[mCount++];
return f;
} }
// float operator[](size_t i)
// {
// assert(i < mSize);
// return *mValues[i];
// }
void reset(float** vals) void reset(float** vals)
{ {
mValues = vals; mValues = vals;
mCount = 0; mCount = 0;
} }
size_t size() const noexcept { return mSize; }
private: private:
float** mValues; float** mValues;
size_t mSize; size_t mSize;
@ -178,6 +172,17 @@ public:
{ {
assert(!(mClient.audioChannelsOut() > 0 && mClient.controlChannelsOut() > 0) && "Client can't have both audio and control outputs"); assert(!(mClient.audioChannelsOut() > 0 && mClient.controlChannelsOut() > 0) && "Client can't have both audio and control outputs");
//If we don't the number of arguments we expect, the language side code is probably the wrong version
//set plugin to no-op, squawk, and bail;
if(mControlsIterator.size() != Wrapper::getParamDescriptors()->count())
{
mCalcFunc = Wrapper::getInterfaceTable()->fClearUnitOutputs;
std::cout << "ERROR: " << Wrapper::getName() <<
" wrong number of arguments. Expected " << Wrapper::getParamDescriptors()->count() <<
", got " << mControlsIterator.size() << ". Your .sc file and binary plugin might be different versions." << std::endl;
return;
}
mInputConnections.reserve(mClient.audioChannelsIn()); mInputConnections.reserve(mClient.audioChannelsIn());
mOutputConnections.reserve(mClient.audioChannelsOut()); mOutputConnections.reserve(mClient.audioChannelsOut());
mAudioInputs.reserve(mClient.audioChannelsIn()); mAudioInputs.reserve(mClient.audioChannelsIn());
@ -251,14 +256,23 @@ public:
static void launch(World *world, void *inUserData, struct sc_msg_iter *args, void *replyAddr) static void launch(World *world, void *inUserData, struct sc_msg_iter *args, void *replyAddr)
{ {
if(args->tags && ((std::string{args->tags}.size() - 1) != Wrapper::getParamDescriptors()->count()))
{
std::cout << "ERROR: " << Wrapper::getName() <<
" wrong number of arguments. Expected " << Wrapper::getParamDescriptors()->count() <<
", got " << (std::string{args->tags}.size() - 1) << ". Your .sc file and binary plugin might be different versions." << std::endl;
return;
}
Wrapper *w = new Wrapper(world,args); //this has to be on the heap, because it doesn't get destoryed until the async command is done Wrapper *w = new Wrapper(world,args); //this has to be on the heap, because it doesn't get destoryed until the async command is done
int argsPosition = args->count; int argsPosition = args->count;
auto argsRdPos = args->rdpos; auto argsRdPos = args->rdpos;
Result result = validateParameters(w, world, args); Result result = validateParameters(w, world, args);
if (!result.ok()) if (!result.ok())
{ {
std::cout << "FluCoMa Error " << Wrapper::getName() << ": " << result.message().c_str(); std::cout << "ERROR: " << Wrapper::getName() << ": " << result.message().c_str() << std::endl;
delete w; delete w;
return; return;
} }
@ -308,7 +322,7 @@ private:
if(!r.ok()) if(!r.ok())
{ {
std::cout << "FluCoMa Error " << Wrapper::getName() << ": " << r.message().c_str(); std::cout << "ERROR: " << Wrapper::getName() << ": " << r.message().c_str();
return false; return false;
} }
@ -436,7 +450,9 @@ public:
template<typename ParameterSet> template<typename ParameterSet>
static auto& setParams(ParameterSet& p, bool verbose, World* world, impl::FloatControlsIter& inputs) static auto& setParams(ParameterSet& p, bool verbose, World* world, impl::FloatControlsIter& inputs)
{ {
p.template setParameterValues<impl::ControlGetter>(verbose, world, inputs); //We won't even try and set params if the arguments don't match
if(inputs.size() == getParamDescriptors()->count())
p.template setParameterValues<impl::ControlGetter>(verbose, world, inputs);
return p; return p;
} }

Loading…
Cancel
Save