From 7c37e211c705e644454faa8974d4018feeab855d Mon Sep 17 00:00:00 2001 From: Stephane Letz Date: Fri, 10 Jul 2020 18:10:08 +0200 Subject: [PATCH] Implement sample-rate change. --- src/FaustEngine.cpp | 52 ++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/FaustEngine.cpp b/src/FaustEngine.cpp index 4c51b27..32a9638 100644 --- a/src/FaustEngine.cpp +++ b/src/FaustEngine.cpp @@ -3,6 +3,8 @@ #include #include +#define kBufferSize 64 + class FaustEngine : public ScriptEngine { public: @@ -25,40 +27,41 @@ class FaustEngine : public ScriptEngine { int run(const std::string& path, const std::string& script) override { - display("Compiling..."); - std::string error_msg; fFactory = createDSPFactoryFromString("FaustDSP", script, 0, NULL, "", error_msg, -1); if (!fFactory) { - display("Cannot create Faust factory"); + display("ERROR: cannot create Faust factory !"); return -1; } else { - display("Compiling finished"); + display("Compiling factory finished"); } fDSP = fFactory->createDSPInstance(); if (!fDSP) { - display("Cannot create Faust instance"); + display("ERROR: cannot create Faust instance !"); return -1; } else { - display("Creating DSP"); + display("Created DSP"); } - fInputs = new FAUSTFLOAT*[fDSP->getNumInputs()]; - fOutputs = new FAUSTFLOAT*[fDSP->getNumOutputs()]; + // Prepare inputs/ouputs + if (fDSP->getNumInputs() > 6) { + display("ERROR: DSP has " + std::to_string(fDSP->getNumInputs()) + " inputs !"); + return -1; + } - setFrameDivider(1); - setBufferSize(64); + if (fDSP->getNumOutputs() > 6) { + display("ERROR: DSP has " + std::to_string(fDSP->getNumInputs()) + " outputs !"); + return -1; + } - // TODO - //ProcessBlock* block = getProcessBlock(); - fDSP->init(44100); - return 0; - } - - int process() override - { + setFrameDivider(1); + setBufferSize(kBufferSize); + + // Prepare buffers for process ProcessBlock* block = getProcessBlock(); + fInputs = new FAUSTFLOAT*[fDSP->getNumInputs()]; + fOutputs = new FAUSTFLOAT*[fDSP->getNumOutputs()]; for (int chan = 0; chan < fDSP->getNumInputs(); chan++) { fInputs[chan] = block->inputs[chan]; @@ -67,7 +70,18 @@ class FaustEngine : public ScriptEngine { fOutputs[chan] = block->outputs[chan]; } - fDSP->compute(block->bufferSize, fInputs, fOutputs); + // Init DSP with default SR + fDSP->init(44100); + return 0; + } + + int process() override + { + // Possibly update SR + if (getProcessBlock()->sampleRate != fDSP->getSampleRate()) { + fDSP->init(getProcessBlock()->sampleRate); + } + fDSP->compute(kBufferSize, fInputs, fOutputs); return 0; }