#include "CustomEffect.h" #include #include "../MathUtil.h" const juce::String CustomEffect::FILE_NAME = "6a3580b0-c5fc-4b28-a33e-e26a487f052f"; CustomEffect::CustomEffect(std::function errorCallback) : errorCallback(errorCallback) {} CustomEffect::~CustomEffect() { parser->close(L); } Point CustomEffect::apply(int index, Point input, const std::vector& values, double sampleRate) { auto effectScale = values[0]; auto x = input.x; auto y = input.y; auto z = input.z; { juce::SpinLock::ScopedLockType lock(codeLock); if (!defaultScript) { parser->setVariable("x", x); parser->setVariable("y", y); parser->setVariable("z", z); auto result = parser->run(L, LuaVariables{sampleRate, 0}, step, phase); if (result.size() >= 3) { x = result[0]; y = result[1]; z = result[2]; } } else { parser->resetErrors(); } } return Point( (1 - effectScale) * input.x + effectScale * x, (1 - effectScale) * input.y + effectScale * y, (1 - effectScale) * input.z + effectScale * z ); } void CustomEffect::updateCode(const juce::String& newCode) { juce::SpinLock::ScopedLockType lock(codeLock); defaultScript = newCode == DEFAULT_SCRIPT; code = newCode; parser = std::make_unique(FILE_NAME, code, errorCallback); } void CustomEffect::setVariable(juce::String variableName, double value) { juce::SpinLock::ScopedLockType lock(codeLock); if (!defaultScript) { parser->setVariable(variableName, value); } } juce::String CustomEffect::getCode() { juce::SpinLock::ScopedLockType lock(codeLock); return code; }