@@ -26,106 +26,93 @@ extern "C" { | |||
#include <stddef.h> | |||
#include <stdint.h> | |||
// --------------------------------------------------------------------------------------- | |||
// Plugin Categories | |||
#define PLUGIN_CATEGORY_SYNTH ":synth" //!< A synthesizer or generator. | |||
#define PLUGIN_CATEGORY_DELAY ":delay" //!< A delay or reverberator. | |||
#define PLUGIN_CATEGORY_EQ ":eq" //!< An equalizer. | |||
#define PLUGIN_CATEGORY_FILTER ":filter" //!< A filter. | |||
#define PLUGIN_CATEGORY_DYNAMICS ":dynamics" //!< A 'dynamic' plugin (amplifier, compressor, gate, etc). | |||
#define PLUGIN_CATEGORY_MODULATOR ":modulator" //!< A 'modulator' plugin (chorus, flanger, phaser, etc). | |||
#define PLUGIN_CATEGORY_UTILITY ":utility" //!< An 'utility' plugin (analyzer, converter, mixer, etc). | |||
#define PLUGIN_CATEGORY_OTHER ":other" //!< Misc plugin (used to check if the plugin has a category). | |||
// --------------------------------------------------------------------------------------- | |||
// Plugin Features | |||
#define PLUGIN_FEATURE_RTSAFE ":rtsafe" | |||
#define PLUGIN_FEATURE_FIXED_BUFFERS ":fixedbuffers" | |||
#define PLUGIN_FEATURE_BUFFER_SIZE_CHANGES ":buffersizechanges" | |||
#define PLUGIN_FEATURE_SAMPLE_RATE_CHANGES ":sampleratechanges" | |||
#define PLUGIN_FEATURE_MONO_PANNING ":monopanning" | |||
#define PLUGIN_FEATURE_STEREO_BALANCE ":stereobalance" | |||
#define PLUGIN_FEATURE_STATE ":state" | |||
#define PLUGIN_FEATURE_TIME ":time" | |||
#define PLUGIN_FEATURE_WRITE_EVENT ":writeevent" | |||
#define PLUGIN_FEATURE_OPEN_SAVE ":uiopensave" | |||
// --------------------------------------------------------------------------------------- | |||
// Plugin Supports | |||
#define PLUGIN_SUPPORTS_PROGRAM_CHANGES ":program" | |||
#define PLUGIN_SUPPORTS_CONTROL_CHANGES ":control" | |||
#define PLUGIN_SUPPORTS_CHANNEL_PRESSURE ":pressure" | |||
#define PLUGIN_SUPPORTS_NOTE_AFTERTOUCH ":aftertouch" | |||
#define PLUGIN_SUPPORTS_PITCHBEND ":pitchbend" | |||
#define PLUGIN_SUPPORTS_ALL_SOUND_OFF ":allsoundoff" | |||
#define PLUGIN_SUPPORTS_EVERYTHING ":control:pressure:aftertouch:pitchbend:allsoundoff:" | |||
// --------------------------------------------------------------------------------------- | |||
// Parameter Hints | |||
#define PARAMETER_IS_OUTPUT ":output" | |||
#define PARAMETER_IS_ENABLED ":enabled" | |||
#define PARAMETER_IS_AUTOMABLE ":rtsafe" | |||
#define PARAMETER_IS_BOOLEAN ":boolean" | |||
#define PARAMETER_IS_INTEGER ":integer" | |||
#define PARAMETER_IS_LOGARITHMIC ":logarithmic" | |||
#define PARAMETER_USES_SAMPLE_RATE ":samplerate" | |||
#define PARAMETER_USES_SCALEPOINTS ":scalepoints" | |||
#define PARAMETER_USES_CUSTOM_TEXT ":customtext" | |||
// --------------------------------------------------------------------------------------- | |||
// Default Parameter Ranges | |||
#define PARAMETER_RANGE_DEFAULT_STEP 0.01f | |||
#define PARAMETER_RANGE_DEFAULT_STEP_SMALL 0.0001f | |||
#define PARAMETER_RANGE_DEFAULT_STEP_LARGE 0.1f | |||
// --------------------------------------------------------------------------------------- | |||
// Event Types | |||
#define EVENT_TYPE_MIDI "midi" | |||
#define EVENT_TYPE_MIDI_PROGRAM "midiprogram" | |||
#define EVENT_TYPE_PARAMETER "parameter" | |||
// --------------------------------------------------------------------------------------- | |||
// Host Dispatcher Opcodes | |||
#define HOST_OPCODE_SET_VOLUME "setVolume" //!< Set host's volume, uses opt. | |||
#define HOST_OPCODE_SET_DRYWET "setDryWet" //!< Set host's dry-wet, uses opt. | |||
#define HOST_OPCODE_SET_BALANCE_LEFT "setBalanceLeft" //!< Set host's balance-left, uses opt. | |||
#define HOST_OPCODE_SET_BALANCE_RIGHT "setBalanceRight" //!< Set host's balance-right, uses opt. | |||
#define HOST_OPCODE_SET_PANNING "setPanning" //!< Set host's panning, uses opt. | |||
#define HOST_OPCODE_GET_PARAMETER_MIDI_CC "getParameterMidiCC" //!< Get the parameter @a index currently mapped MIDI control, uses index, return answer. | |||
#define HOST_OPCODE_SET_PARAMETER_MIDI_CC "setParameterMidiCC" //!< Set the parameter @a index mapped MIDI control, uses index and value. | |||
#define HOST_OPCODE_UPDATE_PARAMETER "updateParameter" //!< Tell the host to update parameter @a index, uses index with -1 for all. | |||
#define HOST_OPCODE_UPDATE_MIDI_PROGRAM "updateMidiProgram" //!< Tell the host to update midi-program @a index, uses index with -1 for all; may also use value for channel. | |||
#define HOST_OPCODE_RELOAD_PARAMETERS "reloadParameters" //!< Tell the host to reload all parameters data, uses nothing. | |||
#define HOST_OPCODE_RELOAD_MIDI_PROGRAMS "reloadMidiPrograms" //!< Tell the host to reload all midi-programs data, uses nothing. | |||
#define HOST_OPCODE_RELOAD_ALL "reloadAll" //!< Tell the host to reload everything all the plugin, uses nothing. | |||
#define HOST_OPCODE_UI_UNAVAILABLE "uiUnavailable" //!< Tell the host the UI can't be shown, uses nothing. | |||
// --------------------------------------------------------------------------------------- | |||
// Plugin Dispatcher Opcodes | |||
#define PLUGIN_OPCODE_BUFFER_SIZE_CHANGED "bufferSizeChanged" //!< Audio buffer size changed, uses value. | |||
#define PLUGIN_OPCODE_SAMPLE_RATE_CHANGED "sampleRateChanged" //!< Audio sample rate changed, uses opt. | |||
#define PLUGIN_OPCODE_OFFLINE_CHANGED "offlineChanged" //!< Offline mode changed, uses value (0=off, 1=on). | |||
#define PLUGIN_OPCODE_UI_TITLE_CHANGED "uiTitleChanged" //!< UI title changed, uses ptr. | |||
// --------------------------------------------------------------------------------------- | |||
// Base types | |||
typedef float audio_sample_t; | |||
typedef uint32_t mapped_value_t; | |||
/*! | |||
* @defgroup CarlaNativeAPI Carla Native API | |||
* | |||
* The Carla Native API | |||
* @{ | |||
*/ | |||
typedef void* PluginHandle; | |||
typedef void* HostHandle; | |||
typedef void* PluginHandle; | |||
// ----------------------------------------------------------------------- | |||
// enums | |||
typedef enum { | |||
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). | |||
} PluginCategory; | |||
typedef enum { | |||
PLUGIN_IS_RTSAFE = 1 << 0, | |||
PLUGIN_IS_SYNTH = 1 << 1, | |||
PLUGIN_HAS_GUI = 1 << 2, | |||
PLUGIN_NEEDS_FIXED_BUFFERS = 1 << 3, | |||
PLUGIN_NEEDS_SINGLE_THREAD = 1 << 4, | |||
PLUGIN_NEEDS_UI_OPEN_SAVE = 1 << 5, | |||
PLUGIN_USES_PANNING = 1 << 6, // uses stereo balance if unset (default) | |||
PLUGIN_USES_STATE = 1 << 7, | |||
PLUGIN_USES_TIME = 1 << 8 | |||
} PluginHints; | |||
typedef enum { | |||
PLUGIN_SUPPORTS_PROGRAM_CHANGES = 1 << 0, // handles MIDI programs internally instead of host-exposed/exported | |||
PLUGIN_SUPPORTS_CONTROL_CHANGES = 1 << 1, | |||
PLUGIN_SUPPORTS_CHANNEL_PRESSURE = 1 << 2, | |||
PLUGIN_SUPPORTS_NOTE_AFTERTOUCH = 1 << 3, | |||
PLUGIN_SUPPORTS_PITCHBEND = 1 << 4, | |||
PLUGIN_SUPPORTS_ALL_SOUND_OFF = 1 << 5, | |||
PLUGIN_SUPPORTS_EVERYTHING = (1 << 6)-1 | |||
} PluginSupports; | |||
typedef enum { | |||
PARAMETER_IS_OUTPUT = 1 << 0, | |||
PARAMETER_IS_ENABLED = 1 << 1, | |||
PARAMETER_IS_AUTOMABLE = 1 << 2, | |||
PARAMETER_IS_BOOLEAN = 1 << 3, | |||
PARAMETER_IS_INTEGER = 1 << 4, | |||
PARAMETER_IS_LOGARITHMIC = 1 << 5, | |||
PARAMETER_USES_SAMPLE_RATE = 1 << 6, | |||
PARAMETER_USES_SCALEPOINTS = 1 << 7, | |||
PARAMETER_USES_CUSTOM_TEXT = 1 << 8 | |||
} ParameterHints; | |||
typedef enum { | |||
PLUGIN_OPCODE_NULL = 0, // nothing | |||
PLUGIN_OPCODE_BUFFER_SIZE_CHANGED = 1, // uses value | |||
PLUGIN_OPCODE_SAMPLE_RATE_CHANGED = 2, // uses opt | |||
PLUGIN_OPCODE_OFFLINE_CHANGED = 3, // uses value (0=off, 1=on) | |||
PLUGIN_OPCODE_UI_NAME_CHANGED = 4 // uses ptr | |||
} PluginDispatcherOpcode; | |||
typedef enum { | |||
HOST_OPCODE_NULL = 0, // nothing | |||
HOST_OPCODE_SET_VOLUME = 1, // uses opt | |||
HOST_OPCODE_SET_DRYWET = 2, // uses opt | |||
HOST_OPCODE_SET_BALANCE_LEFT = 3, // uses opt | |||
HOST_OPCODE_SET_BALANCE_RIGHT = 4, // uses opt | |||
HOST_OPCODE_SET_PANNING = 5, // uses opt | |||
HOST_OPCODE_GET_PARAMETER_MIDI_CC = 6, // uses index; return answer | |||
HOST_OPCODE_SET_PARAMETER_MIDI_CC = 7, // uses index and value | |||
HOST_OPCODE_SET_PROCESS_PRECISION = 8, // uses value | |||
HOST_OPCODE_UPDATE_PARAMETER = 9, // uses index, -1 for all | |||
HOST_OPCODE_UPDATE_MIDI_PROGRAM = 10, // uses index, -1 for all; may use value for channel | |||
HOST_OPCODE_RELOAD_PARAMETERS = 11, // nothing | |||
HOST_OPCODE_RELOAD_MIDI_PROGRAMS = 12, // nothing | |||
HOST_OPCODE_RELOAD_ALL = 13, // nothing | |||
HOST_OPCODE_UI_UNAVAILABLE = 14 // nothing | |||
} HostDispatcherOpcode; | |||
// --------------------------------------------------------------------------------------- | |||
// Base structs | |||
// ----------------------------------------------------------------------- | |||
// base structs | |||
typedef struct { | |||
const char* label; | |||
@@ -141,8 +128,12 @@ typedef struct { | |||
float stepLarge; | |||
} ParameterRanges; | |||
#define PARAMETER_RANGES_DEFAULT_STEP 0.01f | |||
#define PARAMETER_RANGES_DEFAULT_STEP_SMALL 0.0001f | |||
#define PARAMETER_RANGES_DEFAULT_STEP_LARGE 0.1f | |||
typedef struct { | |||
const char* hints; | |||
ParameterHints hints; | |||
const char* name; | |||
const char* unit; | |||
ParameterRanges ranges; | |||
@@ -152,41 +143,17 @@ typedef struct { | |||
} Parameter; | |||
typedef struct { | |||
uint32_t bank; | |||
uint32_t program; | |||
const char* name; | |||
} MidiProgram; | |||
// --------------------------------------------------------------------------------------- | |||
// Events | |||
typedef struct { | |||
mapped_value_t type; | |||
uint32_t frame; | |||
} Event; | |||
typedef struct { | |||
Event e; | |||
uint32_t port; | |||
uint32_t size; | |||
uint8_t port; | |||
uint32_t time; | |||
uint8_t data[4]; | |||
uint8_t size; | |||
} MidiEvent; | |||
typedef struct { | |||
Event e; | |||
uint32_t channel; // used only in synths | |||
uint32_t bank; | |||
uint32_t program; | |||
} MidiProgramEvent; | |||
typedef struct { | |||
Event e; | |||
uint32_t index; | |||
float value; | |||
} ParameterEvent; | |||
// --------------------------------------------------------------------------------------- | |||
// Time | |||
const char* name; | |||
} MidiProgram; | |||
typedef struct { | |||
bool valid; | |||
@@ -210,57 +177,52 @@ typedef struct { | |||
TimeInfoBBT bbt; | |||
} TimeInfo; | |||
// --------------------------------------------------------------------------------------- | |||
// PluginHostDescriptor | |||
// ----------------------------------------------------------------------- | |||
// HostDescriptor | |||
typedef struct { | |||
HostHandle handle; | |||
const char* resourceDir; | |||
const char* uiTitle; | |||
uint32_t bufferSize; | |||
uint32_t sampleRate; | |||
bool isOffline; | |||
const char* uiName; | |||
mapped_value_t (*map_value)(HostHandle handle, const char* valueStr); | |||
const char* (*unmap_value)(HostHandle handle, mapped_value_t value); | |||
uint32_t (*get_buffer_size)(HostHandle handle); | |||
double (*get_sample_rate)(HostHandle handle); | |||
bool (*is_offline)(HostHandle handle); | |||
const TimeInfo* (*get_time_info)(HostHandle handle); | |||
bool (*write_event)(HostHandle handle, const Event* event); | |||
bool (*write_midi_event)(HostHandle handle, const MidiEvent* event); | |||
void (*ui_parameter_changed)(HostHandle handle, uint32_t index, float value); | |||
void (*ui_midi_program_changed)(HostHandle handle, uint8_t channel, uint32_t bank, uint32_t program); | |||
void (*ui_custom_data_changed)(HostHandle handle, const char* key, const char* value); | |||
void (*ui_closed)(HostHandle handle); | |||
// TODO: add some msgbox call | |||
const char* (*ui_open_file)(HostHandle handle, bool isDir, const char* title, const char* filter); | |||
const char* (*ui_save_file)(HostHandle handle, bool isDir, const char* title, const char* filter); | |||
intptr_t (*dispatcher)(HostHandle handle, mapped_value_t opcode, int32_t index, intptr_t value, void* ptr, float opt); | |||
intptr_t (*dispatcher)(HostHandle handle, HostDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt); | |||
} PluginHostDescriptor; | |||
} HostDescriptor; | |||
// --------------------------------------------------------------------------------------- | |||
// ----------------------------------------------------------------------- | |||
// PluginDescriptor | |||
typedef struct { | |||
const char* const categories; | |||
const char* const features; | |||
const char* const supports; | |||
typedef struct _PluginDescriptor { | |||
const PluginCategory category; | |||
const PluginHints hints; | |||
const PluginSupports supports; | |||
const uint32_t audioIns; | |||
const uint32_t audioOuts; | |||
const uint32_t midiIns; | |||
const uint32_t midiOuts; | |||
const uint32_t paramIns; | |||
const uint32_t paramOuts; | |||
const char* const author; | |||
const char* const name; | |||
const char* const label; | |||
const char* const maker; | |||
const char* const copyright; | |||
const char* const version; | |||
PluginHandle (*instantiate)(const PluginHostDescriptor* host); | |||
PluginHandle (*instantiate)(const HostDescriptor* host); | |||
void (*cleanup)(PluginHandle handle); | |||
uint32_t (*get_parameter_count)(PluginHandle handle); | |||
@@ -271,20 +233,25 @@ typedef struct { | |||
uint32_t (*get_midi_program_count)(PluginHandle handle); | |||
const MidiProgram* (*get_midi_program_info)(PluginHandle handle, uint32_t index); | |||
char* (*get_state)(PluginHandle handle); | |||
void (*set_state)(PluginHandle handle, const char* data); | |||
void (*activate)(PluginHandle handle); | |||
void (*deactivate)(PluginHandle handle); | |||
void (*process)(PluginHandle handle, audio_sample_t** inBuffer, audio_sample_t** outBuffer, uint32_t frames, const Event* events, uint32_t eventCount); | |||
void (*set_parameter_value)(PluginHandle handle, uint32_t index, float value); | |||
void (*set_midi_program)(PluginHandle handle, uint8_t channel, uint32_t bank, uint32_t program); | |||
void (*set_custom_data)(PluginHandle handle, const char* key, const char* value); | |||
void (*ui_show)(PluginHandle handle, bool show); | |||
void (*ui_idle)(PluginHandle handle); | |||
void (*ui_set_parameter)(PluginHandle handle, uint32_t index, float value); | |||
void (*ui_set_parameter_value)(PluginHandle handle, uint32_t index, float value); | |||
void (*ui_set_midi_program)(PluginHandle handle, uint8_t channel, uint32_t bank, uint32_t program); | |||
void (*ui_set_custom_data)(PluginHandle handle, const char* key, const char* value); | |||
intptr_t (*dispatcher)(PluginHandle handle, mapped_value_t opcode, int32_t index, intptr_t value, void* ptr, float opt); | |||
void (*activate)(PluginHandle handle); | |||
void (*deactivate)(PluginHandle handle); | |||
void (*process)(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount); | |||
char* (*get_state)(PluginHandle handle); | |||
void (*set_state)(PluginHandle handle, const char* data); | |||
intptr_t (*dispatcher)(PluginHandle handle, PluginDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt); | |||
} PluginDescriptor; | |||
@@ -295,6 +262,8 @@ extern void carla_register_native_plugin(const PluginDescriptor* desc); | |||
// ----------------------------------------------------------------------- | |||
/**@}*/ | |||
#ifdef __cplusplus | |||
} // extern "C" | |||
#endif | |||
@@ -33,35 +33,10 @@ | |||
class PluginClass | |||
{ | |||
public: | |||
struct MappedValues { | |||
// event types | |||
MappedValue midi; | |||
MappedValue parameter; | |||
// plugin opcodes | |||
MappedValue msgReceived; | |||
MappedValue bufferSizeChanged; | |||
MappedValue sampleRateChanged; | |||
MappedValue offlineChanged; | |||
// host opcodes | |||
MappedValue needsIdle; | |||
} fMap; | |||
PluginClass(const PluginHostDescriptor* const host) | |||
PluginClass(const HostDescriptor* const host) | |||
: pHost(host) | |||
{ | |||
std::memset(&fMap, 0, sizeof(MappedValues)); | |||
CARLA_SAFE_ASSERT_RETURN(host != nullptr,); | |||
fMap.midi = pHost->map_value(pHost->handle, EVENT_TYPE_MIDI); | |||
fMap.parameter = pHost->map_value(pHost->handle, EVENT_TYPE_PARAMETER); | |||
fMap.msgReceived = pHost->map_value(pHost->handle, PLUGIN_OPCODE_MSG_RECEIVED); | |||
fMap.bufferSizeChanged = pHost->map_value(pHost->handle, PLUGIN_OPCODE_BUFFER_SIZE_CHANGED); | |||
fMap.sampleRateChanged = pHost->map_value(pHost->handle, PLUGIN_OPCODE_SAMPLE_RATE_CHANGED); | |||
fMap.offlineChanged = pHost->map_value(pHost->handle, PLUGIN_OPCODE_OFFLINE_CHANGED); | |||
fMap.needsIdle = pHost->map_value(pHost->handle, HOST_OPCODE_NEEDS_IDLE); | |||
CARLA_ASSERT(host != nullptr); | |||
} | |||
virtual ~PluginClass() | |||
@@ -72,30 +47,23 @@ protected: | |||
// ------------------------------------------------------------------- | |||
// Host calls | |||
const PluginHostDescriptor* getHostHandle() const noexcept | |||
const HostDescriptor* getHostHandle() const noexcept | |||
{ | |||
return pHost; | |||
} | |||
int getPluginVersion() const noexcept | |||
{ | |||
return pHost->pluginVersion; | |||
} | |||
MappedValue mapValue(const char* const valueStr) const | |||
const char* getResourceDir() const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, 0); | |||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr, 0); | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, nullptr); | |||
return pHost->map_value(pHost->handle, valueStr); | |||
return pHost->resourceDir; | |||
} | |||
const char* unmapValue(const MappedValue value) const | |||
const char* getUiName() const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, nullptr); | |||
CARLA_SAFE_ASSERT_RETURN(value != 0, nullptr); | |||
return pHost->unmap_value(pHost->handle, value); | |||
return pHost->uiName; | |||
} | |||
uint32_t getBufferSize() const | |||
@@ -126,49 +94,58 @@ protected: | |||
return pHost->get_time_info(pHost->handle); | |||
} | |||
bool sendUiMessage(const char* const msg) | |||
void writeMidiEvent(const MidiEvent* const event) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(msg != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
return pHost->send_ui_msg(pHost->handle, msg); | |||
pHost->write_midi_event(pHost->handle, event); | |||
} | |||
bool writeEvent(const Event* const event) const | |||
void uiParameterChanged(const uint32_t index, const float value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(event != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
return pHost->write_event(pHost->handle, event); | |||
pHost->ui_parameter_changed(pHost->handle, index, value); | |||
} | |||
bool writeMidiEvent(const MidiEvent* const midiEvent) const | |||
void uiMidiProgramChanged(const uint8_t channel, const uint32_t bank, const uint32_t program) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(midiEvent != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
return pHost->write_event(pHost->handle, (const Event*)midiEvent); | |||
pHost->ui_midi_program_changed(pHost->handle, channel, bank, program); | |||
} | |||
bool writeParameterEvent(const ParameterEvent* const paramEvent) const | |||
void uiCustomDataChanged(const char* const key, const char* const value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(paramEvent != nullptr, false); | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
return pHost->write_event(pHost->handle, (const Event*)paramEvent); | |||
pHost->ui_custom_data_changed(pHost->handle, key, value); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Host dispatcher calls | |||
void hostNeedsIdle() const | |||
void uiClosed() const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
pHost->dispatcher(pHost->handle, fMap.needsIdle, 0, 0, nullptr, 0.0f); | |||
pHost->ui_closed(pHost->handle); | |||
} | |||
const char* uiOpenFile(const bool isDir, const char* const title, const char* const filter) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, nullptr); | |||
return pHost->ui_open_file(pHost->handle, isDir, title, filter); | |||
} | |||
#if 0 | |||
const char* uiSaveFile(const bool isDir, const char* const title, const char* const filter) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr, nullptr); | |||
return pHost->ui_save_file(pHost->handle, isDir, title, filter); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Host dispatcher calls | |||
void hostSetVolume(const float value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
@@ -218,6 +195,13 @@ protected: | |||
pHost->dispatcher(pHost->handle, HOST_OPCODE_SET_PARAMETER_MIDI_CC, index, value, nullptr, 0.0f); | |||
} | |||
void hostSetProcessPrecision(const intptr_t value) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
pHost->dispatcher(pHost->handle, HOST_OPCODE_SET_PROCESS_PRECISION, 0, value, nullptr, 0.0f); | |||
} | |||
void hostUpdateParameter(const int32_t index) const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
@@ -266,7 +250,13 @@ protected: | |||
pHost->dispatcher(pHost->handle, HOST_OPCODE_RELOAD_ALL, 0, 0, nullptr, 0.0f); | |||
} | |||
#endif | |||
void hostUiUnavailable() const | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(pHost != nullptr,); | |||
pHost->dispatcher(pHost->handle, HOST_OPCODE_UI_UNAVAILABLE, 0, 0, nullptr, 0.0f); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin parameter calls | |||
@@ -297,15 +287,6 @@ protected: | |||
(void)value; | |||
} | |||
virtual void setParameterValue(const uint32_t index, const float value) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),); | |||
return; | |||
// unused | |||
(void)value; | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin midi-program calls | |||
@@ -320,6 +301,18 @@ protected: | |||
return nullptr; | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin state calls | |||
virtual void setParameterValue(const uint32_t index, const float value) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),); | |||
return; | |||
// unused | |||
(void)value; | |||
} | |||
virtual void setMidiProgram(const uint8_t channel, const uint32_t bank, const uint32_t program) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | |||
@@ -330,50 +323,87 @@ protected: | |||
(void)program; | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin idle | |||
virtual void idle() | |||
virtual void setCustomData(const char* const key, const char* const value) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(key != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin state calls | |||
// Plugin process calls | |||
virtual char* getState() const | |||
virtual void activate() | |||
{ | |||
return nullptr; | |||
} | |||
virtual void setState(const char* const data) | |||
virtual void deactivate() | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(data != nullptr,); | |||
} | |||
virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const MidiEvent* const midiEvents, const uint32_t midiEventCount) = 0; | |||
// ------------------------------------------------------------------- | |||
// Plugin process calls | |||
// Plugin UI calls | |||
virtual void activate() | |||
virtual void uiShow(const bool show) | |||
{ | |||
return; | |||
// unused | |||
(void)show; | |||
} | |||
virtual void deactivate() | |||
virtual void uiIdle() | |||
{ | |||
} | |||
virtual void uiSetParameterValue(const uint32_t index, const float value) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(index < getParameterCount(),); | |||
return; | |||
// unused | |||
(void)value; | |||
} | |||
virtual void process(float** const inBuffer, float** const outBuffer, const uint32_t frames, const Event* const events, const uint32_t eventCount) = 0; | |||
virtual void uiSetMidiProgram(const uint8_t channel, const uint32_t bank, const uint32_t program) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(channel < MAX_MIDI_CHANNELS,); | |||
return; | |||
// unused | |||
(void)bank; | |||
(void)program; | |||
} | |||
virtual void uiSetCustomData(const char* const key, const char* const value) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(key != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin dispatcher calls | |||
// Plugin state calls | |||
virtual char* getState() const | |||
{ | |||
return nullptr; | |||
} | |||
virtual void messageReceived(const char* const msg) | |||
virtual void setState(const char* const data) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(msg != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(data != nullptr,); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin dispatcher calls | |||
virtual void bufferSizeChanged(const uint32_t bufferSize) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(bufferSize > 0,); | |||
return; | |||
// unused | |||
(void)bufferSize; | |||
} | |||
virtual void sampleRateChanged(const double sampleRate) | |||
@@ -381,7 +411,7 @@ protected: | |||
CARLA_SAFE_ASSERT_RETURN(sampleRate > 0.0,); | |||
} | |||
virtual void offlineModeChanged(const bool isOffline) | |||
virtual void offlineChanged(const bool isOffline) | |||
{ | |||
return; | |||
@@ -389,10 +419,15 @@ protected: | |||
(void)isOffline; | |||
} | |||
virtual void uiNameChanged(const char* const uiName) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(uiName != nullptr,); | |||
} | |||
// ------------------------------------------------------------------- | |||
private: | |||
const PluginHostDescriptor* const pHost; | |||
const HostDescriptor* const pHost; | |||
// ------------------------------------------------------------------- | |||
@@ -420,11 +455,6 @@ public: | |||
return handlePtr->getParameterText(index, value); | |||
} | |||
static void _set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||
{ | |||
handlePtr->setParameterValue(index, value); | |||
} | |||
static uint32_t _get_midi_program_count(PluginHandle handle) | |||
{ | |||
return handlePtr->getMidiProgramCount(); | |||
@@ -435,24 +465,44 @@ public: | |||
return handlePtr->getMidiProgramInfo(index); | |||
} | |||
static void _set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||
{ | |||
handlePtr->setParameterValue(index, value); | |||
} | |||
static void _set_midi_program(PluginHandle handle, uint8_t channel, uint32_t bank, uint32_t program) | |||
{ | |||
handlePtr->setMidiProgram(channel, bank, program); | |||
} | |||
static void _idle(PluginHandle handle) | |||
static void _set_custom_data(PluginHandle handle, const char* key, const char* value) | |||
{ | |||
handlePtr->idle(); | |||
handlePtr->setCustomData(key, value); | |||
} | |||
static char* _get_state(PluginHandle handle) | |||
static void _ui_show(PluginHandle handle, bool show) | |||
{ | |||
return handlePtr->getState(); | |||
handlePtr->uiShow(show); | |||
} | |||
static void _set_state(PluginHandle handle, const char* data) | |||
static void _ui_idle(PluginHandle handle) | |||
{ | |||
handlePtr->setState(data); | |||
handlePtr->uiIdle(); | |||
} | |||
static void _ui_set_parameter_value(PluginHandle handle, uint32_t index, float value) | |||
{ | |||
handlePtr->uiSetParameterValue(index, value); | |||
} | |||
static void _ui_set_midi_program(PluginHandle handle, uint8_t channel, uint32_t bank, uint32_t program) | |||
{ | |||
handlePtr->uiSetMidiProgram(channel, bank, program); | |||
} | |||
static void _ui_set_custom_data(PluginHandle handle, const char* key, const char* value) | |||
{ | |||
handlePtr->uiSetCustomData(key, value); | |||
} | |||
static void _activate(PluginHandle handle) | |||
@@ -465,39 +515,46 @@ public: | |||
handlePtr->deactivate(); | |||
} | |||
static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, const Event* events, uint32_t eventCount) | |||
static void _process(PluginHandle handle, float** inBuffer, float** outBuffer, const uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
{ | |||
handlePtr->process(inBuffer, outBuffer, frames, events, eventCount); | |||
handlePtr->process(inBuffer, outBuffer, frames, midiEvents, midiEventCount); | |||
} | |||
static intptr_t _dispatcher(PluginHandle handle, MappedValue opcode, int32_t /*index*/, intptr_t value, void* ptr, float opt) | |||
static char* _get_state(PluginHandle handle) | |||
{ | |||
const MappedValues& map(handlePtr->fMap); | |||
return handlePtr->getState(); | |||
} | |||
if (opcode == 0) | |||
{ | |||
} | |||
else if (opcode == map.msgReceived) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(ptr != nullptr, 0); | |||
handlePtr->messageReceived(static_cast<const char*>(ptr)); | |||
} | |||
else if (opcode == map.bufferSizeChanged) | |||
static void _set_state(PluginHandle handle, const char* data) | |||
{ | |||
handlePtr->setState(data); | |||
} | |||
static intptr_t _dispatcher(PluginHandle handle, PluginDispatcherOpcode opcode, int32_t index, intptr_t value, void* ptr, float opt) | |||
{ | |||
switch(opcode) | |||
{ | |||
case PLUGIN_OPCODE_NULL: | |||
return 0; | |||
case PLUGIN_OPCODE_BUFFER_SIZE_CHANGED: | |||
CARLA_SAFE_ASSERT_RETURN(value > 0, 0); | |||
handlePtr->bufferSizeChanged(static_cast<uint32_t>(value)); | |||
} | |||
else if (opcode == map.sampleRateChanged) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(opt > 0.0f, 0); | |||
return 0; | |||
case PLUGIN_OPCODE_SAMPLE_RATE_CHANGED: | |||
handlePtr->sampleRateChanged(static_cast<double>(opt)); | |||
} | |||
else if (opcode == map.offlineChanged) | |||
{ | |||
handlePtr->offlineModeChanged(value != 0); | |||
return 0; | |||
case PLUGIN_OPCODE_OFFLINE_CHANGED: | |||
handlePtr->offlineChanged(value != 0); | |||
return 0; | |||
case PLUGIN_OPCODE_UI_NAME_CHANGED: | |||
handlePtr->uiNameChanged(static_cast<const char*>(ptr)); | |||
return 0; | |||
} | |||
return 0; | |||
// unused | |||
(void)index; | |||
} | |||
#undef handlePtr | |||
@@ -510,15 +567,15 @@ public: | |||
// ----------------------------------------------------------------------- | |||
#define PluginClassEND(ClassName) \ | |||
public: \ | |||
static PluginHandle _instantiate(const PluginHostDescriptor* host) \ | |||
{ \ | |||
return new ClassName(host); \ | |||
} \ | |||
static void _cleanup(PluginHandle handle) \ | |||
{ \ | |||
delete (ClassName*)handle; \ | |||
#define PluginClassEND(ClassName) \ | |||
public: \ | |||
static PluginHandle _instantiate(const HostDescriptor* host) \ | |||
{ \ | |||
return new ClassName(host); \ | |||
} \ | |||
static void _cleanup(PluginHandle handle) \ | |||
{ \ | |||
delete (ClassName*)handle; \ | |||
} | |||
#define PluginDescriptorFILL(ClassName) \ | |||
@@ -528,16 +585,21 @@ public: \ | |||
ClassName::_get_parameter_info, \ | |||
ClassName::_get_parameter_value, \ | |||
ClassName::_get_parameter_text, \ | |||
ClassName::_set_parameter_value, \ | |||
ClassName::_get_midi_program_count, \ | |||
ClassName::_get_midi_program_info, \ | |||
ClassName::_set_parameter_value, \ | |||
ClassName::_set_midi_program, \ | |||
ClassName::_idle, \ | |||
ClassName::_get_state, \ | |||
ClassName::_set_state, \ | |||
ClassName::_set_custom_data, \ | |||
ClassName::_ui_show, \ | |||
ClassName::_ui_idle, \ | |||
ClassName::_ui_set_parameter_value, \ | |||
ClassName::_ui_set_midi_program, \ | |||
ClassName::_ui_set_custom_data, \ | |||
ClassName::_activate, \ | |||
ClassName::_deactivate, \ | |||
ClassName::_process, \ | |||
ClassName::_get_state, \ | |||
ClassName::_set_state, \ | |||
ClassName::_dispatcher | |||
// ----------------------------------------------------------------------- | |||
@@ -1,97 +0,0 @@ | |||
# QtCreator project file | |||
TARGET = CarlaNative | |||
TEMPLATE = lib | |||
VERSION = 1.0 | |||
# ------------------------------------------------------- | |||
QT = core gui | |||
CONFIG = debug | |||
CONFIG += link_pkgconfig qt shared warn_on | |||
DEFINES = DEBUG | |||
DEFINES += HAVE_CPP11_SUPPORT | |||
DEFINES += QTCREATOR_TEST MOC_PARSING | |||
# Shared | |||
DEFINES += WANT_NATIVE | |||
DEFINES += WANT_LADSPA | |||
DEFINES += WANT_DSSI | |||
DEFINES += WANT_LV2 | |||
DEFINES += WANT_VST | |||
DEFINES += WANT_PLUGIN | |||
DEFINES += WANT_FLUIDSYNTH | |||
DEFINES += WANT_LINUXSAMPLER | |||
DEFINES += WANT_OPENGL | |||
DEFINES += WANT_AUDIOFILE | |||
DEFINES += WANT_MIDIFILE | |||
DEFINES += WANT_ZYNADDSUBFX | |||
DEFINES += WANT_ZYNADDSUBFX_UI | |||
# Audio file | |||
DEFINES += HAVE_FFMPEG | |||
PKGCONFIG += sndfile libavcodec libavformat libavutil | |||
# MIDI file | |||
PKGCONFIG += smf | |||
# DISTRHO | |||
PKGCONFIG += gl | |||
# ZynAddSubFX | |||
DEFINES += NTK_GUI | |||
PKGCONFIG += fftw3 mxml zlib ntk ntk_images | |||
# ------------------------------------------------------- | |||
SOURCES = \ | |||
bypass.c \ | |||
lfo.c \ | |||
midi-split.c \ | |||
midi-through.c \ | |||
midi-transpose.c \ | |||
nekofilter.c | |||
SOURCES += \ | |||
audio-file.cpp \ | |||
midi-file.cpp \ | |||
midi-sequencer.cpp \ | |||
sunvox-file.cpp \ | |||
zynaddsubfx.cpp \ | |||
zynaddsubfx-src.cpp \ | |||
zynaddsubfx-ui.cpp | |||
SOURCES += \ | |||
distrho-3bandeq.cpp | |||
HEADERS = \ | |||
audio-base.hpp \ | |||
midi-base.hpp | |||
HEADERS += \ | |||
../CarlaNative.h \ | |||
../CarlaNative.hpp | |||
HEADERS += \ | |||
distrho/DistrhoPluginCarla.cpp | |||
HEADERS += \ | |||
../../utils/CarlaUtils.hpp \ | |||
../../utils/CarlaJuceUtils.hpp \ | |||
../../utils/CarlaLibUtils.hpp \ | |||
../../utils/CarlaOscUtils.hpp \ | |||
../../utils/CarlaStateUtils.hpp \ | |||
../../utils/CarlaMutex.hpp \ | |||
../../utils/CarlaString.hpp | |||
INCLUDEPATH = . .. \ | |||
3bandeq distrho \ | |||
../../includes \ | |||
../../libs/distrho \ | |||
../../utils \ | |||
../../widgets | |||
QMAKE_CFLAGS *= -std=c99 | |||
QMAKE_CXXFLAGS *= -std=c++0x |
@@ -154,17 +154,6 @@ all: ../carla_native.a | |||
# -------------------------------------------------------------- | |||
%.c.o: %.c | |||
$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
%.cpp.o: %.cpp | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
moc_%.cpp: %.hpp | |||
$(MOC) $< -DMOC_PARSING -o $@ | |||
# -------------------------------------------------------------- | |||
CDEPS = ../CarlaNative.h | |||
CXXDEPS = ../CarlaNative.h ../CarlaNative.hpp | |||
@@ -218,6 +207,17 @@ zynaddsubfx/UI/%.h: zynaddsubfx/UI/%.fl | |||
# -------------------------------------------------------------- | |||
%.c.o: %.c | |||
$(CC) $< $(BUILD_C_FLAGS) -c -o $@ | |||
%.cpp.o: %.cpp | |||
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@ | |||
moc_%.cpp: %.hpp | |||
$(MOC) $< -DMOC_PARSING -o $@ | |||
# -------------------------------------------------------------- | |||
clean: | |||
rm -f $(OBJS) ../carla_native*.a | |||
rm -f $(ZYN_UI_FILES_H) $(ZYN_UI_FILES_CPP) | |||
@@ -26,7 +26,7 @@ class AudioFilePlugin : public PluginClass, | |||
public AbstractAudioPlayer | |||
{ | |||
public: | |||
AudioFilePlugin(const PluginHostDescriptor* const host) | |||
AudioFilePlugin(const HostDescriptor* const host) | |||
: PluginClass(host), | |||
AbstractAudioPlayer(), | |||
fLoopMode(false), | |||
@@ -65,17 +65,17 @@ protected: | |||
static Parameter param; | |||
param.hints = PARAMETER_IS_ENABLED ":" PARAMETER_IS_BOOLEAN; | |||
param.name = "Loop Mode"; | |||
param.unit = nullptr; | |||
param.ranges.def = 1.0f; | |||
param.ranges.min = 0.0f; | |||
param.ranges.max = 1.0f; | |||
param.hints = static_cast<ParameterHints>(PARAMETER_IS_ENABLED|PARAMETER_IS_BOOLEAN); | |||
param.ranges.def = 1.0f; | |||
param.ranges.min = 0.0f; | |||
param.ranges.max = 1.0f; | |||
param.ranges.step = 1.0f; | |||
param.ranges.stepSmall = 1.0f; | |||
param.ranges.stepLarge = 1.0f; | |||
param.scalePointCount = 0; | |||
param.scalePoints = nullptr; | |||
param.scalePointCount = 0; | |||
param.scalePoints = nullptr; | |||
return ¶m; | |||
} | |||
@@ -88,6 +88,9 @@ protected: | |||
return fLoopMode ? 1.0f : 0.0f; | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin state calls | |||
void setParameterValue(const uint32_t index, const float value) override | |||
{ | |||
if (index != 0) | |||
@@ -102,21 +105,18 @@ protected: | |||
fThread.setNeedsRead(); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin state calls | |||
void setCustomData(const char* const key, const char* const value) override | |||
{ | |||
if (std::strcmp(key, "file") != 0) | |||
return; | |||
// void setCustomData(const char* const key, const char* const value) override | |||
// { | |||
// if (std::strcmp(key, "file") != 0) | |||
// return; | |||
// | |||
// loadFilename(value); | |||
// } | |||
loadFilename(value); | |||
} | |||
// ------------------------------------------------------------------- | |||
// Plugin process calls | |||
void process(float**, float** const outBuffer, const uint32_t frames, const Event* const, const uint32_t) override | |||
void process(float**, float** const outBuffer, const uint32_t frames, const MidiEvent* const, const uint32_t) override | |||
{ | |||
const TimeInfo* const timePos(getTimeInfo()); | |||
@@ -189,16 +189,16 @@ protected: | |||
// ------------------------------------------------------------------- | |||
// Plugin UI calls | |||
// void uiShow(const bool show) override | |||
// { | |||
// if (! show) | |||
// return; | |||
// | |||
// if (const char* const filename = uiOpenFile(false, "Open Audio File", "")) | |||
// uiCustomDataChanged("file", filename); | |||
// | |||
// uiClosed(); | |||
// } | |||
void uiShow(const bool show) override | |||
{ | |||
if (! show) | |||
return; | |||
if (const char* const filename = uiOpenFile(false, "Open Audio File", "")) | |||
uiCustomDataChanged("file", filename); | |||
uiClosed(); | |||
} | |||
private: | |||
bool fLoopMode; | |||
@@ -244,22 +244,19 @@ private: | |||
// ----------------------------------------------------------------------- | |||
static const PluginDescriptor audiofileDesc = { | |||
/* api */ CARLA_NATIVE_API_VERSION, | |||
/* categories */ PLUGIN_CATEGORY_UTILITY, | |||
/* features */ PLUGIN_FEATURE_RTSAFE, | |||
/* supports */ nullptr, | |||
/* metadata */ nullptr, | |||
/* audioIns */ 0, | |||
/* audioOuts */ 2, | |||
/* midiIns */ 0, | |||
/* midiOuts */ 0, | |||
/* paramIns */ 0, // TODO - loopMode | |||
/* paramOuts */ 0, | |||
/* author */ "falkTX", | |||
/* name */ "Audio File", | |||
/* label */ "audiofile", | |||
/* copyright */ "GNU GPL v2+", | |||
/* version */ 0x1000, | |||
/* category */ PLUGIN_CATEGORY_UTILITY, | |||
/* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_GUI|PLUGIN_NEEDS_UI_OPEN_SAVE), | |||
/* supports */ static_cast<PluginSupports>(0x0), | |||
/* audioIns */ 0, | |||
/* audioOuts */ 2, | |||
/* midiIns */ 0, | |||
/* midiOuts */ 0, | |||
/* paramIns */ 0, // TODO - loopMode | |||
/* paramOuts */ 0, | |||
/* name */ "Audio File", | |||
/* label */ "audiofile", | |||
/* maker */ "falkTX", | |||
/* copyright */ "GNU GPL v2+", | |||
PluginDescriptorFILL(AudioFilePlugin) | |||
}; | |||
@@ -21,42 +21,39 @@ | |||
// ----------------------------------------------------------------------- | |||
static PluginHandle bypass_instantiate(const PluginHostDescriptor* host) | |||
static PluginHandle bypass_instantiate(const HostDescriptor* host) | |||
{ | |||
// dummy, return non-NULL | |||
return (PluginHandle)host; | |||
} | |||
static void bypass_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const Event* events, uint32_t eventCount) | |||
static void bypass_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
{ | |||
memcpy(outBuffer[0], inBuffer[0], sizeof(float)*frames); | |||
return; | |||
// unused | |||
(void)handle; | |||
(void)events; | |||
(void)eventCount; | |||
(void)midiEvents; | |||
(void)midiEventCount; | |||
} | |||
// ----------------------------------------------------------------------- | |||
static const PluginDescriptor bypassDesc = { | |||
.api = CARLA_NATIVE_API_VERSION, | |||
.categories = NULL, | |||
.features = "rtsafe", | |||
.supports = NULL, | |||
.metadata = NULL, | |||
.audioIns = 1, | |||
.audioOuts = 1, | |||
.midiIns = 0, | |||
.midiOuts = 0, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.author = "falkTX", | |||
.name = "ByPass", | |||
.label = "bypass", | |||
.copyright = "GNU GPL v2+", | |||
.version = 0x1000, | |||
.category = PLUGIN_CATEGORY_NONE, | |||
.hints = PLUGIN_IS_RTSAFE, | |||
.supports = 0x0, | |||
.audioIns = 1, | |||
.audioOuts = 1, | |||
.midiIns = 0, | |||
.midiOuts = 0, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.name = "ByPass", | |||
.label = "bypass", | |||
.maker = "falkTX", | |||
.copyright = "GNU GPL v2+", | |||
.instantiate = bypass_instantiate, | |||
.cleanup = NULL, | |||
@@ -65,21 +62,28 @@ static const PluginDescriptor bypassDesc = { | |||
.get_parameter_info = NULL, | |||
.get_parameter_value = NULL, | |||
.get_parameter_text = NULL, | |||
.set_parameter_value = NULL, | |||
.get_midi_program_count = NULL, | |||
.get_midi_program_info = NULL, | |||
.set_midi_program = NULL, | |||
.idle = NULL, | |||
.set_parameter_value = NULL, | |||
.set_midi_program = NULL, | |||
.set_custom_data = NULL, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.ui_show = NULL, | |||
.ui_idle = NULL, | |||
.ui_set_parameter_value = NULL, | |||
.ui_set_midi_program = NULL, | |||
.ui_set_custom_data = NULL, | |||
.activate = NULL, | |||
.deactivate = NULL, | |||
.process = bypass_process, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.dispatcher = NULL | |||
}; | |||
@@ -268,14 +268,14 @@ static void lfo_process(PluginHandle handle, float** inBuffer, float** outBuffer | |||
static const PluginDescriptor lfoDesc = { | |||
.category = PLUGIN_CATEGORY_UTILITY, | |||
.hints = PLUGIN_IS_RTSAFE|PLUGIN_USES_TIMEPOS, | |||
.hints = PLUGIN_IS_RTSAFE, | |||
.supports = 0x0, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 0, | |||
.midiOuts = 0, | |||
.parameterIns = PARAM_COUNT-1, | |||
.parameterOuts = 1, | |||
.paramIns = PARAM_COUNT-1, | |||
.paramOuts = 1, | |||
.name = "LFO", | |||
.label = "lfo", | |||
.maker = "falkTX", | |||
@@ -220,7 +220,7 @@ private: | |||
static const PluginDescriptor midifileDesc = { | |||
/* category */ PLUGIN_CATEGORY_UTILITY, | |||
/* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_GUI|PLUGIN_NEEDS_OPENSAVE), | |||
/* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_HAS_GUI|PLUGIN_NEEDS_UI_OPEN_SAVE), | |||
/* supports */ static_cast<PluginSupports>(0x0), | |||
/* audioIns */ 0, | |||
/* audioOuts */ 0, | |||
@@ -32,8 +32,7 @@ typedef enum { | |||
} MidiGainParams; | |||
typedef struct { | |||
const PluginHostDescriptor* host; | |||
MappedValue map_midi; | |||
const HostDescriptor* host; | |||
float gain; | |||
bool applyNotes; | |||
bool applyAftertouch; | |||
@@ -42,19 +41,18 @@ typedef struct { | |||
// ----------------------------------------------------------------------- | |||
static PluginHandle midiGain_instantiate(const PluginHostDescriptor* host) | |||
static PluginHandle midiGain_instantiate(const HostDescriptor* host) | |||
{ | |||
MidiGainHandle* const handle = (MidiGainHandle*)malloc(sizeof(MidiGainHandle)); | |||
if (handle == NULL) | |||
return NULL; | |||
handle->host = host; | |||
handle->map_midi = host->map_value(host->handle, EVENT_TYPE_MIDI); | |||
handle->gain = 1.0f; | |||
handle->applyNotes = true; | |||
handle->host = host; | |||
handle->gain = 1.0f; | |||
handle->applyNotes = true; | |||
handle->applyAftertouch = true; | |||
handle->applyCC = false; | |||
handle->applyCC = false; | |||
return handle; | |||
} | |||
@@ -80,7 +78,7 @@ const Parameter* midiGain_get_parameter_info(PluginHandle handle, uint32_t index | |||
static Parameter param; | |||
param.hints = PARAMETER_IS_ENABLED ":" PARAMETER_IS_AUTOMABLE; | |||
param.hints = PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE; | |||
param.unit = NULL; | |||
param.scalePointCount = 0; | |||
param.scalePoints = NULL; | |||
@@ -89,16 +87,16 @@ const Parameter* midiGain_get_parameter_info(PluginHandle handle, uint32_t index | |||
{ | |||
case PARAM_GAIN: | |||
param.name = "Gain"; | |||
param.ranges.def = 1.0f; | |||
param.ranges.min = 0.001f; | |||
param.ranges.max = 4.0f; | |||
param.ranges.step = PARAMETER_RANGE_DEFAULT_STEP; | |||
param.ranges.stepSmall = PARAMETER_RANGE_DEFAULT_STEP_SMALL; | |||
param.ranges.stepLarge = PARAMETER_RANGE_DEFAULT_STEP_LARGE; | |||
param.ranges.def = 1.0f; | |||
param.ranges.min = 0.001f; | |||
param.ranges.max = 4.0f; | |||
param.ranges.step = PARAMETER_RANGES_DEFAULT_STEP; | |||
param.ranges.stepSmall = PARAMETER_RANGES_DEFAULT_STEP_SMALL; | |||
param.ranges.stepLarge = PARAMETER_RANGES_DEFAULT_STEP_LARGE; | |||
break; | |||
case PARAM_APPLY_NOTES: | |||
param.name = "Apply Notes"; | |||
param.hints = PARAMETER_IS_ENABLED ":" PARAMETER_IS_AUTOMABLE ":" PARAMETER_IS_BOOLEAN; | |||
param.name = "Apply Notes"; | |||
param.hints |= PARAMETER_IS_BOOLEAN; | |||
param.ranges.def = 1.0f; | |||
param.ranges.min = 0.0f; | |||
param.ranges.max = 1.0f; | |||
@@ -107,8 +105,8 @@ const Parameter* midiGain_get_parameter_info(PluginHandle handle, uint32_t index | |||
param.ranges.stepLarge = 1.0f; | |||
break; | |||
case PARAM_APPLY_AFTERTOUCH: | |||
param.name = "Apply Aftertouch"; | |||
param.hints = PARAMETER_IS_ENABLED ":" PARAMETER_IS_AUTOMABLE ":" PARAMETER_IS_BOOLEAN; | |||
param.name = "Apply Aftertouch"; | |||
param.hints |= PARAMETER_IS_BOOLEAN; | |||
param.ranges.def = 1.0f; | |||
param.ranges.min = 0.0f; | |||
param.ranges.max = 1.0f; | |||
@@ -117,8 +115,8 @@ const Parameter* midiGain_get_parameter_info(PluginHandle handle, uint32_t index | |||
param.ranges.stepLarge = 1.0f; | |||
break; | |||
case PARAM_APPLY_CC: | |||
param.name = "Apply CC"; | |||
param.hints = PARAMETER_IS_ENABLED ":" PARAMETER_IS_AUTOMABLE ":" PARAMETER_IS_BOOLEAN; | |||
param.name = "Apply CC"; | |||
param.hints |= PARAMETER_IS_BOOLEAN; | |||
param.ranges.def = 0.0f; | |||
param.ranges.min = 0.0f; | |||
param.ranges.max = 1.0f; | |||
@@ -170,24 +168,18 @@ static void midiGain_set_parameter_value(PluginHandle handle, uint32_t index, fl | |||
} | |||
} | |||
static void midiGain_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const Event* events, uint32_t eventCount) | |||
static void midiGain_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
{ | |||
const PluginHostDescriptor* const host = handlePtr->host; | |||
const MappedValue map_midi = handlePtr->map_midi; | |||
const HostDescriptor* const host = handlePtr->host; | |||
const float gain = handlePtr->gain; | |||
const bool applyNotes = handlePtr->applyNotes; | |||
const bool applyAftertouch = handlePtr->applyAftertouch; | |||
const bool applyCC = handlePtr->applyCC; | |||
MidiEvent tmpEvent; | |||
tmpEvent.e.type = map_midi; | |||
for (uint32_t i=0; i < eventCount; ++i) | |||
for (uint32_t i=0; i < midiEventCount; ++i) | |||
{ | |||
if (events[i].type != map_midi) | |||
continue; | |||
const MidiEvent* const midiEvent = (const MidiEvent*)&events[i]; | |||
const MidiEvent* const midiEvent = &midiEvents[i]; | |||
const uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent->data); | |||
@@ -201,15 +193,15 @@ static void midiGain_process(PluginHandle handle, float** inBuffer, float** outB | |||
if (value <= 0.0f) | |||
tmpEvent.data[2] = 0; | |||
else if (value >= 127.0f) | |||
else if (value >= 1.27f) | |||
tmpEvent.data[2] = 127; | |||
else | |||
tmpEvent.data[2] = (uint8_t)value; | |||
host->write_event(host->handle, (const Event*)&tmpEvent); | |||
host->write_midi_event(host->handle, &tmpEvent); | |||
} | |||
else | |||
host->write_event(host->handle, &events[i]); | |||
host->write_midi_event(host->handle, midiEvent); | |||
} | |||
return; | |||
@@ -223,21 +215,19 @@ static void midiGain_process(PluginHandle handle, float** inBuffer, float** outB | |||
// ----------------------------------------------------------------------- | |||
static const PluginDescriptor midiGainDesc = { | |||
.api = CARLA_NATIVE_API_VERSION, | |||
.categories = PLUGIN_CATEGORY_UTILITY ":midi", | |||
.features = "rtsafe", | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.metadata = NULL, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 1, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.author = "falkTX", | |||
.name = "MIDI Gain", | |||
.label = "midiGain", | |||
.copyright = "GNU GPL v2+", | |||
.category = PLUGIN_CATEGORY_UTILITY, | |||
.hints = PLUGIN_IS_RTSAFE, | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 1, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.name = "MIDI Gain", | |||
.label = "midiGain", | |||
.maker = "falkTX", | |||
.copyright = "GNU GPL v2+", | |||
.instantiate = midiGain_instantiate, | |||
.cleanup = midiGain_cleanup, | |||
@@ -246,21 +236,28 @@ static const PluginDescriptor midiGainDesc = { | |||
.get_parameter_info = midiGain_get_parameter_info, | |||
.get_parameter_value = midiGain_get_parameter_value, | |||
.get_parameter_text = NULL, | |||
.set_parameter_value = midiGain_set_parameter_value, | |||
.get_midi_program_count = NULL, | |||
.get_midi_program_info = NULL, | |||
.set_parameter_value = midiGain_set_parameter_value, | |||
.set_midi_program = NULL, | |||
.set_custom_data = NULL, | |||
.idle = NULL, | |||
.ui_show = NULL, | |||
.ui_idle = NULL, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.ui_set_parameter_value = NULL, | |||
.ui_set_midi_program = NULL, | |||
.ui_set_custom_data = NULL, | |||
.activate = NULL, | |||
.deactivate = NULL, | |||
.process = midiGain_process, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.dispatcher = NULL | |||
}; | |||
@@ -18,50 +18,22 @@ | |||
#include "CarlaNative.h" | |||
#include "CarlaMIDI.h" | |||
#include <stdlib.h> | |||
// ----------------------------------------------------------------------- | |||
typedef struct { | |||
const PluginHostDescriptor* host; | |||
MappedValue map_midi; | |||
} MidiSplitHandle; | |||
// ----------------------------------------------------------------------- | |||
static PluginHandle midiSplit_instantiate(const PluginHostDescriptor* host) | |||
static PluginHandle midiSplit_instantiate(const HostDescriptor* host) | |||
{ | |||
MidiSplitHandle* const handle = (MidiSplitHandle*)malloc(sizeof(MidiSplitHandle)); | |||
if (handle == NULL) | |||
return NULL; | |||
handle->host = host; | |||
handle->map_midi = host->map_value(host->handle, EVENT_TYPE_MIDI); | |||
return handle; | |||
// use HostDescriptor as PluginHandle | |||
return (PluginHandle)host; | |||
} | |||
#define handlePtr ((MidiSplitHandle*)handle) | |||
static void midiSplit_cleanup(PluginHandle handle) | |||
static void midiSplit_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
{ | |||
free(handlePtr); | |||
} | |||
static void midiSplit_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const Event* events, uint32_t eventCount) | |||
{ | |||
const PluginHostDescriptor* const host = handlePtr->host; | |||
const MappedValue map_midi = handlePtr->map_midi; | |||
const HostDescriptor* const host = (const HostDescriptor*)handle; | |||
MidiEvent tmpEvent; | |||
tmpEvent.e.type = map_midi; | |||
for (uint32_t i=0; i < eventCount; ++i) | |||
for (uint32_t i=0; i < midiEventCount; ++i) | |||
{ | |||
if (events[i].type != map_midi) | |||
continue; | |||
const MidiEvent* const midiEvent = (const MidiEvent*)&events[i]; | |||
const MidiEvent* const midiEvent = &midiEvents[i]; | |||
const uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent->data); | |||
const uint8_t channel = MIDI_GET_CHANNEL_FROM_DATA(midiEvent->data); | |||
@@ -69,15 +41,15 @@ static void midiSplit_process(PluginHandle handle, float** inBuffer, float** out | |||
if (channel >= MAX_MIDI_CHANNELS) | |||
continue; | |||
tmpEvent.e.frame = midiEvent->e.frame; | |||
tmpEvent.port = channel; | |||
tmpEvent.time = midiEvent->time; | |||
tmpEvent.data[0] = status; | |||
tmpEvent.data[1] = midiEvent->data[1]; | |||
tmpEvent.data[2] = midiEvent->data[2]; | |||
tmpEvent.data[3] = midiEvent->data[3]; | |||
tmpEvent.size = midiEvent->size; | |||
host->write_event(host->handle, (const Event*)&tmpEvent); | |||
host->write_midi_event(host->handle, &tmpEvent); | |||
} | |||
return; | |||
@@ -88,49 +60,52 @@ static void midiSplit_process(PluginHandle handle, float** inBuffer, float** out | |||
(void)frames; | |||
} | |||
#undef handlePtr | |||
// ----------------------------------------------------------------------- | |||
static const PluginDescriptor midiSplitDesc = { | |||
.api = CARLA_NATIVE_API_VERSION, | |||
.categories = PLUGIN_CATEGORY_UTILITY ":midi", | |||
.features = "rtsafe", | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.metadata = NULL, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 16, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.author = "falkTX", | |||
.name = "MIDI Split", | |||
.label = "midiSplit", | |||
.copyright = "GNU GPL v2+", | |||
.category = PLUGIN_CATEGORY_UTILITY, | |||
.hints = PLUGIN_IS_RTSAFE, | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 16, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.name = "MIDI Split", | |||
.label = "midiSplit", | |||
.maker = "falkTX", | |||
.copyright = "GNU GPL v2+", | |||
.instantiate = midiSplit_instantiate, | |||
.cleanup = midiSplit_cleanup, | |||
.cleanup = NULL, | |||
.get_parameter_count = NULL, | |||
.get_parameter_info = NULL, | |||
.get_parameter_value = NULL, | |||
.get_parameter_text = NULL, | |||
.set_parameter_value = NULL, | |||
.get_midi_program_count = NULL, | |||
.get_midi_program_info = NULL, | |||
.set_midi_program = NULL, | |||
.idle = NULL, | |||
.set_parameter_value = NULL, | |||
.set_midi_program = NULL, | |||
.set_custom_data = NULL, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.ui_show = NULL, | |||
.ui_idle = NULL, | |||
.ui_set_parameter_value = NULL, | |||
.ui_set_midi_program = NULL, | |||
.ui_set_custom_data = NULL, | |||
.activate = NULL, | |||
.deactivate = NULL, | |||
.process = midiSplit_process, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.dispatcher = NULL | |||
}; | |||
@@ -18,46 +18,20 @@ | |||
#include "CarlaNative.h" | |||
#include "CarlaMIDI.h" | |||
#include <stdlib.h> | |||
// ----------------------------------------------------------------------- | |||
typedef struct { | |||
const PluginHostDescriptor* host; | |||
MappedValue map_midi; | |||
} MidiThroughHandle; | |||
// ----------------------------------------------------------------------- | |||
static PluginHandle midiThrough_instantiate(const PluginHostDescriptor* host) | |||
{ | |||
MidiThroughHandle* const handle = (MidiThroughHandle*)malloc(sizeof(MidiThroughHandle)); | |||
if (handle == NULL) | |||
return NULL; | |||
handle->host = host; | |||
handle->map_midi = host->map_value(host->handle, EVENT_TYPE_MIDI); | |||
return handle; | |||
} | |||
#define handlePtr ((MidiThroughHandle*)handle) | |||
static void midiThrough_cleanup(PluginHandle handle) | |||
static PluginHandle midiThrough_instantiate(const HostDescriptor* host) | |||
{ | |||
free(handlePtr); | |||
// use HostDescriptor as PluginHandle | |||
return (PluginHandle)host; | |||
} | |||
static void midiThrough_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const Event* events, uint32_t eventCount) | |||
static void midiThrough_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
{ | |||
const PluginHostDescriptor* const host = handlePtr->host; | |||
const MappedValue map_midi = handlePtr->map_midi; | |||
const HostDescriptor* const host = (const HostDescriptor*)handle; | |||
for (uint32_t i=0; i < eventCount; ++i) | |||
{ | |||
if (events[i].type == map_midi) | |||
host->write_event(host->handle, &events[i]); | |||
} | |||
for (uint32_t i=0; i < midiEventCount; ++i) | |||
host->write_midi_event(host->handle, &midiEvents[i]); | |||
return; | |||
@@ -67,50 +41,52 @@ static void midiThrough_process(PluginHandle handle, float** inBuffer, float** o | |||
(void)frames; | |||
} | |||
#undef handlePtr | |||
// ----------------------------------------------------------------------- | |||
static const PluginDescriptor midiThroughDesc = { | |||
.api = CARLA_NATIVE_API_VERSION, | |||
.categories = PLUGIN_CATEGORY_UTILITY ":midi", | |||
.features = "rtsafe", | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.metadata = NULL, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 1, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.author = "falkTX", | |||
.name = "MIDI Through", | |||
.label = "midiThrough", | |||
.copyright = "GNU GPL v2+", | |||
.version = 0x1000, | |||
.category = PLUGIN_CATEGORY_UTILITY, | |||
.hints = PLUGIN_IS_RTSAFE, | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 1, | |||
.paramIns = 0, | |||
.paramOuts = 0, | |||
.name = "MIDI Through", | |||
.label = "midiThrough", | |||
.maker = "falkTX", | |||
.copyright = "GNU GPL v2+", | |||
.instantiate = midiThrough_instantiate, | |||
.cleanup = midiThrough_cleanup, | |||
.cleanup = NULL, | |||
.get_parameter_count = NULL, | |||
.get_parameter_info = NULL, | |||
.get_parameter_value = NULL, | |||
.get_parameter_text = NULL, | |||
.set_parameter_value = NULL, | |||
.get_midi_program_count = NULL, | |||
.get_midi_program_info = NULL, | |||
.set_midi_program = NULL, | |||
.idle = NULL, | |||
.set_parameter_value = NULL, | |||
.set_midi_program = NULL, | |||
.set_custom_data = NULL, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.ui_show = NULL, | |||
.ui_idle = NULL, | |||
.ui_set_parameter_value = NULL, | |||
.ui_set_midi_program = NULL, | |||
.ui_set_custom_data = NULL, | |||
.activate = NULL, | |||
.deactivate = NULL, | |||
.process = midiThrough_process, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.dispatcher = NULL | |||
}; | |||
@@ -23,23 +23,21 @@ | |||
// ----------------------------------------------------------------------- | |||
typedef struct { | |||
const PluginHostDescriptor* host; | |||
MappedValue map_midi; | |||
const HostDescriptor* host; | |||
int octaves; | |||
} MidiTransposeHandle; | |||
// ----------------------------------------------------------------------- | |||
static PluginHandle midiTranspose_instantiate(const PluginHostDescriptor* host) | |||
static PluginHandle midiTranspose_instantiate(const HostDescriptor* host) | |||
{ | |||
MidiTransposeHandle* const handle = (MidiTransposeHandle*)malloc(sizeof(MidiTransposeHandle)); | |||
if (handle == NULL) | |||
return NULL; | |||
handle->host = host; | |||
handle->map_midi = host->map_value(host->handle, EVENT_TYPE_MIDI); | |||
handle->octaves = 0; | |||
handle->host = host; | |||
handle->octaves = 0; | |||
return handle; | |||
} | |||
@@ -65,17 +63,17 @@ const Parameter* midiTranspose_get_parameter_info(PluginHandle handle, uint32_t | |||
static Parameter param; | |||
param.hints = PARAMETER_IS_ENABLED ":" PARAMETER_IS_AUTOMABLE ":" PARAMETER_IS_INTEGER; | |||
param.name = "Octaves"; | |||
param.unit = NULL; | |||
param.ranges.def = 0.0f; | |||
param.ranges.min = -8.0f; | |||
param.ranges.max = 8.0f; | |||
param.hints = PARAMETER_IS_ENABLED|PARAMETER_IS_AUTOMABLE|PARAMETER_IS_INTEGER; | |||
param.ranges.def = 0.0f; | |||
param.ranges.min = -8.0f; | |||
param.ranges.max = 8.0f; | |||
param.ranges.step = 1.0f; | |||
param.ranges.stepSmall = 1.0f; | |||
param.ranges.stepLarge = 1.0f; | |||
param.scalePointCount = 0; | |||
param.scalePoints = NULL; | |||
param.scalePointCount = 0; | |||
param.scalePoints = NULL; | |||
return ¶m; | |||
@@ -99,21 +97,15 @@ static void midiTranspose_set_parameter_value(PluginHandle handle, uint32_t inde | |||
handlePtr->octaves = (int)value; | |||
} | |||
static void midiTranspose_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const Event* events, uint32_t eventCount) | |||
static void midiTranspose_process(PluginHandle handle, float** inBuffer, float** outBuffer, uint32_t frames, const MidiEvent* midiEvents, uint32_t midiEventCount) | |||
{ | |||
const PluginHostDescriptor* const host = handlePtr->host; | |||
const MappedValue map_midi = handlePtr->map_midi; | |||
const HostDescriptor* const host = handlePtr->host; | |||
const int octaves = handlePtr->octaves; | |||
MidiEvent tmpEvent; | |||
tmpEvent.e.type = map_midi; | |||
for (uint32_t i=0; i < eventCount; ++i) | |||
for (uint32_t i=0; i < midiEventCount; ++i) | |||
{ | |||
if (events[i].type != map_midi) | |||
continue; | |||
const MidiEvent* const midiEvent = (const MidiEvent*)&events[i]; | |||
const MidiEvent* const midiEvent = &midiEvents[i]; | |||
const uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent->data); | |||
@@ -125,18 +117,18 @@ static void midiTranspose_process(PluginHandle handle, float** inBuffer, float** | |||
if (newnote < 0 || newnote >= MAX_MIDI_NOTE) | |||
continue; | |||
tmpEvent.e.frame = midiEvent->e.frame; | |||
tmpEvent.port = midiEvent->port; | |||
tmpEvent.time = midiEvent->time; | |||
tmpEvent.data[0] = midiEvent->data[0]; | |||
tmpEvent.data[1] = newnote; | |||
tmpEvent.data[2] = midiEvent->data[2]; | |||
tmpEvent.data[3] = midiEvent->data[3]; | |||
tmpEvent.size = midiEvent->size; | |||
host->write_event(host->handle, (const Event*)&tmpEvent); | |||
host->write_midi_event(host->handle, &tmpEvent); | |||
} | |||
else | |||
host->write_event(host->handle, &events[i]); | |||
host->write_midi_event(host->handle, midiEvent); | |||
} | |||
return; | |||
@@ -152,22 +144,19 @@ static void midiTranspose_process(PluginHandle handle, float** inBuffer, float** | |||
// ----------------------------------------------------------------------- | |||
static const PluginDescriptor midiTransposeDesc = { | |||
.api = CARLA_NATIVE_API_VERSION, | |||
.categories = PLUGIN_CATEGORY_UTILITY ":midi", | |||
.features = "rtsafe", | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.metadata = NULL, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 1, | |||
.paramIns = 1, | |||
.paramOuts = 0, | |||
.author = "falkTX", | |||
.name = "MIDI Transpose", | |||
.label = "midiTranspose", | |||
.copyright = "GNU GPL v2+", | |||
.version = 0x1000, | |||
.category = PLUGIN_CATEGORY_UTILITY, | |||
.hints = PLUGIN_IS_RTSAFE, | |||
.supports = PLUGIN_SUPPORTS_EVERYTHING, | |||
.audioIns = 0, | |||
.audioOuts = 0, | |||
.midiIns = 1, | |||
.midiOuts = 1, | |||
.paramIns = 1, | |||
.paramOuts = 0, | |||
.name = "MIDI Transpose", | |||
.label = "midiTranspose", | |||
.maker = "falkTX", | |||
.copyright = "GNU GPL v2+", | |||
.instantiate = midiTranspose_instantiate, | |||
.cleanup = midiTranspose_cleanup, | |||
@@ -176,21 +165,28 @@ static const PluginDescriptor midiTransposeDesc = { | |||
.get_parameter_info = midiTranspose_get_parameter_info, | |||
.get_parameter_value = midiTranspose_get_parameter_value, | |||
.get_parameter_text = NULL, | |||
.set_parameter_value = midiTranspose_set_parameter_value, | |||
.get_midi_program_count = NULL, | |||
.get_midi_program_info = NULL, | |||
.set_midi_program = NULL, | |||
.idle = NULL, | |||
.set_parameter_value = midiTranspose_set_parameter_value, | |||
.set_midi_program = NULL, | |||
.set_custom_data = NULL, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.ui_show = NULL, | |||
.ui_idle = NULL, | |||
.ui_set_parameter_value = NULL, | |||
.ui_set_midi_program = NULL, | |||
.ui_set_custom_data = NULL, | |||
.activate = NULL, | |||
.deactivate = NULL, | |||
.process = midiTranspose_process, | |||
.get_state = NULL, | |||
.set_state = NULL, | |||
.dispatcher = NULL | |||
}; | |||
@@ -38,8 +38,8 @@ static const PluginDescriptor nekofilterDesc = { | |||
.audioOuts = 1, | |||
.midiIns = 0, | |||
.midiOuts = 0, | |||
.parameterIns = GLOBAL_PARAMETERS_COUNT + BAND_PARAMETERS_COUNT*BANDS_COUNT, | |||
.parameterOuts = 0, | |||
.paramIns = GLOBAL_PARAMETERS_COUNT + BAND_PARAMETERS_COUNT*BANDS_COUNT, | |||
.paramOuts = 0, | |||
.name = "NekoFilter", | |||
.label = "nekofilter", | |||
.maker = "falkTX, Nedko, Fons Adriaensen", | |||
@@ -17,6 +17,8 @@ | |||
#include "CarlaNative.hpp" | |||
#include "juce_core.h" | |||
using namespace juce; | |||
#include "vex/cArp.h" | |||
@@ -813,7 +815,7 @@ private: | |||
static const PluginDescriptor vexArpDesc = { | |||
/* category */ PLUGIN_CATEGORY_UTILITY, | |||
/* hints */ static_cast<PluginHints>(PLUGIN_USES_TIMEPOS), | |||
/* hints */ static_cast<PluginHints>(PLUGIN_USES_TIME), | |||
/* supports */ static_cast<PluginSupports>(PLUGIN_SUPPORTS_EVERYTHING), | |||
/* audioIns */ 0, | |||
/* audioOuts */ 0, | |||
@@ -847,7 +849,7 @@ static const PluginDescriptor vexChorusDesc = { | |||
static const PluginDescriptor vexDelayDesc = { | |||
/* category */ PLUGIN_CATEGORY_DELAY, | |||
/* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_USES_TIMEPOS), | |||
/* hints */ static_cast<PluginHints>(PLUGIN_IS_RTSAFE|PLUGIN_USES_TIME), | |||
/* supports */ static_cast<PluginSupports>(0x0), | |||
/* audioIns */ 2, | |||
/* audioOuts */ 2, | |||
@@ -58,6 +58,8 @@ | |||
#include <set> | |||
#include <string> | |||
#include "juce_core.h" | |||
// Dummy variables and functions for linking purposes | |||
const char* instance_name = nullptr; | |||
class WavFile; | |||
@@ -243,7 +245,7 @@ private: | |||
MidiProgram fRetProgram; | |||
NonRtList<const ProgramInfo*> fPrograms; | |||
CARLA_DECLARE_NON_COPYABLE(ZynAddSubFxPrograms) | |||
CARLA_DECLARE_NON_COPY_CLASS(ZynAddSubFxPrograms) | |||
}; | |||
static ZynAddSubFxPrograms sPrograms; | |||
@@ -347,7 +349,7 @@ public: | |||
private: | |||
int fCount; | |||
CARLA_DECLARE_NON_COPYABLE(ZynAddSubFxInstanceCount) | |||
CARLA_DECLARE_NON_COPY_CLASS(ZynAddSubFxInstanceCount) | |||
}; | |||
static ZynAddSubFxInstanceCount sInstanceCount; | |||
@@ -110,7 +110,7 @@ endif | |||
all: $(TARGETS) | |||
clean: | |||
rm -f *.o | |||
rm -f $(TARGETS) *.o | |||
rm -f carla-native.lv2/*.* | |||
debug: | |||
@@ -134,7 +134,7 @@ void carla_register_native_plugin(const PluginDescriptor* desc) | |||
{ | |||
#ifdef CARLA_NATIVE_PLUGIN_LV2 | |||
// LV2 MIDI Out and Open/Save are not implemented yet | |||
if (desc->midiOuts > 0 || (desc->hints & PLUGIN_NEEDS_OPENSAVE) != 0) | |||
if (desc->midiOuts > 0 || (desc->hints & PLUGIN_NEEDS_UI_OPEN_SAVE) != 0) | |||
return; | |||
#endif | |||
sPluginDescsMgr.descs.append(desc); | |||
@@ -297,13 +297,13 @@ void writePluginFile(const PluginDescriptor* const pluginDesc) | |||
// ------------------------------------------------------------------- | |||
// First MIDI/Time port | |||
if (pluginDesc->midiIns > 0 || (pluginDesc->hints & PLUGIN_USES_TIMEPOS) != 0) | |||
if (pluginDesc->midiIns > 0 || (pluginDesc->hints & PLUGIN_USES_TIME) != 0) | |||
{ | |||
text += " lv2:port [\n"; | |||
text += " a lv2:InputPort, atom:AtomPort ;\n"; | |||
text += " atom:bufferType atom:Sequence ;\n"; | |||
if (pluginDesc->midiIns > 0 && (pluginDesc->hints & PLUGIN_USES_TIMEPOS) != 0) | |||
if (pluginDesc->midiIns > 0 && (pluginDesc->hints & PLUGIN_USES_TIME) != 0) | |||
{ | |||
text += " atom:supports <" LV2_MIDI__MidiEvent "> ,\n"; | |||
text += " <" LV2_TIME__Position "> ;\n"; | |||
@@ -130,7 +130,7 @@ public: | |||
if (fDescriptor->midiIns > 0) | |||
fUI.portOffset += desc->midiIns; | |||
else if (fDescriptor->hints & PLUGIN_USES_TIMEPOS) | |||
else if (fDescriptor->hints & PLUGIN_USES_TIME) | |||
fUI.portOffset += 1; | |||
fUI.portOffset += desc->midiOuts; | |||
@@ -232,7 +232,7 @@ public: | |||
} | |||
} | |||
if (fDescriptor->midiIns > 0 || (fDescriptor->hints & PLUGIN_USES_TIMEPOS) != 0) | |||
if (fDescriptor->midiIns > 0 || (fDescriptor->hints & PLUGIN_USES_TIME) != 0) | |||
{ | |||
fMidiEventCount = 0; | |||
carla_zeroStruct<MidiEvent>(fMidiEvents, kMaxMidiEvents*2); | |||
@@ -883,7 +883,7 @@ private: | |||
for (uint32_t i=0; i < desc->midiIns; ++i) | |||
eventsIn[i] = nullptr; | |||
} | |||
else if (desc->hints & PLUGIN_USES_TIMEPOS) | |||
else if (desc->hints & PLUGIN_USES_TIME) | |||
{ | |||
eventsIn = new LV2_Atom_Sequence*[1]; | |||
eventsIn[0] = nullptr; | |||
@@ -935,7 +935,7 @@ private: | |||
{ | |||
uint32_t index = 0; | |||
if (desc->midiIns > 0 || (desc->hints & PLUGIN_USES_TIMEPOS) != 0) | |||
if (desc->midiIns > 0 || (desc->hints & PLUGIN_USES_TIME) != 0) | |||
{ | |||
if (port == index++) | |||
{ | |||
@@ -43,9 +43,9 @@ | |||
\endcode | |||
*/ | |||
#define CARLA_LEAK_DETECTOR(ClassName) \ | |||
friend class LeakedObjectDetector<ClassName>; \ | |||
friend class ::LeakedObjectDetector<ClassName>; \ | |||
static const char* getLeakedObjectClassName() noexcept { return #ClassName; } \ | |||
LeakedObjectDetector<ClassName> CARLA_JOIN_MACRO(leakDetector, __LINE__); | |||
::LeakedObjectDetector<ClassName> CARLA_JOIN_MACRO(leakDetector, __LINE__); | |||
#define CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(ClassName) \ | |||
CARLA_DECLARE_NON_COPY_CLASS(ClassName) \ | |||
@@ -26,6 +26,9 @@ | |||
#include "CarlaUtils.hpp" | |||
#include "CarlaString.hpp" | |||
#include <cerrno> | |||
#include <clocale> | |||
#include <fcntl.h> | |||
#include <sys/wait.h> | |||