Browse Source

Use writeDSPFactoryToMachineFile/readDSPFactoryFromMachineFile to implement machine code cache.

faust
Stephane Letz Andrew Belt 4 years ago
parent
commit
c8014e40dc
1 changed files with 30 additions and 13 deletions
  1. +30
    -13
      src/FaustEngine.cpp

+ 30
- 13
src/FaustEngine.cpp View File

@@ -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;


Loading…
Cancel
Save