| @@ -0,0 +1,581 @@ | |||
| /* | |||
| * Carla Backend | |||
| * Copyright (C) 2011-2012 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef CARLA_BACKEND_HPP | |||
| #define CARLA_BACKEND_HPP | |||
| #include "carla_defines.hpp" | |||
| #include <cstdint> | |||
| #define CARLA_BACKEND_START_NAMESPACE namespace CarlaBackend { | |||
| #define CARLA_BACKEND_END_NAMESPACE } | |||
| #define CARLA_BACKEND_USE_NAMESPACE using namespace CarlaBackend; | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| #define STR_MAX 0xFF | |||
| /*! | |||
| * @defgroup CarlaBackendAPI Carla Backend API | |||
| * | |||
| * The Carla Backend API | |||
| * | |||
| * @{ | |||
| */ | |||
| #ifdef BUILD_BRIDGE | |||
| const unsigned short MAX_PLUGINS = 1; | |||
| #else | |||
| const unsigned short MAX_PLUGINS = 99; //!< Maximum number of loadable plugins | |||
| #endif | |||
| const unsigned int MAX_PARAMETERS = 200; //!< Default value for the maximum number of parameters allowed.\see OPTION_MAX_PARAMETERS | |||
| /*! | |||
| * @defgroup PluginHints Plugin Hints | |||
| * | |||
| * Various plugin hints. | |||
| * \see CarlaPlugin::hints() | |||
| * @{ | |||
| */ | |||
| #ifndef BUILD_BRIDGE | |||
| const unsigned int PLUGIN_IS_BRIDGE = 0x001; //!< Plugin is a bridge (ie, BridgePlugin). This hint is required because "bridge" itself is not a plugin type. | |||
| #endif | |||
| const unsigned int PLUGIN_IS_SYNTH = 0x002; //!< Plugin is a synthesizer (produces sound). | |||
| const unsigned int PLUGIN_HAS_GUI = 0x004; //!< Plugin has its own custom GUI. | |||
| const unsigned int PLUGIN_USES_CHUNKS = 0x008; //!< Plugin uses chunks to save internal data.\see CarlaPlugin::chunkData() | |||
| const unsigned int PLUGIN_USES_SINGLE_THREAD = 0x010; //!< Plugin needs a single thread for both DSP processing and UI events. | |||
| const unsigned int PLUGIN_CAN_DRYWET = 0x020; //!< Plugin can make use of Dry/Wet controls. | |||
| const unsigned int PLUGIN_CAN_VOLUME = 0x040; //!< Plugin can make use of Volume controls. | |||
| const unsigned int PLUGIN_CAN_BALANCE = 0x080; //!< Plugin can make use of Left & Right Balance controls. | |||
| const unsigned int PLUGIN_CAN_FORCE_STEREO = 0x100; //!< Plugin can be used in forced-stereo mode. | |||
| /**@}*/ | |||
| /*! | |||
| * @defgroup ParameterHints Parameter Hints | |||
| * | |||
| * Various parameter hints. | |||
| * \see CarlaPlugin::parameterData() | |||
| * @{ | |||
| */ | |||
| const unsigned int PARAMETER_IS_BOOLEAN = 0x01; //!< Parameter value is of boolean type (always at minimum or maximum). | |||
| const unsigned int PARAMETER_IS_INTEGER = 0x02; //!< Parameter values are always integer. | |||
| const unsigned int PARAMETER_IS_LOGARITHMIC = 0x04; //!< Parameter is logarithmic (informative only, not really implemented). | |||
| const unsigned int PARAMETER_IS_ENABLED = 0x08; //!< Parameter is enabled and will be shown in the host built-in editor. | |||
| const unsigned int PARAMETER_IS_AUTOMABLE = 0x10; //!< Parameter is automable (realtime safe) | |||
| const unsigned int PARAMETER_USES_SAMPLERATE = 0x20; //!< Parameter needs sample rate to work (value and ranges are multiplied by SR, and divided by SR on save). | |||
| const unsigned int PARAMETER_USES_SCALEPOINTS = 0x40; //!< Parameter uses scalepoints to define internal values in a meaninful way. | |||
| const unsigned int PARAMETER_USES_CUSTOM_TEXT = 0x80; //!< Parameter uses custom text for displaying its value.\see CarlaPlugin::getParameterText() | |||
| /**@}*/ | |||
| /*! | |||
| * @defgroup CustomDataTypes Custom Data types | |||
| * | |||
| * The type defines how the \param value in CustomData is stored. | |||
| * | |||
| * Types are valid URIs.\n | |||
| * Any non-string type is saved in a base64 encoded format. | |||
| */ | |||
| const char* const CUSTOM_DATA_INVALID = nullptr; //!< Null/Invalid data. | |||
| const char* const CUSTOM_DATA_CHUNK = "http://kxstudio.sf.net/ns/carla/chunk"; //!< Carla Chunk | |||
| const char* const CUSTOM_DATA_STRING = "http://kxstudio.sf.net/ns/carla/string"; //!< Carla String | |||
| /**@}*/ | |||
| /*! | |||
| * @defgroup BridgeMessages Bridge Messages | |||
| * | |||
| * Various bridge related messages, used as configure(<message>, value). | |||
| * \note This is for internal use only. | |||
| * @{ | |||
| */ | |||
| const char* const CARLA_BRIDGE_MSG_HIDE_GUI = "CarlaBridgeHideGUI"; //!< Plugin -> Host call, tells host GUI is now hidden | |||
| const char* const CARLA_BRIDGE_MSG_SAVED = "CarlaBridgeSaved"; //!< Plugin -> Host call, tells host state is saved | |||
| const char* const CARLA_BRIDGE_MSG_SAVE_NOW = "CarlaBridgeSaveNow"; //!< Host -> Plugin call, tells plugin to save state now | |||
| const char* const CARLA_BRIDGE_MSG_SET_CHUNK = "CarlaBridgeSetChunk"; //!< Host -> Plugin call, tells plugin to set chunk in file \a value | |||
| const char* const CARLA_BRIDGE_MSG_SET_CUSTOM = "CarlaBridgeSetCustom"; //!< Host -> Plugin call, tells plugin to set a custom data set using \a value ("type·key·rvalue").\n If \a type is 'chunk' or 'binary' \a rvalue refers to chunk file. | |||
| /**@}*/ | |||
| /*! | |||
| * The binary type of a plugin. | |||
| */ | |||
| enum BinaryType { | |||
| BINARY_NONE = 0, //!< Null binary type. | |||
| BINARY_POSIX32 = 1, //!< POSIX 32bit. | |||
| BINARY_POSIX64 = 2, //!< POSIX 64bit. | |||
| BINARY_WIN32 = 3, //!< Windows 32bit. | |||
| BINARY_WIN64 = 4, //!< Windows 64bit. | |||
| BINARY_OTHER = 5 //!< Other. | |||
| }; | |||
| /*! | |||
| * All the available plugin types, as provided by subclasses of CarlaPlugin.\n | |||
| * \note Some plugin classes might provide more than 1 plugin type. | |||
| */ | |||
| enum PluginType { | |||
| PLUGIN_NONE = 0, //!< Null plugin type. | |||
| PLUGIN_INTERNAL = 1, //!< Internal plugin.\see NativePlugin | |||
| PLUGIN_LADSPA = 2, //!< LADSPA plugin.\see LadspaPlugin | |||
| PLUGIN_DSSI = 3, //!< DSSI plugin.\see DssiPlugin | |||
| PLUGIN_LV2 = 4, //!< LV2 plugin.\see Lv2Plugin | |||
| PLUGIN_VST = 5, //!< VST plugin.\see VstPlugin | |||
| PLUGIN_GIG = 6, //!< GIG sound kit, implemented via LinuxSampler.\see LinuxSamplerPlugin | |||
| PLUGIN_SF2 = 7, //!< SF2 sound kit (aka SoundFont), implemented via FluidSynth.\see FluidSynthPlugin | |||
| PLUGIN_SFZ = 8 //!< SFZ sound kit, implemented via LinuxSampler.\see LinuxSamplerPlugin | |||
| }; | |||
| /*! | |||
| * Plugin category, describing the funtionality of a plugin.\n | |||
| * When a plugin fails to tell his own category, one is atributted to it based on its name. | |||
| */ | |||
| enum PluginCategory { | |||
| PLUGIN_CATEGORY_NONE = 0, //!< Null plugin category. | |||
| PLUGIN_CATEGORY_SYNTH = 1, //!< A synthesizer or generator. | |||
| PLUGIN_CATEGORY_DELAY = 2, //!< A delay or reverberator. | |||
| PLUGIN_CATEGORY_EQ = 3, //!< An equalizer. | |||
| PLUGIN_CATEGORY_FILTER = 4, //!< A filter. | |||
| PLUGIN_CATEGORY_DYNAMICS = 5, //!< A 'dynamic' plugin (amplifier, compressor, gate, etc). | |||
| PLUGIN_CATEGORY_MODULATOR = 6, //!< A 'modulator' plugin (chorus, flanger, phaser, etc). | |||
| PLUGIN_CATEGORY_UTILITY = 7, //!< An 'utility' plugin (analyzer, converter, mixer, etc). | |||
| PLUGIN_CATEGORY_OTHER = 8 //!< Misc plugin (used to check if the plugin has a category). | |||
| }; | |||
| /*! | |||
| * Plugin parameter type. | |||
| */ | |||
| enum ParameterType { | |||
| PARAMETER_UNKNOWN = 0, //!< Null parameter type. | |||
| PARAMETER_INPUT = 1, //!< Input parameter. | |||
| PARAMETER_OUTPUT = 2, //!< Ouput parameter. | |||
| PARAMETER_LATENCY = 3, //!< Special latency parameter, used in LADSPA, DSSI and LV2 plugins. | |||
| PARAMETER_SAMPLE_RATE = 4, //!< Special sample-rate parameter, used in LADSPA, DSSI and LV2 plugins. | |||
| PARAMETER_LV2_FREEWHEEL = 5, //!< Special LV2 Plugin parameter used to report freewheel (offline) mode. | |||
| PARAMETER_LV2_TIME = 6 //!< Special LV2 Plugin parameter used to report time information. | |||
| }; | |||
| /*! | |||
| * Internal parameter indexes.\n | |||
| * These are special parameters used internally, plugins do not know about their existence. | |||
| */ | |||
| enum InternalParametersIndex { | |||
| PARAMETER_NULL = -1, //!< Null parameter. | |||
| PARAMETER_ACTIVE = -2, //!< Active parameter, can only be 'true' or 'false'; default is 'false'. | |||
| PARAMETER_DRYWET = -3, //!< Dry/Wet parameter, range 0.0...1.0; default is 1.0. | |||
| PARAMETER_VOLUME = -4, //!< Volume parameter, range 0.0...1.27; default is 1.0. | |||
| PARAMETER_BALANCE_LEFT = -5, //!< Balance-Left parameter, range -1.0...1.0; default is -1.0. | |||
| PARAMETER_BALANCE_RIGHT = -6 //!< Balance-Right parameter, range -1.0...1.0; default is 1.0. | |||
| }; | |||
| /*! | |||
| * Plugin custom GUI type. | |||
| * \see OPTION_PREFER_UI_BRIDGES | |||
| */ | |||
| enum GuiType { | |||
| GUI_NONE = 0, //!< Null type, plugin has no custom GUI. | |||
| GUI_INTERNAL_QT4 = 1, //!< Qt4 type, handled internally. | |||
| GUI_INTERNAL_COCOA = 2, //!< Reparented MacOS native type, handled internally. | |||
| GUI_INTERNAL_HWND = 3, //!< Reparented Windows native type, handled internally. | |||
| GUI_INTERNAL_X11 = 4, //!< Reparented X11 native type, handled internally. | |||
| GUI_EXTERNAL_LV2 = 5, //!< External LV2-UI type, handled internally. | |||
| GUI_EXTERNAL_SUIL = 6, //!< SUIL type, currently used only for lv2 gtk2 direct-access UIs.\note This type will be removed in the future! | |||
| GUI_EXTERNAL_OSC = 7 //!< External, osc-bridge controlled, UI. | |||
| }; | |||
| /*! | |||
| * Options used in the set_option() call.\n | |||
| * These options must be set before calling engine_init() or after engine_close(). | |||
| */ | |||
| enum OptionsType { | |||
| /*! | |||
| * Try to set the current process name.\n | |||
| * \note Not available on all platforms. | |||
| */ | |||
| OPTION_PROCESS_NAME = 0, | |||
| /*! | |||
| * Set the engine processing mode.\n | |||
| * Default is PROCESS_MODE_MULTIPLE_CLIENTS. | |||
| * \see ProcessMode | |||
| */ | |||
| OPTION_PROCESS_MODE = 1, | |||
| /*! | |||
| * High-Precision processing mode.\n | |||
| * When enabled, audio will be processed by blocks of 8 samples at a time, indenpendently of the buffer size.\n | |||
| * Default is off.\n | |||
| * EXPERIMENTAL! | |||
| */ | |||
| OPTION_PROCESS_HIGH_PRECISION = 2, | |||
| /*! | |||
| * Maximum number of parameters allowed.\n | |||
| * Default is MAX_PARAMETERS. | |||
| */ | |||
| OPTION_MAX_PARAMETERS = 3, | |||
| /*! | |||
| * Prefered buffer size, currently unused. | |||
| */ | |||
| OPTION_PREFERRED_BUFFER_SIZE = 4, | |||
| /*! | |||
| * Prefered sample rate, currently unused. | |||
| */ | |||
| OPTION_PREFERRED_SAMPLE_RATE = 5, | |||
| /*! | |||
| * Force mono plugins as stereo, by running 2 instances at the same time.\n | |||
| * Not supported in VST plugins. | |||
| */ | |||
| OPTION_FORCE_STEREO = 6, | |||
| /*! | |||
| * Use (unofficial) dssi-vst chunks feature.\n | |||
| * Default is no.\n | |||
| * EXPERIMENTAL! | |||
| */ | |||
| OPTION_USE_DSSI_VST_CHUNKS = 7, | |||
| /*! | |||
| * Use plugin bridges whenever possible.\n | |||
| * Default is no, and not recommended at this point!. | |||
| * EXPERIMENTAL! | |||
| */ | |||
| OPTION_PREFER_PLUGIN_BRIDGES = 8, | |||
| /*! | |||
| * Use OSC-UI bridges whenever possible, otherwise UIs will be handled in the main thread.\n | |||
| * Default is yes. | |||
| */ | |||
| OPTION_PREFER_UI_BRIDGES = 9, | |||
| /*! | |||
| * Timeout value in ms for how much to wait for OSC-UIs to respond.\n | |||
| * Default is 4000 ms (4 secs). | |||
| */ | |||
| OPTION_OSC_UI_TIMEOUT = 10, | |||
| /*! | |||
| * Set path to the POSIX 32bit plugin bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_POSIX32 = 11, | |||
| /*! | |||
| * Set path to the POSIX 64bit plugin bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_POSIX64 = 12, | |||
| /*! | |||
| * Set path to the Windows 32bit plugin bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_WIN32 = 13, | |||
| /*! | |||
| * Set path to the Windows 64bit plugin bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_WIN64 = 14, | |||
| /*! | |||
| * Set path to the LV2 Gtk2 UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_GTK2 = 15, | |||
| /*! | |||
| * Set path to the LV2 Gtk3 UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_GTK3 = 16, | |||
| /*! | |||
| * Set path to the LV2 Qt4 UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_QT4 = 17, | |||
| /*! | |||
| * Set path to the LV2 Qt5 UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_QT5 = 18, | |||
| /*! | |||
| * Set path to the LV2 Cocoa UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_COCOA = 19, | |||
| /*! | |||
| * Set path to the LV2 Windows UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_WINDOWS = 20, | |||
| /*! | |||
| * Set path to the LV2 X11 UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_LV2_X11 = 21, | |||
| /*! | |||
| * Set path to the VST Cocoa UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_VST_COCOA = 22, | |||
| /*! | |||
| * Set path to the VST HWND UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_VST_HWND = 23, | |||
| /*! | |||
| * Set path to the VST X11 UI bridge executable.\n | |||
| * Default unset. | |||
| */ | |||
| OPTION_PATH_BRIDGE_VST_X11 = 24 | |||
| }; | |||
| /*! | |||
| * Opcodes sent from the engine callback, as defined by CallbackFunc. | |||
| * | |||
| * \see set_callback_function() | |||
| */ | |||
| enum CallbackType { | |||
| /*! | |||
| * Debug.\n | |||
| * This opcode is undefined and used only for testing purposes. | |||
| */ | |||
| CALLBACK_DEBUG = 0, | |||
| /*! | |||
| * A parameter has been changed. | |||
| * | |||
| * \param value1 Parameter index | |||
| * \param value3 Value | |||
| */ | |||
| CALLBACK_PARAMETER_VALUE_CHANGED = 1, | |||
| /*! | |||
| * A parameter's MIDI channel has been changed. | |||
| * | |||
| * \param value1 Parameter index | |||
| * \param value2 MIDI channel | |||
| */ | |||
| CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED = 2, | |||
| /*! | |||
| * A parameter's MIDI CC has been changed. | |||
| * | |||
| * \param value1 Parameter index | |||
| * \param value2 MIDI CC | |||
| */ | |||
| CALLBACK_PARAMETER_MIDI_CC_CHANGED = 3, | |||
| /*! | |||
| * The current program has has been changed. | |||
| * | |||
| * \param value1 Program index | |||
| */ | |||
| CALLBACK_PROGRAM_CHANGED = 4, | |||
| /*! | |||
| * The current MIDI program has been changed. | |||
| * | |||
| * \param value1 MIDI bank | |||
| * \param value2 MIDI program | |||
| */ | |||
| CALLBACK_MIDI_PROGRAM_CHANGED = 5, | |||
| /*! | |||
| * A note has been pressed. | |||
| * | |||
| * \param value1 Channel | |||
| * \param value2 Note | |||
| * \param value3 Velocity | |||
| */ | |||
| CALLBACK_NOTE_ON = 6, | |||
| /*! | |||
| * A note has been released. | |||
| * | |||
| * \param value1 Channel | |||
| * \param value2 Note | |||
| */ | |||
| CALLBACK_NOTE_OFF = 7, | |||
| /*! | |||
| * The plugin's custom GUI state has changed. | |||
| * | |||
| * \param value1 State, as follows:.\n | |||
| * 0: GUI has been closed or hidden\n | |||
| * 1: GUI has been shown\n | |||
| * -1: GUI has crashed and should not be shown again\n | |||
| */ | |||
| CALLBACK_SHOW_GUI = 8, | |||
| /*! | |||
| * The plugin's custom GUI has been resized. | |||
| * | |||
| * \param value1 Width | |||
| * \param value2 Height | |||
| */ | |||
| CALLBACK_RESIZE_GUI = 9, | |||
| /*! | |||
| * The plugin needs update. | |||
| */ | |||
| CALLBACK_UPDATE = 10, | |||
| /*! | |||
| * The plugin's data/information has changed. | |||
| */ | |||
| CALLBACK_RELOAD_INFO = 11, | |||
| /*! | |||
| * The plugin's parameters have changed. | |||
| */ | |||
| CALLBACK_RELOAD_PARAMETERS = 12, | |||
| /*! | |||
| * The plugin's programs have changed. | |||
| */ | |||
| CALLBACK_RELOAD_PROGRAMS = 13, | |||
| /*! | |||
| * The plugin's state has changed. | |||
| */ | |||
| CALLBACK_RELOAD_ALL = 14, | |||
| /*! | |||
| * Non-Session-Manager Announce message. | |||
| */ | |||
| CALLBACK_NSM_ANNOUNCE = 15, | |||
| /*! | |||
| * Non-Session-Manager Open message #1. | |||
| */ | |||
| CALLBACK_NSM_OPEN1 = 16, | |||
| /*! | |||
| * Non-Session-Manager Open message #2. | |||
| */ | |||
| CALLBACK_NSM_OPEN2 = 17, | |||
| /*! | |||
| * Non-Session-Manager Save message. | |||
| */ | |||
| CALLBACK_NSM_SAVE = 18, | |||
| /*! | |||
| * An error occurred, show last error to user. | |||
| */ | |||
| CALLBACK_ERROR = 19, | |||
| /*! | |||
| * The engine has crashed or malfunctioned and will no longer work. | |||
| */ | |||
| CALLBACK_QUIT = 20 | |||
| }; | |||
| /*! | |||
| * Engine process mode, changed using set_option(). | |||
| * | |||
| * \see OPTION_PROCESS_MODE | |||
| */ | |||
| enum ProcessMode { | |||
| PROCESS_MODE_SINGLE_CLIENT = 0, //!< Single client mode (dynamic input/outputs as needed by plugins) | |||
| PROCESS_MODE_MULTIPLE_CLIENTS = 1, //!< Multiple client mode (1 master client + 1 client per plugin) | |||
| PROCESS_MODE_CONTINUOUS_RACK = 2, //!< Single client, 'rack' mode. Processes plugins in order of id, with forced stereo. | |||
| PROCESS_MODE_PATCHBAY = 3 //!< Single client, 'patchbay' mode. | |||
| }; | |||
| /*! | |||
| * Callback function the backend will call when something interesting happens. | |||
| * | |||
| * \see set_callback_function() | |||
| */ | |||
| typedef void (*CallbackFunc)(void* ptr, CallbackType action, unsigned short pluginId, int value1, int value2, double value3, const char* valueStr); | |||
| struct ParameterData { | |||
| ParameterType type; | |||
| int32_t index; | |||
| int32_t rindex; | |||
| int32_t hints; | |||
| uint8_t midiChannel; | |||
| int16_t midiCC; | |||
| ParameterData() | |||
| : type(PARAMETER_UNKNOWN), | |||
| index(-1), | |||
| rindex(-1), | |||
| hints(0), | |||
| midiChannel(0), | |||
| midiCC(-1) {} | |||
| }; | |||
| struct ParameterRanges { | |||
| double def; | |||
| double min; | |||
| double max; | |||
| double step; | |||
| double stepSmall; | |||
| double stepLarge; | |||
| ParameterRanges() | |||
| : def(0.0), | |||
| min(0.0), | |||
| max(1.0), | |||
| step(0.01), | |||
| stepSmall(0.0001), | |||
| stepLarge(0.1) {} | |||
| }; | |||
| struct MidiProgramData { | |||
| uint32_t bank; | |||
| uint32_t program; | |||
| const char* name; | |||
| MidiProgramData() | |||
| : bank(0), | |||
| program(0), | |||
| name(nullptr) {} | |||
| }; | |||
| struct CustomData { | |||
| const char* type; | |||
| const char* key; | |||
| const char* value; | |||
| CustomData() | |||
| : type(nullptr), | |||
| key(nullptr), | |||
| value(nullptr) {} | |||
| }; | |||
| /**@}*/ | |||
| // forward declarations of commonly used Carla classes | |||
| class CarlaEngine; | |||
| class CarlaPlugin; | |||
| CARLA_BACKEND_END_NAMESPACE | |||
| #endif // CARLA_BACKEND_HPP | |||
| @@ -0,0 +1,985 @@ | |||
| /* | |||
| * Carla Engine | |||
| * Copyright (C) 2012 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef CARLA_ENGINE_HPP | |||
| #define CARLA_ENGINE_HPP | |||
| #include "carla_engine_osc.hpp" | |||
| #include "carla_engine_thread.hpp" | |||
| #include <QtCore/QProcessEnvironment> | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| /*! | |||
| * @defgroup CarlaBackendEngine Carla Backend Engine | |||
| * | |||
| * The Carla Backend Engine | |||
| * @{ | |||
| */ | |||
| /*! | |||
| * @defgroup TimeInfoValidHints TimeInfo Valid Hints | |||
| * | |||
| * Various hints used for CarlaTimeInfo::valid. | |||
| * @{ | |||
| */ | |||
| const uint32_t CarlaEngineTimeBBT = 0x1; | |||
| /**@}*/ | |||
| /*! | |||
| * The type of an engine. | |||
| */ | |||
| enum CarlaEngineType { | |||
| /*! | |||
| * Null engine type. | |||
| */ | |||
| CarlaEngineTypeNull = 0, | |||
| /*! | |||
| * Jack engine type.\n | |||
| * Provides single, multi-client, and rack processing modes. | |||
| */ | |||
| CarlaEngineTypeJack = 1, | |||
| /*! | |||
| * RtAudio engine type, used to provide ALSA, PulseAudio, DirectSound, ASIO and CoreAudio/Midi support.\n | |||
| * Provides rack mode processing only. | |||
| */ | |||
| CarlaEngineTypeRtAudio = 2, | |||
| /*! | |||
| * Plugin engine type, used to export the engine as a plugin (DSSI, LV2 and VST) via the DISTRHO Plugin Toolkit.\n | |||
| * Works in rack mode only. | |||
| */ | |||
| CarlaEngineTypePlugin = 3 | |||
| }; | |||
| /*! | |||
| * The type of an engine port. | |||
| */ | |||
| enum CarlaEnginePortType { | |||
| /*! | |||
| * Null engine port type. | |||
| */ | |||
| CarlaEnginePortTypeNull = 0, | |||
| /*! | |||
| * Audio port. | |||
| */ | |||
| CarlaEnginePortTypeAudio = 1, | |||
| /*! | |||
| * Control port.\n | |||
| * These are MIDI ports on some engine types, by handling MIDI-CC as control. | |||
| */ | |||
| CarlaEnginePortTypeControl = 2, | |||
| /*! | |||
| * MIDI port. | |||
| */ | |||
| CarlaEnginePortTypeMIDI = 3 | |||
| }; | |||
| /*! | |||
| * The type of a control event. | |||
| */ | |||
| enum CarlaEngineControlEventType { | |||
| /*! | |||
| * Null event type. | |||
| */ | |||
| CarlaEngineNullEvent = 0, | |||
| /*! | |||
| * Parameter change event.\n | |||
| * \note Value uses a range of 0.0<->1.0. | |||
| */ | |||
| CarlaEngineParameterChangeEvent = 1, | |||
| /*! | |||
| * MIDI Bank change event. | |||
| */ | |||
| CarlaEngineMidiBankChangeEvent = 2, | |||
| /*! | |||
| * MIDI Program change event. | |||
| */ | |||
| CarlaEngineMidiProgramChangeEvent = 3, | |||
| /*! | |||
| * All sound off event. | |||
| */ | |||
| CarlaEngineAllSoundOffEvent = 4, | |||
| /*! | |||
| * All notes off event. | |||
| */ | |||
| CarlaEngineAllNotesOffEvent = 5 | |||
| }; | |||
| /*! | |||
| * Engine control event. | |||
| */ | |||
| struct CarlaEngineControlEvent { | |||
| CarlaEngineControlEventType type; | |||
| uint32_t time; | |||
| uint8_t channel; | |||
| uint16_t parameter; | |||
| double value; | |||
| CarlaEngineControlEvent() | |||
| : type(CarlaEngineNullEvent), | |||
| time(0), | |||
| channel(0), | |||
| parameter(0), | |||
| value(0.0) {} | |||
| }; | |||
| /*! | |||
| * Engine MIDI event. | |||
| */ | |||
| struct CarlaEngineMidiEvent { | |||
| uint32_t time; | |||
| uint8_t size; | |||
| uint8_t data[3]; | |||
| CarlaEngineMidiEvent() | |||
| : time(0), | |||
| size(0), | |||
| data{0} {} | |||
| }; | |||
| /*! | |||
| * Engine BBT Time information. | |||
| */ | |||
| struct CarlaEngineTimeInfoBBT { | |||
| int32_t bar; | |||
| int32_t beat; | |||
| int32_t tick; | |||
| double bar_start_tick; | |||
| float beats_per_bar; | |||
| float beat_type; | |||
| double ticks_per_beat; | |||
| double beats_per_minute; | |||
| CarlaEngineTimeInfoBBT() | |||
| : bar(0), | |||
| beat(0), | |||
| tick(0), | |||
| bar_start_tick(0.0), | |||
| beats_per_bar(0.0f), | |||
| beat_type(0.0f), | |||
| ticks_per_beat(0.0), | |||
| beats_per_minute(0.0) {} | |||
| }; | |||
| /*! | |||
| * Engine Time information. | |||
| */ | |||
| struct CarlaEngineTimeInfo { | |||
| bool playing; | |||
| uint32_t frame; | |||
| uint32_t time; | |||
| uint32_t valid; | |||
| CarlaEngineTimeInfoBBT bbt; | |||
| CarlaEngineTimeInfo() | |||
| : playing(false), | |||
| frame(0), | |||
| time(0), | |||
| valid(0) {} | |||
| }; | |||
| /*! | |||
| * Engine options. | |||
| */ | |||
| struct CarlaEngineOptions { | |||
| ProcessMode processMode; | |||
| bool processHighPrecision; | |||
| uint maxParameters; | |||
| uint preferredBufferSize; | |||
| uint preferredSampleRate; | |||
| bool forceStereo; | |||
| bool useDssiVstChunks; | |||
| bool preferPluginBridges; | |||
| bool preferUiBridges; | |||
| uint oscUiTimeout; | |||
| CarlaString bridge_posix32; | |||
| CarlaString bridge_posix64; | |||
| CarlaString bridge_win32; | |||
| CarlaString bridge_win64; | |||
| CarlaString bridge_lv2gtk2; | |||
| CarlaString bridge_lv2gtk3; | |||
| CarlaString bridge_lv2qt4; | |||
| CarlaString bridge_lv2qt5; | |||
| CarlaString bridge_lv2cocoa; | |||
| CarlaString bridge_lv2win; | |||
| CarlaString bridge_lv2x11; | |||
| CarlaString bridge_vstcocoa; | |||
| CarlaString bridge_vsthwnd; | |||
| CarlaString bridge_vstx11; | |||
| CarlaEngineOptions() | |||
| : processMode(PROCESS_MODE_CONTINUOUS_RACK), | |||
| processHighPrecision(false), | |||
| maxParameters(MAX_PARAMETERS), | |||
| preferredBufferSize(512), | |||
| preferredSampleRate(44100), | |||
| forceStereo(false), | |||
| useDssiVstChunks(false), | |||
| preferPluginBridges(false), | |||
| preferUiBridges(true), | |||
| oscUiTimeout(4000/100) {} | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /*! | |||
| * Engine port (Base).\n | |||
| * This is the base class for all Carla engine ports. | |||
| */ | |||
| class CarlaEngineBasePort | |||
| { | |||
| public: | |||
| /*! | |||
| * The contructor.\n | |||
| * Param \a isInput defines wherever this is an input port or not (output otherwise).\n | |||
| * Input/output state is constant for the lifetime of the port. | |||
| */ | |||
| CarlaEngineBasePort(const bool isInput, const ProcessMode processMode); | |||
| /*! | |||
| * The decontructor. | |||
| */ | |||
| virtual ~CarlaEngineBasePort(); | |||
| /*! | |||
| * Get the type of the port, as provided by the respective subclasses. | |||
| */ | |||
| virtual CarlaEnginePortType type() const = 0; | |||
| /*! | |||
| * Initialize the port's internal buffer for \a engine. | |||
| */ | |||
| virtual void initBuffer(CarlaEngine* const engine) = 0; | |||
| protected: | |||
| const bool isInput; | |||
| const ProcessMode processMode; | |||
| void* buffer; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /*! | |||
| * Engine port (Audio). | |||
| */ | |||
| class CarlaEngineAudioPort : public CarlaEngineBasePort | |||
| { | |||
| public: | |||
| /*! | |||
| * The contructor.\n | |||
| * Param \a isInput defines wherever this is an input port or not (output otherwise).\n | |||
| * Input/output state is constant for the lifetime of the port. | |||
| */ | |||
| CarlaEngineAudioPort(const bool isInput, const ProcessMode processMode); | |||
| /*! | |||
| * The decontructor. | |||
| */ | |||
| virtual ~CarlaEngineAudioPort(); | |||
| /*! | |||
| * Get the type of the port, in this case CarlaEnginePortTypeAudio. | |||
| */ | |||
| CarlaEnginePortType type() const | |||
| { | |||
| return CarlaEnginePortTypeAudio; | |||
| } | |||
| /*! | |||
| * Initialize the port's internal buffer for \a engine. | |||
| */ | |||
| virtual void initBuffer(CarlaEngine* const engine); | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /*! | |||
| * Engine port (Control). | |||
| */ | |||
| class CarlaEngineControlPort : public CarlaEngineBasePort | |||
| { | |||
| public: | |||
| /*! | |||
| * The contructor.\n | |||
| * Param \a isInput defines wherever this is an input port or not (output otherwise).\n | |||
| * Input/output state is constant for the lifetime of the port. | |||
| */ | |||
| CarlaEngineControlPort(const bool isInput, const ProcessMode processMode); | |||
| /*! | |||
| * The decontructor. | |||
| */ | |||
| virtual ~CarlaEngineControlPort(); | |||
| /*! | |||
| * Get the type of the port, in this case CarlaEnginePortTypeControl. | |||
| */ | |||
| CarlaEnginePortType type() const | |||
| { | |||
| return CarlaEnginePortTypeControl; | |||
| } | |||
| /*! | |||
| * Initialize the port's internal buffer for \a engine. | |||
| */ | |||
| virtual void initBuffer(CarlaEngine* const engine); | |||
| /*! | |||
| * Get the number of control events present in the buffer. | |||
| * \note You must only call this for input ports. | |||
| */ | |||
| virtual uint32_t getEventCount(); | |||
| /*! | |||
| * Get the control event at \a index. | |||
| ** \note You must only call this for input ports. | |||
| */ | |||
| virtual const CarlaEngineControlEvent* getEvent(const uint32_t index); | |||
| /*! | |||
| * Write a control event to the buffer.\n | |||
| * Arguments are the same as in the CarlaEngineControlEvent struct. | |||
| ** \note You must only call this for output ports. | |||
| */ | |||
| virtual void writeEvent(const CarlaEngineControlEventType type, const uint32_t time, const uint8_t channel, const uint16_t parameter, const double value); | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /*! | |||
| * Engine port (MIDI). | |||
| */ | |||
| class CarlaEngineMidiPort : public CarlaEngineBasePort | |||
| { | |||
| public: | |||
| /*! | |||
| * The contructor.\n | |||
| * Param \a isInput defines wherever this is an input port or not (output otherwise).\n | |||
| * Input/output state is constant for the lifetime of the port. | |||
| */ | |||
| CarlaEngineMidiPort(const bool isInput, const ProcessMode processMode); | |||
| /*! | |||
| * The decontructor. | |||
| */ | |||
| virtual ~CarlaEngineMidiPort(); | |||
| /*! | |||
| * Get the type of the port, in this case CarlaEnginePortTypeMIDI. | |||
| */ | |||
| CarlaEnginePortType type() const | |||
| { | |||
| return CarlaEnginePortTypeMIDI; | |||
| } | |||
| /*! | |||
| * Initialize the port's internal buffer for \a engine. | |||
| */ | |||
| virtual void initBuffer(CarlaEngine* const engine); | |||
| /*! | |||
| * Get the number of MIDI events present in the buffer. | |||
| * \note You must only call this for input ports. | |||
| */ | |||
| virtual uint32_t getEventCount(); | |||
| /*! | |||
| * Get the MIDI event at \a index. | |||
| ** \note You must only call this for input ports. | |||
| */ | |||
| virtual const CarlaEngineMidiEvent* getEvent(const uint32_t index); | |||
| /*! | |||
| * Write a MIDI event to the buffer.\n | |||
| * Arguments are the same as in the CarlaEngineMidiEvent struct. | |||
| ** \note You must only call this for output ports. | |||
| */ | |||
| virtual void writeEvent(const uint32_t time, const uint8_t* const data, const uint8_t size); | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /*! | |||
| * Engine client.\n | |||
| * Each plugin requires one client from the engine (created via CarlaEngine::addPort()).\n | |||
| * \note This is a virtual class, each engine type provides its own funtionality. | |||
| */ | |||
| class CarlaEngineClient | |||
| { | |||
| public: | |||
| /*! | |||
| * The contructor.\n | |||
| * All constructor parameters are constant and will never change in the lifetime of the client.\n | |||
| * Client starts in deactivated state. | |||
| */ | |||
| CarlaEngineClient(const CarlaEngineType engineType, const ProcessMode processMode); | |||
| /*! | |||
| * The decontructor. | |||
| */ | |||
| virtual ~CarlaEngineClient(); | |||
| /*! | |||
| * Activate this client.\n | |||
| * \note Client must be deactivated before calling this function. | |||
| */ | |||
| virtual void activate(); | |||
| /*! | |||
| * Deactivate this client.\n | |||
| * \note Client must be activated before calling this function. | |||
| */ | |||
| virtual void deactivate(); | |||
| /*! | |||
| * Check if the client is activated. | |||
| */ | |||
| virtual bool isActive() const; | |||
| /*! | |||
| * Check if the client is ok.\n | |||
| * Plugins will refuse to instantiate if this returns false. | |||
| * \note This is always true in rack and patchbay processing modes. | |||
| */ | |||
| virtual bool isOk() const; | |||
| /*! | |||
| * Get the current latency, in samples. | |||
| */ | |||
| virtual uint32_t getLatency() const; | |||
| /*! | |||
| * Change the client's latency. | |||
| */ | |||
| virtual void setLatency(const uint32_t samples); | |||
| /*! | |||
| * Add a new port of type \a portType. | |||
| * \note This function does nothing in rack processing mode since its ports are static (2 audio, 1 midi and 1 control for both input and output). | |||
| */ | |||
| virtual const CarlaEngineBasePort* addPort(const CarlaEnginePortType portType, const char* const name, const bool isInput) = 0; | |||
| protected: | |||
| const CarlaEngineType engineType; | |||
| const ProcessMode processMode; | |||
| private: | |||
| bool m_active; | |||
| uint32_t m_latency; | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /*! | |||
| * Carla Engine. | |||
| * \note This is a virtual class for all available engine types available in Carla. | |||
| */ | |||
| class CarlaEngine | |||
| { | |||
| public: | |||
| /*! | |||
| * The decontructor. | |||
| * The engine must have been closed before this happens. | |||
| */ | |||
| virtual ~CarlaEngine(); | |||
| // ------------------------------------------------------------------- | |||
| // Static values and calls | |||
| /*! | |||
| * Maximum number of peaks per plugin.\n | |||
| * \note There are both input and output peaks. | |||
| */ | |||
| static const unsigned short MAX_PEAKS = 2; | |||
| /*! | |||
| * Get the number of available engine drivers. | |||
| */ | |||
| static unsigned int getDriverCount(); | |||
| /*! | |||
| * Get the name of the engine driver at \a index. | |||
| */ | |||
| static const char* getDriverName(unsigned int index); | |||
| /*! | |||
| * Create a new engine, using driver \a driverName.\n | |||
| * Returned variable must be deleted when no longer needed. | |||
| */ | |||
| static CarlaEngine* newDriverByName(const char* const driverName); | |||
| // ------------------------------------------------------------------- | |||
| // Maximum values | |||
| /*! | |||
| * Maximum client name size. | |||
| */ | |||
| virtual int maxClientNameSize(); | |||
| /*! | |||
| * Maximum port name size. | |||
| */ | |||
| virtual int maxPortNameSize(); | |||
| /*! | |||
| * Maximum number of loadable plugins. | |||
| * \note This function returns 0 if engine is not started. | |||
| */ | |||
| unsigned short maxPluginNumber() const; | |||
| // ------------------------------------------------------------------- | |||
| // Virtual, per-engine type calls | |||
| /*! | |||
| * Initialize engine, using \a clientName. | |||
| */ | |||
| virtual bool init(const char* const clientName); | |||
| /*! | |||
| * Close engine. | |||
| */ | |||
| virtual bool close(); | |||
| /*! | |||
| * Check if engine is running. | |||
| */ | |||
| virtual bool isRunning() const = 0; | |||
| /*! | |||
| * Check if engine is running offline (aka freewheel mode). | |||
| */ | |||
| virtual bool isOffline() const = 0; | |||
| /*! | |||
| * Get engine type. | |||
| */ | |||
| virtual CarlaEngineType type() const = 0; | |||
| /*! | |||
| * Add new engine client. | |||
| * \note This must only be called within a plugin class. | |||
| */ | |||
| virtual CarlaEngineClient* addClient(CarlaPlugin* const plugin) = 0; | |||
| // ------------------------------------------------------------------- | |||
| // Plugin management | |||
| /*! | |||
| * Get next available plugin id.\n | |||
| * Returns -1 if no more plugins can be loaded. | |||
| */ | |||
| short getNewPluginId() const; | |||
| /*! | |||
| * Get plugin with id \a id. | |||
| */ | |||
| CarlaPlugin* getPlugin(const unsigned short id) const; | |||
| /*! | |||
| * Get plugin with id \a id, faster unchecked version. | |||
| */ | |||
| CarlaPlugin* getPluginUnchecked(const unsigned short id) const; | |||
| /*! | |||
| * Get a unique plugin name within the engine.\n | |||
| * Returned variable must be free'd when no longer needed. | |||
| */ | |||
| const char* getUniquePluginName(const char* const name); | |||
| /*! | |||
| * Add new plugin.\n | |||
| * Returns the id of the plugin, or -1 if the operation failed. | |||
| */ | |||
| short addPlugin(const BinaryType btype, const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra = nullptr); | |||
| /*! | |||
| * Add new plugin, using native binary type.\n | |||
| * Returns the id of the plugin, or -1 if the operation failed. | |||
| */ | |||
| short addPlugin(const PluginType ptype, const char* const filename, const char* const name, const char* const label, void* const extra = nullptr); | |||
| /*! | |||
| * Remove plugin with id \a id. | |||
| */ | |||
| bool removePlugin(const unsigned short id); | |||
| /*! | |||
| * Remove all plugins. | |||
| */ | |||
| void removeAllPlugins(); | |||
| /*! | |||
| * Idle all plugins GUIs. | |||
| */ | |||
| void idlePluginGuis(); | |||
| // bridge, internal use only | |||
| // TODO - find a better way for this | |||
| void __bridgePluginRegister(const unsigned short id, CarlaPlugin* const plugin) | |||
| { | |||
| m_carlaPlugins[id] = plugin; | |||
| } | |||
| // ------------------------------------------------------------------- | |||
| // Information (base) | |||
| /*! | |||
| * Get engine name. | |||
| */ | |||
| const char* getName() const; | |||
| /*! | |||
| * Get current sample rate. | |||
| */ | |||
| double getSampleRate() const; | |||
| /*! | |||
| * Get current buffer size. | |||
| */ | |||
| uint32_t getBufferSize() const; | |||
| /*! | |||
| * Get current Time information. | |||
| */ | |||
| const CarlaEngineTimeInfo* getTimeInfo() const; | |||
| /*! | |||
| * Tell the engine it's about to close.\n | |||
| * This is used to prevent the engine thread from reactivating. | |||
| */ | |||
| void aboutToClose(); | |||
| // ------------------------------------------------------------------- | |||
| // Information (audio peaks) | |||
| double getInputPeak(const unsigned short pluginId, const unsigned short id) const; | |||
| double getOutputPeak(const unsigned short pluginId, const unsigned short id) const; | |||
| void setInputPeak(const unsigned short pluginId, const unsigned short id, double value); | |||
| void setOutputPeak(const unsigned short pluginId, const unsigned short id, double value); | |||
| // ------------------------------------------------------------------- | |||
| // Callback | |||
| void callback(const CallbackType action, const unsigned short pluginId, const int value1, const int value2, const double value3, const char* const valueStr); | |||
| void setCallback(const CallbackFunc func, void* const ptr); | |||
| // ------------------------------------------------------------------- | |||
| // Error handling | |||
| /*! | |||
| * Get last error. | |||
| */ | |||
| const char* getLastError() const; | |||
| /*! | |||
| * Set last error. | |||
| */ | |||
| void setLastError(const char* const error); | |||
| // ------------------------------------------------------------------- | |||
| // Options | |||
| /*! | |||
| * Get the engine options (read-only). | |||
| */ | |||
| const CarlaEngineOptions& getOptions() const | |||
| { | |||
| return options; | |||
| } | |||
| #ifndef BUILD_BRIDGE | |||
| /*! | |||
| * Get the engine options as process environment. | |||
| */ | |||
| const QProcessEnvironment& getOptionsAsProcessEnvironment() const | |||
| { | |||
| return m_procEnv; | |||
| } | |||
| /*! | |||
| * Set the engine option \a option. | |||
| */ | |||
| void setOption(const OptionsType option, const int value, const char* const valueStr); | |||
| #endif | |||
| // ------------------------------------------------------------------- | |||
| // Mutex locks | |||
| /*! | |||
| * Lock processing. | |||
| */ | |||
| void processLock(); | |||
| /*! | |||
| * Try Lock processing. | |||
| */ | |||
| void processTryLock(); | |||
| /*! | |||
| * Unlock processing. | |||
| */ | |||
| void processUnlock(); | |||
| /*! | |||
| * Lock MIDI. | |||
| */ | |||
| void midiLock(); | |||
| /*! | |||
| * Try Lock MIDI. | |||
| */ | |||
| void midiTryLock(); | |||
| /*! | |||
| * Unlock MIDI. | |||
| */ | |||
| void midiUnlock(); | |||
| // ------------------------------------------------------------------- | |||
| // OSC Stuff | |||
| #ifndef BUILD_BRIDGE | |||
| /*! | |||
| * Check if OSC controller is registered. | |||
| */ | |||
| bool isOscControlRegistered() const; | |||
| #else | |||
| /*! | |||
| * Check if OSC bridge is registered. | |||
| */ | |||
| bool isOscBridgeRegistered() const; | |||
| #endif | |||
| /*! | |||
| * Idle OSC. | |||
| */ | |||
| void idleOsc(); | |||
| /*! | |||
| * Get OSC TCP server path. | |||
| */ | |||
| const char* getOscServerPathTCP() const; | |||
| /*! | |||
| * Get OSC UDP server path. | |||
| */ | |||
| const char* getOscServerPathUDP() const; | |||
| #ifdef BUILD_BRIDGE | |||
| /*! | |||
| * Set OSC bridge data. | |||
| */ | |||
| void setOscBridgeData(const CarlaOscData* const oscData); | |||
| #endif | |||
| #ifdef BUILD_BRIDGE | |||
| void osc_send_peaks(CarlaPlugin* const plugin); | |||
| #else | |||
| void osc_send_peaks(CarlaPlugin* const plugin, const unsigned short& id); | |||
| #endif | |||
| #ifdef BUILD_BRIDGE | |||
| void osc_send_bridge_audio_count(const int32_t ins, const int32_t outs, const int32_t total); | |||
| void osc_send_bridge_midi_count(const int32_t ins, const int32_t outs, const int32_t total); | |||
| void osc_send_bridge_parameter_count(const int32_t ins, const int32_t outs, const int32_t total); | |||
| void osc_send_bridge_program_count(const int32_t count); | |||
| void osc_send_bridge_midi_program_count(const int32_t count); | |||
| void osc_send_bridge_plugin_info(const int32_t category, const int32_t hints, const char* const name, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId); | |||
| void osc_send_bridge_parameter_info(const int32_t index, const char* const name, const char* const unit); | |||
| void osc_send_bridge_parameter_data(const int32_t index, const int32_t type, const int32_t rindex, const int32_t hints, const int32_t midiChannel, const int32_t midiCC); | |||
| void osc_send_bridge_parameter_ranges(const int32_t index, const double def, const double min, const double max, const double step, const double stepSmall, const double stepLarge); | |||
| void osc_send_bridge_program_info(const int32_t index, const char* const name); | |||
| void osc_send_bridge_midi_program_info(const int32_t index, const int32_t bank, const int32_t program, const char* const label); | |||
| void osc_send_bridge_configure(const char* const key, const char* const value); | |||
| void osc_send_bridge_set_parameter_value(const int32_t index, const double value); | |||
| void osc_send_bridge_set_default_value(const int32_t index, const double value); | |||
| void osc_send_bridge_set_program(const int32_t index); | |||
| void osc_send_bridge_set_midi_program(const int32_t index); | |||
| void osc_send_bridge_set_custom_data(const char* const type, const char* const key, const char* const value); | |||
| void osc_send_bridge_set_chunk_data(const char* const chunkFile); | |||
| void osc_send_bridge_set_inpeak(const int32_t portId); | |||
| void osc_send_bridge_set_outpeak(const int32_t portId); | |||
| #else | |||
| void osc_send_control_add_plugin_start(const int32_t pluginId, const char* const pluginName); | |||
| void osc_send_control_add_plugin_end(const int32_t pluginId); | |||
| void osc_send_control_remove_plugin(const int32_t pluginId); | |||
| void osc_send_control_set_plugin_data(const int32_t pluginId, const int32_t type, const int32_t category, const int32_t hints, const char* const realName, const char* const label, const char* const maker, const char* const copyright, const int64_t uniqueId); | |||
| void osc_send_control_set_plugin_ports(const int32_t pluginId, const int32_t audioIns, const int32_t audioOuts, const int32_t midiIns, const int32_t midiOuts, const int32_t cIns, const int32_t cOuts, const int32_t cTotals); | |||
| void osc_send_control_set_parameter_data(const int32_t pluginId, const int32_t index, const int32_t type, const int32_t hints, const char* const name, const char* const label, const double current); | |||
| void osc_send_control_set_parameter_ranges(const int32_t pluginId, const int32_t index, const double min, const double max, const double def, const double step, const double stepSmall, const double stepLarge); | |||
| void osc_send_control_set_parameter_midi_cc(const int32_t pluginId, const int32_t index, const int32_t cc); | |||
| void osc_send_control_set_parameter_midi_channel(const int32_t pluginId, const int32_t index, const int32_t channel); | |||
| void osc_send_control_set_parameter_value(const int32_t pluginId, const int32_t index, const double value); | |||
| void osc_send_control_set_default_value(const int32_t pluginId, const int32_t index, const double value); | |||
| void osc_send_control_set_program(const int32_t pluginId, const int32_t index); | |||
| void osc_send_control_set_program_count(const int32_t pluginId, const int32_t count); | |||
| void osc_send_control_set_program_name(const int32_t pluginId, const int32_t index, const char* const name); | |||
| void osc_send_control_set_midi_program(const int32_t pluginId, const int32_t index); | |||
| void osc_send_control_set_midi_program_count(const int32_t pluginId, const int32_t count); | |||
| void osc_send_control_set_midi_program_data(const int32_t pluginId, const int32_t index, const int32_t bank, const int32_t program, const char* const name); | |||
| void osc_send_control_note_on(const int32_t pluginId, const int32_t channel, const int32_t note, const int32_t velo); | |||
| void osc_send_control_note_off(const int32_t pluginId, const int32_t channel, const int32_t note); | |||
| void osc_send_control_set_input_peak_value(const int32_t pluginId, const int32_t portId); | |||
| void osc_send_control_set_output_peak_value(const int32_t pluginId, const int32_t portId); | |||
| void osc_send_control_exit(); | |||
| #endif | |||
| #ifndef BUILD_BRIDGE | |||
| // ------------------------------------------------------------------- | |||
| // Rack mode | |||
| static const unsigned short MAX_CONTROL_EVENTS = 512; | |||
| static const unsigned short MAX_MIDI_EVENTS = 512; | |||
| CarlaEngineControlEvent rackControlEventsIn[MAX_CONTROL_EVENTS]; | |||
| CarlaEngineControlEvent rackControlEventsOut[MAX_CONTROL_EVENTS]; | |||
| CarlaEngineMidiEvent rackMidiEventsIn[MAX_MIDI_EVENTS]; | |||
| CarlaEngineMidiEvent rackMidiEventsOut[MAX_MIDI_EVENTS]; | |||
| #endif | |||
| // ------------------------------------- | |||
| /*! | |||
| * \class ScopedLocker | |||
| * | |||
| * \brief Carla engine scoped locker | |||
| * | |||
| * This is a handy class that temporarily locks an engine during a function scope. | |||
| */ | |||
| class ScopedLocker | |||
| { | |||
| public: | |||
| /*! | |||
| * Lock the engine \a engine if \a lock is true. | |||
| * The engine is unlocked in the deconstructor of this class if \a lock is true. | |||
| * | |||
| * \param engine The engine to lock | |||
| * \param lock Wherever to lock the engine or not, true by default | |||
| */ | |||
| ScopedLocker(CarlaEngine* const engine, bool lock = true) | |||
| : mutex(&engine->m_procLock), | |||
| m_lock(lock) | |||
| { | |||
| if (m_lock) | |||
| mutex->lock(); | |||
| } | |||
| ~ScopedLocker() | |||
| { | |||
| if (m_lock) | |||
| mutex->unlock(); | |||
| } | |||
| private: | |||
| QMutex* const mutex; | |||
| const bool m_lock; | |||
| }; | |||
| // ------------------------------------- | |||
| protected: | |||
| /*! | |||
| * The contructor, protected.\n | |||
| * \note This only initializes engine data, it doesn't initialize the engine itself. | |||
| */ | |||
| CarlaEngine(); | |||
| #ifndef BUILD_BRIDGE | |||
| /*! | |||
| * Proccess audio buffer in rack mode, protected. | |||
| */ | |||
| void processRack(float* inBuf[2], float* outBuf[2], const uint32_t frames); | |||
| #endif | |||
| CarlaEngineOptions options; | |||
| CarlaString name; | |||
| uint32_t bufferSize; | |||
| double sampleRate; | |||
| CarlaEngineTimeInfo timeInfo; | |||
| void bufferSizeChanged(const uint32_t newBufferSize); | |||
| private: | |||
| CarlaEngineOsc m_osc; | |||
| CarlaEngineThread m_thread; | |||
| const CarlaOscData* m_oscData; | |||
| CallbackFunc m_callback; | |||
| void* m_callbackPtr; | |||
| CarlaString m_lastError; | |||
| #ifndef BUILD_BRIDGE | |||
| QProcessEnvironment m_procEnv; | |||
| #endif | |||
| QMutex m_procLock; | |||
| QMutex m_midiLock; | |||
| CarlaPlugin* m_carlaPlugins[MAX_PLUGINS]; | |||
| const char* m_uniqueNames[MAX_PLUGINS]; | |||
| double m_insPeak[MAX_PLUGINS * MAX_PEAKS]; | |||
| double m_outsPeak[MAX_PLUGINS * MAX_PEAKS]; | |||
| bool m_aboutToClose; | |||
| unsigned short m_maxPluginNumber; | |||
| #ifdef CARLA_ENGINE_JACK | |||
| static CarlaEngine* newJack(); | |||
| #endif | |||
| #ifdef CARLA_ENGINE_RTAUDIO | |||
| enum RtAudioApi { | |||
| RTAUDIO_DUMMY = 0, | |||
| RTAUDIO_LINUX_ALSA = 1, | |||
| RTAUDIO_LINUX_PULSE = 2, | |||
| RTAUDIO_LINUX_OSS = 3, | |||
| RTAUDIO_UNIX_JACK = 4, | |||
| RTAUDIO_MACOSX_CORE = 5, | |||
| RTAUDIO_WINDOWS_ASIO = 6, | |||
| RTAUDIO_WINDOWS_DS = 7 | |||
| }; | |||
| static CarlaEngine* newRtAudio(RtAudioApi api); | |||
| static unsigned int getRtAudioApiCount(); | |||
| static const char* getRtAudioApiName(unsigned int index); | |||
| #endif | |||
| }; | |||
| // ----------------------------------------------------------------------- | |||
| /**@}*/ | |||
| CARLA_BACKEND_END_NAMESPACE | |||
| #endif // CARLA_ENGINE_HPP | |||
| @@ -0,0 +1,88 @@ | |||
| #!/usr/bin/make -f | |||
| # Makefile for carla-discovery # | |||
| # ----------------------------------------- # | |||
| # Created by falkTX | |||
| # | |||
| include ../Makefile.mk | |||
| # -------------------------------------------------------------- | |||
| BUILD_CXX_FLAGS += -I../backend -I../includes -I../utils | |||
| BUILD_CXX_FLAGS += $(shell pkg-config --cflags QtCore) | |||
| LINK_FLAGS += $(shell pkg-config --libs QtCore) | |||
| ifeq ($(CARLA_PLUGIN_SUPPORT),true) | |||
| BUILD_CXX_FLAGS += -DWANT_LADSPA -DWANT_DSSI -DWANT_LV2 -DWANT_VST | |||
| endif | |||
| ifeq ($(HAVE_FLUIDSYNTH),true) | |||
| NATIVE_FLAGS += $(shell pkg-config --cflags --libs fluidsynth) -DWANT_FLUIDSYNTH | |||
| endif | |||
| ifeq ($(HAVE_LINUXSAMPLER),true) | |||
| NATIVE_FLAGS += $(shell pkg-config --cflags --libs linuxsampler) -DWANT_LINUXSAMPLER | |||
| endif | |||
| # -------------------------------------------------------------- | |||
| POSIX_BUILD_FLAGS = $(BUILD_CXX_FLAGS) | |||
| POSIX_32BIT_FLAGS = $(32BIT_FLAGS) -L/usr/lib32 -L/usr/lib/i386-linux-gnu | |||
| POSIX_64BIT_FLAGS = $(64BIT_FLAGS) -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu | |||
| POSIX_LINK_FLAGS = $(LINK_FLAGS) -ldl | |||
| #-lpthread | |||
| WIN_BUILD_FLAGS = $(BUILD_CXX_FLAGS) | |||
| WIN_32BIT_FLAGS = $(32BIT_FLAGS) | |||
| WIN_64BIT_FLAGS = $(64BIT_FLAGS) | |||
| WIN_LINK_FLAGS = $(LINK_FLAGS) -static -mwindows -lole32 -luuid -lws2_32 | |||
| # -------------------------------------------------------------- | |||
| all: carla-discovery-native | |||
| posix32: carla-discovery-posix32 | |||
| posix64: carla-discovery-posix64 | |||
| win32: carla-discovery-win32.exe | |||
| win64: carla-discovery-win64.exe | |||
| # -------------------------------------------------------------- | |||
| OBJS = carla-discovery.cpp | |||
| carla-discovery-native: $(OBJS) ../libs/lilv.a | |||
| $(CXX) $^ $(POSIX_BUILD_FLAGS) $(POSIX_LINK_FLAGS) $(NATIVE_FLAGS) -o $@ && $(STRIP) $@ | |||
| carla-discovery-posix32: $(OBJS) ../libs/lilv_posix32.a | |||
| $(CXX) $^ $(POSIX_BUILD_FLAGS) $(POSIX_32BIT_FLAGS) $(POSIX_LINK_FLAGS) -o $@ && $(STRIP) $@ | |||
| carla-discovery-posix64: $(OBJS) ../libs/lilv_posix64.a | |||
| $(CXX) $^ $(POSIX_BUILD_FLAGS) $(POSIX_64BIT_FLAGS) $(POSIX_LINK_FLAGS) -o $@ && $(STRIP) $@ | |||
| carla-discovery-win32.exe: $(OBJS) ../libs/lilv_win32.a | |||
| $(CXX) $^ $(WIN_BUILD_FLAGS) $(WIN_32BIT_FLAGS) $(WIN_LINK_FLAGS) -o $@ && $(STRIP) $@ | |||
| carla-discovery-win64.exe: $(OBJS) ../libs/lilv_win64.a | |||
| $(CXX) $^ $(WIN_BUILD_FLAGS) $(WIN_64BIT_FLAGS) $(WIN_LINK_FLAGS) -o $@ && $(STRIP) $@ | |||
| # -------------------------------------------------------------- | |||
| ../libs/lilv.a: | |||
| $(MAKE) -C ../libs/lilv | |||
| ../libs/lilv_posix32.a: | |||
| $(MAKE) -C ../libs/lilv posix32 | |||
| ../libs/lilv_posix64.a: | |||
| $(MAKE) -C ../libs/lilv posix64 | |||
| ../libs/lilv_win32.a: | |||
| $(MAKE) -C ../libs/lilv win32 | |||
| ../libs/lilv_win64.a: | |||
| $(MAKE) -C ../libs/lilv win64 | |||
| # -------------------------------------------------------------- | |||
| clean: | |||
| rm -f carla-discovery-* | |||
| @@ -0,0 +1,51 @@ | |||
| # QtCreator project file | |||
| QT = core | |||
| win { | |||
| CONFIG = release | |||
| } else { | |||
| CONFIG = debug | |||
| } | |||
| CONFIG += link_pkgconfig qt warn_on | |||
| DEFINES = DEBUG | |||
| DEFINES += WANT_LADSPA WANT_DSSI WANT_LV2 WANT_VST | |||
| DEFINES += WANT_FLUIDSYNTH WANT_LINUXSAMPLER | |||
| PKGCONFIG = fluidsynth linuxsampler | |||
| TARGET = carla-discovery-qtcreator | |||
| TEMPLATE = app | |||
| VERSION = 0.5.0 | |||
| SOURCES = \ | |||
| carla-discovery.cpp | |||
| HEADERS = \ | |||
| ../includes/carla_defines.hpp \ | |||
| ../includes/carla_midi.h \ | |||
| ../includes/ladspa_rdf.hpp \ | |||
| ../includes/lv2_rdf.hpp \ | |||
| ../backend/carla_backend.hpp \ | |||
| ../utils/carla_utils.hpp \ | |||
| ../utils/carla_lib_utils.hpp \ | |||
| ../utils/carla_ladspa_utils.hpp \ | |||
| ../utils/carla_lv2_utils.hpp \ | |||
| ../utils/carla_vst_utils.hpp | |||
| INCLUDEPATH = \ | |||
| ../backend \ | |||
| ../includes \ | |||
| ../utils | |||
| LIBS = \ | |||
| ../libs/lilv.a | |||
| unix { | |||
| LIBS += -ldl | |||
| } | |||
| mingw { | |||
| LIBS += -static -mwindows | |||
| } | |||
| QMAKE_CXXFLAGS *= -std=c++0x | |||
| @@ -0,0 +1,192 @@ | |||
| /* | |||
| * Simple Queue, specially developed for Atom types | |||
| * Copyright (C) 2012 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef __LV2_ATOM_QUEUE_HPP__ | |||
| #define __LV2_ATOM_QUEUE_HPP__ | |||
| #include "carla_utils.hpp" | |||
| #include "lv2/atom.h" | |||
| #include <cstring> // memcpy, memset | |||
| #include <pthread.h> | |||
| class Lv2AtomQueue | |||
| { | |||
| public: | |||
| Lv2AtomQueue() | |||
| : mutex(PTHREAD_MUTEX_INITIALIZER) | |||
| { | |||
| index = indexPool = 0; | |||
| empty = true; | |||
| full = false; | |||
| ::memset(dataPool, 0, sizeof(unsigned char)*MAX_POOL_SIZE); | |||
| } | |||
| void copyDataFrom(Lv2AtomQueue* const queue) | |||
| { | |||
| // lock mutexes | |||
| queue->lock(); | |||
| lock(); | |||
| // copy data from queue | |||
| ::memcpy(data, queue->data, sizeof(datatype)*MAX_SIZE); | |||
| ::memcpy(dataPool, queue->dataPool, sizeof(unsigned char)*MAX_POOL_SIZE); | |||
| index = queue->index; | |||
| indexPool = queue->indexPool; | |||
| empty = queue->empty; | |||
| full = queue->full; | |||
| // unlock our mutex, no longer needed | |||
| unlock(); | |||
| // reset queque | |||
| ::memset(queue->data, 0, sizeof(datatype)*MAX_SIZE); | |||
| ::memset(queue->dataPool, 0, sizeof(unsigned char)*MAX_POOL_SIZE); | |||
| queue->index = queue->indexPool = 0; | |||
| queue->empty = true; | |||
| queue->full = false; | |||
| // unlock queque mutex | |||
| queue->unlock(); | |||
| } | |||
| bool isEmpty() | |||
| { | |||
| return empty; | |||
| } | |||
| bool isFull() | |||
| { | |||
| return full; | |||
| } | |||
| bool lock() | |||
| { | |||
| return (pthread_mutex_lock(&mutex) == 0); | |||
| } | |||
| bool tryLock() | |||
| { | |||
| return (pthread_mutex_trylock(&mutex) == 0); | |||
| } | |||
| bool unlock() | |||
| { | |||
| return (pthread_mutex_unlock(&mutex) == 0); | |||
| } | |||
| void put(const uint32_t portIndex, const LV2_Atom* const atom) | |||
| { | |||
| CARLA_ASSERT(atom && atom->size > 0); | |||
| CARLA_ASSERT(indexPool + atom->size < MAX_POOL_SIZE); // overflow | |||
| if (full || atom->size == 0 || indexPool + atom->size >= MAX_POOL_SIZE) | |||
| return; | |||
| lock(); | |||
| for (unsigned short i=0; i < MAX_SIZE; i++) | |||
| { | |||
| if (data[i].size == 0) | |||
| { | |||
| data[i].portIndex = portIndex; | |||
| data[i].size = atom->size; | |||
| data[i].type = atom->type; | |||
| data[i].poolOffset = indexPool; | |||
| ::memcpy(dataPool + indexPool, (const unsigned char*)LV2_ATOM_BODY_CONST(atom), atom->size); | |||
| empty = false; | |||
| full = (i == MAX_SIZE-1); | |||
| indexPool += atom->size; | |||
| break; | |||
| } | |||
| } | |||
| unlock(); | |||
| } | |||
| bool get(uint32_t* const portIndex, const LV2_Atom** const atom) | |||
| { | |||
| CARLA_ASSERT(portIndex && atom); | |||
| if (empty || ! (portIndex && atom)) | |||
| return false; | |||
| if (! tryLock()) | |||
| return false; | |||
| full = false; | |||
| if (data[index].size == 0) | |||
| { | |||
| index = indexPool = 0; | |||
| empty = true; | |||
| unlock(); | |||
| return false; | |||
| } | |||
| retAtom.atom.size = data[index].size; | |||
| retAtom.atom.type = data[index].type; | |||
| ::memcpy(retAtom.data, dataPool + data[index].poolOffset, data[index].size); | |||
| *portIndex = data[index].portIndex; | |||
| *atom = (LV2_Atom*)&retAtom; | |||
| data[index].portIndex = 0; | |||
| data[index].size = 0; | |||
| data[index].type = 0; | |||
| data[index].poolOffset = 0; | |||
| index++; | |||
| empty = false; | |||
| unlock(); | |||
| return true; | |||
| } | |||
| private: | |||
| struct datatype { | |||
| size_t size; | |||
| uint32_t type; | |||
| uint32_t portIndex; | |||
| uint32_t poolOffset; | |||
| datatype() | |||
| : size(0), | |||
| type(0), | |||
| portIndex(0), | |||
| poolOffset(0) {} | |||
| }; | |||
| static const unsigned short MAX_SIZE = 128; | |||
| static const unsigned short MAX_POOL_SIZE = 8192; | |||
| datatype data[MAX_SIZE]; | |||
| unsigned char dataPool[MAX_POOL_SIZE]; | |||
| struct { | |||
| LV2_Atom atom; | |||
| unsigned char data[MAX_POOL_SIZE]; | |||
| } retAtom; | |||
| unsigned short index, indexPool; | |||
| bool empty, full; | |||
| pthread_mutex_t mutex; | |||
| }; | |||
| #endif // __LV2_ATOM_QUEUE_HPP__ | |||
| @@ -0,0 +1,567 @@ | |||
| /* | |||
| * Custom types to store LV2 information | |||
| * Copyright (C) 2011-2013 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef LV2_RDF_INCLUDED | |||
| #define LV2_RDF_INCLUDED | |||
| #include <cstdint> | |||
| #include <cstdlib> | |||
| // Base Types | |||
| typedef const char* LV2_URI; | |||
| typedef uint32_t LV2_Property; | |||
| struct LV2_Type { | |||
| LV2_Property Value; | |||
| LV2_URI URI; | |||
| LV2_Type() | |||
| : Value(0), | |||
| URI(nullptr) {} | |||
| ~LV2_Type() | |||
| { | |||
| if (URI) | |||
| ::free((void*)URI); | |||
| } | |||
| }; | |||
| // Port Midi Map Types | |||
| #define LV2_PORT_MIDI_MAP_CC 0x1 | |||
| #define LV2_PORT_MIDI_MAP_NRPN 0x2 | |||
| #define LV2_IS_PORT_MIDI_MAP_CC(x) ((x) == LV2_PORT_MIDI_MAP_CC) | |||
| #define LV2_IS_PORT_MIDI_MAP_NRPN(x) ((x) == LV2_PORT_MIDI_MAP_NRPN) | |||
| // Port Point Hints | |||
| #define LV2_PORT_POINT_DEFAULT 0x1 | |||
| #define LV2_PORT_POINT_MINIMUM 0x2 | |||
| #define LV2_PORT_POINT_MAXIMUM 0x4 | |||
| #define LV2_HAVE_DEFAULT_PORT_POINT(x) ((x) & LV2_PORT_POINT_DEFAULT) | |||
| #define LV2_HAVE_MINIMUM_PORT_POINT(x) ((x) & LV2_PORT_POINT_MINIMUM) | |||
| #define LV2_HAVE_MAXIMUM_PORT_POINT(x) ((x) & LV2_PORT_POINT_MAXIMUM) | |||
| // Port Unit Hints | |||
| #define LV2_PORT_UNIT_NAME 0x1 | |||
| #define LV2_PORT_UNIT_RENDER 0x2 | |||
| #define LV2_PORT_UNIT_SYMBOL 0x4 | |||
| #define LV2_PORT_UNIT_UNIT 0x8 | |||
| #define LV2_HAVE_PORT_UNIT_NAME(x) ((x) & LV2_PORT_UNIT_NAME) | |||
| #define LV2_HAVE_PORT_UNIT_RENDER(x) ((x) & LV2_PORT_UNIT_RENDER) | |||
| #define LV2_HAVE_PORT_UNIT_SYMBOL(x) ((x) & LV2_PORT_UNIT_SYMBOL) | |||
| #define LV2_HAVE_PORT_UNIT_UNIT(x) ((x) & LV2_PORT_UNIT_UNIT) | |||
| // Port Unit Unit | |||
| #define LV2_PORT_UNIT_BAR 0x01 | |||
| #define LV2_PORT_UNIT_BEAT 0x02 | |||
| #define LV2_PORT_UNIT_BPM 0x03 | |||
| #define LV2_PORT_UNIT_CENT 0x04 | |||
| #define LV2_PORT_UNIT_CM 0x05 | |||
| #define LV2_PORT_UNIT_COEF 0x06 | |||
| #define LV2_PORT_UNIT_DB 0x07 | |||
| #define LV2_PORT_UNIT_DEGREE 0x08 | |||
| #define LV2_PORT_UNIT_FRAME 0x09 | |||
| #define LV2_PORT_UNIT_HZ 0x0A | |||
| #define LV2_PORT_UNIT_INCH 0x0B | |||
| #define LV2_PORT_UNIT_KHZ 0x0C | |||
| #define LV2_PORT_UNIT_KM 0x0D | |||
| #define LV2_PORT_UNIT_M 0x0E | |||
| #define LV2_PORT_UNIT_MHZ 0x0F | |||
| #define LV2_PORT_UNIT_MIDINOTE 0x10 | |||
| #define LV2_PORT_UNIT_MILE 0x11 | |||
| #define LV2_PORT_UNIT_MIN 0x12 | |||
| #define LV2_PORT_UNIT_MM 0x13 | |||
| #define LV2_PORT_UNIT_MS 0x14 | |||
| #define LV2_PORT_UNIT_OCT 0x15 | |||
| #define LV2_PORT_UNIT_PC 0x16 | |||
| #define LV2_PORT_UNIT_S 0x17 | |||
| #define LV2_PORT_UNIT_SEMITONE 0x18 | |||
| #define LV2_IS_PORT_UNIT_BAR(x) ((x) == LV2_PORT_UNIT_BAR) | |||
| #define LV2_IS_PORT_UNIT_BEAT(x) ((x) == LV2_PORT_UNIT_BEAT) | |||
| #define LV2_IS_PORT_UNIT_BPM(x) ((x) == LV2_PORT_UNIT_BPM) | |||
| #define LV2_IS_PORT_UNIT_CENT(x) ((x) == LV2_PORT_UNIT_CENT) | |||
| #define LV2_IS_PORT_UNIT_CM(x) ((x) == LV2_PORT_UNIT_CM) | |||
| #define LV2_IS_PORT_UNIT_COEF(x) ((x) == LV2_PORT_UNIT_COEF) | |||
| #define LV2_IS_PORT_UNIT_DB(x) ((x) == LV2_PORT_UNIT_DB) | |||
| #define LV2_IS_PORT_UNIT_DEGREE(x) ((x) == LV2_PORT_UNIT_DEGREE) | |||
| #define LV2_IS_PORT_UNIT_FRAME(x) ((x) == LV2_PORT_UNIT_FRAME) | |||
| #define LV2_IS_PORT_UNIT_HZ(x) ((x) == LV2_PORT_UNIT_HZ) | |||
| #define LV2_IS_PORT_UNIT_INCH(x) ((x) == LV2_PORT_UNIT_INCH) | |||
| #define LV2_IS_PORT_UNIT_KHZ(x) ((x) == LV2_PORT_UNIT_KHZ) | |||
| #define LV2_IS_PORT_UNIT_KM(x) ((x) == LV2_PORT_UNIT_KM) | |||
| #define LV2_IS_PORT_UNIT_M(x) ((x) == LV2_PORT_UNIT_M) | |||
| #define LV2_IS_PORT_UNIT_MHZ(x) ((x) == LV2_PORT_UNIT_MHZ) | |||
| #define LV2_IS_PORT_UNIT_MIDINOTE(x) ((x) == LV2_PORT_UNIT_MIDINOTE) | |||
| #define LV2_IS_PORT_UNIT_MILE(x) ((x) == LV2_PORT_UNIT_MILE) | |||
| #define LV2_IS_PORT_UNIT_MIN(x) ((x) == LV2_PORT_UNIT_MIN) | |||
| #define LV2_IS_PORT_UNIT_MM(x) ((x) == LV2_PORT_UNIT_MM) | |||
| #define LV2_IS_PORT_UNIT_MS(x) ((x) == LV2_PORT_UNIT_MS) | |||
| #define LV2_IS_PORT_UNIT_OCT(x) ((x) == LV2_PORT_UNIT_OCT) | |||
| #define LV2_IS_PORT_UNIT_PC(x) ((x) == LV2_PORT_UNIT_PC) | |||
| #define LV2_IS_PORT_UNIT_S(x) ((x) == LV2_PORT_UNIT_S) | |||
| #define LV2_IS_PORT_UNIT_SEMITONE(x) ((x) == LV2_PORT_UNIT_SEMITONE) | |||
| // Port Types | |||
| #define LV2_PORT_INPUT 0x01 | |||
| #define LV2_PORT_OUTPUT 0x02 | |||
| #define LV2_PORT_CONTROL 0x04 | |||
| #define LV2_PORT_AUDIO 0x08 | |||
| #define LV2_PORT_CV 0x10 | |||
| #define LV2_PORT_ATOM 0x20 | |||
| #define LV2_PORT_ATOM_SEQUENCE (0x40 | LV2_PORT_ATOM) | |||
| #define LV2_PORT_EVENT 0x80 | |||
| #define LV2_PORT_MIDI_LL 0x100 | |||
| // Port Data Types | |||
| #define LV2_PORT_DATA_MIDI_EVENT 0x1000 | |||
| #define LV2_PORT_DATA_PATCH_MESSAGE 0x2000 | |||
| #define LV2_IS_PORT_INPUT(x) ((x) & LV2_PORT_INPUT) | |||
| #define LV2_IS_PORT_OUTPUT(x) ((x) & LV2_PORT_OUTPUT) | |||
| #define LV2_IS_PORT_CONTROL(x) ((x) & LV2_PORT_CONTROL) | |||
| #define LV2_IS_PORT_AUDIO(x) ((x) & LV2_PORT_AUDIO) | |||
| #define LV2_IS_PORT_ATOM_SEQUENCE(x) ((x) & LV2_PORT_ATOM_SEQUENCE) | |||
| #define LV2_IS_PORT_CV(x) ((x) & LV2_PORT_CV) | |||
| #define LV2_IS_PORT_EVENT(x) ((x) & LV2_PORT_EVENT) | |||
| #define LV2_IS_PORT_MIDI_LL(x) ((x) & LV2_PORT_MIDI_LL) | |||
| #define LV2_PORT_SUPPORTS_MIDI_EVENT ((x) & LV2_PORT_DATA_MIDI_EVENT) | |||
| #define LV2_PORT_SUPPORTS_PATCH_MESSAGE ((x) & LV2_PORT_DATA_PATCH_MESSAGE) | |||
| // Port Properties | |||
| #define LV2_PORT_OPTIONAL 0x0001 | |||
| #define LV2_PORT_ENUMERATION 0x0002 | |||
| #define LV2_PORT_INTEGER 0x0004 | |||
| #define LV2_PORT_SAMPLE_RATE 0x0008 | |||
| #define LV2_PORT_TOGGLED 0x0010 | |||
| #define LV2_PORT_CAUSES_ARTIFACTS 0x0020 | |||
| #define LV2_PORT_CONTINUOUS_CV 0x0040 | |||
| #define LV2_PORT_DISCRETE_CV 0x0080 | |||
| #define LV2_PORT_EXPENSIVE 0x0100 | |||
| #define LV2_PORT_STRICT_BOUNDS 0x0200 | |||
| #define LV2_PORT_LOGARITHMIC 0x0400 | |||
| #define LV2_PORT_NOT_AUTOMATIC 0x0800 | |||
| #define LV2_PORT_NOT_ON_GUI 0x1000 | |||
| #define LV2_PORT_TRIGGER 0x2000 | |||
| #define LV2_IS_PORT_OPTIONAL(x) ((x) & LV2_PORT_OPTIONAL) | |||
| #define LV2_IS_PORT_ENUMERATION(x) ((x) & LV2_PORT_ENUMERATION) | |||
| #define LV2_IS_PORT_INTEGER(x) ((x) & LV2_PORT_INTEGER) | |||
| #define LV2_IS_PORT_SAMPLE_RATE(x) ((x) & LV2_PORT_SAMPLE_RATE) | |||
| #define LV2_IS_PORT_TOGGLED(x) ((x) & LV2_PORT_TOGGLED) | |||
| #define LV2_IS_PORT_CAUSES_ARTIFACTS(x) ((x) & LV2_PORT_CAUSES_ARTIFACTS) | |||
| #define LV2_IS_PORT_CONTINUOUS_CV(x) ((x) & LV2_PORT_CONTINUOUS_CV) | |||
| #define LV2_IS_PORT_DISCRETE_CV(x) ((x) & LV2_PORT_DISCRETE_CV) | |||
| #define LV2_IS_PORT_EXPENSIVE(x) ((x) & LV2_PORT_EXPENSIVE) | |||
| #define LV2_IS_PORT_STRICT_BOUNDS(x) ((x) & LV2_PORT_STRICT_BOUNDS) | |||
| #define LV2_IS_PORT_LOGARITHMIC(x) ((x) & LV2_PORT_LOGARITHMIC) | |||
| #define LV2_IS_PORT_NOT_AUTOMATIC(x) ((x) & LV2_PORT_NOT_AUTOMATIC) | |||
| #define LV2_IS_PORT_NOT_ON_GUI(x) ((x) & LV2_PORT_NOT_ON_GUI) | |||
| #define LV2_IS_PORT_TRIGGER(x) ((x) & LV2_PORT_TRIGGER) | |||
| // Port Designation | |||
| #define LV2_PORT_DESIGNATION_FREEWHEELING 0x1 | |||
| #define LV2_PORT_DESIGNATION_LATENCY 0x2 | |||
| #define LV2_PORT_DESIGNATION_SAMPLE_RATE 0x3 | |||
| #define LV2_PORT_DESIGNATION_TIME_BAR 0x4 | |||
| #define LV2_PORT_DESIGNATION_TIME_BAR_BEAT 0x5 | |||
| #define LV2_PORT_DESIGNATION_TIME_BEAT 0x6 | |||
| #define LV2_PORT_DESIGNATION_TIME_BEAT_UNIT 0x7 | |||
| #define LV2_PORT_DESIGNATION_TIME_BEATS_PER_BAR 0x8 | |||
| #define LV2_PORT_DESIGNATION_TIME_BEATS_PER_MINUTE 0x9 | |||
| #define LV2_PORT_DESIGNATION_TIME_FRAME 0xA | |||
| #define LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND 0xB | |||
| #define LV2_PORT_DESIGNATION_TIME_POSITION 0xC | |||
| #define LV2_PORT_DESIGNATION_TIME_SPEED 0xD | |||
| #define LV2_IS_PORT_DESIGNATION_FREEWHEELING(x) ((x) == LV2_PORT_DESIGNATION_FREEWHEELING) | |||
| #define LV2_IS_PORT_DESIGNATION_LATENCY(x) ((x) == LV2_PORT_DESIGNATION_LATENCY) | |||
| #define LV2_IS_PORT_DESIGNATION_SAMPLE_RATE(x) ((x) == LV2_PORT_DESIGNATION_SAMPLE_RATE) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_BAR(x) ((x) == LV2_PORT_DESIGNATION_TIME_BAR) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_BAR_BEAT(x) ((x) == LV2_PORT_DESIGNATION_TIME_BAR_BEAT) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_BEAT(x) ((x) == LV2_PORT_DESIGNATION_TIME_BEAT) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_BEAT_UNIT(x) ((x) == LV2_PORT_DESIGNATION_TIME_BEAT_UNIT) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_BEATS_PER_BAR(x) ((x) == LV2_PORT_DESIGNATION_TIME_BEATS_PER_BAR) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_BEATS_PER_MINUTE(x) ((x) == LV2_PORT_DESIGNATION_TIME_BEATS_PER_MINUTE) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_FRAME(x) ((x) == LV2_PORT_DESIGNATION_TIME_FRAME) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND(x) ((x) == LV2_PORT_DESIGNATION_TIME_FRAMES_PER_SECOND) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_POSITION(x) ((x) == LV2_PORT_DESIGNATION_TIME_POSITION) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME_SPEED(x) ((x) == LV2_PORT_DESIGNATION_TIME_SPEED) | |||
| #define LV2_IS_PORT_DESIGNATION_TIME(x) ((x) >= LV2_PORT_DESIGNATION_TIME_BAR && (x) <= LV2_PORT_DESIGNATION_TIME_SPEED) | |||
| // Feature Types | |||
| #define LV2_FEATURE_OPTIONAL 0x1 | |||
| #define LV2_FEATURE_REQUIRED 0x2 | |||
| #define LV2_IS_FEATURE_OPTIONAL(x) ((x) == LV2_FEATURE_OPTIONAL) | |||
| #define LV2_IS_FEATURE_REQUIRED(x) ((x) == LV2_FEATURE_REQUIRED) | |||
| // UI Types | |||
| #define LV2_UI_GTK2 0x1 | |||
| #define LV2_UI_GTK3 0x2 | |||
| #define LV2_UI_QT4 0x3 | |||
| #define LV2_UI_QT5 0x4 | |||
| #define LV2_UI_COCOA 0x5 | |||
| #define LV2_UI_WINDOWS 0x6 | |||
| #define LV2_UI_X11 0x7 | |||
| #define LV2_UI_EXTERNAL 0x8 | |||
| #define LV2_UI_OLD_EXTERNAL 0x9 | |||
| #define LV2_IS_UI_GTK2(x) ((x) == LV2_UI_GTK2) | |||
| #define LV2_IS_UI_GTK3(x) ((x) == LV2_UI_GTK3) | |||
| #define LV2_IS_UI_QT4(x) ((x) == LV2_UI_QT4) | |||
| #define LV2_IS_UI_QT5(x) ((x) == LV2_UI_QT5) | |||
| #define LV2_IS_UI_COCOA(x) ((x) == LV2_UI_COCOA) | |||
| #define LV2_IS_UI_WINDOWS(x) ((x) == LV2_UI_WINDOWS) | |||
| #define LV2_IS_UI_X11(x) ((x) == LV2_UI_X11) | |||
| #define LV2_IS_UI_EXTERNAL(x) ((x) == LV2_UI_EXTERNAL) | |||
| #define LV2_IS_UI_OLD_EXTERNAL(x) ((x) == LV2_UI_OLD_EXTERNAL) | |||
| // Plugin Types | |||
| #define LV2_PLUGIN_DELAY 0x000001 | |||
| #define LV2_PLUGIN_REVERB 0x000002 | |||
| #define LV2_PLUGIN_SIMULATOR 0x000004 | |||
| #define LV2_PLUGIN_DISTORTION 0x000008 | |||
| #define LV2_PLUGIN_WAVESHAPER 0x000010 | |||
| #define LV2_PLUGIN_DYNAMICS 0x000020 | |||
| #define LV2_PLUGIN_AMPLIFIER 0x000040 | |||
| #define LV2_PLUGIN_COMPRESSOR 0x000080 | |||
| #define LV2_PLUGIN_ENVELOPE 0x000100 | |||
| #define LV2_PLUGIN_EXPANDER 0x000200 | |||
| #define LV2_PLUGIN_GATE 0x000400 | |||
| #define LV2_PLUGIN_LIMITER 0x000800 | |||
| #define LV2_PLUGIN_EQ 0x001000 | |||
| #define LV2_PLUGIN_MULTI_EQ 0x002000 | |||
| #define LV2_PLUGIN_PARA_EQ 0x004000 | |||
| #define LV2_PLUGIN_FILTER 0x008000 | |||
| #define LV2_PLUGIN_ALLPASS 0x010000 | |||
| #define LV2_PLUGIN_BANDPASS 0x020000 | |||
| #define LV2_PLUGIN_COMB 0x040000 | |||
| #define LV2_PLUGIN_HIGHPASS 0x080000 | |||
| #define LV2_PLUGIN_LOWPASS 0x100000 | |||
| #define LV2_PLUGIN_GENERATOR 0x000001 | |||
| #define LV2_PLUGIN_CONSTANT 0x000002 | |||
| #define LV2_PLUGIN_INSTRUMENT 0x000004 | |||
| #define LV2_PLUGIN_OSCILLATOR 0x000008 | |||
| #define LV2_PLUGIN_MODULATOR 0x000010 | |||
| #define LV2_PLUGIN_CHORUS 0x000020 | |||
| #define LV2_PLUGIN_FLANGER 0x000040 | |||
| #define LV2_PLUGIN_PHASER 0x000080 | |||
| #define LV2_PLUGIN_SPATIAL 0x000100 | |||
| #define LV2_PLUGIN_SPECTRAL 0x000200 | |||
| #define LV2_PLUGIN_PITCH 0x000400 | |||
| #define LV2_PLUGIN_UTILITY 0x000800 | |||
| #define LV2_PLUGIN_ANALYSER 0x001000 | |||
| #define LV2_PLUGIN_CONVERTER 0x002000 | |||
| #define LV2_PLUGIN_FUNCTION 0x008000 | |||
| #define LV2_PLUGIN_MIXER 0x010000 | |||
| #define LV2_GROUP_DELAY (LV2_PLUGIN_DELAY|LV2_PLUGIN_REVERB) | |||
| #define LV2_GROUP_DISTORTION (LV2_PLUGIN_DISTORTION|LV2_PLUGIN_WAVESHAPER) | |||
| #define LV2_GROUP_DYNAMICS (LV2_PLUGIN_DYNAMICS|LV2_PLUGIN_AMPLIFIER|LV2_PLUGIN_COMPRESSOR|LV2_PLUGIN_ENVELOPE|LV2_PLUGIN_EXPANDER|LV2_PLUGIN_GATE|LV2_PLUGIN_LIMITER) | |||
| #define LV2_GROUP_EQ (LV2_PLUGIN_EQ|LV2_PLUGIN_MULTI_EQ|LV2_PLUGIN_PARA_EQ) | |||
| #define LV2_GROUP_FILTER (LV2_PLUGIN_FILTER|LV2_PLUGIN_ALLPASS|LV2_PLUGIN_BANDPASS|LV2_PLUGIN_COMB|LV2_GROUP_EQ|LV2_PLUGIN_HIGHPASS|LV2_PLUGIN_LOWPASS) | |||
| #define LV2_GROUP_GENERATOR (LV2_PLUGIN_GENERATOR|LV2_PLUGIN_CONSTANT|LV2_PLUGIN_INSTRUMENT|LV2_PLUGIN_OSCILLATOR) | |||
| #define LV2_GROUP_MODULATOR (LV2_PLUGIN_MODULATOR|LV2_PLUGIN_CHORUS|LV2_PLUGIN_FLANGER|LV2_PLUGIN_PHASER) | |||
| #define LV2_GROUP_REVERB (LV2_PLUGIN_REVERB) | |||
| #define LV2_GROUP_SIMULATOR (LV2_PLUGIN_SIMULATOR|LV2_PLUGIN_REVERB) | |||
| #define LV2_GROUP_SPATIAL (LV2_PLUGIN_SPATIAL) | |||
| #define LV2_GROUP_SPECTRAL (LV2_PLUGIN_SPECTRAL|LV2_PLUGIN_PITCH) | |||
| #define LV2_GROUP_UTILITY (LV2_PLUGIN_UTILITY|LV2_PLUGIN_ANALYSER|LV2_PLUGIN_CONVERTER|LV2_PLUGIN_FUNCTION|LV2_PLUGIN_MIXER) | |||
| #define LV2_IS_DELAY(x, y) (((x) & LV2_GROUP_DELAY) || ((y) & LV2_GROUP_DELAY)) | |||
| #define LV2_IS_DISTORTION(x, y) (((x) & LV2_GROUP_DISTORTION) || ((y) & LV2_GROUP_DISTORTION)) | |||
| #define LV2_IS_DYNAMICS(x, y) (((x) & LV2_GROUP_DYNAMICS) || ((y) & LV2_GROUP_DYNAMICS)) | |||
| #define LV2_IS_EQ(x, y) (((x) & LV2_GROUP_EQ) || ((y) & LV2_GROUP_EQ)) | |||
| #define LV2_IS_FILTER(x, y) (((x) & LV2_GROUP_FILTER) || ((y) & LV2_GROUP_FILTER)) | |||
| #define LV2_IS_GENERATOR(x, y) (((x) & LV2_GROUP_GENERATOR) || ((y) & LV2_GROUP_GENERATOR)) | |||
| #define LV2_IS_MODULATOR(x, y) (((x) & LV2_GROUP_MODULATOR) || ((y) & LV2_GROUP_MODULATOR)) | |||
| #define LV2_IS_REVERB(x, y) (((x) & LV2_GROUP_REVERB) || ((y) & LV2_GROUP_REVERB)) | |||
| #define LV2_IS_SIMULATOR(x, y) (((x) & LV2_GROUP_SIMULATOR) || ((y) & LV2_GROUP_SIMULATOR)) | |||
| #define LV2_IS_SPATIAL(x, y) (((x) & LV2_GROUP_SPATIAL) || ((y) & LV2_GROUP_SPATIAL)) | |||
| #define LV2_IS_SPECTRAL(x, y) (((x) & LV2_GROUP_SPECTRAL) || ((y) & LV2_GROUP_SPECTRAL)) | |||
| #define LV2_IS_UTILITY(x, y) (((x) & LV2_GROUP_UTILITY) || ((y) & LV2_GROUP_UTILITY)) | |||
| // Port Midi Map | |||
| struct LV2_RDF_PortMidiMap { | |||
| LV2_Property Type; | |||
| uint32_t Number; | |||
| LV2_RDF_PortMidiMap() | |||
| : Type(0), | |||
| Number(0) {} | |||
| }; | |||
| // Port Points | |||
| struct LV2_RDF_PortPoints { | |||
| LV2_Property Hints; | |||
| float Default; | |||
| float Minimum; | |||
| float Maximum; | |||
| LV2_RDF_PortPoints() | |||
| : Hints(0x0), | |||
| Default(0.0f), | |||
| Minimum(0.0f), | |||
| Maximum(1.0f) {} | |||
| }; | |||
| // Port Unit | |||
| struct LV2_RDF_PortUnit { | |||
| LV2_Property Hints; | |||
| const char* Name; | |||
| const char* Render; | |||
| const char* Symbol; | |||
| LV2_Property Unit; | |||
| LV2_RDF_PortUnit() | |||
| : Hints(0x0), | |||
| Name(nullptr), | |||
| Render(nullptr), | |||
| Symbol(nullptr), | |||
| Unit(0) {} | |||
| ~LV2_RDF_PortUnit() | |||
| { | |||
| if (Name) | |||
| ::free((void*)Name); | |||
| if (Render) | |||
| ::free((void*)Render); | |||
| if (Symbol) | |||
| ::free((void*)Symbol); | |||
| } | |||
| }; | |||
| // Port Scale Point | |||
| struct LV2_RDF_PortScalePoint { | |||
| const char* Label; | |||
| float Value; | |||
| LV2_RDF_PortScalePoint() | |||
| : Label(nullptr), | |||
| Value(0.0f) {} | |||
| ~LV2_RDF_PortScalePoint() | |||
| { | |||
| if (Label) | |||
| ::free((void*)Label); | |||
| } | |||
| }; | |||
| // Port | |||
| struct LV2_RDF_Port { | |||
| LV2_Property Types; | |||
| LV2_Property Properties; | |||
| LV2_Property Designation; | |||
| const char* Name; | |||
| const char* Symbol; | |||
| LV2_RDF_PortMidiMap MidiMap; | |||
| LV2_RDF_PortPoints Points; | |||
| LV2_RDF_PortUnit Unit; | |||
| uint32_t ScalePointCount; | |||
| LV2_RDF_PortScalePoint* ScalePoints; | |||
| LV2_RDF_Port() | |||
| : Types(0x0), | |||
| Properties(0x0), | |||
| Designation(0), | |||
| Name(nullptr), | |||
| Symbol(nullptr), | |||
| ScalePointCount(0), | |||
| ScalePoints(nullptr) {} | |||
| ~LV2_RDF_Port() | |||
| { | |||
| if (Name) | |||
| ::free((void*)Name); | |||
| if (Symbol) | |||
| ::free((void*)Symbol); | |||
| if (ScalePoints) | |||
| delete[] ScalePoints; | |||
| } | |||
| }; | |||
| // Preset | |||
| struct LV2_RDF_Preset { | |||
| LV2_URI URI; | |||
| const char* Label; | |||
| LV2_RDF_Preset() | |||
| : URI(nullptr), | |||
| Label(nullptr) {} | |||
| ~LV2_RDF_Preset() | |||
| { | |||
| if (URI) | |||
| ::free((void*)URI); | |||
| if (Label) | |||
| ::free((void*)Label); | |||
| } | |||
| }; | |||
| // Feature | |||
| struct LV2_RDF_Feature { | |||
| LV2_Property Type; | |||
| LV2_URI URI; | |||
| LV2_RDF_Feature() | |||
| : Type(0), | |||
| URI(nullptr) {} | |||
| ~LV2_RDF_Feature() | |||
| { | |||
| if (URI) | |||
| ::free((void*)URI); | |||
| } | |||
| }; | |||
| // UI | |||
| struct LV2_RDF_UI { | |||
| LV2_Type Type; | |||
| LV2_URI URI; | |||
| const char* Binary; | |||
| const char* Bundle; | |||
| uint32_t FeatureCount; | |||
| LV2_RDF_Feature* Features; | |||
| uint32_t ExtensionCount; | |||
| LV2_URI* Extensions; | |||
| LV2_RDF_UI() | |||
| : URI(nullptr), | |||
| Binary(nullptr), | |||
| Bundle(nullptr), | |||
| FeatureCount(0), | |||
| Features(nullptr), | |||
| ExtensionCount(0), | |||
| Extensions(nullptr) {} | |||
| ~LV2_RDF_UI() | |||
| { | |||
| if (URI) | |||
| ::free((void*)URI); | |||
| if (Binary) | |||
| ::free((void*)Binary); | |||
| if (Bundle) | |||
| ::free((void*)Bundle); | |||
| if (Features) | |||
| delete[] Features; | |||
| if (Extensions) | |||
| delete[] Extensions; | |||
| } | |||
| }; | |||
| // Plugin | |||
| struct LV2_RDF_Descriptor { | |||
| LV2_Property Type[2]; | |||
| LV2_URI URI; | |||
| const char* Name; | |||
| const char* Author; | |||
| const char* License; | |||
| const char* Binary; | |||
| const char* Bundle; | |||
| unsigned long UniqueID; | |||
| uint32_t PortCount; | |||
| LV2_RDF_Port* Ports; | |||
| uint32_t PresetCount; | |||
| LV2_RDF_Preset* Presets; | |||
| uint32_t FeatureCount; | |||
| LV2_RDF_Feature* Features; | |||
| uint32_t ExtensionCount; | |||
| LV2_URI* Extensions; | |||
| uint32_t UICount; | |||
| LV2_RDF_UI* UIs; | |||
| LV2_RDF_Descriptor() | |||
| : Type{0x0, 0x0}, // FIXME ? | |||
| URI(nullptr), | |||
| Name(nullptr), | |||
| Author(nullptr), | |||
| License(nullptr), | |||
| Binary(nullptr), | |||
| Bundle(nullptr), | |||
| UniqueID(0), | |||
| PortCount(0), | |||
| Ports(nullptr), | |||
| PresetCount(0), | |||
| Presets(nullptr), | |||
| FeatureCount(0), | |||
| Features(nullptr), | |||
| ExtensionCount(0), | |||
| Extensions(nullptr), | |||
| UICount(0), | |||
| UIs(nullptr) {} | |||
| ~LV2_RDF_Descriptor() | |||
| { | |||
| if (URI) | |||
| ::free((void*)URI); | |||
| if (Name) | |||
| ::free((void*)Name); | |||
| if (Author) | |||
| ::free((void*)Author); | |||
| if (License) | |||
| ::free((void*)License); | |||
| if (Binary) | |||
| ::free((void*)Binary); | |||
| if (Bundle) | |||
| ::free((void*)Bundle); | |||
| if (Ports) | |||
| delete[] Ports; | |||
| if (Presets) | |||
| delete[] Presets; | |||
| if (Features) | |||
| delete[] Features; | |||
| if (Extensions) | |||
| delete[] Extensions; | |||
| if (UIs) | |||
| delete[] UIs; | |||
| } | |||
| }; | |||
| #endif // LV2_RDF_INCLUDED | |||
| @@ -0,0 +1,459 @@ | |||
| /* | |||
| * Carla Backend | |||
| * Copyright (C) 2011-2012 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef CARLA_BACKEND_UTILS_HPP | |||
| #define CARLA_BACKEND_UTILS_HPP | |||
| #include "carla_backend.hpp" | |||
| #include "carla_utils.hpp" | |||
| CARLA_BACKEND_START_NAMESPACE | |||
| /*! | |||
| * @defgroup CarlaBackendUtils Carla Backend Utils | |||
| * | |||
| * Carla Backend Utils | |||
| * | |||
| * @{ | |||
| */ | |||
| static inline | |||
| const char* BinaryType2Str(const BinaryType& type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case BINARY_NONE: | |||
| return "BINARY_NONE"; | |||
| case BINARY_POSIX32: | |||
| return "BINARY_POSIX32"; | |||
| case BINARY_POSIX64: | |||
| return "BINARY_POSIX64"; | |||
| case BINARY_WIN32: | |||
| return "BINARY_WIN32"; | |||
| case BINARY_WIN64: | |||
| return "BINARY_WIN64"; | |||
| case BINARY_OTHER: | |||
| return "BINARY_OTHER"; | |||
| } | |||
| qWarning("CarlaBackend::BinaryType2Str(%i) - invalid type", type); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* PluginType2Str(const PluginType& type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case PLUGIN_NONE: | |||
| return "PLUGIN_NONE"; | |||
| case PLUGIN_INTERNAL: | |||
| return "PLUGIN_INTERNAL"; | |||
| case PLUGIN_LADSPA: | |||
| return "PLUGIN_LADSPA"; | |||
| case PLUGIN_DSSI: | |||
| return "PLUGIN_DSSI"; | |||
| case PLUGIN_LV2: | |||
| return "PLUGIN_LV2"; | |||
| case PLUGIN_VST: | |||
| return "PLUGIN_VST"; | |||
| case PLUGIN_GIG: | |||
| return "PLUGIN_GIG"; | |||
| case PLUGIN_SF2: | |||
| return "PLUGIN_SF2"; | |||
| case PLUGIN_SFZ: | |||
| return "PLUGIN_SFZ"; | |||
| } | |||
| qWarning("CarlaBackend::PluginType2Str(%i) - invalid type", type); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* PluginCategory2Str(const PluginCategory& category) | |||
| { | |||
| switch (category) | |||
| { | |||
| case PLUGIN_CATEGORY_NONE: | |||
| return "PLUGIN_CATEGORY_NONE"; | |||
| case PLUGIN_CATEGORY_SYNTH: | |||
| return "PLUGIN_CATEGORY_SYNTH"; | |||
| case PLUGIN_CATEGORY_DELAY: | |||
| return "PLUGIN_CATEGORY_DELAY"; | |||
| case PLUGIN_CATEGORY_EQ: | |||
| return "PLUGIN_CATEGORY_EQ"; | |||
| case PLUGIN_CATEGORY_FILTER: | |||
| return "PLUGIN_CATEGORY_FILTER"; | |||
| case PLUGIN_CATEGORY_DYNAMICS: | |||
| return "PLUGIN_CATEGORY_DYNAMICS"; | |||
| case PLUGIN_CATEGORY_MODULATOR: | |||
| return "PLUGIN_CATEGORY_MODULATOR"; | |||
| case PLUGIN_CATEGORY_UTILITY: | |||
| return "PLUGIN_CATEGORY_UTILITY"; | |||
| case PLUGIN_CATEGORY_OTHER: | |||
| return "PLUGIN_CATEGORY_OTHER"; | |||
| } | |||
| qWarning("CarlaBackend::PluginCategory2Str(%i) - invalid category", category); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* ParameterType2Str(const ParameterType& type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case PARAMETER_UNKNOWN: | |||
| return "PARAMETER_UNKNOWN"; | |||
| case PARAMETER_INPUT: | |||
| return "PARAMETER_INPUT"; | |||
| case PARAMETER_OUTPUT: | |||
| return "PARAMETER_OUTPUT"; | |||
| case PARAMETER_LATENCY: | |||
| return "PARAMETER_LATENCY"; | |||
| case PARAMETER_SAMPLE_RATE: | |||
| return "PARAMETER_SAMPLE_RATE"; | |||
| case PARAMETER_LV2_FREEWHEEL: | |||
| return "PARAMETER_LV2_FREEWHEEL"; | |||
| case PARAMETER_LV2_TIME: | |||
| return "PARAMETER_LV2_TIME"; | |||
| } | |||
| qWarning("CarlaBackend::ParameterType2Str(%i) - invalid type", type); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* InternalParametersIndex2Str(const InternalParametersIndex& index) | |||
| { | |||
| switch (index) | |||
| { | |||
| case PARAMETER_NULL: | |||
| return "PARAMETER_NULL"; | |||
| case PARAMETER_ACTIVE: | |||
| return "PARAMETER_ACTIVE"; | |||
| case PARAMETER_DRYWET: | |||
| return "PARAMETER_DRYWET"; | |||
| case PARAMETER_VOLUME: | |||
| return "PARAMETER_VOLUME"; | |||
| case PARAMETER_BALANCE_LEFT: | |||
| return "PARAMETER_BALANCE_LEFT"; | |||
| case PARAMETER_BALANCE_RIGHT: | |||
| return "PARAMETER_BALANCE_RIGHT"; | |||
| } | |||
| qWarning("CarlaBackend::InternalParametersIndex2Str(%i) - invalid index", index); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* GuiType2Str(const GuiType& type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case GUI_NONE: | |||
| return "GUI_NONE"; | |||
| case GUI_INTERNAL_QT4: | |||
| return "GUI_INTERNAL_QT4"; | |||
| case GUI_INTERNAL_COCOA: | |||
| return "GUI_INTERNAL_COCOA"; | |||
| case GUI_INTERNAL_HWND: | |||
| return "GUI_INTERNAL_HWND"; | |||
| case GUI_INTERNAL_X11: | |||
| return "GUI_INTERNAL_X11"; | |||
| case GUI_EXTERNAL_LV2: | |||
| return "GUI_EXTERNAL_LV2"; | |||
| case GUI_EXTERNAL_SUIL: | |||
| return "GUI_EXTERNAL_SUIL"; | |||
| case GUI_EXTERNAL_OSC: | |||
| return "GUI_EXTERNAL_OSC"; | |||
| } | |||
| qWarning("CarlaBackend::GuiType2Str(%i) - invalid type", type); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* OptionsType2Str(const OptionsType& type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case OPTION_PROCESS_NAME: | |||
| return "OPTION_PROCESS_NAME"; | |||
| case OPTION_PROCESS_MODE: | |||
| return "OPTION_PROCESS_MODE"; | |||
| case OPTION_PROCESS_HIGH_PRECISION: | |||
| return "OPTION_PROCESS_HIGH_PRECISION"; | |||
| case OPTION_MAX_PARAMETERS: | |||
| return "OPTION_MAX_PARAMETERS"; | |||
| case OPTION_PREFERRED_BUFFER_SIZE: | |||
| return "OPTION_PREFERRED_BUFFER_SIZE"; | |||
| case OPTION_PREFERRED_SAMPLE_RATE: | |||
| return "OPTION_PREFERRED_SAMPLE_RATE"; | |||
| case OPTION_FORCE_STEREO: | |||
| return "OPTION_FORCE_STEREO"; | |||
| case OPTION_USE_DSSI_VST_CHUNKS: | |||
| return "OPTION_USE_DSSI_VST_CHUNKS"; | |||
| case OPTION_PREFER_PLUGIN_BRIDGES: | |||
| return "OPTION_PREFER_PLUGIN_BRIDGES"; | |||
| case OPTION_PREFER_UI_BRIDGES: | |||
| return "OPTION_PREFER_UI_BRIDGES"; | |||
| case OPTION_OSC_UI_TIMEOUT: | |||
| return "OPTION_OSC_UI_TIMEOUT"; | |||
| case OPTION_PATH_BRIDGE_POSIX32: | |||
| return "OPTION_PATH_BRIDGE_POSIX32"; | |||
| case OPTION_PATH_BRIDGE_POSIX64: | |||
| return "OPTION_PATH_BRIDGE_POSIX64"; | |||
| case OPTION_PATH_BRIDGE_WIN32: | |||
| return "OPTION_PATH_BRIDGE_WIN32"; | |||
| case OPTION_PATH_BRIDGE_WIN64: | |||
| return "OPTION_PATH_BRIDGE_WIN64"; | |||
| case OPTION_PATH_BRIDGE_LV2_GTK2: | |||
| return "OPTION_PATH_BRIDGE_LV2_GTK2"; | |||
| case OPTION_PATH_BRIDGE_LV2_GTK3: | |||
| return "OPTION_PATH_BRIDGE_LV2_GTK3"; | |||
| case OPTION_PATH_BRIDGE_LV2_QT4: | |||
| return "OPTION_PATH_BRIDGE_LV2_QT4"; | |||
| case OPTION_PATH_BRIDGE_LV2_QT5: | |||
| return "OPTION_PATH_BRIDGE_LV2_QT5"; | |||
| case OPTION_PATH_BRIDGE_LV2_COCOA: | |||
| return "OPTION_PATH_BRIDGE_LV2_COCOA"; | |||
| case OPTION_PATH_BRIDGE_LV2_WINDOWS: | |||
| return "OPTION_PATH_BRIDGE_LV2_WINDOWS"; | |||
| case OPTION_PATH_BRIDGE_LV2_X11: | |||
| return "OPTION_PATH_BRIDGE_LV2_X11"; | |||
| case OPTION_PATH_BRIDGE_VST_COCOA: | |||
| return "OPTION_PATH_BRIDGE_VST_COCOA"; | |||
| case OPTION_PATH_BRIDGE_VST_HWND: | |||
| return "OPTION_PATH_BRIDGE_VST_HWND"; | |||
| case OPTION_PATH_BRIDGE_VST_X11: | |||
| return "OPTION_PATH_BRIDGE_VST_X11"; | |||
| } | |||
| qWarning("CarlaBackend::OptionsType2Str(%i) - invalid type", type); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* CallbackType2Str(const CallbackType& type) | |||
| { | |||
| switch (type) | |||
| { | |||
| case CALLBACK_DEBUG: | |||
| return "CALLBACK_DEBUG"; | |||
| case CALLBACK_PARAMETER_VALUE_CHANGED: | |||
| return "CALLBACK_PARAMETER_VALUE_CHANGED"; | |||
| case CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED: | |||
| return "CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED"; | |||
| case CALLBACK_PARAMETER_MIDI_CC_CHANGED: | |||
| return "CALLBACK_PARAMETER_MIDI_CC_CHANGED"; | |||
| case CALLBACK_PROGRAM_CHANGED: | |||
| return "CALLBACK_PROGRAM_CHANGED"; | |||
| case CALLBACK_MIDI_PROGRAM_CHANGED: | |||
| return "CALLBACK_MIDI_PROGRAM_CHANGED"; | |||
| case CALLBACK_NOTE_ON: | |||
| return "CALLBACK_NOTE_ON"; | |||
| case CALLBACK_NOTE_OFF: | |||
| return "CALLBACK_NOTE_OFF"; | |||
| case CALLBACK_SHOW_GUI: | |||
| return "CALLBACK_SHOW_GUI"; | |||
| case CALLBACK_RESIZE_GUI: | |||
| return "CALLBACK_RESIZE_GUI"; | |||
| case CALLBACK_UPDATE: | |||
| return "CALLBACK_UPDATE"; | |||
| case CALLBACK_RELOAD_INFO: | |||
| return "CALLBACK_RELOAD_INFO"; | |||
| case CALLBACK_RELOAD_PARAMETERS: | |||
| return "CALLBACK_RELOAD_PARAMETERS"; | |||
| case CALLBACK_RELOAD_PROGRAMS: | |||
| return "CALLBACK_RELOAD_PROGRAMS"; | |||
| case CALLBACK_RELOAD_ALL: | |||
| return "CALLBACK_RELOAD_ALL"; | |||
| case CALLBACK_NSM_ANNOUNCE: | |||
| return "CALLBACK_NSM_ANNOUNCE"; | |||
| case CALLBACK_NSM_OPEN1: | |||
| return "CALLBACK_NSM_OPEN1"; | |||
| case CALLBACK_NSM_OPEN2: | |||
| return "CALLBACK_NSM_OPEN2"; | |||
| case CALLBACK_NSM_SAVE: | |||
| return "CALLBACK_NSM_SAVE"; | |||
| case CALLBACK_ERROR: | |||
| return "CALLBACK_ERROR"; | |||
| case CALLBACK_QUIT: | |||
| return "CALLBACK_QUIT"; | |||
| } | |||
| qWarning("CarlaBackend::CallbackType2Str(%i) - invalid type", type); | |||
| return nullptr; | |||
| } | |||
| static inline | |||
| const char* ProcessMode2Str(const ProcessMode& mode) | |||
| { | |||
| switch (mode) | |||
| { | |||
| case PROCESS_MODE_SINGLE_CLIENT: | |||
| return "PROCESS_MODE_SINGLE_CLIENT"; | |||
| case PROCESS_MODE_MULTIPLE_CLIENTS: | |||
| return "PROCESS_MODE_MULTIPLE_CLIENTS"; | |||
| case PROCESS_MODE_CONTINUOUS_RACK: | |||
| return "PROCESS_MODE_CONTINUOUS_RACK"; | |||
| case PROCESS_MODE_PATCHBAY: | |||
| return "PROCESS_MODE_PATCHBAY"; | |||
| } | |||
| qWarning("CarlaBackend::ProcessModeType2Str(%i) - invalid type", mode); | |||
| return nullptr; | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| static inline | |||
| const char* getPluginTypeString(const PluginType& type) | |||
| { | |||
| qDebug("CarlaBackend::getPluginTypeString(%s)", PluginType2Str(type)); | |||
| switch (type) | |||
| { | |||
| case PLUGIN_NONE: | |||
| return "NONE"; | |||
| case PLUGIN_INTERNAL: | |||
| return "INTERNAL"; | |||
| case PLUGIN_LADSPA: | |||
| return "LADSPA"; | |||
| case PLUGIN_DSSI: | |||
| return "DSSI"; | |||
| case PLUGIN_LV2: | |||
| return "LV2"; | |||
| case PLUGIN_VST: | |||
| return "VST"; | |||
| case PLUGIN_GIG: | |||
| return "GIG"; | |||
| case PLUGIN_SF2: | |||
| return "SF2"; | |||
| case PLUGIN_SFZ: | |||
| return "SFZ"; | |||
| } | |||
| return "NONE"; | |||
| } | |||
| // ------------------------------------------------------------------------------------------------------------------- | |||
| static inline | |||
| uintptr_t getAddressFromPointer(void* const ptr) | |||
| { | |||
| qDebug("CarlaBackend::getAddressFromPointer(%p)", ptr); | |||
| CARLA_ASSERT(ptr != nullptr); | |||
| uintptr_t* addr = (uintptr_t*)&ptr; | |||
| return *addr; | |||
| } | |||
| static inline | |||
| void* getPointerFromAddress(const uintptr_t& addr) | |||
| { | |||
| CARLA_ASSERT(addr != 0); | |||
| uintptr_t** const ptr = (uintptr_t**)&addr; | |||
| return *ptr; | |||
| } | |||
| static inline | |||
| PluginCategory getPluginCategoryFromName(const char* const name) | |||
| { | |||
| qDebug("CarlaBackend::getPluginCategoryFromName(\"%s\")", name); | |||
| CARLA_ASSERT(name); | |||
| if (! name) | |||
| return PLUGIN_CATEGORY_NONE; | |||
| CarlaString sname(name); | |||
| if (sname.isEmpty()) | |||
| return PLUGIN_CATEGORY_NONE; | |||
| sname.toLower(); | |||
| // generic tags first | |||
| if (sname.contains("delay")) | |||
| return PLUGIN_CATEGORY_DELAY; | |||
| if (sname.contains("reverb")) | |||
| return PLUGIN_CATEGORY_DELAY; | |||
| // filter | |||
| if (sname.contains("filter")) | |||
| return PLUGIN_CATEGORY_FILTER; | |||
| // dynamics | |||
| if (sname.contains("dynamics")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| if (sname.contains("amplifier")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| if (sname.contains("compressor")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| if (sname.contains("enhancer")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| if (sname.contains("exciter")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| if (sname.contains("gate")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| if (sname.contains("limiter")) | |||
| return PLUGIN_CATEGORY_DYNAMICS; | |||
| // modulator | |||
| if (sname.contains("modulator")) | |||
| return PLUGIN_CATEGORY_MODULATOR; | |||
| if (sname.contains("chorus")) | |||
| return PLUGIN_CATEGORY_MODULATOR; | |||
| if (sname.contains("flanger")) | |||
| return PLUGIN_CATEGORY_MODULATOR; | |||
| if (sname.contains("phaser")) | |||
| return PLUGIN_CATEGORY_MODULATOR; | |||
| if (sname.contains("saturator")) | |||
| return PLUGIN_CATEGORY_MODULATOR; | |||
| // utility | |||
| if (sname.contains("utility")) | |||
| return PLUGIN_CATEGORY_UTILITY; | |||
| if (sname.contains("analyzer")) | |||
| return PLUGIN_CATEGORY_UTILITY; | |||
| if (sname.contains("converter")) | |||
| return PLUGIN_CATEGORY_UTILITY; | |||
| if (sname.contains("deesser")) | |||
| return PLUGIN_CATEGORY_UTILITY; | |||
| if (sname.contains("mixer")) | |||
| return PLUGIN_CATEGORY_UTILITY; | |||
| // common tags | |||
| if (sname.contains("verb")) | |||
| return PLUGIN_CATEGORY_DELAY; | |||
| if (sname.contains("eq")) | |||
| return PLUGIN_CATEGORY_EQ; | |||
| if (sname.contains("tool")) | |||
| return PLUGIN_CATEGORY_UTILITY; | |||
| return PLUGIN_CATEGORY_NONE; | |||
| } | |||
| /**@}*/ | |||
| CARLA_BACKEND_END_NAMESPACE | |||
| #endif // CARLA_BACKEND_UTILS_HPP | |||
| @@ -0,0 +1,212 @@ | |||
| /* | |||
| * Carla LADSPA utils | |||
| * Copyright (C) 2011-2013 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef __CARLA_LADSPA_UTILS_HPP__ | |||
| #define __CARLA_LADSPA_UTILS_HPP__ | |||
| #include "carla_utils.hpp" | |||
| #include "ladspa/ladspa.h" | |||
| #include "ladspa_rdf.hpp" | |||
| #include <cmath> | |||
| #include <cstring> | |||
| // ------------------------------------------------- | |||
| // Copy RDF object | |||
| static inline | |||
| const LADSPA_RDF_Descriptor* ladspa_rdf_dup(const LADSPA_RDF_Descriptor* const oldDescriptor) | |||
| { | |||
| CARLA_ASSERT(oldDescriptor); | |||
| if (! oldDescriptor) | |||
| return nullptr; | |||
| LADSPA_RDF_Descriptor* const newDescriptor = new LADSPA_RDF_Descriptor; | |||
| newDescriptor->Type = oldDescriptor->Type; | |||
| newDescriptor->UniqueID = oldDescriptor->UniqueID; | |||
| newDescriptor->PortCount = oldDescriptor->PortCount; | |||
| if (oldDescriptor->Title) | |||
| newDescriptor->Title = strdup(oldDescriptor->Title); | |||
| if (oldDescriptor->Creator) | |||
| newDescriptor->Creator = strdup(oldDescriptor->Creator); | |||
| if (newDescriptor->PortCount > 0) | |||
| { | |||
| newDescriptor->Ports = new LADSPA_RDF_Port[newDescriptor->PortCount]; | |||
| for (unsigned long i=0; i < newDescriptor->PortCount; i++) | |||
| { | |||
| LADSPA_RDF_Port* const newPort = &newDescriptor->Ports[i]; | |||
| newPort->Type = oldDescriptor->Ports[i].Type; | |||
| newPort->Hints = oldDescriptor->Ports[i].Hints; | |||
| newPort->Default = oldDescriptor->Ports[i].Default; | |||
| newPort->Unit = oldDescriptor->Ports[i].Unit; | |||
| newPort->ScalePointCount = oldDescriptor->Ports[i].ScalePointCount; | |||
| if (oldDescriptor->Ports[i].Label) | |||
| newPort->Label = strdup(oldDescriptor->Ports[i].Label); | |||
| if (newPort->ScalePointCount > 0) | |||
| { | |||
| newPort->ScalePoints = new LADSPA_RDF_ScalePoint[newPort->ScalePointCount]; | |||
| for (unsigned long j=0; j < newPort->ScalePointCount; j++) | |||
| { | |||
| LADSPA_RDF_ScalePoint* const newScalePoint = &newPort->ScalePoints[j]; | |||
| newScalePoint->Value = oldDescriptor->Ports[i].ScalePoints[j].Value; | |||
| if (oldDescriptor->Ports[i].ScalePoints[j].Label) | |||
| newScalePoint->Label = strdup(oldDescriptor->Ports[i].ScalePoints[j].Label); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| return newDescriptor; | |||
| } | |||
| // ------------------------------------------------- | |||
| // Check if 2 ports match types | |||
| static inline | |||
| bool is_ladspa_port_good(const LADSPA_PortDescriptor port1, const LADSPA_PortDescriptor port2) | |||
| { | |||
| if (LADSPA_IS_PORT_INPUT(port1) && ! LADSPA_IS_PORT_INPUT(port2)) | |||
| return false; | |||
| if (LADSPA_IS_PORT_OUTPUT(port1) && ! LADSPA_IS_PORT_OUTPUT(port2)) | |||
| return false; | |||
| if (LADSPA_IS_PORT_CONTROL(port1) && ! LADSPA_IS_PORT_CONTROL(port2)) | |||
| return false; | |||
| if (LADSPA_IS_PORT_AUDIO(port1) && ! LADSPA_IS_PORT_AUDIO(port2)) | |||
| return false; | |||
| return true; | |||
| } | |||
| // ------------------------------------------------- | |||
| // Check if rdf data matches descriptor | |||
| static inline | |||
| bool is_ladspa_rdf_descriptor_valid(const LADSPA_RDF_Descriptor* const rdfDescriptor, const LADSPA_Descriptor* const descriptor) | |||
| { | |||
| CARLA_ASSERT(rdfDescriptor); | |||
| CARLA_ASSERT(descriptor); | |||
| if (! rdfDescriptor) | |||
| return false; | |||
| if (! descriptor) | |||
| return false; | |||
| if (rdfDescriptor->UniqueID != descriptor->UniqueID) | |||
| { | |||
| qWarning("WARNING - Plugin has wrong UniqueID: %li != %li", rdfDescriptor->UniqueID, descriptor->UniqueID); | |||
| return false; | |||
| } | |||
| if (rdfDescriptor->PortCount > descriptor->PortCount) | |||
| { | |||
| qWarning("WARNING - Plugin has RDF data, but invalid PortCount: %li > %li", rdfDescriptor->PortCount, descriptor->PortCount); | |||
| return false; | |||
| } | |||
| for (unsigned long i=0; i < rdfDescriptor->PortCount; i++) | |||
| { | |||
| if (! is_ladspa_port_good(rdfDescriptor->Ports[i].Type, descriptor->PortDescriptors[i])) | |||
| { | |||
| qWarning("WARNING - Plugin has RDF data, but invalid PortTypes: %i != %i", rdfDescriptor->Ports[i].Type, descriptor->PortDescriptors[i]); | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| // ------------------------------------------------- | |||
| // Get default control port value | |||
| static inline | |||
| LADSPA_Data get_default_ladspa_port_value(const LADSPA_PortRangeHintDescriptor hintDescriptor, const LADSPA_Data min, const LADSPA_Data max) | |||
| { | |||
| LADSPA_Data def; | |||
| if (LADSPA_IS_HINT_HAS_DEFAULT(hintDescriptor)) | |||
| { | |||
| switch (hintDescriptor & LADSPA_HINT_DEFAULT_MASK) | |||
| { | |||
| case LADSPA_HINT_DEFAULT_MINIMUM: | |||
| def = min; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_MAXIMUM: | |||
| def = max; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_0: | |||
| def = 0.0f; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_1: | |||
| def = 1.0f; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_100: | |||
| def = 100.0f; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_440: | |||
| def = 440.0f; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_LOW: | |||
| if (LADSPA_IS_HINT_LOGARITHMIC(hintDescriptor)) | |||
| def = std::exp((std::log(min)*0.75f) + (std::log(max)*0.25f)); | |||
| else | |||
| def = (min*0.75f) + (max*0.25f); | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_MIDDLE: | |||
| if (LADSPA_IS_HINT_LOGARITHMIC(hintDescriptor)) | |||
| def = std::sqrt(min*max); | |||
| else | |||
| def = (min+max)/2; | |||
| break; | |||
| case LADSPA_HINT_DEFAULT_HIGH: | |||
| if (LADSPA_IS_HINT_LOGARITHMIC(hintDescriptor)) | |||
| def = std::exp((std::log(min)*0.25f) + (std::log(max)*0.75f)); | |||
| else | |||
| def = (min*0.25f) + (max*0.75f); | |||
| break; | |||
| default: | |||
| if (min < 0.0f && max > 0.0f) | |||
| def = 0.0f; | |||
| else | |||
| def = min; | |||
| break; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| // no default value | |||
| if (min < 0.0f && max > 0.0f) | |||
| def = 0.0f; | |||
| else | |||
| def = min; | |||
| } | |||
| return def; | |||
| } | |||
| // ------------------------------------------------- | |||
| #endif // __CARLA_LADSPA_UTILS_HPP__ | |||
| @@ -0,0 +1,98 @@ | |||
| /* | |||
| * Carla library utils | |||
| * Copyright (C) 2011-2013 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef __CARLA_LIB_UTILS_HPP__ | |||
| #define __CARLA_LIB_UTILS_HPP__ | |||
| #include "carla_utils.hpp" | |||
| #ifndef Q_OS_WIN | |||
| # include <dlfcn.h> | |||
| #endif | |||
| // ------------------------------------------------- | |||
| // library related calls | |||
| static inline | |||
| void* lib_open(const char* const filename) | |||
| { | |||
| CARLA_ASSERT(filename); | |||
| #ifdef Q_OS_WIN | |||
| return LoadLibraryA(filename); | |||
| #else | |||
| return dlopen(filename, RTLD_NOW|RTLD_LOCAL); | |||
| #endif | |||
| } | |||
| static inline | |||
| bool lib_close(void* const lib) | |||
| { | |||
| CARLA_ASSERT(lib); | |||
| if (! lib) | |||
| return false; | |||
| #ifdef Q_OS_WIN | |||
| return FreeLibrary((HMODULE)lib); | |||
| #else | |||
| return (dlclose(lib) == 0); | |||
| #endif | |||
| } | |||
| static inline | |||
| void* lib_symbol(void* const lib, const char* const symbol) | |||
| { | |||
| CARLA_ASSERT(lib); | |||
| CARLA_ASSERT(symbol); | |||
| if (! (lib && symbol)) | |||
| return nullptr; | |||
| #ifdef Q_OS_WIN | |||
| return (void*)GetProcAddress((HMODULE)lib, symbol); | |||
| #else | |||
| return dlsym(lib, symbol); | |||
| #endif | |||
| } | |||
| static inline | |||
| const char* lib_error(const char* const filename) | |||
| { | |||
| CARLA_ASSERT(filename); | |||
| #ifdef Q_OS_WIN | |||
| static char libError[2048]; | |||
| memset(libError, 0, sizeof(char)*2048); | |||
| LPVOID winErrorString; | |||
| DWORD winErrorCode = GetLastError(); | |||
| FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, nullptr, winErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&winErrorString, 0, nullptr); | |||
| snprintf(libError, 2048, "%s: error code %li: %s", filename, winErrorCode, (const char*)winErrorString); | |||
| LocalFree(winErrorString); | |||
| return libError; | |||
| #else | |||
| return dlerror(); | |||
| Q_UNUSED(filename); | |||
| #endif | |||
| } | |||
| // ------------------------------------------------- | |||
| #endif // __CARLA_LIB_UTILS_HPP__ | |||
| @@ -0,0 +1,348 @@ | |||
| /* | |||
| * Carla OSC utils | |||
| * Copyright (C) 2012 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef CARLA_OSC_UTILS_HPP | |||
| #define CARLA_OSC_UTILS_HPP | |||
| #include "carla_utils.hpp" | |||
| #include <cstdint> | |||
| #include <lo/lo.h> | |||
| // ------------------------------------------------------------------------------------------------ | |||
| struct CarlaOscData { | |||
| const char* path; | |||
| lo_address source; | |||
| lo_address target; | |||
| CarlaOscData() | |||
| : path(nullptr), | |||
| source(nullptr), | |||
| target(nullptr) {} | |||
| ~CarlaOscData() | |||
| { | |||
| free(); | |||
| } | |||
| void free() | |||
| { | |||
| if (path) | |||
| ::free((void*)path); | |||
| if (source) | |||
| ::lo_address_free(source); | |||
| if (target) | |||
| ::lo_address_free(target); | |||
| path = nullptr; | |||
| source = nullptr; | |||
| target = nullptr; | |||
| } | |||
| }; | |||
| // ------------------------------------------------------------------------------------------------ | |||
| static inline | |||
| void osc_send_configure(const CarlaOscData* const oscData, const char* const key, const char* const value) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(key); | |||
| CARLA_ASSERT(value); | |||
| qDebug("osc_send_configure(path:\"%s\", \"%s\", \"%s\")", oscData->path, key, value); | |||
| if (oscData && oscData->path && oscData->target && key && value) | |||
| { | |||
| char targetPath[strlen(oscData->path)+11]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/configure"); | |||
| lo_send(oscData->target, targetPath, "ss", key, value); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_control(const CarlaOscData* const oscData, const int32_t index, const float value) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(index != -1); // -1 == PARAMETER_NULL | |||
| qDebug("osc_send_control(path:\"%s\", %i, %f)", oscData->path, index, value); | |||
| if (oscData && oscData->path && oscData->target && index != -1) | |||
| { | |||
| char targetPath[strlen(oscData->path)+9]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/control"); | |||
| lo_send(oscData->target, targetPath, "if", index, value); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_program(const CarlaOscData* const oscData, const int32_t index) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(index >= 0); | |||
| qDebug("osc_send_program(path:\"%s\", %i)", oscData->path, index); | |||
| if (oscData && oscData->path && oscData->target && index >= 0) | |||
| { | |||
| char targetPath[strlen(oscData->path)+9]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/program"); | |||
| lo_send(oscData->target, targetPath, "i", index); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_program(const CarlaOscData* const oscData, const int32_t bank, const int32_t program) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(program >= 0); | |||
| CARLA_ASSERT(bank >= 0); | |||
| qDebug("osc_send_program(path:\"%s\", %i, %i)", oscData->path, bank, program); | |||
| if (oscData && oscData->path && oscData->target && bank >= 0 && program >= 0) | |||
| { | |||
| char targetPath[strlen(oscData->path)+9]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/program"); | |||
| lo_send(oscData->target, targetPath, "ii", bank, program); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_midi_program(const CarlaOscData* const oscData, const int32_t index) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(index >= 0); | |||
| qDebug("osc_send_midi_program(path:\"%s\", %i)", oscData->path, index); | |||
| if (oscData && oscData->path && oscData->target && index >= 0) | |||
| { | |||
| char targetPath[strlen(oscData->path)+14]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/midi_program"); | |||
| lo_send(oscData->target, targetPath, "i", index); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_midi_program(const CarlaOscData* const oscData, const int32_t bank, const int32_t program) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(program >= 0); | |||
| CARLA_ASSERT(bank >= 0); | |||
| qDebug("osc_send_midi_program(path:\"%s\", %i, %i)", oscData->path, bank, program); | |||
| if (oscData && oscData->path && oscData->target && bank >= 0 && program >= 0) | |||
| { | |||
| char targetPath[strlen(oscData->path)+14]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/midi_program"); | |||
| lo_send(oscData->target, targetPath, "ii", bank, program); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_midi(const CarlaOscData* const oscData, const uint8_t buf[4]) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(buf[0] == 0); | |||
| CARLA_ASSERT(buf[1] != 0); | |||
| qDebug("osc_send_midi(path:\"%s\", 0x%X, %03u, %03u)", oscData->path, buf[1], buf[2], buf[3]); | |||
| if (oscData && oscData->path && oscData->target && buf[0] == 0 && buf[1] != 0) | |||
| { | |||
| char targetPath[strlen(oscData->path)+6]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/midi"); | |||
| lo_send(oscData->target, targetPath, "m", buf); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_sample_rate(const CarlaOscData* const oscData, const float sampleRate) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(sampleRate > 0.0f); | |||
| qDebug("osc_send_sample_rate(path:\"%s\", %f)", oscData->path, sampleRate); | |||
| if (oscData && oscData->path && oscData->target && sampleRate > 0.0f) | |||
| { | |||
| char targetPath[strlen(oscData->path)+13]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/sample-rate"); | |||
| lo_send(oscData->target, targetPath, "f", sampleRate); | |||
| } | |||
| } | |||
| #ifdef BUILD_BRIDGE | |||
| static inline | |||
| void osc_send_update(const CarlaOscData* const oscData, const char* const url) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(url); | |||
| qDebug("osc_send_update(path:\"%s\", \"%s\")", oscData->path, url); | |||
| if (oscData && oscData->path && oscData->target && url) | |||
| { | |||
| char targetPath[strlen(oscData->path)+8]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/update"); | |||
| lo_send(oscData->target, targetPath, "s", url); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_exiting(const CarlaOscData* const oscData) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| qDebug("osc_send_exiting(path:\"%s\")", oscData->path); | |||
| if (oscData && oscData->path && oscData->target) | |||
| { | |||
| char targetPath[strlen(oscData->path)+9]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/exiting"); | |||
| lo_send(oscData->target, targetPath, ""); | |||
| } | |||
| } | |||
| #endif | |||
| static inline | |||
| void osc_send_show(const CarlaOscData* const oscData) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| qDebug("osc_send_show(path:\"%s\")", oscData->path); | |||
| if (oscData && oscData->path && oscData->target) | |||
| { | |||
| char targetPath[strlen(oscData->path)+6]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/show"); | |||
| lo_send(oscData->target, targetPath, ""); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_hide(const CarlaOscData* const oscData) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| qDebug("osc_send_hide(path:\"%s\")", oscData->path); | |||
| if (oscData && oscData->path && oscData->target) | |||
| { | |||
| char targetPath[strlen(oscData->path)+6]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/hide"); | |||
| lo_send(oscData->target, targetPath, ""); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_quit(const CarlaOscData* const oscData) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| qDebug("osc_send_quit(path:\"%s\")", oscData->path); | |||
| if (oscData && oscData->path && oscData->target) | |||
| { | |||
| char targetPath[strlen(oscData->path)+6]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/quit"); | |||
| lo_send(oscData->target, targetPath, ""); | |||
| } | |||
| } | |||
| // ------------------------------------------------------------------------------------------------ | |||
| #ifdef BUILD_BRIDGE_PLUGIN | |||
| static inline | |||
| void osc_send_bridge_update(const CarlaOscData* const oscData, const char* const url) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(url); | |||
| qDebug("osc_send_bridge_update(path:\"%s\", \"%s\")", oscData->path, url); | |||
| if (oscData && oscData->path && oscData->target && url) | |||
| { | |||
| char targetPath[strlen(oscData->path)+15]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/bridge_update"); | |||
| lo_send(oscData->target, targetPath, "s", url); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_bridge_error(const CarlaOscData* const oscData, const char* const error) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(error); | |||
| qDebug("osc_send_bridge_error(path:\"%s\", \"%s\")", oscData->path, error); | |||
| if (oscData && oscData->path && oscData->target && error) | |||
| { | |||
| char targetPath[strlen(oscData->path)+14]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/bridge_error"); | |||
| lo_send(oscData->target, targetPath, "s", error); | |||
| } | |||
| } | |||
| #endif | |||
| #if defined(BRIDGE_LV2) || defined(WANT_LV2) | |||
| static inline | |||
| void osc_send_lv2_transfer_atom(const CarlaOscData* const oscData, const int32_t portIndex, const char* const typeStr, const char* const atomBuf) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(portIndex >= 0); | |||
| CARLA_ASSERT(typeStr); | |||
| CARLA_ASSERT(atomBuf); | |||
| qDebug("osc_send_lv2_transfer_atom(path:\"%s\", %i, \"%s\", <atomBuf:%p>)", oscData->path, portIndex, typeStr, atomBuf); | |||
| if (oscData && oscData->path && oscData->target && portIndex >= 0 && typeStr && atomBuf) | |||
| { | |||
| char targetPath[strlen(oscData->path)+19]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/lv2_atom_transfer"); | |||
| lo_send(oscData->target, targetPath, "iss", portIndex, typeStr, atomBuf); | |||
| } | |||
| } | |||
| static inline | |||
| void osc_send_lv2_transfer_event(const CarlaOscData* const oscData, const int32_t portIndex, const char* const typeStr, const char* const atomBuf) | |||
| { | |||
| CARLA_ASSERT(oscData && oscData->path); | |||
| CARLA_ASSERT(portIndex >= 0); | |||
| CARLA_ASSERT(typeStr); | |||
| CARLA_ASSERT(atomBuf); | |||
| qDebug("osc_send_lv2_transfer_event(path:\"%s\", %i, \"%s\", <atomBuf:%p>)", oscData->path, portIndex, typeStr, atomBuf); | |||
| if (oscData && oscData->path && oscData->target && portIndex >= 0 && typeStr && atomBuf) | |||
| { | |||
| char targetPath[strlen(oscData->path)+20]; | |||
| strcpy(targetPath, oscData->path); | |||
| strcat(targetPath, "/lv2_event_transfer"); | |||
| lo_send(oscData->target, targetPath, "iss", portIndex, typeStr, atomBuf); | |||
| } | |||
| } | |||
| #endif | |||
| // ------------------------------------------------------------------------------------------------ | |||
| #endif // CARLA_OSC_UTILS_HPP | |||
| @@ -0,0 +1,471 @@ | |||
| /* | |||
| * Carla common utils | |||
| * Copyright (C) 2011-2013 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef __CARLA_UTILS_HPP__ | |||
| #define __CARLA_UTILS_HPP__ | |||
| #include "carla_defines.hpp" | |||
| #include <cstdio> | |||
| #include <cstdlib> | |||
| #include <cstring> | |||
| #if defined(Q_OS_HAIKU) | |||
| # include <kernel/OS.h> | |||
| #elif defined(Q_OS_LINUX) | |||
| # include <sys/prctl.h> | |||
| # include <linux/prctl.h> | |||
| #endif | |||
| // ------------------------------------------------- | |||
| // carla_assert* | |||
| static inline | |||
| void carla_assert(const char* const assertion, const char* const file, const int line) | |||
| { | |||
| qCritical("Carla assertion failure: \"%s\" in file %s, line %i", assertion, file, line); | |||
| } | |||
| static inline | |||
| void carla_assert_int(const char* const assertion, const char* const file, const int line, const int value) | |||
| { | |||
| qCritical("Carla assertion failure: \"%s\" in file %s, line %i, value %i", assertion, file, line, value); | |||
| } | |||
| // ------------------------------------------------- | |||
| // carla_*sleep (carla_usleep not possible in Windows) | |||
| static inline | |||
| void carla_sleep(const int secs) | |||
| { | |||
| CARLA_ASSERT(secs > 0); | |||
| #ifdef Q_OS_WIN | |||
| Sleep(secs * 1000); | |||
| #else | |||
| sleep(secs); | |||
| #endif | |||
| } | |||
| static inline | |||
| void carla_msleep(const int msecs) | |||
| { | |||
| CARLA_ASSERT(msecs > 0); | |||
| #ifdef Q_OS_WIN | |||
| Sleep(msecs); | |||
| #else | |||
| usleep(msecs * 1000); | |||
| #endif | |||
| } | |||
| static inline | |||
| void carla_usleep(const int usecs) | |||
| { | |||
| CARLA_ASSERT(usecs > 0); | |||
| #ifdef Q_OS_WIN | |||
| Sleep(usecs / 1000); | |||
| #else | |||
| usleep(usecs); | |||
| #endif | |||
| } | |||
| // ------------------------------------------------- | |||
| // carla_setenv | |||
| static inline | |||
| void carla_setenv(const char* const key, const char* const value) | |||
| { | |||
| CARLA_ASSERT(key); | |||
| CARLA_ASSERT(value); | |||
| #ifdef Q_OS_WIN | |||
| SetEnvironmentVariableA(key, value); | |||
| #else | |||
| setenv(key, value, 1); | |||
| #endif | |||
| } | |||
| // ------------------------------------------------- | |||
| // carla_setprocname (not available on all platforms) | |||
| static inline | |||
| void carla_setprocname(const char* const name) | |||
| { | |||
| CARLA_ASSERT(name); | |||
| #if defined(Q_OS_HAIKU) | |||
| if ((thread_id this_thread = find_thread(nullptr)) != B_NAME_NOT_FOUND) | |||
| rename_thread(this_thread, name); | |||
| #elif defined(Q_OS_LINUX) | |||
| prctl(PR_SET_NAME, name); | |||
| #else | |||
| qWarning("carla_setprocname(\"%s\") - unsupported on this platform", name); | |||
| #endif | |||
| } | |||
| // ------------------------------------------------- | |||
| // math functions | |||
| template<typename T> | |||
| static inline | |||
| const T& carla_min(const T& v1, const T& v2, const T& min) | |||
| { | |||
| return ((v1 < min || v2 < min) ? min : (v1 < v2 ? v1 : v2)); | |||
| } | |||
| template<typename T> | |||
| static inline | |||
| void carla_fill(T* data, const unsigned int size, const T v) | |||
| { | |||
| CARLA_ASSERT(data); | |||
| CARLA_ASSERT(size > 0); | |||
| for (unsigned int i=0; i < size; i++) | |||
| *data++ = v; | |||
| } | |||
| void carla_zeroDouble(double* data, const unsigned size) | |||
| { | |||
| carla_fill<double>(data, size, 0.0); | |||
| } | |||
| void carla_zeroFloat(float* data, const unsigned size) | |||
| { | |||
| carla_fill<float>(data, size, 0.0f); | |||
| } | |||
| // ------------------------------------------------- | |||
| // other misc functions | |||
| static inline | |||
| const char* bool2str(const bool yesNo) | |||
| { | |||
| return yesNo ? "true" : "false"; | |||
| } | |||
| static inline | |||
| void pass() {} | |||
| // ------------------------------------------------- | |||
| // CarlaString class | |||
| class CarlaString | |||
| { | |||
| public: | |||
| // --------------------------------------------- | |||
| // constructors (no explicit conversions allowed) | |||
| explicit CarlaString() | |||
| { | |||
| buffer = ::strdup(""); | |||
| } | |||
| explicit CarlaString(char* const strBuf) | |||
| { | |||
| buffer = ::strdup(strBuf ? strBuf : ""); | |||
| } | |||
| explicit CarlaString(const char* const strBuf) | |||
| { | |||
| buffer = ::strdup(strBuf ? strBuf : ""); | |||
| } | |||
| explicit CarlaString(const int value) | |||
| { | |||
| const size_t strBufSize = ::abs(value/10) + 3; | |||
| char strBuf[strBufSize]; | |||
| ::snprintf(strBuf, strBufSize, "%d", value); | |||
| buffer = ::strdup(strBuf); | |||
| } | |||
| explicit CarlaString(const unsigned int value, const bool hexadecimal = false) | |||
| { | |||
| const size_t strBufSize = value/10 + 2 + (hexadecimal ? 2 : 0); | |||
| char strBuf[strBufSize]; | |||
| ::snprintf(strBuf, strBufSize, hexadecimal ? "%u" : "0x%x", value); | |||
| buffer = ::strdup(strBuf); | |||
| } | |||
| explicit CarlaString(const long int value) | |||
| { | |||
| const size_t strBufSize = ::labs(value/10) + 3; | |||
| char strBuf[strBufSize]; | |||
| ::snprintf(strBuf, strBufSize, "%ld", value); | |||
| buffer = ::strdup(strBuf); | |||
| } | |||
| explicit CarlaString(const unsigned long int value, const bool hexadecimal = false) | |||
| { | |||
| const size_t strBufSize = value/10 + 2 + (hexadecimal ? 2 : 0); | |||
| char strBuf[strBufSize]; | |||
| ::snprintf(strBuf, strBufSize, hexadecimal ? "%lu" : "0x%lx", value); | |||
| buffer = ::strdup(strBuf); | |||
| } | |||
| explicit CarlaString(const float value) | |||
| { | |||
| char strBuf[0xff]; | |||
| ::snprintf(strBuf, 0xff, "%f", value); | |||
| buffer = ::strdup(strBuf); | |||
| } | |||
| explicit CarlaString(const double value) | |||
| { | |||
| char strBuf[0xff]; | |||
| ::snprintf(strBuf, 0xff, "%g", value); | |||
| buffer = ::strdup(strBuf); | |||
| } | |||
| // --------------------------------------------- | |||
| // non-explicit constructor | |||
| CarlaString(const CarlaString& str) | |||
| { | |||
| buffer = ::strdup(str.buffer); | |||
| } | |||
| // --------------------------------------------- | |||
| // deconstructor | |||
| ~CarlaString() | |||
| { | |||
| CARLA_ASSERT(buffer); | |||
| ::free(buffer); | |||
| } | |||
| // --------------------------------------------- | |||
| // public methods | |||
| size_t length() const | |||
| { | |||
| return ::strlen(buffer); | |||
| } | |||
| bool isEmpty() const | |||
| { | |||
| return (*buffer == 0); | |||
| } | |||
| bool isNotEmpty() const | |||
| { | |||
| return (*buffer != 0); | |||
| } | |||
| bool contains(const char* const strBuf) const | |||
| { | |||
| if (! strBuf) | |||
| return false; | |||
| if (*strBuf == 0) | |||
| return false; | |||
| size_t thisLen = ::strlen(buffer); | |||
| size_t thatLen = ::strlen(strBuf)-1; | |||
| for (size_t i=0, j=0; i < thisLen; i++) | |||
| { | |||
| if (buffer[i] == strBuf[j]) | |||
| j++; | |||
| else | |||
| j = 0; | |||
| if (j == thatLen) | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| bool contains(const CarlaString& str) const | |||
| { | |||
| return contains(str.buffer); | |||
| } | |||
| bool isDigit(const size_t pos) const | |||
| { | |||
| if (pos >= length()) | |||
| return false; | |||
| return (buffer[pos] >= '0' && buffer[pos] <= '9'); | |||
| } | |||
| void clear() | |||
| { | |||
| truncate(0); | |||
| } | |||
| void replace(const char before, const char after) | |||
| { | |||
| for (size_t i=0, len = ::strlen(buffer); i < len; i++) | |||
| { | |||
| if (buffer[i] == before) | |||
| buffer[i] = after; | |||
| } | |||
| } | |||
| void truncate(const unsigned int n) | |||
| { | |||
| for (size_t i=n, len = ::strlen(buffer); i < len; i++) | |||
| buffer[i] = 0; | |||
| } | |||
| void toBasic() | |||
| { | |||
| for (size_t i=0, len = ::strlen(buffer); i < len; i++) | |||
| { | |||
| if (buffer[i] >= '0' && buffer[i] <= '9') | |||
| continue; | |||
| if (buffer[i] >= 'A' && buffer[i] <= 'Z') | |||
| continue; | |||
| if (buffer[i] >= 'a' && buffer[i] <= 'z') | |||
| continue; | |||
| if (buffer[i] == '_') | |||
| continue; | |||
| buffer[i] = '_'; | |||
| } | |||
| } | |||
| void toLower() | |||
| { | |||
| for (size_t i=0, len = ::strlen(buffer); i < len; i++) | |||
| { | |||
| if (buffer[i] >= 'A' && buffer[i] <= 'Z') | |||
| buffer[i] += 32; | |||
| } | |||
| } | |||
| void toUpper() | |||
| { | |||
| for (size_t i=0, len = ::strlen(buffer); i < len; i++) | |||
| { | |||
| if (buffer[i] >= 'a' && buffer[i] <= 'z') | |||
| buffer[i] -= 32; | |||
| } | |||
| } | |||
| // --------------------------------------------- | |||
| // public operators | |||
| operator const char*() const | |||
| { | |||
| return buffer; | |||
| } | |||
| char& operator[](const unsigned int pos) | |||
| { | |||
| return buffer[pos]; | |||
| } | |||
| bool operator==(const char* const strBuf) const | |||
| { | |||
| return (strBuf && ::strcmp(buffer, strBuf) == 0); | |||
| } | |||
| bool operator==(const CarlaString& str) const | |||
| { | |||
| return operator==(str.buffer); | |||
| } | |||
| bool operator!=(const char* const strBuf) const | |||
| { | |||
| return !operator==(strBuf); | |||
| } | |||
| bool operator!=(const CarlaString& str) const | |||
| { | |||
| return !operator==(str.buffer); | |||
| } | |||
| CarlaString& operator=(const char* const strBuf) | |||
| { | |||
| ::free(buffer); | |||
| buffer = ::strdup(strBuf ? strBuf : ""); | |||
| return *this; | |||
| } | |||
| CarlaString& operator=(const CarlaString& str) | |||
| { | |||
| return operator=(str.buffer); | |||
| } | |||
| CarlaString& operator+=(const char* const strBuf) | |||
| { | |||
| const size_t newBufSize = ::strlen(buffer) + (strBuf ? ::strlen(strBuf) : 0) + 1; | |||
| char newBuf[newBufSize]; | |||
| ::strcpy(newBuf, buffer); | |||
| ::strcat(newBuf, strBuf); | |||
| ::free(buffer); | |||
| buffer = ::strdup(newBuf); | |||
| return *this; | |||
| } | |||
| CarlaString& operator+=(const CarlaString& str) | |||
| { | |||
| return operator+=(str.buffer); | |||
| } | |||
| CarlaString operator+(const char* const strBuf) | |||
| { | |||
| const size_t newBufSize = ::strlen(buffer) + (strBuf ? ::strlen(strBuf) : 0) + 1; | |||
| char newBuf[newBufSize]; | |||
| ::strcpy(newBuf, buffer); | |||
| ::strcat(newBuf, strBuf); | |||
| return CarlaString(newBuf); | |||
| } | |||
| CarlaString operator+(const CarlaString& str) | |||
| { | |||
| return operator+(str.buffer); | |||
| } | |||
| // --------------------------------------------- | |||
| private: | |||
| char* buffer; | |||
| }; | |||
| static inline | |||
| CarlaString operator+(const char* const strBufBefore, const CarlaString& strAfter) | |||
| { | |||
| const char* const strBufAfter = (const char*)strAfter; | |||
| const size_t newBufSize = (strBufBefore ? ::strlen(strBufBefore) : 0) + ::strlen(strBufAfter) + 1; | |||
| char newBuf[newBufSize]; | |||
| ::strcpy(newBuf, strBufBefore); | |||
| ::strcat(newBuf, strBufAfter); | |||
| return CarlaString(newBuf); | |||
| } | |||
| // ------------------------------------------------- | |||
| #endif // __CARLA_UTILS_HPP__ | |||
| @@ -0,0 +1,454 @@ | |||
| /* | |||
| * Carla VST utils | |||
| * Copyright (C) 2011-2013 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 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 GNU General Public License see the COPYING file | |||
| */ | |||
| #ifndef __CARLA_VST_UTILS_HPP__ | |||
| #define __CARLA_VST_UTILS_HPP__ | |||
| // Disable deprecated VST features (NOT) | |||
| #define VST_FORCE_DEPRECATED 0 | |||
| #include "carla_utils.hpp" | |||
| #include <cstdint> | |||
| // ------------------------------------------------- | |||
| // Include fixes | |||
| #if VESTIGE_HEADER | |||
| #include "vestige/aeffectx.h" | |||
| #define audioMasterGetOutputSpeakerArrangement audioMasterGetSpeakerArrangement | |||
| #define effFlagsProgramChunks (1 << 5) | |||
| #define effSetProgramName 4 | |||
| #define effGetParamLabel 6 | |||
| #define effGetParamDisplay 7 | |||
| #define effGetVu 9 | |||
| #define effEditDraw 16 | |||
| #define effEditMouse 17 | |||
| #define effEditKey 18 | |||
| #define effEditSleep 21 | |||
| #define effIdentify 22 | |||
| #define effGetChunk 23 | |||
| #define effSetChunk 24 | |||
| #define effCanBeAutomated 26 | |||
| #define effString2Parameter 27 | |||
| #define effGetNumProgramCategories 28 | |||
| #define effGetProgramNameIndexed 29 | |||
| #define effCopyProgram 30 | |||
| #define effConnectInput 31 | |||
| #define effConnectOutput 32 | |||
| #define effGetInputProperties 33 | |||
| #define effGetOutputProperties 34 | |||
| #define effGetPlugCategory 35 | |||
| #define effGetCurrentPosition 36 | |||
| #define effGetDestinationBuffer 37 | |||
| #define effOfflineNotify 38 | |||
| #define effOfflinePrepare 39 | |||
| #define effOfflineRun 40 | |||
| #define effProcessVarIo 41 | |||
| #define effSetSpeakerArrangement 42 | |||
| #define effSetBlockSizeAndSampleRate 43 | |||
| #define effSetBypass 44 | |||
| #define effGetErrorText 46 | |||
| #define effVendorSpecific 50 | |||
| #define effGetTailSize 52 | |||
| #define effIdle 53 | |||
| #define effGetIcon 54 | |||
| #define effSetViewPosition 55 | |||
| #define effKeysRequired 57 | |||
| #define effEditKeyDown 59 | |||
| #define effEditKeyUp 60 | |||
| #define effSetEditKnobMode 61 | |||
| #define effGetMidiProgramName 62 | |||
| #define effGetCurrentMidiProgram 63 | |||
| #define effGetMidiProgramCategory 64 | |||
| #define effHasMidiProgramsChanged 65 | |||
| #define effGetMidiKeyName 66 | |||
| #define effBeginSetProgram 67 | |||
| #define effEndSetProgram 68 | |||
| #define effGetSpeakerArrangement 69 | |||
| #define effShellGetNextPlugin 70 | |||
| #define effStartProcess 71 | |||
| #define effStopProcess 72 | |||
| #define effSetTotalSampleToProcess 73 | |||
| #define effSetPanLaw 74 | |||
| #define effBeginLoadBank 75 | |||
| #define effBeginLoadProgram 76 | |||
| #define effSetProcessPrecision 77 | |||
| #define effGetNumMidiInputChannels 78 | |||
| #define effGetNumMidiOutputChannels 79 | |||
| #define kPlugCategSynth 2 | |||
| #define kPlugCategAnalysis 3 | |||
| #define kPlugCategMastering 4 | |||
| #define kPlugCategRoomFx 6 | |||
| #define kPlugCategRestoration 8 | |||
| #define kPlugCategShell 10 | |||
| #define kPlugCategGenerator 11 | |||
| #define kVstAutomationOff 1 | |||
| #define kVstAutomationReadWrite 4 | |||
| #define kVstProcessLevelUnknown 0 | |||
| #define kVstProcessLevelUser 1 | |||
| #define kVstProcessLevelRealtime 2 | |||
| #define kVstProcessLevelOffline 4 | |||
| #define kVstProcessPrecision32 0 | |||
| #define kVstTransportChanged 1 | |||
| #define kVstVersion 2400 | |||
| #define VSTCALLBACK | |||
| struct ERect { | |||
| int16_t top, left, bottom, right; | |||
| }; | |||
| struct VstTimeInfo_R { | |||
| double samplePos, sampleRate, nanoSeconds, ppqPos, tempo, barStartPos, cycleStartPos, cycleEndPos; | |||
| int32_t timeSigNumerator, timeSigDenominator, smpteOffset, smpteFrameRate, samplesToNextClock, flags; | |||
| }; | |||
| #else | |||
| #include "vst/aeffectx.h" | |||
| typedef VstTimeInfo VstTimeInfo_R; | |||
| #endif | |||
| // ------------------------------------------------- | |||
| // Plugin callback | |||
| typedef AEffect* (*VST_Function)(audioMasterCallback); | |||
| // ------------------------------------------------- | |||
| // Check if feature is supported by the plugin | |||
| static inline | |||
| bool vstPluginCanDo(AEffect* const effect, const char* const feature) | |||
| { | |||
| return (effect->dispatcher(effect, effCanDo, 0, 0, (void*)feature, 0.0f) == 1); | |||
| } | |||
| // ------------------------------------------------- | |||
| // Convert Effect opcode to string | |||
| static inline | |||
| const char* vstEffectOpcode2str(const int32_t opcode) | |||
| { | |||
| switch (opcode) | |||
| { | |||
| case effOpen: | |||
| return "effOpen"; | |||
| case effClose: | |||
| return "effClose"; | |||
| case effSetProgram: | |||
| return "effSetProgram"; | |||
| case effGetProgram: | |||
| return "effGetProgram"; | |||
| case effSetProgramName: | |||
| return "effSetProgramName"; | |||
| case effGetProgramName: | |||
| return "effGetProgramName"; | |||
| case effGetParamLabel: | |||
| return "effGetParamLabel"; | |||
| case effGetParamDisplay: | |||
| return "effGetParamDisplay"; | |||
| case effGetParamName: | |||
| return "effGetParamName"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effGetVu: | |||
| return "effGetVu"; | |||
| #endif | |||
| case effSetSampleRate: | |||
| return "effSetSampleRate"; | |||
| case effSetBlockSize: | |||
| return "effSetBlockSize"; | |||
| case effMainsChanged: | |||
| return "effMainsChanged"; | |||
| case effEditGetRect: | |||
| return "effEditGetRect"; | |||
| case effEditOpen: | |||
| return "effEditOpen"; | |||
| case effEditClose: | |||
| return "effEditClose"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effEditDraw: | |||
| return "effEditDraw"; | |||
| case effEditMouse: | |||
| return "effEditMouse"; | |||
| case effEditKey: | |||
| return "effEditKey"; | |||
| case effEditTop: | |||
| return "effEditTop"; | |||
| case effEditSleep: | |||
| return "effEditSleep"; | |||
| case effIdentify: | |||
| return "effIdentify"; | |||
| #endif | |||
| case effGetChunk: | |||
| return "effGetChunk"; | |||
| case effSetChunk: | |||
| return "effSetChunk"; | |||
| case effProcessEvents: | |||
| return "effProcessEvents"; | |||
| case effCanBeAutomated: | |||
| return "effCanBeAutomated"; | |||
| case effString2Parameter: | |||
| return "effString2Parameter"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effGetNumProgramCategories: | |||
| return "effGetNumProgramCategories"; | |||
| #endif | |||
| case effGetProgramNameIndexed: | |||
| return "effGetProgramNameIndexed"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effCopyProgram: | |||
| return "effCopyProgram"; | |||
| case effConnectInput: | |||
| return "effConnectInput"; | |||
| case effConnectOutput: | |||
| return "effConnectOutput"; | |||
| #endif | |||
| case effGetInputProperties: | |||
| return "effGetInputProperties"; | |||
| case effGetOutputProperties: | |||
| return "effGetOutputProperties"; | |||
| case effGetPlugCategory: | |||
| return "effGetPlugCategory"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effGetCurrentPosition: | |||
| return "effGetCurrentPosition"; | |||
| case effGetDestinationBuffer: | |||
| return "effGetDestinationBuffer"; | |||
| #endif | |||
| case effOfflineNotify: | |||
| return "effOfflineNotify"; | |||
| case effOfflinePrepare: | |||
| return "effOfflinePrepare"; | |||
| case effOfflineRun: | |||
| return "effOfflineRun"; | |||
| case effProcessVarIo: | |||
| return "effProcessVarIo"; | |||
| case effSetSpeakerArrangement: | |||
| return "effSetSpeakerArrangement"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effSetBlockSizeAndSampleRate: | |||
| return "effSetBlockSizeAndSampleRate"; | |||
| #endif | |||
| case effSetBypass: | |||
| return "effSetBypass"; | |||
| case effGetEffectName: | |||
| return "effGetEffectName"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effGetErrorText: | |||
| return "effGetErrorText"; | |||
| #endif | |||
| case effGetVendorString: | |||
| return "effGetVendorString"; | |||
| case effGetProductString: | |||
| return "effGetProductString"; | |||
| case effGetVendorVersion: | |||
| return "effGetVendorVersion"; | |||
| case effVendorSpecific: | |||
| return "effVendorSpecific"; | |||
| case effCanDo: | |||
| return "effCanDo"; | |||
| case effGetTailSize: | |||
| return "effGetTailSize"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effIdle: | |||
| return "effIdle"; | |||
| case effGetIcon: | |||
| return "effGetIcon"; | |||
| case effSetViewPosition: | |||
| return "effSetViewPosition"; | |||
| #endif | |||
| case effGetParameterProperties: | |||
| return "effGetParameterProperties"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case effKeysRequired: | |||
| return "effKeysRequired"; | |||
| #endif | |||
| case effGetVstVersion: | |||
| return "effGetVstVersion"; | |||
| case effEditKeyDown: | |||
| return "effEditKeyDown"; | |||
| case effEditKeyUp: | |||
| return "effEditKeyUp"; | |||
| case effSetEditKnobMode: | |||
| return "effSetEditKnobMode"; | |||
| case effGetMidiProgramName: | |||
| return "effGetMidiProgramName"; | |||
| case effGetCurrentMidiProgram: | |||
| return "effGetCurrentMidiProgram"; | |||
| case effGetMidiProgramCategory: | |||
| return "effGetMidiProgramCategory"; | |||
| case effHasMidiProgramsChanged: | |||
| return "effHasMidiProgramsChanged"; | |||
| case effGetMidiKeyName: | |||
| return "effGetMidiKeyName"; | |||
| case effBeginSetProgram: | |||
| return "effBeginSetProgram"; | |||
| case effEndSetProgram: | |||
| return "effEndSetProgram"; | |||
| case effGetSpeakerArrangement: | |||
| return "effGetSpeakerArrangement"; | |||
| case effShellGetNextPlugin: | |||
| return "effShellGetNextPlugin"; | |||
| case effStartProcess: | |||
| return "effStartProcess"; | |||
| case effStopProcess: | |||
| return "effStopProcess"; | |||
| case effSetTotalSampleToProcess: | |||
| return "effSetTotalSampleToProcess"; | |||
| case effSetPanLaw: | |||
| return "effSetPanLaw"; | |||
| case effBeginLoadBank: | |||
| return "effBeginLoadBank"; | |||
| case effBeginLoadProgram: | |||
| return "effBeginLoadProgram"; | |||
| case effSetProcessPrecision: | |||
| return "effSetProcessPrecision"; | |||
| case effGetNumMidiInputChannels: | |||
| return "effGetNumMidiInputChannels"; | |||
| case effGetNumMidiOutputChannels: | |||
| return "effGetNumMidiOutputChannels"; | |||
| default: | |||
| return "unknown"; | |||
| } | |||
| } | |||
| // ------------------------------------------------- | |||
| // Convert Host/Master opcode to string | |||
| static inline | |||
| const char* vstMasterOpcode2str(const int32_t opcode) | |||
| { | |||
| switch (opcode) | |||
| { | |||
| case audioMasterAutomate: | |||
| return "audioMasterAutomate"; | |||
| case audioMasterVersion: | |||
| return "audioMasterVersion"; | |||
| case audioMasterCurrentId: | |||
| return "audioMasterCurrentId"; | |||
| case audioMasterIdle: | |||
| return "audioMasterIdle"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterPinConnected: | |||
| return "audioMasterPinConnected"; | |||
| case audioMasterWantMidi: | |||
| return "audioMasterWantMidi"; | |||
| #endif | |||
| case audioMasterGetTime: | |||
| return "audioMasterGetTime"; | |||
| case audioMasterProcessEvents: | |||
| return "audioMasterProcessEvents"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterSetTime: | |||
| return "audioMasterSetTime"; | |||
| case audioMasterTempoAt: | |||
| return "audioMasterTempoAt"; | |||
| case audioMasterGetNumAutomatableParameters: | |||
| return "audioMasterGetNumAutomatableParameters"; | |||
| case audioMasterGetParameterQuantization: | |||
| return "audioMasterGetParameterQuantization"; | |||
| #endif | |||
| case audioMasterIOChanged: | |||
| return "audioMasterIOChanged"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterNeedIdle: | |||
| return "audioMasterNeedIdle"; | |||
| #endif | |||
| case audioMasterSizeWindow: | |||
| return "audioMasterSizeWindow"; | |||
| case audioMasterGetSampleRate: | |||
| return "audioMasterGetSampleRate"; | |||
| case audioMasterGetBlockSize: | |||
| return "audioMasterGetBlockSize"; | |||
| case audioMasterGetInputLatency: | |||
| return "audioMasterGetInputLatency"; | |||
| case audioMasterGetOutputLatency: | |||
| return "audioMasterGetOutputLatency"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterGetPreviousPlug: | |||
| return "audioMasterGetPreviousPlug"; | |||
| case audioMasterGetNextPlug: | |||
| return "audioMasterGetNextPlug"; | |||
| case audioMasterWillReplaceOrAccumulate: | |||
| return "audioMasterWillReplaceOrAccumulate"; | |||
| #endif | |||
| case audioMasterGetCurrentProcessLevel: | |||
| return "audioMasterGetCurrentProcessLevel"; | |||
| case audioMasterGetAutomationState: | |||
| return "audioMasterGetAutomationState"; | |||
| case audioMasterOfflineStart: | |||
| return "audioMasterOfflineStart"; | |||
| case audioMasterOfflineRead: | |||
| return "audioMasterOfflineRead"; | |||
| case audioMasterOfflineWrite: | |||
| return "audioMasterOfflineWrite"; | |||
| case audioMasterOfflineGetCurrentPass: | |||
| return "audioMasterOfflineGetCurrentPass"; | |||
| case audioMasterOfflineGetCurrentMetaPass: | |||
| return "audioMasterOfflineGetCurrentMetaPass"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterSetOutputSampleRate: | |||
| return "audioMasterSetOutputSampleRate"; | |||
| case audioMasterGetOutputSpeakerArrangement: | |||
| return "audioMasterGetOutputSpeakerArrangement"; | |||
| #endif | |||
| case audioMasterGetVendorString: | |||
| return "audioMasterGetVendorString"; | |||
| case audioMasterGetProductString: | |||
| return "audioMasterGetProductString"; | |||
| case audioMasterGetVendorVersion: | |||
| return "audioMasterGetVendorVersion"; | |||
| case audioMasterVendorSpecific: | |||
| return "audioMasterVendorSpecific"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterSetIcon: | |||
| return "audioMasterSetIcon"; | |||
| #endif | |||
| case audioMasterCanDo: | |||
| return "audioMasterCanDo"; | |||
| case audioMasterGetLanguage: | |||
| return "audioMasterGetLanguage"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterOpenWindow: | |||
| return "audioMasterOpenWindow"; | |||
| case audioMasterCloseWindow: | |||
| return "audioMasterCloseWindow"; | |||
| #endif | |||
| case audioMasterGetDirectory: | |||
| return "audioMasterGetDirectory"; | |||
| case audioMasterUpdateDisplay: | |||
| return "audioMasterUpdateDisplay"; | |||
| case audioMasterBeginEdit: | |||
| return "audioMasterBeginEdit"; | |||
| case audioMasterEndEdit: | |||
| return "audioMasterEndEdit"; | |||
| case audioMasterOpenFileSelector: | |||
| return "audioMasterOpenFileSelector"; | |||
| case audioMasterCloseFileSelector: | |||
| return "audioMasterCloseFileSelector"; | |||
| #if ! VST_FORCE_DEPRECATED | |||
| case audioMasterEditFile: | |||
| return "audioMasterEditFile"; | |||
| case audioMasterGetChunkFile: | |||
| return "audioMasterGetChunkFile"; | |||
| case audioMasterGetInputSpeakerArrangement: | |||
| return "audioMasterGetInputSpeakerArrangement"; | |||
| #endif | |||
| default: | |||
| return "unknown"; | |||
| } | |||
| } | |||
| // ------------------------------------------------- | |||
| #endif // __CARLA_VST_UTILS_HPP__ | |||