|
- /*
- * DISTRHO Cardinal Plugin
- * Copyright (C) 2021 Filipe Coelho <falktx@falktx.com>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 3 of
- * the License, or any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * For a full copy of the GNU General Public License see the LICENSE file.
- */
-
- #include "src/lv2/buf-size.h"
- #include "src/lv2/options.h"
- #include <rack.hpp>
- #include <context.hpp>
-
- #include "DistrhoUtils.hpp"
-
- using namespace rack;
-
- extern Model* modelSpringReverb;
- Plugin* pluginInstance__Befaco;
-
- namespace rack {
- namespace settings {
- bool cpuMeter = false;
- }
- Context::~Context() {
- }
- static thread_local Context* threadContext;
- Context* contextGet() {
- DISTRHO_SAFE_ASSERT(threadContext != nullptr);
- return threadContext;
- }
- // Apple's clang incorrectly compiles this function when -O2 or higher is enabled.
- #ifdef ARCH_MAC
- __attribute__((optnone))
- #endif
- void contextSet(Context* const context) {
- // DISTRHO_SAFE_ASSERT(threadContext == nullptr);
- threadContext = context;
- }
- Exception::Exception(const char* format, ...)
- {
- va_list args;
- va_start(args, format);
- msg = string::fV(format, args);
- va_end(args);
- }
- namespace asset {
- std::string plugin(plugin::Plugin* plugin, std::string filename) { return {}; }
- std::string system(std::string filename) { return {}; }
- }
- namespace engine {
- float Engine::getParamValue(Module* module, int paramId) { return 0.0f; }
- float Engine::getParamSmoothValue(Module* module, int paramId) { return 0.0f; }
- void Engine::setParamValue(Module* module, int paramId, float value) {}
- void Engine::setParamSmoothValue(Module* module, int paramId, float value) {}
- }
- namespace plugin {
- void Plugin::addModel(Model* model)
- {
- // Check that the model is not added to a plugin already
- DISTRHO_SAFE_ASSERT_RETURN(model != nullptr,);
- DISTRHO_SAFE_ASSERT_RETURN(model->plugin == nullptr,);
- model->plugin = this;
- models.push_back(model);
- }
- Model* modelFromJson(json_t* moduleJ) {
- return nullptr;
- }
- std::vector<Plugin*> plugins;
- } // namespace plugin
- } // namespace rack
-
- struct PluginLv2 {
- Plugin* plugin;
- engine::Module* module;
- float sampleRate;
- int frameCount = 0;
-
- void* ports[11];
-
- PluginLv2(double sr)
- {
- sampleRate = sr;
- plugin = new Plugin;
- pluginInstance__Befaco = plugin;
- plugin->addModel(modelSpringReverb);
- module = modelSpringReverb->createModule();
-
- // FIXME we need to detect if something is connected
- // module->inputs[0].channels = 1;
- // module->inputs[1].channels = 1;
- module->inputs[2].channels = 1;
- module->inputs[3].channels = 1;
- module->inputs[4].channels = 1;
- module->outputs[0].channels = 1;
- module->outputs[1].channels = 1;
- }
-
- void lv2_connect_port(const uint32_t port, void* const dataLocation)
- {
- ports[port] = dataLocation;
- }
-
- void lv2_run(const uint32_t sampleCount)
- {
- if (sampleCount == 0)
- return;
-
- Module::ProcessArgs args = {
- sampleRate,
- 1.0f / sampleRate,
- frameCount
- };
-
- // const float* CV1_INPUT = (float*)ports[0];
- // const float* CV2_INPUT = (float*)ports[1];
- const float* IN1_INPUT = (float*)ports[2];
- const float* IN2_INPUT = (float*)ports[3];
- const float* MIX_CV_INPUT = (float*)ports[4];
- float* MIX_OUTPUT = (float*)ports[5];
- float* WET_OUTPUT = (float*)ports[6];
-
- const float drywet = *(float*)ports[7] * 0.01f;
- const float lvl1 = *(float*)ports[8] * 0.01f;
- const float lvl2 = *(float*)ports[9] * 0.01f;
- const float hpf = *(float*)ports[10];
-
- module->params[0].setValue(drywet);
- module->params[1].setValue(lvl1);
- module->params[2].setValue(lvl2);
- module->params[3].setValue(hpf);
-
- for (uint32_t i=0; i<sampleCount; ++i)
- {
- // module->inputs[0].setVoltage(CV1_INPUT[i]);
- // module->inputs[1].setVoltage(CV2_INPUT[i]);
- module->inputs[2].setVoltage(IN1_INPUT[i] * 10);
- module->inputs[3].setVoltage(IN2_INPUT[i] * 10);
- module->inputs[4].setVoltage(MIX_CV_INPUT[i]);
- module->doProcess(args);
- MIX_OUTPUT[i] = module->outputs[0].getVoltage() * 0.1f;
- WET_OUTPUT[i] = module->outputs[1].getVoltage() * 0.1f;
- ++args.frame;
- }
-
- frameCount += sampleCount;
- }
-
- };
-
- static LV2_Handle lv2_instantiate(const LV2_Descriptor*, double sampleRate, const char* bundlePath, const LV2_Feature* const* features)
- {
- return new PluginLv2(sampleRate);
- }
-
- // -----------------------------------------------------------------------
-
- #define instancePtr ((PluginLv2*)instance)
-
- static void lv2_connect_port(LV2_Handle instance, uint32_t port, void* dataLocation)
- {
- instancePtr->lv2_connect_port(port, dataLocation);
- }
-
- static void lv2_activate(LV2_Handle instance)
- {
- }
-
- static void lv2_run(LV2_Handle instance, uint32_t sampleCount)
- {
- instancePtr->lv2_run(sampleCount);
- }
-
- static void lv2_deactivate(LV2_Handle instance)
- {
- }
-
- static void lv2_cleanup(LV2_Handle instance)
- {
- delete instancePtr;
- }
-
- // -----------------------------------------------------------------------
-
- static const void* lv2_extension_data(const char* uri)
- {
- return nullptr;
- }
-
- #undef instancePtr
-
- // -----------------------------------------------------------------------
-
- static const LV2_Descriptor sLv2Descriptor = {
- "urn:Cardinal:Befaco",
- lv2_instantiate,
- lv2_connect_port,
- lv2_activate,
- lv2_run,
- lv2_deactivate,
- lv2_cleanup,
- lv2_extension_data
- };
-
- DISTRHO_PLUGIN_EXPORT
- const LV2_Descriptor* lv2_descriptor(uint32_t index)
- {
- USE_NAMESPACE_DISTRHO
- return (index == 0) ? &sLv2Descriptor : nullptr;
- }
-
- // -----------------------------------------------------------------------
|