From 7e26fcbce1ab8b7f857f2fb4c09ba55b5bd4b09e Mon Sep 17 00:00:00 2001 From: Owen Green Date: Mon, 21 Feb 2022 10:02:36 +0000 Subject: [PATCH] NRT and Data objects ensure params can be set in NRT queue immediately after creation (#71) fixes #70 --- include/wrapper/NonRealtime.hpp | 39 ++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/include/wrapper/NonRealtime.hpp b/include/wrapper/NonRealtime.hpp index 61598af..32ca380 100644 --- a/include/wrapper/NonRealtime.hpp +++ b/include/wrapper/NonRealtime.hpp @@ -695,7 +695,16 @@ private: ptr->mClient.setParams(ptr->mParams); } else - printNotFound(NRTCommand::mID); + { + mParamsSize = args->size; + mParamsData = (char*) getInterfaceTable()->fRTAlloc(world, asUnsigned(mParamsSize)); + std::copy_n(args->data, args->size,mParamsData); +// mArgs = args; GAH WHY ISN"T THIS COPYABLE???? + mArgs.init(mParamsSize,mParamsData); + mArgs.count = args->count; + mArgs.rdpos = mParamsData + std::distance(args->data,args->rdpos); + mTryInNRT = true; + } } static const char* name() @@ -703,6 +712,34 @@ private: static std::string cmd = std::string(Wrapper::getName()) + "/setParams"; return cmd.c_str(); } + + bool stage2(World* world) + { + + if(!mTryInNRT) return false; + + if (auto ptr = get(NRTCommand::mID).lock()) + { + ptr->mParams.template setParameterValues(true, world, mArgs); + Result result = validateParameters(ptr->mParams); + ptr->mClient.setParams(ptr->mParams); + } + else + printNotFound(NRTCommand::mID); + + return true; + } + + bool stage3(World* world) + { + if(mParamsData) getInterfaceTable()->fRTFree(world, mParamsData); + return false; + } + + bool mTryInNRT{false}; + char* mParamsData{nullptr}; + int mParamsSize; + sc_msg_iter mArgs; };