diff --git a/source/backend/CarlaBackend.h b/source/backend/CarlaBackend.h index 82effa129..2f85059e1 100644 --- a/source/backend/CarlaBackend.h +++ b/source/backend/CarlaBackend.h @@ -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; diff --git a/source/backend/CarlaEngine.hpp b/source/backend/CarlaEngine.hpp index d80606f86..9bdc6db84 100644 --- a/source/backend/CarlaEngine.hpp +++ b/source/backend/CarlaEngine.hpp @@ -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 { diff --git a/source/backend/CarlaHost.h b/source/backend/CarlaHost.h index e6b852348..6c8a498f4 100644 --- a/source/backend/CarlaHost.h +++ b/source/backend/CarlaHost.h @@ -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), diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index 56b6c8eef..ca34df18f 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -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 * diff --git a/source/backend/engine/CarlaEngineInternal.hpp b/source/backend/engine/CarlaEngineInternal.hpp index 5ea63d511..7a6173fd7 100644 --- a/source/backend/engine/CarlaEngineInternal.hpp +++ b/source/backend/engine/CarlaEngineInternal.hpp @@ -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(); } diff --git a/source/backend/engine/CarlaEngineOsc.hpp b/source/backend/engine/CarlaEngineOsc.hpp index c43866ca9..8be102538 100644 --- a/source/backend/engine/CarlaEngineOsc.hpp +++ b/source/backend/engine/CarlaEngineOsc.hpp @@ -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(); } // ------------------------------------------------------------------- diff --git a/source/carla_backend.py b/source/carla_backend.py index 6d1d739a5..49a1ee1f0 100644 --- a/source/carla_backend.py +++ b/source/carla_backend.py @@ -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). diff --git a/source/includes/CarlaMIDI.h b/source/includes/CarlaMIDI.h index d07d531d5..e15cdfe50 100644 --- a/source/includes/CarlaMIDI.h +++ b/source/includes/CarlaMIDI.h @@ -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 diff --git a/source/utils/CarlaBackendUtils.hpp b/source/utils/CarlaBackendUtils.hpp index fcad6132a..3d35a71d4 100644 --- a/source/utils/CarlaBackendUtils.hpp +++ b/source/utils/CarlaBackendUtils.hpp @@ -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) {