From c8014e40dc4fda566689215a71c86c30a22f78b6 Mon Sep 17 00:00:00 2001 From: Stephane Letz Date: Fri, 10 Jul 2020 21:53:18 +0200 Subject: [PATCH] Use writeDSPFactoryToMachineFile/readDSPFactoryFromMachineFile to implement machine code cache. --- src/FaustEngine.cpp | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/FaustEngine.cpp b/src/FaustEngine.cpp index 32a9638..75b73c4 100644 --- a/src/FaustEngine.cpp +++ b/src/FaustEngine.cpp @@ -9,7 +9,7 @@ class FaustEngine : public ScriptEngine { public: - FaustEngine():fFactory(nullptr), fDSP(nullptr), fInputs(nullptr), fOutputs(nullptr) + FaustEngine():fDSPFactory(nullptr), fDSP(nullptr), fInputs(nullptr), fOutputs(nullptr) {} ~FaustEngine() @@ -17,7 +17,7 @@ class FaustEngine : public ScriptEngine { delete [] fInputs; delete [] fOutputs; delete fDSP; - deleteDSPFactory(fFactory); + deleteDSPFactory(fDSPFactory); } std::string getEngineName() override @@ -27,16 +27,32 @@ class FaustEngine : public ScriptEngine { int run(const std::string& path, const std::string& script) override { + std::string filename = path.substr(path.find_last_of("/")); + #if defined ARCH_MAC + std::string tempDir = "/private/var/tmp/"; + #else + std::string tempDir = ""; + #endif std::string error_msg; - fFactory = createDSPFactoryFromString("FaustDSP", script, 0, NULL, "", error_msg, -1); - if (!fFactory) { - display("ERROR: cannot create Faust factory !"); - return -1; - } else { - display("Compiling factory finished"); + + // Try to load the machine code cache + fDSPFactory = readDSPFactoryFromMachineFile(tempDir + filename, "", error_msg); + + if (!fDSPFactory) { + // Otherwise recompile the DSP + fDSPFactory = createDSPFactoryFromString("FaustDSP", script, 0, NULL, "", error_msg, -1); + if (!fDSPFactory) { + display("ERROR: cannot create Faust factory !"); + return -1; + } else { + // And save the cache + display("Compiling factory finished"); + writeDSPFactoryToMachineFile(fDSPFactory, tempDir + filename, ""); + } } - fDSP = fFactory->createDSPInstance(); + // Create DSP + fDSP = fDSPFactory->createDSPInstance(); if (!fDSP) { display("ERROR: cannot create Faust instance !"); return -1; @@ -44,7 +60,7 @@ class FaustEngine : public ScriptEngine { display("Created DSP"); } - // Prepare inputs/ouputs + // Prepare inputs/outputs if (fDSP->getNumInputs() > 6) { display("ERROR: DSP has " + std::to_string(fDSP->getNumInputs()) + " inputs !"); return -1; @@ -60,12 +76,13 @@ class FaustEngine : public ScriptEngine { // Prepare buffers for process ProcessBlock* block = getProcessBlock(); - fInputs = new FAUSTFLOAT*[fDSP->getNumInputs()]; - fOutputs = new FAUSTFLOAT*[fDSP->getNumOutputs()]; + fInputs = new FAUSTFLOAT*[fDSP->getNumInputs()]; for (int chan = 0; chan < fDSP->getNumInputs(); chan++) { fInputs[chan] = block->inputs[chan]; } + + fOutputs = new FAUSTFLOAT*[fDSP->getNumOutputs()]; for (int chan = 0; chan < fDSP->getNumOutputs(); chan++) { fOutputs[chan] = block->outputs[chan]; } @@ -86,7 +103,7 @@ class FaustEngine : public ScriptEngine { } private: - llvm_dsp_factory* fFactory; + llvm_dsp_factory* fDSPFactory; llvm_dsp* fDSP; FAUSTFLOAT** fInputs; FAUSTFLOAT** fOutputs;