/* * DISTHRO Plugin Toolkit (DPT) * Copyright (C) 2012 Filipe Coelho * * 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 2 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 license see the GPL.txt file */ #ifndef __DISTRHO_PLUGIN_INTERNAL_H__ #define __DISTRHO_PLUGIN_INTERNAL_H__ #include "DistrhoPlugin.h" #include START_NAMESPACE_DISTRHO // ------------------------------------------------- #define MAX_MIDI_EVENTS 512 static uint32_t d_lastBufferSize = 0; static double d_lastSampleRate = 0.0; struct PluginPrivateData { uint32_t bufferSize; double sampleRate; uint32_t parameterCount; Parameter* parameters; #if DISTRHO_PLUGIN_WANT_PROGRAMS uint32_t programCount; d_string* programNames; #endif #if DISTRHO_PLUGIN_WANT_STATE uint32_t stateCount; d_string* stateKeys; #endif #if DISTRHO_PLUGIN_WANT_LATENCY uint32_t latency; #endif TimePos timePos; PluginPrivateData() : bufferSize(d_lastBufferSize), sampleRate(d_lastSampleRate), parameterCount(0), parameters(nullptr), #if DISTRHO_PLUGIN_WANT_PROGRAMS programCount(0), programNames(nullptr), #endif #if DISTRHO_PLUGIN_WANT_STATE stateCount(0), stateKeys(nullptr), #endif #if DISTRHO_PLUGIN_WANT_LATENCY latency(0), #endif timePos() { assert(d_lastSampleRate != 0.0); } ~PluginPrivateData() { if (parameterCount > 0 && parameters) delete[] parameters; #if DISTRHO_PLUGIN_WANT_PROGRAMS if (programCount > 0 && programNames) delete[] programNames; #endif #if DISTRHO_PLUGIN_WANT_STATE if (stateCount > 0 && stateKeys) delete[] stateKeys; #endif } }; // ------------------------------------------------- class PluginInternal { public: PluginInternal() : plugin(createPlugin()), data(nullptr) { assert(plugin); if (! plugin) return; data = plugin->data; for (uint32_t i=0; i < data->parameterCount; i++) plugin->d_initParameter(i, data->parameters[i]); #if DISTRHO_PLUGIN_WANT_PROGRAMS for (uint32_t i=0; i < data->programCount; i++) plugin->d_initProgramName(i, data->programNames[i]); #endif #if DISTRHO_PLUGIN_WANT_STATE for (uint32_t i=0; i < data->stateCount; i++) plugin->d_initStateKey(i, data->stateKeys[i]); #endif } ~PluginInternal() { if (plugin) delete plugin; } // --------------------------------------------- const char* name() { assert(plugin); return plugin ? plugin->d_name() : ""; } const char* label() { assert(plugin); return plugin ? plugin->d_label() : ""; } const char* maker() { assert(plugin); return plugin ? plugin->d_maker() : ""; } const char* license() { assert(plugin); return plugin ? plugin->d_license() : ""; } uint32_t version() { assert(plugin); return plugin ? plugin->d_version() : 1000; } long uniqueId() { assert(plugin); return plugin ? plugin->d_uniqueId() : 0; } // --------------------------------------------- #if DISTRHO_PLUGIN_WANT_LATENCY uint32_t latency() const { assert(data); return data ? data->latency : 0; } #endif uint32_t parameterCount() const { assert(data); return data ? data->parameterCount : 0; } uint32_t parameterHints(uint32_t index) const { assert(data && index < data->parameterCount); return (data && index < data->parameterCount) ? data->parameters[index].hints : 0x0; } bool parameterIsOutput(uint32_t index) const { uint32_t hints = parameterHints(index); return bool(hints & PARAMETER_IS_OUTPUT); } const d_string& parameterName(uint32_t index) const { assert(data && index < data->parameterCount); return (data && index < data->parameterCount) ? data->parameters[index].name : fallbackString; } const d_string& parameterSymbol(uint32_t index) const { assert(data && index < data->parameterCount); return (data && index < data->parameterCount) ? data->parameters[index].symbol : fallbackString; } const d_string& parameterUnit(uint32_t index) const { assert(data && index < data->parameterCount); return (data && index < data->parameterCount) ? data->parameters[index].unit : fallbackString; } const ParameterRanges* parameterRanges(uint32_t index) const { assert(data && index < data->parameterCount); return (data && index < data->parameterCount) ? &data->parameters[index].ranges : &fallbackRanges; } float parameterValue(uint32_t index) { assert(plugin && index < data->parameterCount); return (plugin && index < data->parameterCount) ? plugin->d_parameterValue(index) : 0.0f; } void setParameterValue(uint32_t index, float value) { assert(plugin && index < data->parameterCount); if (plugin && index < data->parameterCount) plugin->d_setParameterValue(index, value); } #if DISTRHO_PLUGIN_WANT_PROGRAMS uint32_t programCount() const { assert(data); return data ? data->programCount : 0; } const d_string& programName(uint32_t index) const { assert(data && index < data->programCount); return (data && index < data->programCount) ? data->programNames[index] : fallbackString; } void setProgram(uint32_t index) { assert(plugin && index < data->programCount); if (plugin && index < data->programCount) plugin->d_setProgram(index); } #endif #if DISTRHO_PLUGIN_WANT_STATE uint32_t stateCount() const { assert(data); return data ? data->stateCount : 0; } const d_string& stateKey(uint32_t index) const { assert(data && index < data->stateCount); return (data && index < data->stateCount) ? data->stateKeys[index] : fallbackString; } void setState(const char* key, const char* value) { assert(plugin && key && value); if (plugin && key && value) plugin->d_setState(key, value); } #endif // --------------------------------------------- void activate() { assert(plugin); if (plugin) plugin->d_activate(); } void deactivate() { assert(plugin); if (plugin) plugin->d_deactivate(); } void run(const float** inputs, float** outputs, uint32_t frames, uint32_t midiEventCount, const MidiEvent* midiEvents) { assert(plugin && frames >= 2); if (plugin) plugin->d_run(inputs, outputs, frames, midiEventCount, midiEvents); } void setBufferSize(uint32_t bufferSize, bool callback = false) { assert(data && plugin && bufferSize >= 2); if (callback && data->bufferSize == bufferSize) callback = false; if (data) data->bufferSize = bufferSize; if (plugin && callback) { plugin->d_deactivate(); plugin->d_bufferSizeChanged(bufferSize); plugin->d_activate(); } } // --------------------------------------------- protected: Plugin* const plugin; PluginPrivateData* data; private: static const d_string fallbackString; static const ParameterRanges fallbackRanges; }; // ------------------------------------------------- END_NAMESPACE_DISTRHO #endif // __DISTRHO_PLUGIN_INTERNAL_H__