|  |  | @@ -0,0 +1,84 @@ | 
		
	
		
			
			|  |  |  | #include "ScriptEngine.hpp" | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #include <faust/dsp/llvm-dsp.h> | 
		
	
		
			
			|  |  |  | #include <iostream> | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | class FaustEngine : public ScriptEngine { | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | public: | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | FaustEngine():fFactory(nullptr), fDSP(nullptr), fInputs(nullptr), fOutputs(nullptr) | 
		
	
		
			
			|  |  |  | {} | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | ~FaustEngine() | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | delete [] fInputs; | 
		
	
		
			
			|  |  |  | delete [] fOutputs; | 
		
	
		
			
			|  |  |  | delete fDSP; | 
		
	
		
			
			|  |  |  | deleteDSPFactory(fFactory); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | std::string getEngineName() override | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return "Faust"; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | 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"); | 
		
	
		
			
			|  |  |  | return -1; | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | display("Compiling finished"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | fDSP = fFactory->createDSPInstance(); | 
		
	
		
			
			|  |  |  | if (!fDSP) { | 
		
	
		
			
			|  |  |  | display("Cannot create Faust instance"); | 
		
	
		
			
			|  |  |  | return -1; | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | display("Creating DSP"); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | fInputs = new FAUSTFLOAT*[fDSP->getNumInputs()]; | 
		
	
		
			
			|  |  |  | fOutputs = new FAUSTFLOAT*[fDSP->getNumOutputs()]; | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | setFrameDivider(1); | 
		
	
		
			
			|  |  |  | setBufferSize(64); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | // TODO | 
		
	
		
			
			|  |  |  | //ProcessBlock* block = getProcessBlock(); | 
		
	
		
			
			|  |  |  | fDSP->init(44100); | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | int process() override | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | ProcessBlock* block = getProcessBlock(); | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | for (int chan = 0; chan < fDSP->getNumInputs(); chan++) { | 
		
	
		
			
			|  |  |  | fInputs[chan] = block->inputs[chan]; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | for (int chan = 0; chan < fDSP->getNumOutputs(); chan++) { | 
		
	
		
			
			|  |  |  | fOutputs[chan] = block->outputs[chan]; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | fDSP->compute(block->bufferSize, fInputs, fOutputs); | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  |  | 
		
	
		
			
			|  |  |  | private: | 
		
	
		
			
			|  |  |  | llvm_dsp_factory* fFactory; | 
		
	
		
			
			|  |  |  | llvm_dsp* fDSP; | 
		
	
		
			
			|  |  |  | FAUSTFLOAT** fInputs; | 
		
	
		
			
			|  |  |  | FAUSTFLOAT** fOutputs; | 
		
	
		
			
			|  |  |  | }; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | __attribute__((constructor(1000))) | 
		
	
		
			
			|  |  |  | static void constructor() { | 
		
	
		
			
			|  |  |  | addScriptEngine<FaustEngine>("dsp"); | 
		
	
		
			
			|  |  |  | } |