/* * DISTRHO Plugin Framework (DPF) * Copyright (C) 2012-2025 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this * permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "DistrhoPluginInternal.hpp" #ifndef DISTRHO_NO_WARNINGS # if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST # error Cannot use parameter value change request with MAPI # endif # if DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT # error Cannot use MIDI with MAPI # endif # if DISTRHO_PLUGIN_WANT_FULL_STATE # error Cannot use full state with MAPI # endif # if DISTRHO_PLUGIN_WANT_TIMEPOS # error Cannot use time position with MAPI # endif #endif #include "mapi/mapi.h" START_NAMESPACE_DISTRHO // -------------------------------------------------------------------------------------------------------------------- class PluginMAPI { public: PluginMAPI() : fPlugin(nullptr, nullptr, nullptr, nullptr) { fPlugin.activate(); } ~PluginMAPI() noexcept { fPlugin.deactivate(); } // ---------------------------------------------------------------------------------------------------------------- void process(const float* const* ins, float** outs, unsigned int frames) { #if DISTRHO_PLUGIN_WANT_MIDI_INPUT fPlugin.run(const_cast(ins), outs, frames, nullptr, 0); #else fPlugin.run(const_cast(ins), outs, frames); #endif updateParameterOutputsAndTriggers(); } void setParameter(unsigned int index, float value) { fPlugin.setParameterValue(index, fPlugin.getParameterRanges(index).getFixedValue(value)); } void setState(const char* key, const char* value) { #if DISTRHO_PLUGIN_WANT_STATE fPlugin.setState(key, value); #else // unused (void)key; (void)value; #endif } // ---------------------------------------------------------------------------------------------------------------- private: PluginExporter fPlugin; void updateParameterOutputsAndTriggers() { float value; for (uint32_t i = 0, count = fPlugin.getParameterCount(); i < count; ++i) { if ((fPlugin.getParameterHints(i) & kParameterIsTrigger) == kParameterIsTrigger) { // NOTE: no trigger support in MAPI, simulate it here value = fPlugin.getParameterRanges(i).def; if (d_isEqual(value, fPlugin.getParameterValue(i))) continue; fPlugin.setParameterValue(i, value); } } } }; // -------------------------------------------------------------------------------------------------------------------- MAPI_EXPORT mapi_handle_t mapi_create(unsigned int sample_rate) { if (d_nextBufferSize == 0) { #if defined(_DARKGLASS_DEVICE_PABLITO) d_nextBufferSize = 16; #elif defined(__MOD_DEVICES__) d_nextBufferSize = 128; #else d_nextBufferSize = 2048; #endif } d_nextSampleRate = sample_rate; return new PluginMAPI(); } MAPI_EXPORT void mapi_process(mapi_handle_t handle, const float* const* ins, float** outs, unsigned int frames) { static_cast(handle)->process(ins, outs, frames); } MAPI_EXPORT void mapi_set_parameter(mapi_handle_t handle, unsigned int index, float value) { static_cast(handle)->setParameter(index, value); } MAPI_EXPORT void mapi_set_state(mapi_handle_t handle, const char* key, const char* value) { static_cast(handle)->setState(key, value); } MAPI_EXPORT void mapi_destroy(mapi_handle_t handle) { delete static_cast(handle); } // -------------------------------------------------------------------------------------------------------------------- END_NAMESPACE_DISTRHO