@@ -114,43 +114,53 @@ const unsigned int ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE = 0x4; | |||
* Plugin is a bridge.\n | |||
* This hint is required because "bridge" itself is not a plugin type. | |||
*/ | |||
const unsigned int PLUGIN_IS_BRIDGE = 0x01; | |||
const unsigned int PLUGIN_IS_BRIDGE = 0x001; | |||
/*! | |||
* Plugin is hard real-time safe. | |||
*/ | |||
const unsigned int PLUGIN_IS_RTSAFE = 0x02; | |||
const unsigned int PLUGIN_IS_RTSAFE = 0x002; | |||
/*! | |||
* Plugin is a synth (produces sound). | |||
*/ | |||
const unsigned int PLUGIN_IS_SYNTH = 0x04; | |||
const unsigned int PLUGIN_IS_SYNTH = 0x004; | |||
/*! | |||
* Plugin has its own custom UI. | |||
* @see CarlaPlugin::showCustomUI() and carla_show_custom_ui() | |||
*/ | |||
const unsigned int PLUGIN_HAS_CUSTOM_UI = 0x08; | |||
const unsigned int PLUGIN_HAS_CUSTOM_UI = 0x008; | |||
/*! | |||
* Plugin can use internal Dry/Wet control. | |||
*/ | |||
const unsigned int PLUGIN_CAN_DRYWET = 0x10; | |||
const unsigned int PLUGIN_CAN_DRYWET = 0x010; | |||
/*! | |||
* Plugin can use internal Volume control. | |||
*/ | |||
const unsigned int PLUGIN_CAN_VOLUME = 0x20; | |||
const unsigned int PLUGIN_CAN_VOLUME = 0x020; | |||
/*! | |||
* Plugin can use internal (Stereo) Balance controls. | |||
*/ | |||
const unsigned int PLUGIN_CAN_BALANCE = 0x40; | |||
const unsigned int PLUGIN_CAN_BALANCE = 0x040; | |||
/*! | |||
* Plugin can use internal (Mono) Panning control. | |||
*/ | |||
const unsigned int PLUGIN_CAN_PANNING = 0x80; | |||
const unsigned int PLUGIN_CAN_PANNING = 0x080; | |||
/*! | |||
* Plugin needs a constant, fixed-size audio buffer. | |||
*/ | |||
const unsigned int PLUGIN_NEEDS_FIXED_BUFFERS = 0x100; | |||
/*! | |||
* Plugin needs all UI events in a single/main thread. | |||
*/ | |||
const unsigned int PLUGIN_NEEDS_SINGLE_THREAD = 0x200; | |||
/** @} */ | |||
@@ -540,6 +550,35 @@ typedef enum { | |||
} PluginCategory; | |||
// ------------------------------------------------------------------------------------------------------------ | |||
// Parameter Type | |||
/*! | |||
* Plugin parameter type. | |||
*/ | |||
typedef enum { | |||
/*! | |||
* Null parameter type. | |||
*/ | |||
PARAMETER_UNKNOWN = 0, | |||
/*! | |||
* Input parameter. | |||
*/ | |||
PARAMETER_INPUT = 1, | |||
/*! | |||
* Ouput parameter. | |||
*/ | |||
PARAMETER_OUTPUT = 2, | |||
/*! | |||
* Special (hidden) parameter. | |||
*/ | |||
PARAMETER_SPECIAL = 3 | |||
} ParameterType; | |||
// ------------------------------------------------------------------------------------------------------------ | |||
// Internal Parameter Index | |||
@@ -1062,7 +1101,18 @@ typedef void (*EngineCallbackFunc)(void* ptr, EngineCallbackOpcode action, uint | |||
/*! | |||
* Parameter data. | |||
*/ | |||
typedef struct _ParameterData { | |||
typedef struct { | |||
/*! | |||
* This parameter type. | |||
*/ | |||
ParameterType type; | |||
/*! | |||
* This parameter hints. | |||
* @see ParameterHints | |||
*/ | |||
unsigned int hints; | |||
/*! | |||
* Index as seen by Carla. | |||
*/ | |||
@@ -1073,12 +1123,6 @@ typedef struct _ParameterData { | |||
*/ | |||
int32_t rindex; | |||
/*! | |||
* This parameter hints. | |||
* @see ParameterHints | |||
*/ | |||
unsigned int hints; | |||
/*! | |||
* Currently mapped MIDI CC.\n | |||
* A value lower than 0 means invalid or unused.\n | |||
@@ -1094,21 +1138,24 @@ typedef struct _ParameterData { | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
* Clear data. | |||
*/ | |||
_ParameterData() noexcept | |||
: index(PARAMETER_NULL), | |||
rindex(-1), | |||
hints(0x0), | |||
midiCC(-1), | |||
midiChannel(0) {} | |||
void clear() noexcept | |||
{ | |||
type = PARAMETER_UNKNOWN; | |||
hints = 0x0; | |||
index = PARAMETER_NULL; | |||
rindex = -1; | |||
midiCC =-1; | |||
midiChannel = 0; | |||
} | |||
#endif | |||
} ParameterData; | |||
/*! | |||
* Parameter ranges. | |||
*/ | |||
typedef struct _ParameterRanges { | |||
typedef struct { | |||
/*! | |||
* Default value. | |||
*/ | |||
@@ -1141,15 +1188,17 @@ typedef struct _ParameterRanges { | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
* Clear data. | |||
*/ | |||
_ParameterRanges() noexcept | |||
: def(0.0f), | |||
min(0.0f), | |||
max(1.0f), | |||
step(0.01f), | |||
stepSmall(0.0001f), | |||
stepLarge(0.1f) {} | |||
void clear() noexcept | |||
{ | |||
def = 0.0f; | |||
min = 0.0f; | |||
max = 1.0f; | |||
step = 0.01f; | |||
stepSmall = 0.0001f; | |||
stepLarge = 0.1f; | |||
} | |||
/*! | |||
* Fix default value within range. | |||
@@ -1229,7 +1278,7 @@ typedef struct _ParameterRanges { | |||
/*! | |||
* MIDI Program data. | |||
*/ | |||
typedef struct _MidiProgramData { | |||
typedef struct { | |||
/*! | |||
* MIDI bank. | |||
*/ | |||
@@ -1247,19 +1296,21 @@ typedef struct _MidiProgramData { | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
* Clear data. | |||
*/ | |||
_MidiProgramData() noexcept | |||
: bank(0), | |||
program(0), | |||
name(nullptr) {} | |||
void clear() noexcept | |||
{ | |||
bank = 0; | |||
program = 0; | |||
name = nullptr; | |||
} | |||
#endif | |||
} MidiProgramData; | |||
/*! | |||
* Custom data, used for saving key:value 'dictionaries'. | |||
*/ | |||
typedef struct _CustomData { | |||
typedef struct { | |||
/*! | |||
* Value type, in URI form. | |||
* @see CustomDataTypes | |||
@@ -1279,19 +1330,21 @@ typedef struct _CustomData { | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
* Clear data. | |||
*/ | |||
_CustomData() noexcept | |||
: type(nullptr), | |||
key(nullptr), | |||
value(nullptr) {} | |||
void clear() noexcept | |||
{ | |||
type = nullptr; | |||
key = nullptr; | |||
value = nullptr; | |||
} | |||
#endif | |||
} CustomData; | |||
/*! | |||
* Engine driver device information. | |||
*/ | |||
typedef struct _EngineDriverDeviceInfo { | |||
typedef struct { | |||
/*! | |||
* This driver device hints. | |||
* @see EngineDriverHints | |||
@@ -1312,12 +1365,14 @@ typedef struct _EngineDriverDeviceInfo { | |||
#ifdef __cplusplus | |||
/*! | |||
* C++ constructor. | |||
* Clear data. | |||
*/ | |||
_EngineDriverDeviceInfo() | |||
: hints(0x0), | |||
bufferSizes(nullptr), | |||
sampleRates(nullptr) {} | |||
void clear() noexcept | |||
{ | |||
hints = 0x0; | |||
bufferSizes = nullptr; | |||
sampleRates = nullptr; | |||
} | |||
#endif | |||
} EngineDriverDeviceInfo; | |||
@@ -168,6 +168,9 @@ struct EngineControlEvent { | |||
uint16_t param; //!< Parameter Id, midi bank or midi program. | |||
float value; //!< Parameter value, normalized to 0.0f<->1.0f. | |||
/*! | |||
* Clear data. | |||
*/ | |||
void clear() noexcept | |||
{ | |||
type = kEngineControlEventTypeNull; | |||
@@ -181,17 +184,20 @@ struct EngineControlEvent { | |||
*/ | |||
struct EngineMidiEvent { | |||
uint8_t port; //!< Port offset (usually 0) | |||
uint8_t data[4]; //!< MIDI data, without channel bit | |||
uint8_t size; //!< Number of bytes used | |||
uint8_t data[4]; //!< MIDI data, without channel bit | |||
/*! | |||
* Clear data. | |||
*/ | |||
void clear() noexcept | |||
{ | |||
port = 0; | |||
size = 0; | |||
data[0] = 0; | |||
data[1] = 0; | |||
data[2] = 0; | |||
data[3] = 0; | |||
size = 0; | |||
} | |||
}; | |||
@@ -203,16 +209,17 @@ struct EngineEvent { | |||
uint32_t time; //!< Time offset in frames | |||
uint8_t channel; //!< Channel, used for MIDI-related events | |||
/*! | |||
* Event specific data. | |||
*/ | |||
union { | |||
EngineControlEvent ctrl; | |||
EngineMidiEvent midi; | |||
}; | |||
EngineEvent() noexcept | |||
{ | |||
clear(); | |||
} | |||
/*! | |||
* Clear data. | |||
*/ | |||
void clear() noexcept | |||
{ | |||
type = kEngineEventTypeNull; | |||
@@ -325,9 +332,10 @@ struct EngineTimeInfo { | |||
EngineTimeInfoBBT bbt; | |||
EngineTimeInfo() noexcept | |||
{ | |||
clear(); | |||
} | |||
: playing(false), | |||
frame(0), | |||
usecs(0), | |||
valid(0x0) {} | |||
void clear() noexcept | |||
{ | |||
@@ -171,7 +171,7 @@ typedef struct _CarlaPluginInfo { | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
_CarlaPluginInfo() | |||
_CarlaPluginInfo() noexcept | |||
: type(CarlaBackend::PLUGIN_NONE), | |||
category(CarlaBackend::PLUGIN_CATEGORY_NONE), | |||
hints(0x0), | |||
@@ -280,7 +280,7 @@ typedef struct _CarlaNativePluginInfo { | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
_CarlaNativePluginInfo() | |||
_CarlaNativePluginInfo() noexcept | |||
: category(CarlaBackend::PLUGIN_CATEGORY_NONE), | |||
hints(0x0), | |||
audioIns(0), | |||
@@ -317,7 +317,7 @@ typedef struct _CarlaPortCountInfo { | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
_CarlaPortCountInfo() | |||
_CarlaPortCountInfo() noexcept | |||
: ins(0), | |||
outs(0) {} | |||
#endif | |||
@@ -353,7 +353,7 @@ typedef struct _CarlaParameterInfo { | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
_CarlaParameterInfo() | |||
_CarlaParameterInfo() noexcept | |||
: name(nullptr), | |||
symbol(nullptr), | |||
unit(nullptr), | |||
@@ -402,7 +402,7 @@ typedef struct _CarlaScalePointInfo { | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
_CarlaScalePointInfo() | |||
_CarlaScalePointInfo() noexcept | |||
: value(0.0f), | |||
label(nullptr) {} | |||
@@ -459,7 +459,7 @@ typedef struct _CarlaTransportInfo { | |||
/*! | |||
* C++ constructor. | |||
*/ | |||
_CarlaTransportInfo() | |||
_CarlaTransportInfo() noexcept | |||
: playing(false), | |||
frame(0), | |||
bar(0), | |||
@@ -33,16 +33,6 @@ CARLA_BACKEND_START_NAMESPACE | |||
} /* Fix editor indentation */ | |||
#endif | |||
/*! | |||
* @defgroup PluginHints | |||
* @{ | |||
*/ | |||
const unsigned int PLUGIN_NEEDS_FIXED_BUFFERS = 0x100; | |||
const unsigned int PLUGIN_NEEDS_SINGLE_THREAD = 0x200; | |||
/** @} */ | |||
/*! | |||
* @defgroup CarlaPluginAPI Carla Plugin API | |||
* | |||
@@ -131,13 +131,6 @@ struct EnginePluginData { | |||
CarlaPlugin* plugin; | |||
float insPeak[2]; | |||
float outsPeak[2]; | |||
EnginePluginData() | |||
: plugin(nullptr) | |||
{ | |||
insPeak[0] = insPeak[1] = 0.0f; | |||
outsPeak[0] = outsPeak[1] = 0.0f; | |||
} | |||
}; | |||
// ----------------------------------------------------------------------- | |||
@@ -171,7 +164,7 @@ struct CarlaEngineProtectedData { | |||
EngineEvent* in; | |||
EngineEvent* out; | |||
InternalEvents() | |||
InternalEvents() noexcept | |||
: in(nullptr), | |||
out(nullptr) {} | |||
@@ -186,7 +179,7 @@ struct CarlaEngineProtectedData { | |||
bool playing; | |||
uint64_t frame; | |||
InternalTime() | |||
InternalTime() noexcept | |||
: playing(false), | |||
frame(0) {} | |||
} time; | |||
@@ -197,7 +190,7 @@ struct CarlaEngineProtectedData { | |||
unsigned int value; | |||
CarlaMutex mutex; | |||
NextAction() | |||
NextAction() noexcept | |||
: opcode(kEnginePostActionNull), | |||
pluginId(0), | |||
value(0) {} | |||
@@ -207,7 +200,7 @@ struct CarlaEngineProtectedData { | |||
CARLA_ASSERT(opcode == kEnginePostActionNull); | |||
} | |||
void ready() | |||
void ready() noexcept | |||
{ | |||
mutex.lock(); | |||
mutex.unlock(); | |||
@@ -253,10 +246,7 @@ struct CarlaEngineProtectedData { | |||
{ | |||
CarlaPlugin* const plugin(plugins[i+1].plugin); | |||
CARLA_ASSERT(plugin != nullptr); | |||
if (plugin == nullptr) | |||
break; | |||
CARLA_SAFE_ASSERT_BREAK(plugin != nullptr); | |||
plugin->setId(i); | |||
@@ -299,7 +289,7 @@ struct CarlaEngineProtectedData { | |||
#endif | |||
} | |||
void doNextPluginAction(const bool unlock) | |||
void doNextPluginAction(const bool unlock) noexcept | |||
{ | |||
switch (nextAction.opcode) | |||
{ | |||
@@ -351,7 +341,7 @@ struct CarlaEngineProtectedData { | |||
} | |||
} | |||
~ScopedActionLock() | |||
~ScopedActionLock() noexcept | |||
{ | |||
fData->nextAction.mutex.unlock(); | |||
} | |||
@@ -68,12 +68,12 @@ public: | |||
const char* getServerPathTCP() const noexcept | |||
{ | |||
return (const char*)fServerPathTCP; | |||
return fServerPathTCP.getBuffer(); | |||
} | |||
const char* getServerPathUDP() const noexcept | |||
{ | |||
return (const char*)fServerPathUDP; | |||
return fServerPathUDP.getBuffer(); | |||
} | |||
// ------------------------------------------------------------------- | |||
@@ -155,29 +155,35 @@ ENGINE_DRIVER_DEVICE_VARIABLE_SAMPLE_RATE = 0x4 | |||
# Plugin is a bridge. | |||
# This hint is required because "bridge" itself is not a plugin type. | |||
PLUGIN_IS_BRIDGE = 0x01 | |||
PLUGIN_IS_BRIDGE = 0x001 | |||
# Plugin is hard real-time safe. | |||
PLUGIN_IS_RTSAFE = 0x02 | |||
PLUGIN_IS_RTSAFE = 0x002 | |||
# Plugin is a synth (produces sound). | |||
PLUGIN_IS_SYNTH = 0x04 | |||
PLUGIN_IS_SYNTH = 0x004 | |||
# Plugin has its own custom UI. | |||
# @see carla_show_custom_ui() | |||
PLUGIN_HAS_CUSTOM_UI = 0x08 | |||
PLUGIN_HAS_CUSTOM_UI = 0x008 | |||
# Plugin can use internal Dry/Wet control. | |||
PLUGIN_CAN_DRYWET = 0x10 | |||
PLUGIN_CAN_DRYWET = 0x010 | |||
# Plugin can use internal Volume control. | |||
PLUGIN_CAN_VOLUME = 0x20 | |||
PLUGIN_CAN_VOLUME = 0x020 | |||
# Plugin can use internal (Stereo) Balance controls. | |||
PLUGIN_CAN_BALANCE = 0x40 | |||
PLUGIN_CAN_BALANCE = 0x040 | |||
# Plugin can use internal (Mono) Panning control. | |||
PLUGIN_CAN_PANNING = 0x80 | |||
PLUGIN_CAN_PANNING = 0x080 | |||
# Plugin needs a constant, fixed-size audio buffer. | |||
PLUGIN_NEEDS_FIXED_BUFFERS = 0x100 | |||
# Plugin needs all UI events in a single/main thread. | |||
PLUGIN_NEEDS_SINGLE_THREAD = 0x200 | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Plugin Options | |||
@@ -395,6 +401,22 @@ PLUGIN_CATEGORY_UTILITY = 8 | |||
# Miscellaneous plugin (used to check if the plugin has a category). | |||
PLUGIN_CATEGORY_OTHER = 9 | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Parameter Type | |||
# Plugin parameter type. | |||
# Null parameter type. | |||
PARAMETER_UNKNOWN = 0 | |||
# Input parameter. | |||
PARAMETER_INPUT = 1 | |||
# Ouput parameter. | |||
PARAMETER_OUTPUT = 2 | |||
# Special (hidden) parameter. | |||
PARAMETER_SPECIAL = 3 | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Internal Parameter Index | |||
# Special parameters used internally in Carla. | |||
@@ -750,16 +772,19 @@ EngineCallbackFunc = CFUNCTYPE(None, c_void_p, c_enum, c_uint, c_int, c_int, c_f | |||
# Parameter data. | |||
class ParameterData(Structure): | |||
_fields_ = [ | |||
# This parameter type. | |||
("type", c_enum), | |||
# This parameter hints. | |||
# @see ParameterHints | |||
("hints", c_uint), | |||
# Index as seen by Carla. | |||
("index", c_int32), | |||
# Real index as seen by plugins. | |||
("rindex", c_int32), | |||
# This parameter hints. | |||
# @see ParameterHints | |||
("hints", c_uint), | |||
# Currently mapped MIDI CC. | |||
# A value lower than 0 means invalid or unused. | |||
# Maximum allowed value is 95 (0x5F). | |||
@@ -21,9 +21,10 @@ | |||
#define MAX_MIDI_CHANNELS 16 | |||
#define MAX_MIDI_NOTE 128 | |||
#define MAX_MIDI_VALUE 128 | |||
//#define MAX_MIDI_CTRL 128 | |||
#define MIDI_STATUS_BIT 0xF0 | |||
#define MIDI_CHANNEL_BIT 0x0F | |||
#define MIDI_STATUS_BIT 0xF0 | |||
#define MIDI_CHANNEL_BIT 0x0F | |||
// MIDI Messages List | |||
#define MIDI_STATUS_NOTE_OFF 0x80 // note (0-127), velocity (0-127) | |||
@@ -34,17 +35,17 @@ | |||
#define MIDI_STATUS_CHANNEL_PRESSURE 0xD0 // pressure (0-127), none | |||
#define MIDI_STATUS_PITCH_WHEEL_CONTROL 0xE0 // LSB (0-127), MSB (0-127) | |||
#define MIDI_IS_STATUS_NOTE_OFF(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_NOTE_OFF) | |||
#define MIDI_IS_STATUS_NOTE_ON(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_NOTE_ON) | |||
#define MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_POLYPHONIC_AFTERTOUCH) | |||
#define MIDI_IS_STATUS_CONTROL_CHANGE(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_CONTROL_CHANGE) | |||
#define MIDI_IS_STATUS_PROGRAM_CHANGE(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_PROGRAM_CHANGE) | |||
#define MIDI_IS_STATUS_CHANNEL_PRESSURE(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_CHANNEL_PRESSURE) | |||
#define MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) (((status) < 0xF0) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_PITCH_WHEEL_CONTROL) | |||
#define MIDI_IS_STATUS_NOTE_OFF(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_NOTE_OFF) | |||
#define MIDI_IS_STATUS_NOTE_ON(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_NOTE_ON) | |||
#define MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_POLYPHONIC_AFTERTOUCH) | |||
#define MIDI_IS_STATUS_CONTROL_CHANGE(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_CONTROL_CHANGE) | |||
#define MIDI_IS_STATUS_PROGRAM_CHANGE(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_PROGRAM_CHANGE) | |||
#define MIDI_IS_STATUS_CHANNEL_PRESSURE(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_CHANNEL_PRESSURE) | |||
#define MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) (((status) < MIDI_STATUS_BIT) && ((status) & MIDI_STATUS_BIT) == MIDI_STATUS_PITCH_WHEEL_CONTROL) | |||
// MIDI Utils | |||
#define MIDI_GET_STATUS_FROM_DATA(data) ((data[0] < 0xF0) ? data[0] & MIDI_STATUS_BIT : data[0]) | |||
#define MIDI_GET_CHANNEL_FROM_DATA(data) ((data[0] < 0xF0) ? data[0] & MIDI_CHANNEL_BIT : 0) | |||
#define MIDI_GET_STATUS_FROM_DATA(data) ((data[0] < MIDI_STATUS_BIT) ? data[0] & MIDI_STATUS_BIT : data[0]) | |||
#define MIDI_GET_CHANNEL_FROM_DATA(data) ((data[0] < MIDI_STATUS_BIT) ? data[0] & MIDI_CHANNEL_BIT : 0) | |||
// Control Change Messages List | |||
#define MIDI_CONTROL_BANK_SELECT 0x00 // 0-127, MSB | |||
@@ -144,6 +144,25 @@ const char* PluginCategory2Str(const PluginCategory 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_SPECIAL: | |||
return "PARAMETER_SPECIAL"; | |||
} | |||
carla_stderr("CarlaBackend::ParameterType2Str(%i) - invalid type", type); | |||
return nullptr; | |||
} | |||
static inline | |||
const char* InternalParameterIndex2Str(const InternalParameterIndex index) | |||
{ | |||