@@ -20,7 +20,6 @@ | |||||
#include "CarlaBackend.h" | #include "CarlaBackend.h" | ||||
#include "CarlaMIDI.h" | #include "CarlaMIDI.h" | ||||
#include "CarlaString.hpp" | |||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
struct CarlaOscData; | struct CarlaOscData; | ||||
@@ -239,10 +238,10 @@ struct EngineOptions { | |||||
unsigned int audioNumPeriods; | unsigned int audioNumPeriods; | ||||
unsigned int audioBufferSize; | unsigned int audioBufferSize; | ||||
unsigned int audioSampleRate; | unsigned int audioSampleRate; | ||||
CarlaString audioDevice; | |||||
const char* audioDevice; | |||||
CarlaString binaryDir; | |||||
CarlaString resourceDir; | |||||
const char* binaryDir; | |||||
const char* resourceDir; | |||||
EngineOptions() | EngineOptions() | ||||
#ifdef CARLA_OS_LINUX | #ifdef CARLA_OS_LINUX | ||||
@@ -260,7 +259,31 @@ struct EngineOptions { | |||||
uiBridgesTimeout(4000), | uiBridgesTimeout(4000), | ||||
audioNumPeriods(2), | audioNumPeriods(2), | ||||
audioBufferSize(512), | audioBufferSize(512), | ||||
audioSampleRate(44100) {} | |||||
audioSampleRate(44100), | |||||
audioDevice(nullptr), | |||||
binaryDir(nullptr), | |||||
resourceDir(nullptr) {} | |||||
~EngineOptions() | |||||
{ | |||||
if (audioDevice != nullptr) | |||||
{ | |||||
delete[] audioDevice; | |||||
audioDevice = nullptr; | |||||
} | |||||
if (binaryDir != nullptr) | |||||
{ | |||||
delete[] binaryDir; | |||||
binaryDir = nullptr; | |||||
} | |||||
if (resourceDir != nullptr) | |||||
{ | |||||
delete[] resourceDir; | |||||
resourceDir = nullptr; | |||||
} | |||||
} | |||||
}; | }; | ||||
/*! | /*! | ||||
@@ -377,7 +400,7 @@ protected: | |||||
const CarlaEngine& fEngine; | const CarlaEngine& fEngine; | ||||
const bool fIsInput; | const bool fIsInput; | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEnginePort) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEnginePort) | |||||
#endif | #endif | ||||
}; | }; | ||||
@@ -425,7 +448,7 @@ public: | |||||
protected: | protected: | ||||
float* fBuffer; | float* fBuffer; | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineAudioPort) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineAudioPort) | |||||
#endif | #endif | ||||
}; | }; | ||||
@@ -481,7 +504,7 @@ public: | |||||
protected: | protected: | ||||
float* fBuffer; | float* fBuffer; | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineCVPort) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineCVPort) | |||||
#endif | #endif | ||||
}; | }; | ||||
@@ -574,7 +597,7 @@ public: | |||||
protected: | protected: | ||||
EngineEvent* fBuffer; | EngineEvent* fBuffer; | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineEventPort) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineEventPort) | |||||
#endif | #endif | ||||
}; | }; | ||||
@@ -647,7 +670,7 @@ protected: | |||||
bool fActive; | bool fActive; | ||||
uint32_t fLatency; | uint32_t fLatency; | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineClient) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineClient) | |||||
#endif | #endif | ||||
}; | }; | ||||
@@ -846,22 +869,20 @@ public: | |||||
// Project management | // Project management | ||||
/*! | /*! | ||||
* Load \a filename of any type.\n | |||||
* Load a file of any type.\n | |||||
* This will try to load a generic file as a plugin, | * This will try to load a generic file as a plugin, | ||||
* either by direct handling (GIG, SF2 and SFZ) or by using an internal plugin (like Audio and MIDI). | * either by direct handling (GIG, SF2 and SFZ) or by using an internal plugin (like Audio and MIDI). | ||||
*/ | */ | ||||
bool loadFilename(const char* const filename); | |||||
bool loadFile(const char* const filename); | |||||
/*! | /*! | ||||
* Load \a filename project file.\n | |||||
* (project files have *.carxp extension) | |||||
* \note Already loaded plugins are not removed; call removeAllPlugins() first if needed. | |||||
* Load a project file. | |||||
* @note Already loaded plugins are not removed; call removeAllPlugins() first if needed. | |||||
*/ | */ | ||||
bool loadProject(const char* const filename); | bool loadProject(const char* const filename); | ||||
/*! | /*! | ||||
* Save current project to \a filename.\n | |||||
* (project files have *.carxp extension) | |||||
* Save current project to a file. | |||||
*/ | */ | ||||
bool saveProject(const char* const filename); | bool saveProject(const char* const filename); | ||||
@@ -871,58 +892,37 @@ public: | |||||
/*! | /*! | ||||
* Get the current engine driver hints. | * Get the current engine driver hints. | ||||
*/ | */ | ||||
unsigned int getHints() const noexcept | |||||
{ | |||||
return fHints; | |||||
} | |||||
unsigned int getHints() const noexcept; | |||||
/*! | /*! | ||||
* Get the current buffer size. | * Get the current buffer size. | ||||
*/ | */ | ||||
uint32_t getBufferSize() const noexcept | |||||
{ | |||||
return fBufferSize; | |||||
} | |||||
uint32_t getBufferSize() const noexcept; | |||||
/*! | /*! | ||||
* Get the current sample rate. | * Get the current sample rate. | ||||
*/ | */ | ||||
double getSampleRate() const noexcept | |||||
{ | |||||
return fSampleRate; | |||||
} | |||||
double getSampleRate() const noexcept; | |||||
/*! | /*! | ||||
* Get the current engine name. | * Get the current engine name. | ||||
*/ | */ | ||||
const char* getName() const noexcept | |||||
{ | |||||
return (const char*)fName; | |||||
} | |||||
const char* getName() const noexcept; | |||||
/*! | /*! | ||||
* Get the current engine proccess mode. | * Get the current engine proccess mode. | ||||
*/ | */ | ||||
EngineProcessMode getProccessMode() const noexcept | |||||
{ | |||||
return fOptions.processMode; | |||||
} | |||||
EngineProcessMode getProccessMode() const noexcept; | |||||
/*! | /*! | ||||
* Get the current engine options (read-only). | * Get the current engine options (read-only). | ||||
*/ | */ | ||||
const EngineOptions& getOptions() const noexcept | |||||
{ | |||||
return fOptions; | |||||
} | |||||
const EngineOptions& getOptions() const noexcept; | |||||
/*! | /*! | ||||
* Get the current Time information (read-only). | * Get the current Time information (read-only). | ||||
*/ | */ | ||||
const EngineTimeInfo& getTimeInfo() const noexcept | |||||
{ | |||||
return fTimeInfo; | |||||
} | |||||
const EngineTimeInfo& getTimeInfo() const noexcept; | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Information (peaks) | // Information (peaks) | ||||
@@ -968,7 +968,7 @@ public: | |||||
/*! | /*! | ||||
* Force the engine to resend all patchbay clients, ports and connections again. | * Force the engine to resend all patchbay clients, ports and connections again. | ||||
*/ | */ | ||||
virtual void patchbayRefresh(); | |||||
virtual bool patchbayRefresh(); | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Transport | // Transport | ||||
@@ -1073,42 +1073,6 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
protected: | protected: | ||||
/*! | |||||
* Current engine driver hints. | |||||
* \see getHints() | |||||
*/ | |||||
unsigned int fHints; | |||||
/*! | |||||
* Current buffer size. | |||||
* \see getBufferSize() | |||||
*/ | |||||
uint32_t fBufferSize; | |||||
/*! | |||||
* Current sample rate. | |||||
* \see getSampleRate() | |||||
*/ | |||||
double fSampleRate; | |||||
/*! | |||||
* Engine name. | |||||
* \see getName() | |||||
*/ | |||||
CarlaString fName; | |||||
/*! | |||||
* Engine options. | |||||
* \see getOptions() and setOption() | |||||
*/ | |||||
EngineOptions fOptions; | |||||
/*! | |||||
* Current time-pos information. | |||||
* \see getTimeInfo() | |||||
*/ | |||||
EngineTimeInfo fTimeInfo; | |||||
/*! | /*! | ||||
* Internal data, for CarlaEngine subclasses only. | * Internal data, for CarlaEngine subclasses only. | ||||
*/ | */ | ||||
@@ -1251,7 +1215,7 @@ public: | |||||
void oscSend_control_exit(); | void oscSend_control_exit(); | ||||
#endif | #endif | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngine) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngine) | |||||
}; | }; | ||||
/**@}*/ | /**@}*/ | ||||
@@ -470,7 +470,7 @@ typedef struct _CarlaTransportInfo { | |||||
CARLA_EXPORT const char* carla_get_complete_license_text(); | CARLA_EXPORT const char* carla_get_complete_license_text(); | ||||
/*! | /*! | ||||
* Get all the supported file types in carla_load_filename().\n | |||||
* Get all the supported file extensions in carla_load_file().\n | |||||
* Returned string uses this syntax: | * Returned string uses this syntax: | ||||
* @code | * @code | ||||
* "*.ext1;*.ext2;*.ext3" | * "*.ext1;*.ext2;*.ext3" | ||||
@@ -529,7 +529,7 @@ CARLA_EXPORT CarlaEngine* carla_get_host_engine(); | |||||
*/ | */ | ||||
CARLA_EXPORT bool carla_engine_init(const char* driverName, const char* clientName); | CARLA_EXPORT bool carla_engine_init(const char* driverName, const char* clientName); | ||||
#ifndef BUILD_BRIDGE | |||||
#ifdef BUILD_BRIDGE | |||||
/*! | /*! | ||||
* Initialize the engine in bridged mode. | * Initialize the engine in bridged mode. | ||||
* @param audioBaseName Shared memory key for audio pool | * @param audioBaseName Shared memory key for audio pool | ||||
@@ -542,7 +542,7 @@ CARLA_EXPORT bool carla_engine_init_bridge(const char audioBaseName[6], const ch | |||||
/*! | /*! | ||||
* Close the engine.\n | * Close the engine.\n | ||||
* This function always closes the engine even if it returns false.\n | * This function always closes the engine even if it returns false.\n | ||||
* In other words, something went wrong when closing the engine but it was still closed nonetheless. | |||||
* In other words, even when something goes wrong when closing the engine it still be closed nonetheless. | |||||
*/ | */ | ||||
CARLA_EXPORT bool carla_engine_close(); | CARLA_EXPORT bool carla_engine_close(); | ||||
@@ -564,42 +564,48 @@ CARLA_EXPORT bool carla_is_engine_running(); | |||||
CARLA_EXPORT void carla_set_engine_about_to_close(); | CARLA_EXPORT void carla_set_engine_about_to_close(); | ||||
/*! | /*! | ||||
* Set the engine callback function to \a func. | |||||
* Use \a ptr to pass a custom pointer to the callback. | |||||
* Set the engine callback function. | |||||
* @param func Callback function | |||||
* @param ptr Callback pointer | |||||
*/ | */ | ||||
CARLA_EXPORT void carla_set_engine_callback(EngineCallbackFunc func, void* ptr); | CARLA_EXPORT void carla_set_engine_callback(EngineCallbackFunc func, void* ptr); | ||||
#ifndef BUILD_BRIDGE | |||||
/*! | /*! | ||||
* Set the engine option \a option.\n | |||||
* With the exception of OPTION_PROCESS_NAME, OPTION_TRANSPORT_MODE and OPTION_PATH_*, | |||||
* this function should not be called when the engine is running. | |||||
* Set an engine option. | |||||
* @param option Option | |||||
* @param value Value as number | |||||
* @param valueStr Value as string | |||||
*/ | */ | ||||
CARLA_EXPORT void carla_set_engine_option(EngineOption option, int value, const char* valueStr); | CARLA_EXPORT void carla_set_engine_option(EngineOption option, int value, const char* valueStr); | ||||
#endif | |||||
/*! | /*! | ||||
* Set the file callback function to \a func. | |||||
* Use \a ptr to pass a custom pointer to the callback. | |||||
* Set the file callback function. | |||||
* @param func Callback function | |||||
* @param ptr Callback pointer | |||||
*/ | */ | ||||
CARLA_EXPORT void carla_set_file_callback(FileCallbackFunc func, void* ptr); | CARLA_EXPORT void carla_set_file_callback(FileCallbackFunc func, void* ptr); | ||||
/*! | /*! | ||||
* Load \a filename of any type.\n | |||||
* Load a file of any type.\n | |||||
* This will try to load a generic file as a plugin, | * This will try to load a generic file as a plugin, | ||||
* either by direct handling (GIG, SF2 and SFZ) or by using an internal plugin (like Audio and MIDI). | |||||
* @see carla_get_supported_file_types() | |||||
* either by direct handling (Csound, GIG, SF2 and SFZ) or by using an internal plugin (like Audio and MIDI). | |||||
* @param Filename Filename | |||||
* @see carla_get_supported_file_extensions() | |||||
*/ | */ | ||||
CARLA_EXPORT bool carla_load_filename(const char* filename); | |||||
CARLA_EXPORT bool carla_load_file(const char* filename); | |||||
/*! | /*! | ||||
* Load \a filename project file.\n | |||||
* (project files have *.carxp extension) | |||||
* \note Already loaded plugins are not removed; call carla_remove_all_plugins() first if needed. | |||||
* Load a Carla project file. | |||||
* @param Filename Filename | |||||
* @note Currently loaded plugins are not removed; call carla_remove_all_plugins() first if needed. | |||||
*/ | */ | ||||
CARLA_EXPORT bool carla_load_project(const char* filename); | CARLA_EXPORT bool carla_load_project(const char* filename); | ||||
/*! | /*! | ||||
* Save current project to \a filename.\n | |||||
* (project files have *.carxp extension) | |||||
* Save current project to a file. | |||||
* @param Filename Filename | |||||
*/ | */ | ||||
CARLA_EXPORT bool carla_save_project(const char* filename); | CARLA_EXPORT bool carla_save_project(const char* filename); | ||||
@@ -19,14 +19,13 @@ | |||||
#define CARLA_PLUGIN_HPP_INCLUDED | #define CARLA_PLUGIN_HPP_INCLUDED | ||||
#include "CarlaBackend.h" | #include "CarlaBackend.h" | ||||
#include "CarlaString.hpp" | |||||
// Avoid including extra libs here | // Avoid including extra libs here | ||||
typedef void* lo_address; | typedef void* lo_address; | ||||
typedef struct _NativePluginDescriptor NativePluginDescriptor; | typedef struct _NativePluginDescriptor NativePluginDescriptor; | ||||
#ifndef LADSPA_RDF_HPP_INCLUDED | |||||
//#ifndef LADSPA_RDF_HPP_INCLUDED | |||||
struct LADSPA_RDF_Descriptor; | struct LADSPA_RDF_Descriptor; | ||||
#endif | |||||
//#endif | |||||
CARLA_BACKEND_START_NAMESPACE | CARLA_BACKEND_START_NAMESPACE | ||||
@@ -109,30 +108,21 @@ public: | |||||
* | * | ||||
* \see setId() | * \see setId() | ||||
*/ | */ | ||||
unsigned int getId() const noexcept | |||||
{ | |||||
return fId; | |||||
} | |||||
unsigned int getId() const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's hints. | * Get the plugin's hints. | ||||
* | * | ||||
* \see PluginHints | * \see PluginHints | ||||
*/ | */ | ||||
unsigned int getHints() const noexcept | |||||
{ | |||||
return fHints; | |||||
} | |||||
unsigned int getHints() const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's options (currently in use). | * Get the plugin's options (currently in use). | ||||
* | * | ||||
* \see PluginOptions, getAvailableOptions() and setOption() | * \see PluginOptions, getAvailableOptions() and setOption() | ||||
*/ | */ | ||||
unsigned int getOptionsEnabled() const noexcept | |||||
{ | |||||
return fOptions; | |||||
} | |||||
unsigned int getOptionsEnabled() const noexcept; | |||||
/*! | /*! | ||||
* Check if the plugin is enabled.\n | * Check if the plugin is enabled.\n | ||||
@@ -140,10 +130,7 @@ public: | |||||
* | * | ||||
* \see setEnabled() | * \see setEnabled() | ||||
*/ | */ | ||||
bool isEnabled() const noexcept | |||||
{ | |||||
return fEnabled; | |||||
} | |||||
bool isEnabled() const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's internal name.\n | * Get the plugin's internal name.\n | ||||
@@ -151,27 +138,18 @@ public: | |||||
* | * | ||||
* \see getRealName() and setName() | * \see getRealName() and setName() | ||||
*/ | */ | ||||
const char* getName() const noexcept | |||||
{ | |||||
return (const char*)fName; | |||||
} | |||||
const char* getName() const noexcept; | |||||
/*! | /*! | ||||
* Get the currently loaded DLL filename for this plugin.\n | * Get the currently loaded DLL filename for this plugin.\n | ||||
* (Sound kits return their exact filename). | * (Sound kits return their exact filename). | ||||
*/ | */ | ||||
const char* getFilename() const noexcept | |||||
{ | |||||
return (const char*)fFilename; | |||||
} | |||||
const char* getFilename() const noexcept; | |||||
/*! | /*! | ||||
* Get the plugins's icon name. | * Get the plugins's icon name. | ||||
*/ | */ | ||||
const char* getIconName() const noexcept | |||||
{ | |||||
return (const char*)fIconName; | |||||
} | |||||
const char* getIconName() const noexcept; | |||||
/*! | /*! | ||||
* Get the plugin's category (delay, filter, synth, etc). | * Get the plugin's category (delay, filter, synth, etc). | ||||
@@ -870,54 +848,6 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
protected: | protected: | ||||
/*! | |||||
* Plugin Id, as passed in the constructor, returned in getId(). | |||||
* \see getId and setId() | |||||
*/ | |||||
unsigned int fId; | |||||
/*! | |||||
* Hints, as returned in getHints(). | |||||
* \see PluginHints and getHints() | |||||
*/ | |||||
unsigned int fHints; | |||||
/*! | |||||
* Defined and currently in-use options, returned in getOptions(). | |||||
* \see PluginOptions, getOptionsAvailable(), getOptionsEnabled(), setOption() | |||||
*/ | |||||
unsigned int fOptions; | |||||
/*! | |||||
* Patchbay client Id that matches this plugin, 0 if unused. | |||||
*/ | |||||
int fPatchbayClientId; | |||||
/*! | |||||
* Wherever the plugin is ready for usage.\n | |||||
* When a plugin is disabled, it will never be processed or managed in any way. | |||||
* \see isEnabled() and setEnabled() | |||||
*/ | |||||
bool fEnabled; | |||||
/*! | |||||
* Plugin name | |||||
* \see getName(), getRealName() and setName() | |||||
*/ | |||||
CarlaString fName; | |||||
/*! | |||||
* Plugin filename, if applicable | |||||
* \see getFilename() | |||||
*/ | |||||
CarlaString fFilename; | |||||
/*! | |||||
* Icon name | |||||
* \see getIconName() | |||||
*/ | |||||
CarlaString fIconName; | |||||
/*! | /*! | ||||
* Internal data, for CarlaPlugin subclasses only. | * Internal data, for CarlaPlugin subclasses only. | ||||
*/ | */ | ||||
@@ -963,7 +893,7 @@ protected: | |||||
CARLA_DECLARE_NON_COPY_CLASS(ScopedSingleProcessLocker) | CARLA_DECLARE_NON_COPY_CLASS(ScopedSingleProcessLocker) | ||||
}; | }; | ||||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPlugin) | |||||
CARLA_DECLARE_NON_COPY_CLASS(CarlaPlugin) | |||||
}; | }; | ||||
/**@}*/ | /**@}*/ | ||||
@@ -338,10 +338,7 @@ CarlaEnginePort* CarlaEngineClient::addPort(const EnginePortType portType, const | |||||
// Carla Engine | // Carla Engine | ||||
CarlaEngine::CarlaEngine() | CarlaEngine::CarlaEngine() | ||||
: fHints(0x0), | |||||
fBufferSize(0), | |||||
fSampleRate(0.0), | |||||
pData(new CarlaEngineProtectedData(this)) | |||||
: pData(new CarlaEngineProtectedData(this)) | |||||
{ | { | ||||
carla_debug("CarlaEngine::CarlaEngine()"); | carla_debug("CarlaEngine::CarlaEngine()"); | ||||
} | } | ||||
@@ -519,7 +516,7 @@ unsigned int CarlaEngine::getMaxPluginNumber() const noexcept | |||||
bool CarlaEngine::init(const char* const clientName) | bool CarlaEngine::init(const char* const clientName) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(fName.isEmpty(), "Invalid engine internal data (err #1)"); | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->name.isEmpty(), "Invalid engine internal data (err #1)"); | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->oscData == nullptr, "Invalid engine internal data (err #2)"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->oscData == nullptr, "Invalid engine internal data (err #2)"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins == nullptr, "Invalid engine internal data (err #3)"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins == nullptr, "Invalid engine internal data (err #3)"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->bufEvents.in == nullptr, "Invalid engine internal data (err #4)"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->bufEvents.in == nullptr, "Invalid engine internal data (err #4)"); | ||||
@@ -532,7 +529,7 @@ bool CarlaEngine::init(const char* const clientName) | |||||
pData->maxPluginNumber = 0; | pData->maxPluginNumber = 0; | ||||
pData->nextPluginId = 0; | pData->nextPluginId = 0; | ||||
switch (fOptions.processMode) | |||||
switch (pData->options.processMode) | |||||
{ | { | ||||
case ENGINE_PROCESS_MODE_SINGLE_CLIENT: | case ENGINE_PROCESS_MODE_SINGLE_CLIENT: | ||||
case ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS: | case ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS: | ||||
@@ -560,10 +557,10 @@ bool CarlaEngine::init(const char* const clientName) | |||||
pData->nextPluginId = pData->maxPluginNumber; | pData->nextPluginId = pData->maxPluginNumber; | ||||
fName = clientName; | |||||
fName.toBasic(); | |||||
pData->name = clientName; | |||||
pData->name.toBasic(); | |||||
fTimeInfo.clear(); | |||||
pData->timeInfo.clear(); | |||||
pData->plugins = new EnginePluginData[pData->maxPluginNumber]; | pData->plugins = new EnginePluginData[pData->maxPluginNumber]; | ||||
@@ -582,7 +579,7 @@ bool CarlaEngine::init(const char* const clientName) | |||||
bool CarlaEngine::close() | bool CarlaEngine::close() | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(fName.isNotEmpty(), "Invalid engine internal data (err #6)"); | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->name.isNotEmpty(), "Invalid engine internal data (err #6)"); | |||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #7)"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->plugins != nullptr, "Invalid engine internal data (err #7)"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextPluginId == pData->maxPluginNumber, "Invalid engine internal data (err #8)"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextPluginId == pData->maxPluginNumber, "Invalid engine internal data (err #8)"); | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #9)"); | CARLA_SAFE_ASSERT_RETURN_ERR(pData->nextAction.opcode == kEnginePostActionNull, "Invalid engine internal data (err #9)"); | ||||
@@ -620,7 +617,7 @@ bool CarlaEngine::close() | |||||
pData->bufEvents.out = nullptr; | pData->bufEvents.out = nullptr; | ||||
} | } | ||||
fName.clear(); | |||||
pData->name.clear(); | |||||
callback(ENGINE_CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr); | callback(ENGINE_CALLBACK_ENGINE_STOPPED, 0, 0, 0, 0.0f, nullptr); | ||||
@@ -701,16 +698,16 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons | |||||
switch (btype) | switch (btype) | ||||
{ | { | ||||
case BINARY_POSIX32: | case BINARY_POSIX32: | ||||
bridgeBinary = fOptions.bridge_posix32.isNotEmpty() ? (const char*)fOptions.bridge_posix32 : nullptr; | |||||
bridgeBinary = pData->options.bridge_posix32.isNotEmpty() ? (const char*)pData->options.bridge_posix32 : nullptr; | |||||
break; | break; | ||||
case BINARY_POSIX64: | case BINARY_POSIX64: | ||||
bridgeBinary = fOptions.bridge_posix64.isNotEmpty() ? (const char*)fOptions.bridge_posix64 : nullptr; | |||||
bridgeBinary = pData->options.bridge_posix64.isNotEmpty() ? (const char*)pData->options.bridge_posix64 : nullptr; | |||||
break; | break; | ||||
case BINARY_WIN32: | case BINARY_WIN32: | ||||
bridgeBinary = fOptions.bridge_win32.isNotEmpty() ? (const char*)fOptions.bridge_win32 : nullptr; | |||||
bridgeBinary = pData->options.bridge_win32.isNotEmpty() ? (const char*)pData->options.bridge_win32 : nullptr; | |||||
break; | break; | ||||
case BINARY_WIN64: | case BINARY_WIN64: | ||||
bridgeBinary = fOptions.bridge_win64.isNotEmpty() ? (const char*)fOptions.bridge_win64 : nullptr; | |||||
bridgeBinary = pData->options.bridge_win64.isNotEmpty() ? (const char*)pData->options.bridge_win64 : nullptr; | |||||
break; | break; | ||||
default: | default: | ||||
bridgeBinary = nullptr; | bridgeBinary = nullptr; | ||||
@@ -718,11 +715,11 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons | |||||
} | } | ||||
# ifndef CARLA_OS_WIN | # ifndef CARLA_OS_WIN | ||||
if (btype == BINARY_NATIVE && fOptions.bridge_native.isNotEmpty()) | |||||
bridgeBinary = (const char*)fOptions.bridge_native; | |||||
if (btype == BINARY_NATIVE && pData->options.bridge_native.isNotEmpty()) | |||||
bridgeBinary = (const char*)pData->options.bridge_native; | |||||
# endif | # endif | ||||
if (btype != BINARY_NATIVE || (fOptions.preferPluginBridges && bridgeBinary != nullptr)) | |||||
if (btype != BINARY_NATIVE || (pData->options.preferPluginBridges && bridgeBinary != nullptr)) | |||||
{ | { | ||||
if (bridgeBinary != nullptr) | if (bridgeBinary != nullptr) | ||||
{ | { | ||||
@@ -845,7 +842,7 @@ bool CarlaEngine::removePlugin(const unsigned int id) | |||||
pData->thread.stop(500); | pData->thread.stop(500); | ||||
const bool lockWait(isRunning() && fOptions.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS); | |||||
const bool lockWait(isRunning() && pData->options.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS); | |||||
const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionRemovePlugin, id, 0, lockWait); | const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionRemovePlugin, id, 0, lockWait); | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
@@ -991,7 +988,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB) | |||||
pData->thread.stop(500); | pData->thread.stop(500); | ||||
const bool lockWait(isRunning() && fOptions.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS); | |||||
const bool lockWait(isRunning() && pData->options.processMode != ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS); | |||||
const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionSwitchPlugins, idA, idB, lockWait); | const CarlaEngineProtectedData::ScopedActionLock sal(pData, kEnginePostActionSwitchPlugins, idA, idB, lockWait); | ||||
#ifndef BUILD_BRIDGE // TODO | #ifndef BUILD_BRIDGE // TODO | ||||
@@ -1108,10 +1105,10 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Project management | // Project management | ||||
bool CarlaEngine::loadFilename(const char* const filename) | |||||
bool CarlaEngine::loadFile(const char* const filename) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #1)"); | CARLA_SAFE_ASSERT_RETURN_ERR(filename != nullptr && filename[0] != '\0', "Invalid filename (err #1)"); | ||||
carla_debug("CarlaEngine::loadFilename(\"%s\")", filename); | |||||
carla_debug("CarlaEngine::loadFile(\"%s\")", filename); | |||||
#ifdef USE_JUCE | #ifdef USE_JUCE | ||||
using namespace juce; | using namespace juce; | ||||
@@ -1373,6 +1370,65 @@ bool CarlaEngine::saveProject(const char* const filename) | |||||
return false; | return false; | ||||
} | } | ||||
// ----------------------------------------------------------------------- | |||||
// Information (base) | |||||
/*! | |||||
* Get the current engine driver hints. | |||||
*/ | |||||
unsigned int CarlaEngine::getHints() const noexcept | |||||
{ | |||||
return pData->hints; | |||||
} | |||||
/*! | |||||
* Get the current buffer size. | |||||
*/ | |||||
uint32_t CarlaEngine::getBufferSize() const noexcept | |||||
{ | |||||
return pData->bufferSize; | |||||
} | |||||
/*! | |||||
* Get the current sample rate. | |||||
*/ | |||||
double CarlaEngine::getSampleRate() const noexcept | |||||
{ | |||||
return pData->sampleRate; | |||||
} | |||||
/*! | |||||
* Get the current engine name. | |||||
*/ | |||||
const char* CarlaEngine::getName() const noexcept | |||||
{ | |||||
return (const char*)pData->name; | |||||
} | |||||
/*! | |||||
* Get the current engine proccess mode. | |||||
*/ | |||||
EngineProcessMode CarlaEngine::getProccessMode() const noexcept | |||||
{ | |||||
return pData->options.processMode; | |||||
} | |||||
/*! | |||||
* Get the current engine options (read-only). | |||||
*/ | |||||
const EngineOptions& CarlaEngine::getOptions() const noexcept | |||||
{ | |||||
return pData->options; | |||||
} | |||||
/*! | |||||
* Get the current Time information (read-only). | |||||
*/ | |||||
const EngineTimeInfo& CarlaEngine::getTimeInfo() const noexcept | |||||
{ | |||||
return pData->timeInfo; | |||||
} | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Information (peaks) | // Information (peaks) | ||||
@@ -1428,9 +1484,10 @@ bool CarlaEngine::patchbayDisconnect(int) | |||||
return false; | return false; | ||||
} | } | ||||
void CarlaEngine::patchbayRefresh() | |||||
bool CarlaEngine::patchbayRefresh() | |||||
{ | { | ||||
// nothing | |||||
setLastError("Unsupported operation"); | |||||
return false; | |||||
} | } | ||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -1492,77 +1549,77 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch | |||||
if (value < ENGINE_PROCESS_MODE_SINGLE_CLIENT || value > ENGINE_PROCESS_MODE_PATCHBAY) | if (value < ENGINE_PROCESS_MODE_SINGLE_CLIENT || value > ENGINE_PROCESS_MODE_PATCHBAY) | ||||
return carla_stderr("CarlaEngine::setOption(ENGINE_OPTION_PROCESS_MODE, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr("CarlaEngine::setOption(ENGINE_OPTION_PROCESS_MODE, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.processMode = static_cast<EngineProcessMode>(value); | |||||
pData->options.processMode = static_cast<EngineProcessMode>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_TRANSPORT_MODE: | case ENGINE_OPTION_TRANSPORT_MODE: | ||||
if (value < ENGINE_TRANSPORT_MODE_INTERNAL || value > ENGINE_TRANSPORT_MODE_JACK) | if (value < ENGINE_TRANSPORT_MODE_INTERNAL || value > ENGINE_TRANSPORT_MODE_JACK) | ||||
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_TRANSPORT_MODE, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.transportMode = static_cast<EngineTransportMode>(value); | |||||
pData->options.transportMode = static_cast<EngineTransportMode>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_FORCE_STEREO: | case ENGINE_OPTION_FORCE_STEREO: | ||||
fOptions.forceStereo = (value != 0); | |||||
pData->options.forceStereo = (value != 0); | |||||
break; | break; | ||||
case ENGINE_OPTION_PREFER_PLUGIN_BRIDGES: | case ENGINE_OPTION_PREFER_PLUGIN_BRIDGES: | ||||
fOptions.preferPluginBridges = (value != 0); | |||||
pData->options.preferPluginBridges = (value != 0); | |||||
break; | break; | ||||
case ENGINE_OPTION_PREFER_UI_BRIDGES: | case ENGINE_OPTION_PREFER_UI_BRIDGES: | ||||
fOptions.preferUiBridges = (value != 0); | |||||
pData->options.preferUiBridges = (value != 0); | |||||
break; | break; | ||||
case ENGINE_OPTION_UIS_ALWAYS_ON_TOP: | case ENGINE_OPTION_UIS_ALWAYS_ON_TOP: | ||||
fOptions.uisAlwaysOnTop = (value != 0); | |||||
pData->options.uisAlwaysOnTop = (value != 0); | |||||
break; | break; | ||||
case ENGINE_OPTION_MAX_PARAMETERS: | case ENGINE_OPTION_MAX_PARAMETERS: | ||||
if (value < 1) | if (value < 1) | ||||
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_MAX_PARAMETERS, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.maxParameters = static_cast<uint>(value); | |||||
pData->options.maxParameters = static_cast<uint>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_UI_BRIDGES_TIMEOUT: | case ENGINE_OPTION_UI_BRIDGES_TIMEOUT: | ||||
if (value < 1) | if (value < 1) | ||||
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_UI_BRIDGES_TIMEOUT, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.uiBridgesTimeout = static_cast<uint>(value); | |||||
pData->options.uiBridgesTimeout = static_cast<uint>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_AUDIO_NUM_PERIODS: | case ENGINE_OPTION_AUDIO_NUM_PERIODS: | ||||
if (value < 2 || value > 3) | if (value < 2 || value > 3) | ||||
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_NUM_PERIODS, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_NUM_PERIODS, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.audioNumPeriods = static_cast<uint>(value); | |||||
pData->options.audioNumPeriods = static_cast<uint>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_AUDIO_BUFFER_SIZE: | case ENGINE_OPTION_AUDIO_BUFFER_SIZE: | ||||
if (value < 8) | if (value < 8) | ||||
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_BUFFER_SIZE, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_BUFFER_SIZE, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.audioBufferSize = static_cast<uint>(value); | |||||
pData->options.audioBufferSize = static_cast<uint>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_AUDIO_SAMPLE_RATE: | case ENGINE_OPTION_AUDIO_SAMPLE_RATE: | ||||
if (value < 22050) | if (value < 22050) | ||||
return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_SAMPLE_RATE, %i, \"%s\") - invalid value", value, valueStr); | return carla_stderr2("carla_set_engine_option(ENGINE_OPTION_AUDIO_SAMPLE_RATE, %i, \"%s\") - invalid value", value, valueStr); | ||||
fOptions.audioSampleRate = static_cast<uint>(value); | |||||
pData->options.audioSampleRate = static_cast<uint>(value); | |||||
break; | break; | ||||
case ENGINE_OPTION_AUDIO_DEVICE: | case ENGINE_OPTION_AUDIO_DEVICE: | ||||
fOptions.audioDevice = valueStr; | |||||
pData->options.audioDevice = valueStr; | |||||
break; | break; | ||||
case ENGINE_OPTION_PATH_BINARIES: | case ENGINE_OPTION_PATH_BINARIES: | ||||
fOptions.binaryDir = valueStr; | |||||
pData->options.binaryDir = valueStr; | |||||
break; | break; | ||||
case ENGINE_OPTION_PATH_RESOURCES: | case ENGINE_OPTION_PATH_RESOURCES: | ||||
fOptions.resourceDir = valueStr; | |||||
pData->options.resourceDir = valueStr; | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -1671,12 +1728,12 @@ void CarlaEngine::runPendingRtEvents() | |||||
pData->doNextPluginAction(true); | pData->doNextPluginAction(true); | ||||
if (pData->time.playing) | if (pData->time.playing) | ||||
pData->time.frame += fBufferSize; | |||||
pData->time.frame += pData->bufferSize; | |||||
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
if (pData->options.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
{ | { | ||||
fTimeInfo.playing = pData->time.playing; | |||||
fTimeInfo.frame = pData->time.frame; | |||||
pData->timeInfo.playing = pData->time.playing; | |||||
pData->timeInfo.frame = pData->time.frame; | |||||
} | } | ||||
} | } | ||||
@@ -151,13 +151,20 @@ struct CarlaEngineProtectedData { | |||||
EngineCallbackFunc callback; | EngineCallbackFunc callback; | ||||
void* callbackPtr; | void* callbackPtr; | ||||
CarlaString lastError; | |||||
unsigned int hints; | |||||
uint32_t bufferSize; | |||||
double sampleRate; | |||||
bool aboutToClose; // don't re-activate thread if true | bool aboutToClose; // don't re-activate thread if true | ||||
unsigned int curPluginCount; // number of plugins loaded (0...max) | unsigned int curPluginCount; // number of plugins loaded (0...max) | ||||
unsigned int maxPluginNumber; // number of plugins allowed (0, 16, 99 or 255) | unsigned int maxPluginNumber; // number of plugins allowed (0, 16, 99 or 255) | ||||
unsigned int nextPluginId; // invalid if == maxPluginNumber | unsigned int nextPluginId; // invalid if == maxPluginNumber | ||||
CarlaString lastError; | |||||
CarlaString name; | |||||
EngineOptions options; | |||||
EngineTimeInfo timeInfo; | |||||
EnginePluginData* plugins; | EnginePluginData* plugins; | ||||
struct InternalEvents { | struct InternalEvents { | ||||
@@ -213,6 +220,9 @@ struct CarlaEngineProtectedData { | |||||
oscData(nullptr), | oscData(nullptr), | ||||
callback(nullptr), | callback(nullptr), | ||||
callbackPtr(nullptr), | callbackPtr(nullptr), | ||||
hints(0x0), | |||||
bufferSize(0), | |||||
sampleRate(0.0), | |||||
aboutToClose(false), | aboutToClose(false), | ||||
curPluginCount(0), | curPluginCount(0), | ||||
maxPluginNumber(0), | maxPluginNumber(0), | ||||
@@ -579,13 +579,13 @@ public: | |||||
carla_debug("CarlaEngineJack::CarlaEngineJack()"); | carla_debug("CarlaEngineJack::CarlaEngineJack()"); | ||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
fOptions.processMode = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS; | |||||
pData->options.processMode = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS; | |||||
#else | #else | ||||
carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr); | carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr); | ||||
#endif | #endif | ||||
// FIXME: Always enable JACK transport for now | // FIXME: Always enable JACK transport for now | ||||
fOptions.transportMode = ENGINE_TRANSPORT_MODE_JACK; | |||||
pData->options.transportMode = ENGINE_TRANSPORT_MODE_JACK; | |||||
carla_zeroStruct<jack_position_t>(fTransportPos); | carla_zeroStruct<jack_position_t>(fTransportPos); | ||||
} | } | ||||
@@ -608,7 +608,7 @@ public: | |||||
unsigned int getMaxClientNameSize() const noexcept override | unsigned int getMaxClientNameSize() const noexcept override | ||||
{ | { | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
{ | { | ||||
unsigned int ret = 0; | unsigned int ret = 0; | ||||
@@ -625,7 +625,7 @@ public: | |||||
unsigned int getMaxPortNameSize() const noexcept override | unsigned int getMaxPortNameSize() const noexcept override | ||||
{ | { | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT || pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
{ | { | ||||
unsigned int ret = 0; | unsigned int ret = 0; | ||||
@@ -666,8 +666,8 @@ public: | |||||
if (fClient != nullptr) | if (fClient != nullptr) | ||||
{ | { | ||||
fBufferSize = jackbridge_get_buffer_size(fClient); | |||||
fSampleRate = jackbridge_get_sample_rate(fClient); | |||||
pData->bufferSize = jackbridge_get_buffer_size(fClient); | |||||
pData->sampleRate = jackbridge_get_sample_rate(fClient); | |||||
jackbridge_custom_publish_data(fClient, URI_CANVAS_ICON, "carla", 6); | jackbridge_custom_publish_data(fClient, URI_CANVAS_ICON, "carla", 6); | ||||
jackbridge_custom_set_data_appearance_callback(fClient, carla_jack_custom_appearance_callback, this); | jackbridge_custom_set_data_appearance_callback(fClient, carla_jack_custom_appearance_callback, this); | ||||
@@ -688,7 +688,7 @@ public: | |||||
jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this); | jackbridge_set_port_connect_callback(fClient, carla_jack_port_connect_callback, this); | ||||
jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this); | jackbridge_set_port_rename_callback(fClient, carla_jack_port_rename_callback, this); | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
{ | { | ||||
fRackPorts[kRackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | fRackPorts[kRackPortAudioIn1] = jackbridge_port_register(fClient, "audio-in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | ||||
fRackPorts[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | fRackPorts[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | ||||
@@ -715,13 +715,13 @@ public: | |||||
return false; | return false; | ||||
#else | #else | ||||
if (fBufferSize == 0 || fSampleRate == 0.0) | |||||
if (pData->bufferSize == 0 || pData->sampleRate == 0.0) | |||||
{ | { | ||||
// open temp client to get initial buffer-size and sample-rate values | // open temp client to get initial buffer-size and sample-rate values | ||||
if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr)) | if (jack_client_t* tmpClient = jackbridge_client_open(clientName, JackNullOption, nullptr)) | ||||
{ | { | ||||
fBufferSize = jackbridge_get_buffer_size(tmpClient); | |||||
fSampleRate = jackbridge_get_sample_rate(tmpClient); | |||||
pData->bufferSize = jackbridge_get_buffer_size(tmpClient); | |||||
pData->sampleRate = jackbridge_get_sample_rate(tmpClient); | |||||
jackbridge_client_close(tmpClient); | jackbridge_client_close(tmpClient); | ||||
} | } | ||||
@@ -743,7 +743,7 @@ public: | |||||
#else | #else | ||||
if (jackbridge_deactivate(fClient)) | if (jackbridge_deactivate(fClient)) | ||||
{ | { | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
{ | { | ||||
jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn1]); | jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn1]); | ||||
jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn2]); | jackbridge_port_unregister(fClient, fRackPorts[kRackPortAudioIn2]); | ||||
@@ -856,8 +856,8 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(client != nullptr, nullptr); | CARLA_SAFE_ASSERT_RETURN(client != nullptr, nullptr); | ||||
fBufferSize = jackbridge_get_buffer_size(client); | |||||
fSampleRate = jackbridge_get_sample_rate(client); | |||||
pData->bufferSize = jackbridge_get_buffer_size(client); | |||||
pData->sampleRate = jackbridge_get_sample_rate(client); | |||||
jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1); | jackbridge_custom_publish_data(client, URI_CANVAS_ICON, iconName, std::strlen(iconName)+1); | ||||
@@ -868,11 +868,11 @@ public: | |||||
jackbridge_set_process_callback(client, carla_jack_process_callback, this); | jackbridge_set_process_callback(client, carla_jack_process_callback, this); | ||||
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); | jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); | ||||
#else | #else | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||||
{ | { | ||||
client = fClient; | client = fClient; | ||||
} | } | ||||
else if (fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
else if (pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
{ | { | ||||
client = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr); | client = jackbridge_client_open(plugin->getName(), JackNullOption, nullptr); | ||||
@@ -912,13 +912,13 @@ public: | |||||
CARLA_ASSERT(plugin->getId() == id); | CARLA_ASSERT(plugin->getId() == id); | ||||
bool needsReinit = (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT); | |||||
bool needsReinit = (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT); | |||||
const char* name = getUniquePluginName(newName); | const char* name = getUniquePluginName(newName); | ||||
// TODO - use rename port if single-client | // TODO - use rename port if single-client | ||||
// JACK client rename | // JACK client rename | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS) | |||||
{ | { | ||||
CarlaEngineJackClient* const client((CarlaEngineJackClient*)plugin->getEngineClient()); | CarlaEngineJackClient* const client((CarlaEngineJackClient*)plugin->getEngineClient()); | ||||
@@ -1039,9 +1039,9 @@ public: | |||||
return false; | return false; | ||||
} | } | ||||
void patchbayRefresh() override | |||||
bool patchbayRefresh() override | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr,); | |||||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, false); | |||||
fLastGroupId = 0; | fLastGroupId = 0; | ||||
fLastPortId = 0; | fLastPortId = 0; | ||||
@@ -1053,6 +1053,8 @@ public: | |||||
fGroupIconsChanged.clear(); | fGroupIconsChanged.clear(); | ||||
initJackPatchbay(jackbridge_get_client_name(fClient)); | initJackPatchbay(jackbridge_get_client_name(fClient)); | ||||
return true; | |||||
} | } | ||||
#endif | #endif | ||||
@@ -1061,7 +1063,7 @@ public: | |||||
void transportPlay() override | void transportPlay() override | ||||
{ | { | ||||
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
if (pData->options.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
CarlaEngine::transportPlay(); | CarlaEngine::transportPlay(); | ||||
else if (fClient != nullptr) | else if (fClient != nullptr) | ||||
jackbridge_transport_start(fClient); | jackbridge_transport_start(fClient); | ||||
@@ -1069,7 +1071,7 @@ public: | |||||
void transportPause() override | void transportPause() override | ||||
{ | { | ||||
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
if (pData->options.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
CarlaEngine::transportPause(); | CarlaEngine::transportPause(); | ||||
else if (fClient != nullptr) | else if (fClient != nullptr) | ||||
jackbridge_transport_stop(fClient); | jackbridge_transport_stop(fClient); | ||||
@@ -1077,7 +1079,7 @@ public: | |||||
void transportRelocate(const uint32_t frame) override | void transportRelocate(const uint32_t frame) override | ||||
{ | { | ||||
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
if (pData->options.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||||
CarlaEngine::transportRelocate(frame); | CarlaEngine::transportRelocate(frame); | ||||
else if (fClient != nullptr) | else if (fClient != nullptr) | ||||
jackbridge_transport_locate(fClient, frame); | jackbridge_transport_locate(fClient, frame); | ||||
@@ -1088,19 +1090,19 @@ public: | |||||
protected: | protected: | ||||
void handleJackBufferSizeCallback(const uint32_t newBufferSize) | void handleJackBufferSizeCallback(const uint32_t newBufferSize) | ||||
{ | { | ||||
if (fBufferSize == newBufferSize) | |||||
if (pData->bufferSize == newBufferSize) | |||||
return; | return; | ||||
fBufferSize = newBufferSize; | |||||
pData->bufferSize = newBufferSize; | |||||
bufferSizeChanged(newBufferSize); | bufferSizeChanged(newBufferSize); | ||||
} | } | ||||
void handleJackSampleRateCallback(const double newSampleRate) | void handleJackSampleRateCallback(const double newSampleRate) | ||||
{ | { | ||||
if (fSampleRate == newSampleRate) | |||||
if (pData->sampleRate == newSampleRate) | |||||
return; | return; | ||||
fSampleRate = newSampleRate; | |||||
pData->sampleRate = newSampleRate; | |||||
sampleRateChanged(newSampleRate); | sampleRateChanged(newSampleRate); | ||||
} | } | ||||
@@ -1115,39 +1117,39 @@ protected: | |||||
void saveTransportInfo() | void saveTransportInfo() | ||||
{ | { | ||||
if (fOptions.transportMode != ENGINE_TRANSPORT_MODE_JACK) | |||||
if (pData->options.transportMode != ENGINE_TRANSPORT_MODE_JACK) | |||||
return; | return; | ||||
fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate | fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate | ||||
fTransportState = jackbridge_transport_query(fClient, &fTransportPos); | fTransportState = jackbridge_transport_query(fClient, &fTransportPos); | ||||
fTimeInfo.playing = (fTransportState == JackTransportRolling); | |||||
pData->timeInfo.playing = (fTransportState == JackTransportRolling); | |||||
if (fTransportPos.unique_1 == fTransportPos.unique_2) | if (fTransportPos.unique_1 == fTransportPos.unique_2) | ||||
{ | { | ||||
fTimeInfo.frame = fTransportPos.frame; | |||||
fTimeInfo.usecs = fTransportPos.usecs; | |||||
pData->timeInfo.frame = fTransportPos.frame; | |||||
pData->timeInfo.usecs = fTransportPos.usecs; | |||||
if (fTransportPos.valid & JackPositionBBT) | if (fTransportPos.valid & JackPositionBBT) | ||||
{ | { | ||||
fTimeInfo.valid = EngineTimeInfo::ValidBBT; | |||||
fTimeInfo.bbt.bar = fTransportPos.bar; | |||||
fTimeInfo.bbt.beat = fTransportPos.beat; | |||||
fTimeInfo.bbt.tick = fTransportPos.tick; | |||||
fTimeInfo.bbt.barStartTick = fTransportPos.bar_start_tick; | |||||
fTimeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar; | |||||
fTimeInfo.bbt.beatType = fTransportPos.beat_type; | |||||
fTimeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat; | |||||
fTimeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute; | |||||
pData->timeInfo.valid = EngineTimeInfo::ValidBBT; | |||||
pData->timeInfo.bbt.bar = fTransportPos.bar; | |||||
pData->timeInfo.bbt.beat = fTransportPos.beat; | |||||
pData->timeInfo.bbt.tick = fTransportPos.tick; | |||||
pData->timeInfo.bbt.barStartTick = fTransportPos.bar_start_tick; | |||||
pData->timeInfo.bbt.beatsPerBar = fTransportPos.beats_per_bar; | |||||
pData->timeInfo.bbt.beatType = fTransportPos.beat_type; | |||||
pData->timeInfo.bbt.ticksPerBeat = fTransportPos.ticks_per_beat; | |||||
pData->timeInfo.bbt.beatsPerMinute = fTransportPos.beats_per_minute; | |||||
} | } | ||||
else | else | ||||
fTimeInfo.valid = 0x0; | |||||
pData->timeInfo.valid = 0x0; | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
fTimeInfo.frame = 0; | |||||
fTimeInfo.valid = 0x0; | |||||
pData->timeInfo.frame = 0; | |||||
pData->timeInfo.valid = 0x0; | |||||
} | } | ||||
} | } | ||||
@@ -1159,7 +1161,7 @@ protected: | |||||
{ | { | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
// pass-through | // pass-through | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
{ | { | ||||
float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes); | float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes); | ||||
float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes); | float* const audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes); | ||||
@@ -1193,7 +1195,7 @@ protected: | |||||
return runPendingRtEvents(); | return runPendingRtEvents(); | ||||
#else | #else | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||||
{ | { | ||||
for (unsigned int i=0; i < pData->curPluginCount; ++i) | for (unsigned int i=0; i < pData->curPluginCount; ++i) | ||||
{ | { | ||||
@@ -1210,7 +1212,7 @@ protected: | |||||
return runPendingRtEvents(); | return runPendingRtEvents(); | ||||
} | } | ||||
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||||
{ | { | ||||
// get buffers from jack | // get buffers from jack | ||||
float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes); | float* const audioIn1 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn1], nframes); | ||||
@@ -1411,7 +1413,7 @@ protected: | |||||
void handleJackLatencyCallback(const jack_latency_callback_mode_t mode) | void handleJackLatencyCallback(const jack_latency_callback_mode_t mode) | ||||
{ | { | ||||
if (fOptions.processMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||||
if (pData->options.processMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||||
return; | return; | ||||
for (unsigned int i=0; i < pData->curPluginCount; ++i) | for (unsigned int i=0; i < pData->curPluginCount; ++i) | ||||
@@ -114,9 +114,9 @@ public: | |||||
#endif | #endif | ||||
// just to make sure | // just to make sure | ||||
fOptions.forceStereo = true; | |||||
fOptions.processMode = ENGINE_PROCESS_MODE_CONTINUOUS_RACK; | |||||
fOptions.transportMode = ENGINE_TRANSPORT_MODE_INTERNAL; | |||||
pData->options.forceStereo = true; | |||||
pData->options.processMode = ENGINE_PROCESS_MODE_CONTINUOUS_RACK; | |||||
pData->options.transportMode = ENGINE_TRANSPORT_MODE_INTERNAL; | |||||
} | } | ||||
~CarlaEngineRtAudio() override | ~CarlaEngineRtAudio() override | ||||
@@ -162,13 +162,13 @@ public: | |||||
return false; | return false; | ||||
} | } | ||||
if (fOptions.audioDevice.isNotEmpty()) | |||||
if (pData->options.audioDevice != nullptr) | |||||
{ | { | ||||
for (unsigned int i=0; i < devCount; ++i) | for (unsigned int i=0; i < devCount; ++i) | ||||
{ | { | ||||
RtAudio::DeviceInfo devInfo(fAudio.getDeviceInfo(i)); | RtAudio::DeviceInfo devInfo(fAudio.getDeviceInfo(i)); | ||||
if (devInfo.probed && devInfo.outputChannels > 0 && devInfo.name == (const char*)fOptions.audioDevice) | |||||
if (devInfo.probed && devInfo.outputChannels > 0 && devInfo.name == (const char*)pData->options.audioDevice) | |||||
{ | { | ||||
deviceSet = true; | deviceSet = true; | ||||
fConnectName = devInfo.name.c_str(); | fConnectName = devInfo.name.c_str(); | ||||
@@ -205,10 +205,10 @@ public: | |||||
else | else | ||||
fAudioIsInterleaved = true; | fAudioIsInterleaved = true; | ||||
fBufferSize = fOptions.audioBufferSize; | |||||
pData->bufferSize = pData->options.audioBufferSize; | |||||
try { | try { | ||||
fAudio.openStream(&oParams, &iParams, RTAUDIO_FLOAT32, fOptions.audioSampleRate, &fBufferSize, carla_rtaudio_process_callback, this, &rtOptions); | |||||
fAudio.openStream(&oParams, &iParams, RTAUDIO_FLOAT32, pData->options.audioSampleRate, &pData->bufferSize, carla_rtaudio_process_callback, this, &rtOptions); | |||||
} | } | ||||
catch (RtError& e) | catch (RtError& e) | ||||
{ | { | ||||
@@ -228,7 +228,7 @@ public: | |||||
fAudioCountIn = iParams.nChannels; | fAudioCountIn = iParams.nChannels; | ||||
fAudioCountOut = oParams.nChannels; | fAudioCountOut = oParams.nChannels; | ||||
fSampleRate = fAudio.getStreamSampleRate(); | |||||
pData->sampleRate = fAudio.getStreamSampleRate(); | |||||
CARLA_ASSERT(fAudioCountOut > 0); | CARLA_ASSERT(fAudioCountOut > 0); | ||||
@@ -237,7 +237,7 @@ public: | |||||
fAudioBufIn = new float*[fAudioCountIn]; | fAudioBufIn = new float*[fAudioCountIn]; | ||||
for (uint i=0; i < fAudioCountIn; ++i) | for (uint i=0; i < fAudioCountIn; ++i) | ||||
fAudioBufIn[i] = new float[fBufferSize]; | |||||
fAudioBufIn[i] = new float[pData->bufferSize]; | |||||
} | } | ||||
if (fAudioCountOut > 0) | if (fAudioCountOut > 0) | ||||
@@ -245,13 +245,13 @@ public: | |||||
fAudioBufOut = new float*[fAudioCountOut]; | fAudioBufOut = new float*[fAudioCountOut]; | ||||
for (uint i=0; i < fAudioCountOut; ++i) | for (uint i=0; i < fAudioCountOut; ++i) | ||||
fAudioBufOut[i] = new float[fBufferSize]; | |||||
fAudioBufOut[i] = new float[pData->bufferSize]; | |||||
} | } | ||||
fAudioBufRackIn[0] = new float[fBufferSize]; | |||||
fAudioBufRackIn[1] = new float[fBufferSize]; | |||||
fAudioBufRackOut[0] = new float[fBufferSize]; | |||||
fAudioBufRackOut[1] = new float[fBufferSize]; | |||||
fAudioBufRackIn[0] = new float[pData->bufferSize]; | |||||
fAudioBufRackIn[1] = new float[pData->bufferSize]; | |||||
fAudioBufRackOut[0] = new float[pData->bufferSize]; | |||||
fAudioBufRackOut[1] = new float[pData->bufferSize]; | |||||
fAudioIsReady = true; | fAudioIsReady = true; | ||||
@@ -639,12 +639,9 @@ public: | |||||
return true; | return true; | ||||
} | } | ||||
void patchbayRefresh() override | |||||
bool patchbayRefresh() override | |||||
{ | { | ||||
CARLA_ASSERT(fAudioIsReady); | |||||
if (! fAudioIsReady) | |||||
return; | |||||
CARLA_SAFE_ASSERT_RETURN(fAudioIsReady, false); | |||||
char strBuf[STR_MAX+1]; | char strBuf[STR_MAX+1]; | ||||
@@ -840,7 +837,7 @@ protected: | |||||
// assert buffers | // assert buffers | ||||
CARLA_ASSERT(nframes != 0); | CARLA_ASSERT(nframes != 0); | ||||
CARLA_ASSERT_INT2(nframes == fBufferSize, nframes, fBufferSize); | |||||
CARLA_ASSERT_INT2(nframes == pData->bufferSize, nframes, pData->bufferSize); | |||||
CARLA_ASSERT(outsPtr != nullptr); | CARLA_ASSERT(outsPtr != nullptr); | ||||
if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady) | if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady) | ||||
@@ -905,17 +902,17 @@ protected: | |||||
engineEvent.channel = midiChannel; | engineEvent.channel = midiChannel; | ||||
if (midiEvent.time < fTimeInfo.frame) | |||||
if (midiEvent.time < pData->timeInfo.frame) | |||||
{ | { | ||||
engineEvent.time = 0; | engineEvent.time = 0; | ||||
} | } | ||||
else if (midiEvent.time >= fTimeInfo.frame + nframes) | |||||
else if (midiEvent.time >= pData->timeInfo.frame + nframes) | |||||
{ | { | ||||
engineEvent.time = fTimeInfo.frame + nframes-1; | |||||
carla_stderr("MIDI Event in the future!, %i vs %i", engineEvent.time, fTimeInfo.frame); | |||||
engineEvent.time = pData->timeInfo.frame + nframes-1; | |||||
carla_stderr("MIDI Event in the future!, %i vs %i", engineEvent.time, pData->timeInfo.frame); | |||||
} | } | ||||
else | else | ||||
engineEvent.time = midiEvent.time - fTimeInfo.frame; | |||||
engineEvent.time = midiEvent.time - pData->timeInfo.frame; | |||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus)) | if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus)) | ||||
{ | { | ||||
@@ -1143,7 +1140,7 @@ protected: | |||||
timeStamp = 0.0; | timeStamp = 0.0; | ||||
RtMidiEvent midiEvent; | RtMidiEvent midiEvent; | ||||
midiEvent.time = fTimeInfo.frame + (timeStamp*(double)fBufferSize); | |||||
midiEvent.time = pData->timeInfo.frame + (timeStamp*(double)pData->bufferSize); | |||||
if (midiEvent.time < lastTime) | if (midiEvent.time < lastTime) | ||||
midiEvent.time = lastTime; | midiEvent.time = lastTime; | ||||
@@ -258,7 +258,7 @@ public: | |||||
pData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_BRIDGE); | pData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_BRIDGE); | ||||
fHints |= PLUGIN_IS_BRIDGE; | |||||
pData->hints |= PLUGIN_IS_BRIDGE; | |||||
} | } | ||||
~BridgePlugin() override | ~BridgePlugin() override | ||||
@@ -348,7 +348,7 @@ public: | |||||
int32_t getChunkData(void** const dataPtr) const override | int32_t getChunkData(void** const dataPtr) const override | ||||
{ | { | ||||
CARLA_ASSERT(fOptions & PLUGIN_OPTION_USE_CHUNKS); | |||||
CARLA_ASSERT(pData->options & PLUGIN_OPTION_USE_CHUNKS); | |||||
CARLA_ASSERT(dataPtr != nullptr); | CARLA_ASSERT(dataPtr != nullptr); | ||||
#if 0 | #if 0 | ||||
@@ -637,7 +637,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -661,7 +661,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -684,7 +684,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -700,7 +700,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -842,21 +842,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -914,7 +914,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent); | fShmControl.writeOpcode(kPluginBridgeOpcodeMidiEvent); | ||||
fShmControl.writeLong(event.time); | fShmControl.writeLong(event.time); | ||||
@@ -928,12 +928,12 @@ public: | |||||
} | } | ||||
case kEngineControlEventTypeMidiBank: | case kEngineControlEventTypeMidiBank: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
nextBankId = ctrlEvent.param; | nextBankId = ctrlEvent.param; | ||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
const uint32_t nextProgramId(ctrlEvent.param); | const uint32_t nextProgramId(ctrlEvent.param); | ||||
@@ -956,14 +956,14 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
// TODO | // TODO | ||||
} | } | ||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -986,13 +986,13 @@ public: | |||||
uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | ||||
uint8_t channel = event.channel; | uint8_t channel = event.channel; | ||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
continue; | continue; | ||||
// Fix bad note-off | // Fix bad note-off | ||||
@@ -1106,9 +1106,9 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) != 0 && pData->postProc.volume != 1.0f; | |||||
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doVolume = (pData->hints & PLUGIN_CAN_VOLUME) != 0 && pData->postProc.volume != 1.0f; | |||||
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
bool isPair; | bool isPair; | ||||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | float bufValue, oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -1350,7 +1350,7 @@ public: | |||||
CARLA_ASSERT(maker != nullptr); | CARLA_ASSERT(maker != nullptr); | ||||
CARLA_ASSERT(copyright != nullptr); | CARLA_ASSERT(copyright != nullptr); | ||||
fHints = hints | PLUGIN_IS_BRIDGE; | |||||
pData->hints = hints | PLUGIN_IS_BRIDGE; | |||||
fInfo.category = static_cast<PluginCategory>(category); | fInfo.category = static_cast<PluginCategory>(category); | ||||
fInfo.uniqueId = uniqueId; | fInfo.uniqueId = uniqueId; | ||||
@@ -1360,8 +1360,8 @@ public: | |||||
fInfo.maker = maker; | fInfo.maker = maker; | ||||
fInfo.copyright = copyright; | fInfo.copyright = copyright; | ||||
if (fName.isEmpty()) | |||||
fName = name; | |||||
if (pData->name.isEmpty()) | |||||
pData->name = name; | |||||
break; | break; | ||||
} | } | ||||
@@ -1507,7 +1507,7 @@ public: | |||||
break; | break; | ||||
if (std::strcmp(key, CARLA_BRIDGE_MSG_HIDE_GUI) == 0) | if (std::strcmp(key, CARLA_BRIDGE_MSG_HIDE_GUI) == 0) | ||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0.0f, nullptr); | |||||
else if (std::strcmp(key, CARLA_BRIDGE_MSG_SAVED) == 0) | else if (std::strcmp(key, CARLA_BRIDGE_MSG_SAVED) == 0) | ||||
fSaved = true; | fSaved = true; | ||||
@@ -1698,9 +1698,9 @@ public: | |||||
// set info | // set info | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
fFilename = filename; | |||||
pData->filename = filename; | |||||
fBridgeBinary = bridgeBinary; | fBridgeBinary = bridgeBinary; | ||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
@@ -1786,8 +1786,8 @@ public: | |||||
fShmControl.commitWrite(); | fShmControl.commitWrite(); | ||||
// register plugin now so we can receive OSC (and wait for it) | // register plugin now so we can receive OSC (and wait for it) | ||||
fHints |= PLUGIN_IS_BRIDGE; | |||||
pData->engine->registerEnginePlugin(fId, this); | |||||
pData->hints |= PLUGIN_IS_BRIDGE; | |||||
pData->engine->registerEnginePlugin(pData->id, this); | |||||
// init OSC | // init OSC | ||||
{ | { | ||||
@@ -1809,7 +1809,7 @@ public: | |||||
if (fInitError || ! fInitiated) | if (fInitError || ! fInitiated) | ||||
{ | { | ||||
// unregister so it gets handled properly | // unregister so it gets handled properly | ||||
pData->engine->registerEnginePlugin(fId, nullptr); | |||||
pData->engine->registerEnginePlugin(pData->id, nullptr); | |||||
pData->osc.thread.stop(6000); | pData->osc.thread.stop(6000); | ||||
@@ -1822,14 +1822,14 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
if (fName.isEmpty()) | |||||
if (pData->name.isEmpty()) | |||||
{ | { | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else if (label != nullptr) | else if (label != nullptr) | ||||
fName = pData->engine->getUniquePluginName(label); | |||||
pData->name = pData->engine->getUniquePluginName(label); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName("unknown"); | |||||
pData->name = pData->engine->getUniquePluginName("unknown"); | |||||
} | } | ||||
pData->client = pData->engine->addClient(this); | pData->client = pData->engine->addClient(this); | ||||
@@ -222,13 +222,7 @@ unsigned int CarlaPluginProtectedData::loadSettings(const unsigned int options, | |||||
// Constructor and destructor | // Constructor and destructor | ||||
CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id) | CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id) | ||||
: fId(id), | |||||
fHints(0x0), | |||||
fOptions(0x0), | |||||
fPatchbayClientId(0), | |||||
fEnabled(false), | |||||
fIconName("plugin"), | |||||
pData(new CarlaPluginProtectedData(engine, this)) | |||||
: pData(new CarlaPluginProtectedData(engine, this)) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(engine != nullptr,); | CARLA_SAFE_ASSERT_RETURN(engine != nullptr,); | ||||
CARLA_ASSERT(id < engine->getMaxPluginNumber()); | CARLA_ASSERT(id < engine->getMaxPluginNumber()); | ||||
@@ -267,6 +261,41 @@ CarlaPlugin::~CarlaPlugin() | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Information (base) | // Information (base) | ||||
unsigned int CarlaPlugin::getId() const noexcept | |||||
{ | |||||
return pData->id; | |||||
} | |||||
unsigned int CarlaPlugin::getHints() const noexcept | |||||
{ | |||||
return pData->hints; | |||||
} | |||||
unsigned int CarlaPlugin::getOptionsEnabled() const noexcept | |||||
{ | |||||
return pData->options; | |||||
} | |||||
bool CarlaPlugin::isEnabled() const noexcept | |||||
{ | |||||
return pData->enabled; | |||||
} | |||||
const char* CarlaPlugin::getName() const noexcept | |||||
{ | |||||
return (const char*)pData->name; | |||||
} | |||||
const char* CarlaPlugin::getFilename() const noexcept | |||||
{ | |||||
return (const char*)pData->filename; | |||||
} | |||||
const char* CarlaPlugin::getIconName() const noexcept | |||||
{ | |||||
return (const char*)pData->iconName; | |||||
} | |||||
uint32_t CarlaPlugin::getLatencyInFrames() const noexcept | uint32_t CarlaPlugin::getLatencyInFrames() const noexcept | ||||
{ | { | ||||
return pData->latency; | return pData->latency; | ||||
@@ -497,9 +526,9 @@ const SaveState& CarlaPlugin::getSaveState() | |||||
getLabel(strBuf); | getLabel(strBuf); | ||||
pData->saveState.type = carla_strdup(getPluginTypeAsString(getType())); | pData->saveState.type = carla_strdup(getPluginTypeAsString(getType())); | ||||
pData->saveState.name = carla_strdup(fName); | |||||
pData->saveState.name = carla_strdup(pData->name); | |||||
pData->saveState.label = carla_strdup(strBuf); | pData->saveState.label = carla_strdup(strBuf); | ||||
pData->saveState.binary = carla_strdup(fFilename); | |||||
pData->saveState.binary = carla_strdup(pData->filename); | |||||
pData->saveState.uniqueID = getUniqueId(); | pData->saveState.uniqueID = getUniqueId(); | ||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
@@ -520,7 +549,7 @@ const SaveState& CarlaPlugin::getSaveState() | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// Chunk | // Chunk | ||||
if (fOptions & PLUGIN_OPTION_USE_CHUNKS) | |||||
if (pData->options & PLUGIN_OPTION_USE_CHUNKS) | |||||
{ | { | ||||
void* data = nullptr; | void* data = nullptr; | ||||
const int32_t dataSize(getChunkData(&data)); | const int32_t dataSize(getChunkData(&data)); | ||||
@@ -798,7 +827,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// Part 6 - set chunk | // Part 6 - set chunk | ||||
if (saveState.chunk != nullptr && (fOptions & PLUGIN_OPTION_USE_CHUNKS) != 0) | |||||
if (saveState.chunk != nullptr && (pData->options & PLUGIN_OPTION_USE_CHUNKS) != 0) | |||||
setChunkData(saveState.chunk); | setChunkData(saveState.chunk); | ||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
@@ -884,14 +913,14 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename) | |||||
void CarlaPlugin::setId(const unsigned int newId) noexcept | void CarlaPlugin::setId(const unsigned int newId) noexcept | ||||
{ | { | ||||
fId = newId; | |||||
pData->id = newId; | |||||
} | } | ||||
void CarlaPlugin::setName(const char* const newName) | void CarlaPlugin::setName(const char* const newName) | ||||
{ | { | ||||
CARLA_ASSERT(newName != nullptr && newName[0] != '\0'); | CARLA_ASSERT(newName != nullptr && newName[0] != '\0'); | ||||
fName = newName; | |||||
pData->name = newName; | |||||
} | } | ||||
void CarlaPlugin::setOption(const unsigned int option, const bool yesNo) | void CarlaPlugin::setOption(const unsigned int option, const bool yesNo) | ||||
@@ -899,19 +928,19 @@ void CarlaPlugin::setOption(const unsigned int option, const bool yesNo) | |||||
CARLA_ASSERT(getOptionsAvailable() & option); | CARLA_ASSERT(getOptionsAvailable() & option); | ||||
if (yesNo) | if (yesNo) | ||||
fOptions |= option; | |||||
pData->options |= option; | |||||
else | else | ||||
fOptions &= ~option; | |||||
pData->options &= ~option; | |||||
pData->saveSetting(option, yesNo); | pData->saveSetting(option, yesNo); | ||||
} | } | ||||
void CarlaPlugin::setEnabled(const bool yesNo) | void CarlaPlugin::setEnabled(const bool yesNo) | ||||
{ | { | ||||
if (fEnabled == yesNo) | |||||
if (pData->enabled == yesNo) | |||||
return; | return; | ||||
fEnabled = yesNo; | |||||
pData->enabled = yesNo; | |||||
pData->masterMutex.lock(); | pData->masterMutex.lock(); | ||||
pData->masterMutex.unlock(); | pData->masterMutex.unlock(); | ||||
@@ -944,10 +973,10 @@ void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool se | |||||
const float value(active ? 1.0f : 0.0f); | const float value(active ? 1.0f : 0.0f); | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_ACTIVE, value); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_ACTIVE, value); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_ACTIVE, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_ACTIVE, 0, value, nullptr); | |||||
#else | #else | ||||
return; | return; | ||||
@@ -970,10 +999,10 @@ void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool se | |||||
pData->postProc.dryWet = fixedValue; | pData->postProc.dryWet = fixedValue; | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_DRYWET, fixedValue); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_DRYWET, fixedValue); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_DRYWET, 0, fixedValue, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_DRYWET, 0, fixedValue, nullptr); | |||||
} | } | ||||
void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool sendCallback) | void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool sendCallback) | ||||
@@ -988,10 +1017,10 @@ void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool se | |||||
pData->postProc.volume = fixedValue; | pData->postProc.volume = fixedValue; | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_VOLUME, fixedValue); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_VOLUME, fixedValue); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_VOLUME, 0, fixedValue, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_VOLUME, 0, fixedValue, nullptr); | |||||
} | } | ||||
void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bool sendCallback) | void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bool sendCallback) | ||||
@@ -1006,10 +1035,10 @@ void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bo | |||||
pData->postProc.balanceLeft = fixedValue; | pData->postProc.balanceLeft = fixedValue; | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, fixedValue); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_BALANCE_LEFT, fixedValue); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_LEFT, 0, fixedValue, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_BALANCE_LEFT, 0, fixedValue, nullptr); | |||||
} | } | ||||
void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const bool sendCallback) | void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const bool sendCallback) | ||||
@@ -1024,10 +1053,10 @@ void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const b | |||||
pData->postProc.balanceRight = fixedValue; | pData->postProc.balanceRight = fixedValue; | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, fixedValue); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_BALANCE_RIGHT, fixedValue); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_BALANCE_RIGHT, 0, fixedValue, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_BALANCE_RIGHT, 0, fixedValue, nullptr); | |||||
} | } | ||||
void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool sendCallback) | void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool sendCallback) | ||||
@@ -1042,10 +1071,10 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s | |||||
pData->postProc.panning = fixedValue; | pData->postProc.panning = fixedValue; | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_PANNING, fixedValue); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_PANNING, fixedValue); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_PANNING, 0, fixedValue, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_PANNING, 0, fixedValue, nullptr); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -1065,12 +1094,12 @@ void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const | |||||
const float ctrlf(channel); | const float ctrlf(channel); | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, ctrlf); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_CTRL_CHANNEL, ctrlf); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, PARAMETER_CTRL_CHANNEL, 0, ctrlf, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, PARAMETER_CTRL_CHANNEL, 0, ctrlf, nullptr); | |||||
if (fHints & PLUGIN_IS_BRIDGE) | |||||
if (pData->hints & PLUGIN_IS_BRIDGE) | |||||
osc_send_control(pData->osc.data, PARAMETER_CTRL_CHANNEL, ctrlf); | osc_send_control(pData->osc.data, PARAMETER_CTRL_CHANNEL, ctrlf); | ||||
#else | #else | ||||
return; | return; | ||||
@@ -1099,11 +1128,11 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu | |||||
uiParameterChange(parameterId, value); | uiParameterChange(parameterId, value); | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, parameterId, value); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, parameterId, value); | |||||
#endif | #endif | ||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, parameterId, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, parameterId, 0, value, nullptr); | |||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
return; | return; | ||||
@@ -1164,12 +1193,12 @@ void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t ch | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_midi_channel(fId, parameterId, channel); | |||||
pData->engine->oscSend_control_set_parameter_midi_channel(pData->id, parameterId, channel); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED, fId, parameterId, channel, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED, pData->id, parameterId, channel, 0.0f, nullptr); | |||||
if (fHints & PLUGIN_IS_BRIDGE) | |||||
if (pData->hints & PLUGIN_IS_BRIDGE) | |||||
{} // TODO | {} // TODO | ||||
#else | #else | ||||
return; | return; | ||||
@@ -1193,12 +1222,12 @@ void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, con | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_parameter_midi_cc(fId, parameterId, cc); | |||||
pData->engine->oscSend_control_set_parameter_midi_cc(pData->id, parameterId, cc); | |||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_MIDI_CC_CHANGED, fId, parameterId, cc, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_MIDI_CC_CHANGED, pData->id, parameterId, cc, 0.0f, nullptr); | |||||
if (fHints & PLUGIN_IS_BRIDGE) | |||||
if (pData->hints & PLUGIN_IS_BRIDGE) | |||||
{} // TODO | {} // TODO | ||||
#else | #else | ||||
return; | return; | ||||
@@ -1305,11 +1334,11 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_program(fId, fixedIndex); | |||||
pData->engine->oscSend_control_set_program(pData->id, fixedIndex); | |||||
#endif | #endif | ||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PROGRAM_CHANGED, pData->id, fixedIndex, 0, 0.0f, nullptr); | |||||
// Change default parameter values | // Change default parameter values | ||||
if (fixedIndex >= 0) | if (fixedIndex >= 0) | ||||
@@ -1331,12 +1360,12 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO | |||||
if (sendOsc || sendCallback) | if (sendOsc || sendCallback) | ||||
{ | { | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
pData->engine->oscSend_control_set_default_value(fId, i, value); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, i, value); | |||||
pData->engine->oscSend_control_set_default_value(pData->id, i, value); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, i, value); | |||||
#endif | #endif | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, i, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, i, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, i, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, pData->id, i, 0, value, nullptr); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -1368,11 +1397,11 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
if (sendOsc) | if (sendOsc) | ||||
pData->engine->oscSend_control_set_midi_program(fId, fixedIndex); | |||||
pData->engine->oscSend_control_set_midi_program(pData->id, fixedIndex); | |||||
#endif | #endif | ||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, fId, fixedIndex, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, pData->id, fixedIndex, 0, 0.0f, nullptr); | |||||
if (fixedIndex >= 0) | if (fixedIndex >= 0) | ||||
{ | { | ||||
@@ -1393,12 +1422,12 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s | |||||
if (sendOsc || sendCallback) | if (sendOsc || sendCallback) | ||||
{ | { | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
pData->engine->oscSend_control_set_default_value(fId, i, value); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, i, value); | |||||
pData->engine->oscSend_control_set_default_value(pData->id, i, value); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, i, value); | |||||
#endif | #endif | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, i, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, i, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, i, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, pData->id, i, 0, value, nullptr); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -1434,10 +1463,10 @@ void CarlaPlugin::showCustomUI(const bool yesNo) | |||||
void CarlaPlugin::idle() | void CarlaPlugin::idle() | ||||
{ | { | ||||
if (! fEnabled) | |||||
if (! pData->enabled) | |||||
return; | return; | ||||
if (fHints & PLUGIN_NEEDS_SINGLE_THREAD) | |||||
if (pData->hints & PLUGIN_NEEDS_SINGLE_THREAD) | |||||
{ | { | ||||
// Process postponed events | // Process postponed events | ||||
postRtEventsRun(); | postRtEventsRun(); | ||||
@@ -1522,7 +1551,7 @@ void CarlaPlugin::registerToOscClient() | |||||
#endif | #endif | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
pData->engine->oscSend_control_add_plugin_start(fId, fName); | |||||
pData->engine->oscSend_control_add_plugin_start(pData->id, pData->name); | |||||
#endif | #endif | ||||
// Base data | // Base data | ||||
@@ -1537,9 +1566,9 @@ void CarlaPlugin::registerToOscClient() | |||||
getCopyright(bufCopyright); | getCopyright(bufCopyright); | ||||
#ifdef BUILD_BRIDGE | #ifdef BUILD_BRIDGE | ||||
pData->engine->oscSend_bridge_plugin_info(getCategory(), fHints, bufName, bufLabel, bufMaker, bufCopyright, getUniqueId()); | |||||
pData->engine->oscSend_bridge_plugin_info(getCategory(), pData->hints, bufName, bufLabel, bufMaker, bufCopyright, getUniqueId()); | |||||
#else | #else | ||||
pData->engine->oscSend_control_set_plugin_data(fId, getType(), getCategory(), fHints, bufName, bufLabel, bufMaker, bufCopyright, getUniqueId()); | |||||
pData->engine->oscSend_control_set_plugin_data(pData->id, getType(), getCategory(), pData->hints, bufName, bufLabel, bufMaker, bufCopyright, getUniqueId()); | |||||
#endif | #endif | ||||
} | } | ||||
@@ -1553,7 +1582,7 @@ void CarlaPlugin::registerToOscClient() | |||||
pData->engine->oscSend_bridge_midi_count(getMidiInCount(), getMidiOutCount(), getMidiInCount() + getMidiOutCount()); | pData->engine->oscSend_bridge_midi_count(getMidiInCount(), getMidiOutCount(), getMidiInCount() + getMidiOutCount()); | ||||
pData->engine->oscSend_bridge_parameter_count(cIns, cOuts, cTotals); | pData->engine->oscSend_bridge_parameter_count(cIns, cOuts, cTotals); | ||||
#else | #else | ||||
pData->engine->oscSend_control_set_plugin_ports(fId, getAudioInCount(), getAudioOutCount(), getMidiInCount(), getMidiOutCount(), cIns, cOuts); | |||||
pData->engine->oscSend_control_set_plugin_ports(pData->id, getAudioInCount(), getAudioOutCount(), getMidiInCount(), getMidiOutCount(), cIns, cOuts); | |||||
#endif | #endif | ||||
} | } | ||||
@@ -1579,10 +1608,10 @@ void CarlaPlugin::registerToOscClient() | |||||
pData->engine->oscSend_bridge_parameter_ranges(i, paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | pData->engine->oscSend_bridge_parameter_ranges(i, paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | ||||
pData->engine->oscSend_bridge_set_parameter_value(i, getParameterValue(i)); | pData->engine->oscSend_bridge_set_parameter_value(i, getParameterValue(i)); | ||||
#else | #else | ||||
pData->engine->oscSend_control_set_parameter_data(fId, i,paramData.hints, bufName, bufUnit, getParameterValue(i)); | |||||
pData->engine->oscSend_control_set_parameter_ranges(fId, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | |||||
pData->engine->oscSend_control_set_parameter_midi_cc(fId, i, paramData.midiCC); | |||||
pData->engine->oscSend_control_set_parameter_midi_channel(fId, i, paramData.midiChannel); | |||||
pData->engine->oscSend_control_set_parameter_data(pData->id, i,paramData.hints, bufName, bufUnit, getParameterValue(i)); | |||||
pData->engine->oscSend_control_set_parameter_ranges(pData->id, i, paramRanges.min, paramRanges.max, paramRanges.def, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); | |||||
pData->engine->oscSend_control_set_parameter_midi_cc(pData->id, i, paramData.midiCC); | |||||
pData->engine->oscSend_control_set_parameter_midi_channel(pData->id, i, paramData.midiChannel); | |||||
#endif | #endif | ||||
} | } | ||||
} | } | ||||
@@ -1598,12 +1627,12 @@ void CarlaPlugin::registerToOscClient() | |||||
pData->engine->oscSend_bridge_set_program(pData->prog.current); | pData->engine->oscSend_bridge_set_program(pData->prog.current); | ||||
#else | #else | ||||
pData->engine->oscSend_control_set_program_count(fId, pData->prog.count); | |||||
pData->engine->oscSend_control_set_program_count(pData->id, pData->prog.count); | |||||
for (uint32_t i=0; i < pData->prog.count; ++i) | for (uint32_t i=0; i < pData->prog.count; ++i) | ||||
pData->engine->oscSend_control_set_program_name(fId, i, pData->prog.names[i]); | |||||
pData->engine->oscSend_control_set_program_name(pData->id, i, pData->prog.names[i]); | |||||
pData->engine->oscSend_control_set_program(fId, pData->prog.current); | |||||
pData->engine->oscSend_control_set_program(pData->id, pData->prog.current); | |||||
#endif | #endif | ||||
} | } | ||||
@@ -1622,31 +1651,31 @@ void CarlaPlugin::registerToOscClient() | |||||
pData->engine->oscSend_bridge_set_midi_program(pData->midiprog.current); | pData->engine->oscSend_bridge_set_midi_program(pData->midiprog.current); | ||||
#else | #else | ||||
pData->engine->oscSend_control_set_midi_program_count(fId, pData->midiprog.count); | |||||
pData->engine->oscSend_control_set_midi_program_count(pData->id, pData->midiprog.count); | |||||
for (uint32_t i=0; i < pData->midiprog.count; ++i) | for (uint32_t i=0; i < pData->midiprog.count; ++i) | ||||
{ | { | ||||
const MidiProgramData& mpData(pData->midiprog.data[i]); | const MidiProgramData& mpData(pData->midiprog.data[i]); | ||||
pData->engine->oscSend_control_set_midi_program_data(fId, i, mpData.bank, mpData.program, mpData.name); | |||||
pData->engine->oscSend_control_set_midi_program_data(pData->id, i, mpData.bank, mpData.program, mpData.name); | |||||
} | } | ||||
pData->engine->oscSend_control_set_midi_program(fId, pData->midiprog.current); | |||||
pData->engine->oscSend_control_set_midi_program(pData->id, pData->midiprog.current); | |||||
#endif | #endif | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
pData->engine->oscSend_control_add_plugin_end(fId); | |||||
pData->engine->oscSend_control_add_plugin_end(pData->id); | |||||
// Internal Parameters | // Internal Parameters | ||||
{ | { | ||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_DRYWET, pData->postProc.dryWet); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_VOLUME, pData->postProc.volume); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_LEFT, pData->postProc.balanceLeft); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_BALANCE_RIGHT, pData->postProc.balanceRight); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_PANNING, pData->postProc.panning); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_CTRL_CHANNEL, pData->ctrlChannel); | |||||
pData->engine->oscSend_control_set_parameter_value(fId, PARAMETER_ACTIVE, pData->active ? 1.0f : 0.0f); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_DRYWET, pData->postProc.dryWet); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_VOLUME, pData->postProc.volume); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_BALANCE_LEFT, pData->postProc.balanceLeft); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_BALANCE_RIGHT, pData->postProc.balanceRight); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_PANNING, pData->postProc.panning); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_CTRL_CHANNEL, pData->ctrlChannel); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, PARAMETER_ACTIVE, pData->active ? 1.0f : 0.0f); | |||||
} | } | ||||
#endif | #endif | ||||
} | } | ||||
@@ -1680,7 +1709,7 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url) | |||||
} | } | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
if (fHints & PLUGIN_IS_BRIDGE) | |||||
if (pData->hints & PLUGIN_IS_BRIDGE) | |||||
return; | return; | ||||
#endif | #endif | ||||
@@ -1775,13 +1804,13 @@ void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note, | |||||
if (sendOsc) | if (sendOsc) | ||||
{ | { | ||||
if (velo > 0) | if (velo > 0) | ||||
pData->engine->oscSend_control_note_on(fId, channel, note, velo); | |||||
pData->engine->oscSend_control_note_on(pData->id, channel, note, velo); | |||||
else | else | ||||
pData->engine->oscSend_control_note_off(fId, channel, note); | |||||
pData->engine->oscSend_control_note_off(pData->id, channel, note); | |||||
} | } | ||||
if (sendCallback) | if (sendCallback) | ||||
pData->engine->callback((velo > 0) ? ENGINE_CALLBACK_NOTE_ON : ENGINE_CALLBACK_NOTE_OFF, fId, channel, note, velo, nullptr); | |||||
pData->engine->callback((velo > 0) ? ENGINE_CALLBACK_NOTE_ON : ENGINE_CALLBACK_NOTE_OFF, pData->id, channel, note, velo, nullptr); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -1821,7 +1850,7 @@ void CarlaPlugin::postRtEventsRun() | |||||
case kPluginPostRtEventDebug: | case kPluginPostRtEventDebug: | ||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
pData->engine->callback(ENGINE_CALLBACK_DEBUG, fId, event.value1, event.value2, event.value3, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_DEBUG, pData->id, event.value1, event.value2, event.value3, nullptr); | |||||
#endif | #endif | ||||
break; | break; | ||||
@@ -1835,10 +1864,10 @@ void CarlaPlugin::postRtEventsRun() | |||||
{ | { | ||||
// Update OSC control client | // Update OSC control client | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
pData->engine->oscSend_control_set_parameter_value(fId, event.value1, event.value3); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, event.value1, event.value3); | |||||
// Update Host | // Update Host | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, event.value1, 0, event.value3, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, event.value1, 0, event.value3, nullptr); | |||||
} | } | ||||
#endif | #endif | ||||
break; | break; | ||||
@@ -1851,10 +1880,10 @@ void CarlaPlugin::postRtEventsRun() | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
// Update OSC control client | // Update OSC control client | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
pData->engine->oscSend_control_set_program(fId, event.value1); | |||||
pData->engine->oscSend_control_set_program(pData->id, event.value1); | |||||
// Update Host | // Update Host | ||||
pData->engine->callback(ENGINE_CALLBACK_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PROGRAM_CHANGED, pData->id, event.value1, 0, 0.0f, nullptr); | |||||
// Update param values | // Update param values | ||||
{ | { | ||||
@@ -1866,12 +1895,12 @@ void CarlaPlugin::postRtEventsRun() | |||||
if (sendOsc) | if (sendOsc) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_parameter_value(fId, j, value); | |||||
pData->engine->oscSend_control_set_default_value(fId, j, pData->param.ranges[j].def); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, j, value); | |||||
pData->engine->oscSend_control_set_default_value(pData->id, j, pData->param.ranges[j].def); | |||||
} | } | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, j, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, j, 0, pData->param.ranges[j].def, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, j, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, pData->id, j, 0, pData->param.ranges[j].def, nullptr); | |||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
@@ -1885,10 +1914,10 @@ void CarlaPlugin::postRtEventsRun() | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
// Update OSC control client | // Update OSC control client | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
pData->engine->oscSend_control_set_midi_program(fId, event.value1); | |||||
pData->engine->oscSend_control_set_midi_program(pData->id, event.value1); | |||||
// Update Host | // Update Host | ||||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, fId, event.value1, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, pData->id, event.value1, 0, 0.0f, nullptr); | |||||
// Update param values | // Update param values | ||||
{ | { | ||||
@@ -1900,12 +1929,12 @@ void CarlaPlugin::postRtEventsRun() | |||||
if (sendOsc) | if (sendOsc) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_parameter_value(fId, j, value); | |||||
pData->engine->oscSend_control_set_default_value(fId, j, pData->param.ranges[j].def); | |||||
pData->engine->oscSend_control_set_parameter_value(pData->id, j, value); | |||||
pData->engine->oscSend_control_set_default_value(pData->id, j, pData->param.ranges[j].def); | |||||
} | } | ||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, fId, j, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, fId, j, 0, pData->param.ranges[j].def, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED, pData->id, j, 0, value, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED, pData->id, j, 0, pData->param.ranges[j].def, nullptr); | |||||
} | } | ||||
} | } | ||||
#endif | #endif | ||||
@@ -1918,10 +1947,10 @@ void CarlaPlugin::postRtEventsRun() | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
// Update OSC control client | // Update OSC control client | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
pData->engine->oscSend_control_note_on(fId, event.value1, event.value2, int(event.value3)); | |||||
pData->engine->oscSend_control_note_on(pData->id, event.value1, event.value2, int(event.value3)); | |||||
// Update Host | // Update Host | ||||
pData->engine->callback(ENGINE_CALLBACK_NOTE_ON, fId, event.value1, event.value2, int(event.value3), nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_NOTE_ON, pData->id, event.value1, event.value2, int(event.value3), nullptr); | |||||
#endif | #endif | ||||
break; | break; | ||||
@@ -1932,10 +1961,10 @@ void CarlaPlugin::postRtEventsRun() | |||||
#ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
// Update OSC control client | // Update OSC control client | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
pData->engine->oscSend_control_note_off(fId, event.value1, event.value2); | |||||
pData->engine->oscSend_control_note_off(pData->id, event.value1, event.value2); | |||||
// Update Host | // Update Host | ||||
pData->engine->callback(ENGINE_CALLBACK_NOTE_OFF, fId, event.value1, event.value2, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_NOTE_OFF, pData->id, event.value1, event.value2, 0.0f, nullptr); | |||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
@@ -2043,8 +2072,8 @@ CarlaPlugin::ScopedDisabler::ScopedDisabler(CarlaPlugin* const plugin) | |||||
plugin->pData->masterMutex.lock(); | plugin->pData->masterMutex.lock(); | ||||
if (plugin->fEnabled) | |||||
plugin->fEnabled = false; | |||||
if (plugin->pData->enabled) | |||||
plugin->pData->enabled = false; | |||||
if (plugin->pData->client->isActive()) | if (plugin->pData->client->isActive()) | ||||
plugin->pData->client->deactivate(); | plugin->pData->client->deactivate(); | ||||
@@ -2064,7 +2093,7 @@ CarlaPlugin::ScopedDisabler::~ScopedDisabler() | |||||
if (fPlugin->pData->client == nullptr) | if (fPlugin->pData->client == nullptr) | ||||
return; | return; | ||||
fPlugin->fEnabled = true; | |||||
fPlugin->pData->enabled = true; | |||||
fPlugin->pData->client->activate(); | fPlugin->pData->client->activate(); | ||||
fPlugin->pData->masterMutex.unlock(); | fPlugin->pData->masterMutex.unlock(); | ||||
} | } | ||||
@@ -31,7 +31,7 @@ | |||||
#include <cmath> | #include <cmath> | ||||
#define CARLA_PROCESS_CONTINUE_CHECK if (! fEnabled) { pData->engine->callback(ENGINE_CALLBACK_DEBUG, fId, 0, 0, 0.0f, "Processing while plugin is disabled!!"); return; } | |||||
#define CARLA_PROCESS_CONTINUE_CHECK if (! pData->enabled) { pData->engine->callback(ENGINE_CALLBACK_DEBUG, pData->id, 0, 0, 0.0f, "Processing while plugin is disabled!!"); return; } | |||||
#ifdef USE_JUCE | #ifdef USE_JUCE | ||||
#include "juce_audio_basics.h" | #include "juce_audio_basics.h" | ||||
@@ -491,21 +491,33 @@ struct CarlaPluginProtectedData { | |||||
CarlaEngine* const engine; | CarlaEngine* const engine; | ||||
CarlaEngineClient* client; | CarlaEngineClient* client; | ||||
unsigned int id; | |||||
unsigned int hints; | |||||
unsigned int options; | |||||
bool active; | bool active; | ||||
bool enabled; | |||||
bool needsReset; | bool needsReset; | ||||
void* lib; | void* lib; | ||||
void* uiLib; | void* uiLib; | ||||
// misc | // misc | ||||
int8_t ctrlChannel; | int8_t ctrlChannel; | ||||
unsigned int extraHints; | unsigned int extraHints; | ||||
CarlaString idStr; | |||||
int patchbayClientId; | |||||
// latency | // latency | ||||
uint32_t latency; | uint32_t latency; | ||||
float** latencyBuffers; | float** latencyBuffers; | ||||
// data | |||||
// data 1 | |||||
CarlaString name; | |||||
CarlaString filename; | |||||
CarlaString iconName; | |||||
CarlaString idStr; | |||||
// data 2 | |||||
PluginAudioData audioIn; | PluginAudioData audioIn; | ||||
PluginAudioData audioOut; | PluginAudioData audioOut; | ||||
PluginEventData event; | PluginEventData event; | ||||
@@ -624,12 +636,17 @@ struct CarlaPluginProtectedData { | |||||
CarlaPluginProtectedData(CarlaEngine* const eng, CarlaPlugin* const plug) | CarlaPluginProtectedData(CarlaEngine* const eng, CarlaPlugin* const plug) | ||||
: engine(eng), | : engine(eng), | ||||
client(nullptr), | client(nullptr), | ||||
id(0), | |||||
hints(0x0), | |||||
options(0x0), | |||||
active(false), | active(false), | ||||
enabled(false), | |||||
needsReset(false), | needsReset(false), | ||||
lib(nullptr), | lib(nullptr), | ||||
uiLib(nullptr), | uiLib(nullptr), | ||||
ctrlChannel(0), | ctrlChannel(0), | ||||
extraHints(0x0), | extraHints(0x0), | ||||
patchbayClientId(0), | |||||
latency(0), | latency(0), | ||||
latencyBuffers(nullptr), | latencyBuffers(nullptr), | ||||
osc(eng, plug) {} | osc(eng, plug) {} | ||||
@@ -53,7 +53,7 @@ public: | |||||
carla_debug("DssiPlugin::~DssiPlugin()"); | carla_debug("DssiPlugin::~DssiPlugin()"); | ||||
// close UI | // close UI | ||||
if (fHints & PLUGIN_HAS_CUSTOM_UI) | |||||
if (pData->hints & PLUGIN_HAS_CUSTOM_UI) | |||||
{ | { | ||||
showCustomUI(false); | showCustomUI(false); | ||||
@@ -74,7 +74,7 @@ public: | |||||
if (fDescriptor != nullptr) | if (fDescriptor != nullptr) | ||||
{ | { | ||||
if (fName.isNotEmpty() && fDssiDescriptor != nullptr && fDssiDescriptor->run_synth == nullptr && fDssiDescriptor->run_multiple_synths != nullptr) | |||||
if (pData->name.isNotEmpty() && fDssiDescriptor != nullptr && fDssiDescriptor->run_synth == nullptr && fDssiDescriptor->run_multiple_synths != nullptr) | |||||
removeUniqueMultiSynth(fDescriptor->Label); | removeUniqueMultiSynth(fDescriptor->Label); | ||||
if (fDescriptor->cleanup != nullptr) | if (fDescriptor->cleanup != nullptr) | ||||
@@ -115,7 +115,7 @@ public: | |||||
if (pData->audioIn.count == 0 && pData->audioOut.count > 0 && (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr)) | if (pData->audioIn.count == 0 && pData->audioOut.count > 0 && (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr)) | ||||
return PLUGIN_CATEGORY_SYNTH; | return PLUGIN_CATEGORY_SYNTH; | ||||
return getPluginCategoryFromName(fName); | |||||
return getPluginCategoryFromName(pData->name); | |||||
} | } | ||||
long getUniqueId() const override | long getUniqueId() const override | ||||
@@ -136,7 +136,7 @@ public: | |||||
int32_t getChunkData(void** const dataPtr) const override | int32_t getChunkData(void** const dataPtr) const override | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fUsesCustomData, 0); | CARLA_SAFE_ASSERT_RETURN(fUsesCustomData, 0); | ||||
CARLA_SAFE_ASSERT_RETURN(fOptions & PLUGIN_OPTION_USE_CHUNKS, 0); | |||||
CARLA_SAFE_ASSERT_RETURN(pData->options & PLUGIN_OPTION_USE_CHUNKS, 0); | |||||
CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr, 0); | ||||
CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor->get_custom_data != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor->get_custom_data != nullptr, 0); | ||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0); | CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0); | ||||
@@ -156,8 +156,8 @@ public: | |||||
unsigned int getOptionsAvailable() const override | unsigned int getOptionsAvailable() const override | ||||
{ | { | ||||
const bool isAmSynth = fFilename.contains("amsynth", true); | |||||
const bool isDssiVst = fFilename.contains("dssi-vst", true); | |||||
const bool isAmSynth = pData->filename.contains("amsynth", true); | |||||
const bool isDssiVst = pData->filename.contains("dssi-vst", true); | |||||
unsigned int options = 0x0; | unsigned int options = 0x0; | ||||
@@ -169,7 +169,7 @@ public: | |||||
if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_FORCE_STEREO) | |||||
if (pData->options & PLUGIN_OPTION_FORCE_STEREO) | |||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | ||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
@@ -311,7 +311,7 @@ public: | |||||
void setChunkData(const char* const stringData) override | void setChunkData(const char* const stringData) override | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fUsesCustomData,); | CARLA_SAFE_ASSERT_RETURN(fUsesCustomData,); | ||||
CARLA_SAFE_ASSERT_RETURN(fOptions & PLUGIN_OPTION_USE_CHUNKS,); | |||||
CARLA_SAFE_ASSERT_RETURN(pData->options & PLUGIN_OPTION_USE_CHUNKS,); | |||||
CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor->set_custom_data != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDssiDescriptor->set_custom_data != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | ||||
@@ -432,7 +432,7 @@ public: | |||||
} | } | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1)) | |||||
if ((pData->options & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1)) | |||||
{ | { | ||||
if (fHandle2 == nullptr) | if (fHandle2 == nullptr) | ||||
fHandle2 = fDescriptor->instantiate(fDescriptor, (unsigned long)sampleRate); | fHandle2 = fDescriptor->instantiate(fDescriptor, (unsigned long)sampleRate); | ||||
@@ -505,7 +505,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -705,7 +705,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -721,7 +721,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -732,27 +732,27 @@ public: | |||||
} | } | ||||
if (forcedStereoIn || forcedStereoOut) | if (forcedStereoIn || forcedStereoOut) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
else | else | ||||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
// plugin hints | // plugin hints | ||||
fHints = 0x0; | |||||
pData->hints = 0x0; | |||||
if (LADSPA_IS_HARD_RT_CAPABLE(fDescriptor->Properties)) | if (LADSPA_IS_HARD_RT_CAPABLE(fDescriptor->Properties)) | ||||
fHints |= PLUGIN_IS_RTSAFE; | |||||
pData->hints |= PLUGIN_IS_RTSAFE; | |||||
if (fGuiFilename != nullptr) | if (fGuiFilename != nullptr) | ||||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | ||||
fHints |= PLUGIN_CAN_DRYWET; | |||||
pData->hints |= PLUGIN_CAN_DRYWET; | |||||
if (aOuts > 0) | if (aOuts > 0) | ||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
if (aOuts >= 2 && aOuts % 2 == 0) | if (aOuts >= 2 && aOuts % 2 == 0) | ||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints = 0x0; | pData->extraHints = 0x0; | ||||
@@ -764,7 +764,7 @@ public: | |||||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | ||||
// check latency | // check latency | ||||
if (fHints & PLUGIN_CAN_DRYWET) | |||||
if (pData->hints & PLUGIN_CAN_DRYWET) | |||||
{ | { | ||||
for (uint32_t i=0; i < pData->param.count; ++i) | for (uint32_t i=0; i < pData->param.count; ++i) | ||||
{ | { | ||||
@@ -860,10 +860,10 @@ public: | |||||
// Update OSC Names | // Update OSC Names | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_midi_program_count(fId, count); | |||||
pData->engine->oscSend_control_set_midi_program_count(pData->id, count); | |||||
for (i=0; i < count; ++i) | for (i=0; i < count; ++i) | ||||
pData->engine->oscSend_control_set_midi_program_data(fId, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
pData->engine->oscSend_control_set_midi_program_data(pData->id, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -910,7 +910,7 @@ public: | |||||
if (programChanged) | if (programChanged) | ||||
setMidiProgram(pData->midiprog.current, true, true, true); | setMidiProgram(pData->midiprog.current, true, true, true); | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -971,7 +971,7 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
midiEventCount = MAX_MIDI_CHANNELS*2; | midiEventCount = MAX_MIDI_CHANNELS*2; | ||||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents, midiEventCount); | carla_zeroStruct<snd_seq_event_t>(fMidiEvents, midiEventCount); | ||||
@@ -1049,7 +1049,7 @@ public: | |||||
// Event Input (System) | // Event Input (System) | ||||
bool allNotesOffSent = false; | bool allNotesOffSent = false; | ||||
bool isSampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
bool isSampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
uint32_t time, numEvents = pData->event.portIn->getEventCount(); | uint32_t time, numEvents = pData->event.portIn->getEventCount(); | ||||
uint32_t startTime = 0; | uint32_t startTime = 0; | ||||
@@ -1111,21 +1111,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) != 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) != 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) != 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) != 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) != 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) != 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -1184,7 +1184,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
if (midiEventCount >= kPluginMaxMidiEvents) | if (midiEventCount >= kPluginMaxMidiEvents) | ||||
continue; | continue; | ||||
@@ -1204,12 +1204,12 @@ public: | |||||
} | } | ||||
case kEngineControlEventTypeMidiBank: | case kEngineControlEventTypeMidiBank: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
nextBankId = ctrlEvent.param; | nextBankId = ctrlEvent.param; | ||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
const uint32_t nextProgramId = ctrlEvent.param; | const uint32_t nextProgramId = ctrlEvent.param; | ||||
@@ -1226,7 +1226,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (midiEventCount >= kPluginMaxMidiEvents) | if (midiEventCount >= kPluginMaxMidiEvents) | ||||
continue; | continue; | ||||
@@ -1243,7 +1243,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -1318,7 +1318,7 @@ public: | |||||
} | } | ||||
case MIDI_STATUS_POLYPHONIC_AFTERTOUCH: | case MIDI_STATUS_POLYPHONIC_AFTERTOUCH: | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) | |||||
if (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) | |||||
{ | { | ||||
const uint8_t note = engineEvent.data[1]; | const uint8_t note = engineEvent.data[1]; | ||||
const uint8_t pressure = engineEvent.data[2]; | const uint8_t pressure = engineEvent.data[2]; | ||||
@@ -1332,7 +1332,7 @@ public: | |||||
} | } | ||||
case MIDI_STATUS_CONTROL_CHANGE: | case MIDI_STATUS_CONTROL_CHANGE: | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||||
if (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) | |||||
{ | { | ||||
const uint8_t control = engineEvent.data[1]; | const uint8_t control = engineEvent.data[1]; | ||||
const uint8_t value = engineEvent.data[2]; | const uint8_t value = engineEvent.data[2]; | ||||
@@ -1346,7 +1346,7 @@ public: | |||||
} | } | ||||
case MIDI_STATUS_CHANNEL_PRESSURE: | case MIDI_STATUS_CHANNEL_PRESSURE: | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) | |||||
if (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) | |||||
{ | { | ||||
const uint8_t pressure = engineEvent.data[1]; | const uint8_t pressure = engineEvent.data[1]; | ||||
@@ -1358,7 +1358,7 @@ public: | |||||
} | } | ||||
case MIDI_STATUS_PITCH_WHEEL_CONTROL: | case MIDI_STATUS_PITCH_WHEEL_CONTROL: | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) | |||||
if (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) | |||||
{ | { | ||||
const uint8_t lsb = engineEvent.data[1]; | const uint8_t lsb = engineEvent.data[1]; | ||||
const uint8_t msb = engineEvent.data[2]; | const uint8_t msb = engineEvent.data[2]; | ||||
@@ -1505,8 +1505,8 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
bool isPair; | bool isPair; | ||||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | float bufValue, oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -1859,16 +1859,16 @@ public: | |||||
// get info | // get info | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else if (fDescriptor->Name != nullptr) | else if (fDescriptor->Name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(fDescriptor->Name); | |||||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Name); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName(fDescriptor->Label); | |||||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Label); | |||||
fFilename = filename; | |||||
pData->filename = filename; | |||||
CARLA_ASSERT(fName.isNotEmpty()); | |||||
CARLA_ASSERT(fFilename.isNotEmpty()); | |||||
CARLA_ASSERT(pData->name.isNotEmpty()); | |||||
CARLA_ASSERT(pData->filename.isNotEmpty()); | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
@@ -1919,29 +1919,29 @@ public: | |||||
// load plugin settings | // load plugin settings | ||||
{ | { | ||||
const bool isAmSynth = fFilename.contains("amsynth", true); | |||||
const bool isDssiVst = fFilename.contains("dssi-vst", true); | |||||
const bool isAmSynth = pData->filename.contains("amsynth", true); | |||||
const bool isDssiVst = pData->filename.contains("dssi-vst", true); | |||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
if (isAmSynth || isDssiVst) | if (isAmSynth || isDssiVst) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
if (pData->engine->getOptions().forceStereo) | if (pData->engine->getOptions().forceStereo) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
if (fUsesCustomData) | if (fUsesCustomData) | ||||
fOptions |= PLUGIN_OPTION_USE_CHUNKS; | |||||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||||
if (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr) | if (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr) | ||||
{ | { | ||||
fOptions |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
fOptions |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
fOptions |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
if (fDssiDescriptor->run_synth == nullptr) | if (fDssiDescriptor->run_synth == nullptr) | ||||
carla_stderr2("WARNING: Plugin can ONLY use run_multiple_synths!"); | carla_stderr2("WARNING: Plugin can ONLY use run_multiple_synths!"); | ||||
@@ -1952,11 +1952,11 @@ public: | |||||
pData->idStr += std::strrchr(filename, OS_SEP)+1; | pData->idStr += std::strrchr(filename, OS_SEP)+1; | ||||
pData->idStr += "/"; | pData->idStr += "/"; | ||||
pData->idStr += label; | pData->idStr += label; | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (isAmSynth || isDssiVst) | if (isAmSynth || isDssiVst) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
} | } | ||||
return true; | return true; | ||||
@@ -462,7 +462,7 @@ public: | |||||
// if (pData->ctrlChannel == static_cast<int32_t>(i)) | // if (pData->ctrlChannel == static_cast<int32_t>(i)) | ||||
// { | // { | ||||
// pData->midiprog.current = index; | // pData->midiprog.current = index; | ||||
// pData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, fId, index, 0, 0.0f, nullptr); | |||||
// pData->engine->callback(CALLBACK_MIDI_PROGRAM_CHANGED, pData->id, index, 0, 0.0f, nullptr); | |||||
// } | // } | ||||
// } | // } | ||||
// | // | ||||
@@ -544,7 +544,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -578,7 +578,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -593,7 +593,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -612,7 +612,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -630,7 +630,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -853,10 +853,10 @@ public: | |||||
// --------------------------------------- | // --------------------------------------- | ||||
// plugin hints | // plugin hints | ||||
fHints = 0x0; | |||||
fHints |= PLUGIN_IS_SYNTH; | |||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints = 0x0; | |||||
pData->hints |= PLUGIN_IS_SYNTH; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints = 0x0; | pData->extraHints = 0x0; | ||||
@@ -929,10 +929,10 @@ public: | |||||
// Update OSC Names | // Update OSC Names | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_midi_program_count(fId, count); | |||||
pData->engine->oscSend_control_set_midi_program_count(pData->id, count); | |||||
for (i=0; i < count; ++i) | for (i=0; i < count; ++i) | ||||
pData->engine->oscSend_control_set_midi_program_data(fId, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
pData->engine->oscSend_control_set_midi_program_data(pData->id, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -974,7 +974,7 @@ public: | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -1007,7 +1007,7 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
for (int c=0; c < MAX_MIDI_CHANNELS; ++c) | for (int c=0; c < MAX_MIDI_CHANNELS; ++c) | ||||
{ | { | ||||
@@ -1112,21 +1112,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -1185,7 +1185,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
fluid_synth_cc(fSynth, event.channel, ctrlEvent.param, ctrlEvent.value*127.0f); | fluid_synth_cc(fSynth, event.channel, ctrlEvent.param, ctrlEvent.value*127.0f); | ||||
} | } | ||||
@@ -1194,12 +1194,12 @@ public: | |||||
} | } | ||||
case kEngineControlEventTypeMidiBank: | case kEngineControlEventTypeMidiBank: | ||||
if (event.channel < MAX_MIDI_CHANNELS && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel < MAX_MIDI_CHANNELS && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
nextBankIds[event.channel] = ctrlEvent.param; | nextBankIds[event.channel] = ctrlEvent.param; | ||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel < MAX_MIDI_CHANNELS && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel < MAX_MIDI_CHANNELS && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
const uint32_t bankId(nextBankIds[event.channel]); | const uint32_t bankId(nextBankIds[event.channel]); | ||||
const uint32_t progId(ctrlEvent.param); | const uint32_t progId(ctrlEvent.param); | ||||
@@ -1221,7 +1221,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
#ifdef FLUIDSYNTH_VERSION_NEW_API | #ifdef FLUIDSYNTH_VERSION_NEW_API | ||||
fluid_synth_all_sounds_off(fSynth, event.channel); | fluid_synth_all_sounds_off(fSynth, event.channel); | ||||
@@ -1232,7 +1232,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -1280,27 +1280,27 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, note, velo); | pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, note, velo); | ||||
} | } | ||||
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) != 0) | |||||
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) != 0) | |||||
{ | { | ||||
//const uint8_t note = midiEvent.data[1]; | //const uint8_t note = midiEvent.data[1]; | ||||
//const uint8_t pressure = midiEvent.data[2]; | //const uint8_t pressure = midiEvent.data[2]; | ||||
// TODO, not in fluidsynth API | // TODO, not in fluidsynth API | ||||
} | } | ||||
else if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0) | |||||
else if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0) | |||||
{ | { | ||||
const uint8_t control = midiEvent.data[1]; | const uint8_t control = midiEvent.data[1]; | ||||
const uint8_t value = midiEvent.data[2]; | const uint8_t value = midiEvent.data[2]; | ||||
fluid_synth_cc(fSynth, channel, control, value); | fluid_synth_cc(fSynth, channel, control, value); | ||||
} | } | ||||
else if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) != 0) | |||||
else if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) != 0) | |||||
{ | { | ||||
const uint8_t pressure = midiEvent.data[1]; | const uint8_t pressure = midiEvent.data[1]; | ||||
fluid_synth_channel_pressure(fSynth, channel, pressure);; | fluid_synth_channel_pressure(fSynth, channel, pressure);; | ||||
} | } | ||||
else if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) != 0) | |||||
else if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) != 0) | |||||
{ | { | ||||
const uint8_t lsb = midiEvent.data[1]; | const uint8_t lsb = midiEvent.data[1]; | ||||
const uint8_t msb = midiEvent.data[2]; | const uint8_t msb = midiEvent.data[2]; | ||||
@@ -1388,8 +1388,8 @@ public: | |||||
{ | { | ||||
// note - balance not possible with kUses16Outs, so we can safely skip fAudioOutBuffers | // note - balance not possible with kUses16Outs, so we can safely skip fAudioOutBuffers | ||||
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) > 0 && pData->postProc.volume != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) > 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doVolume = (pData->hints & PLUGIN_CAN_VOLUME) > 0 && pData->postProc.volume != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) > 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
float oldBufLeft[doBalance ? frames : 1]; | float oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -1556,16 +1556,16 @@ public: | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// get info | // get info | ||||
fFilename = filename; | |||||
fLabel = label; | |||||
pData->filename = filename; | |||||
fLabel = label; | |||||
if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) | if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) | ||||
fLabel += " (16 outs)"; | fLabel += " (16 outs)"; | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName(label); | |||||
pData->name = pData->engine->getUniquePluginName(label); | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
@@ -1583,18 +1583,18 @@ public: | |||||
{ | { | ||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
fOptions |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
fOptions |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
fOptions |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
// load settings | // load settings | ||||
pData->idStr = "SF2/"; | pData->idStr = "SF2/"; | ||||
pData->idStr += label; | pData->idStr += label; | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
} | } | ||||
return true; | return true; | ||||
@@ -127,7 +127,7 @@ public: | |||||
return PLUGIN_CATEGORY_SYNTH; | return PLUGIN_CATEGORY_SYNTH; | ||||
} | } | ||||
return getPluginCategoryFromName(fName); | |||||
return getPluginCategoryFromName(pData->name); | |||||
} | } | ||||
long getUniqueId() const override | long getUniqueId() const override | ||||
@@ -165,7 +165,7 @@ public: | |||||
unsigned int getOptionsAvailable() const override | unsigned int getOptionsAvailable() const override | ||||
{ | { | ||||
const bool isDssiVst = fFilename.contains("dssi-vst", true); | |||||
const bool isDssiVst = pData->filename.contains("dssi-vst", true); | |||||
unsigned int options = 0x0; | unsigned int options = 0x0; | ||||
@@ -175,7 +175,7 @@ public: | |||||
if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_FORCE_STEREO) | |||||
if (pData->options & PLUGIN_OPTION_FORCE_STEREO) | |||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | ||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
@@ -441,7 +441,7 @@ public: | |||||
} | } | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1)) | |||||
if ((pData->options & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1)) | |||||
{ | { | ||||
if (fHandle2 == nullptr) | if (fHandle2 == nullptr) | ||||
fHandle2 = fDescriptor->instantiate(fDescriptor, (unsigned long)sampleRate); | fHandle2 = fDescriptor->instantiate(fDescriptor, (unsigned long)sampleRate); | ||||
@@ -509,7 +509,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -704,7 +704,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -720,7 +720,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -731,24 +731,24 @@ public: | |||||
} | } | ||||
if (forcedStereoIn || forcedStereoOut) | if (forcedStereoIn || forcedStereoOut) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
else | else | ||||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
// plugin hints | // plugin hints | ||||
fHints = 0x0; | |||||
pData->hints = 0x0; | |||||
if (LADSPA_IS_HARD_RT_CAPABLE(fDescriptor->Properties)) | if (LADSPA_IS_HARD_RT_CAPABLE(fDescriptor->Properties)) | ||||
fHints |= PLUGIN_IS_RTSAFE; | |||||
pData->hints |= PLUGIN_IS_RTSAFE; | |||||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | ||||
fHints |= PLUGIN_CAN_DRYWET; | |||||
pData->hints |= PLUGIN_CAN_DRYWET; | |||||
if (aOuts > 0) | if (aOuts > 0) | ||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
if (aOuts >= 2 && aOuts % 2 == 0) | if (aOuts >= 2 && aOuts % 2 == 0) | ||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints = 0x0; | pData->extraHints = 0x0; | ||||
@@ -757,7 +757,7 @@ public: | |||||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | ||||
// check latency | // check latency | ||||
if (fHints & PLUGIN_CAN_DRYWET) | |||||
if (pData->hints & PLUGIN_CAN_DRYWET) | |||||
{ | { | ||||
for (uint32_t i=0; i < pData->param.count; ++i) | for (uint32_t i=0; i < pData->param.count; ++i) | ||||
{ | { | ||||
@@ -891,7 +891,7 @@ public: | |||||
// ---------------------------------------------------------------------------------------------------- | // ---------------------------------------------------------------------------------------------------- | ||||
// Event Input (System) | // Event Input (System) | ||||
bool isSampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
bool isSampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
uint32_t time, numEvents = pData->event.portIn->getEventCount(); | uint32_t time, numEvents = pData->event.portIn->getEventCount(); | ||||
uint32_t timeOffset = 0; | uint32_t timeOffset = 0; | ||||
@@ -936,21 +936,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -1137,8 +1137,8 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
bool isPair; | bool isPair; | ||||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | float bufValue, oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -1422,18 +1422,18 @@ public: | |||||
fRdfDescriptor = ladspa_rdf_dup(rdfDescriptor); | fRdfDescriptor = ladspa_rdf_dup(rdfDescriptor); | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else if (fRdfDescriptor != nullptr && fRdfDescriptor->Title != nullptr) | else if (fRdfDescriptor != nullptr && fRdfDescriptor->Title != nullptr) | ||||
fName = pData->engine->getUniquePluginName(fRdfDescriptor->Title); | |||||
pData->name = pData->engine->getUniquePluginName(fRdfDescriptor->Title); | |||||
else if (fDescriptor->Name != nullptr) | else if (fDescriptor->Name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(fDescriptor->Name); | |||||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Name); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName(fDescriptor->Label); | |||||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Label); | |||||
fFilename = filename; | |||||
pData->filename = filename; | |||||
CARLA_ASSERT(fName.isNotEmpty()); | |||||
CARLA_ASSERT(fFilename.isNotEmpty()); | |||||
CARLA_ASSERT(pData->name.isNotEmpty()); | |||||
CARLA_ASSERT(pData->filename.isNotEmpty()); | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
@@ -1461,16 +1461,16 @@ public: | |||||
// load plugin settings | // load plugin settings | ||||
{ | { | ||||
const bool isDssiVst = fFilename.contains("dssi-vst", true); | |||||
const bool isDssiVst = pData->filename.contains("dssi-vst", true); | |||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
if (isDssiVst) | if (isDssiVst) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
if (pData->engine->getOptions().forceStereo) | if (pData->engine->getOptions().forceStereo) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
// load settings | // load settings | ||||
pData->idStr = "LADSPA/"; | pData->idStr = "LADSPA/"; | ||||
@@ -1479,11 +1479,11 @@ public: | |||||
pData->idStr += CarlaString(getUniqueId()); | pData->idStr += CarlaString(getUniqueId()); | ||||
pData->idStr += "/"; | pData->idStr += "/"; | ||||
pData->idStr += label; | pData->idStr += label; | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (isDssiVst) | if (isDssiVst) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
} | } | ||||
return true; | return true; | ||||
@@ -312,7 +312,7 @@ public: | |||||
if (pData->engine->isOffline()) | if (pData->engine->isOffline()) | ||||
{ | { | ||||
fEngineChannel->PrepareLoadInstrument((const char*)fFilename, rIndex); | |||||
fEngineChannel->PrepareLoadInstrument((const char*)pData->filename, rIndex); | |||||
fEngineChannel->LoadInstrument(); | fEngineChannel->LoadInstrument(); | ||||
} | } | ||||
else | else | ||||
@@ -360,7 +360,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -375,7 +375,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -394,7 +394,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -407,10 +407,10 @@ public: | |||||
// --------------------------------------- | // --------------------------------------- | ||||
// plugin hints | // plugin hints | ||||
fHints = 0x0; | |||||
//fHints |= PLUGIN_IS_SYNTH; | |||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints = 0x0; | |||||
//pData->hints |= PLUGIN_IS_SYNTH; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints = 0x0; | pData->extraHints = 0x0; | ||||
@@ -466,10 +466,10 @@ public: | |||||
// Update OSC Names | // Update OSC Names | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_midi_program_count(fId, count); | |||||
pData->engine->oscSend_control_set_midi_program_count(pData->id, count); | |||||
for (i=0; i < count; ++i) | for (i=0; i < count; ++i) | ||||
pData->engine->oscSend_control_set_midi_program_data(fId, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
pData->engine->oscSend_control_set_midi_program_data(pData->id, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -479,7 +479,7 @@ public: | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -526,7 +526,7 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | ||||
{ | { | ||||
@@ -572,7 +572,7 @@ public: | |||||
// Event Input (System) | // Event Input (System) | ||||
bool allNotesOffSent = false; | bool allNotesOffSent = false; | ||||
bool sampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
bool sampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
uint32_t time, nEvents = pData->event.portIn->getEventCount(); | uint32_t time, nEvents = pData->event.portIn->getEventCount(); | ||||
uint32_t startTime = 0; | uint32_t startTime = 0; | ||||
@@ -632,21 +632,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -705,7 +705,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
fMidiInputPort->DispatchControlChange(ctrlEvent.param, ctrlEvent.value*127.0f, event.channel, sampleAccurate ? startTime : time); | fMidiInputPort->DispatchControlChange(ctrlEvent.param, ctrlEvent.value*127.0f, event.channel, sampleAccurate ? startTime : time); | ||||
} | } | ||||
@@ -714,12 +714,12 @@ public: | |||||
} | } | ||||
case kEngineControlEventTypeMidiBank: | case kEngineControlEventTypeMidiBank: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
nextBankId = ctrlEvent.param; | nextBankId = ctrlEvent.param; | ||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
const uint32_t nextProgramId = ctrlEvent.param; | const uint32_t nextProgramId = ctrlEvent.param; | ||||
@@ -736,14 +736,14 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, event.channel, sampleAccurate ? startTime : time); | fMidiInputPort->DispatchControlChange(MIDI_CONTROL_ALL_SOUND_OFF, 0, event.channel, sampleAccurate ? startTime : time); | ||||
} | } | ||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -789,27 +789,27 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, note, velo); | pData->postponeRtEvent(kPluginPostRtEventNoteOn, channel, note, velo); | ||||
} | } | ||||
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) != 0) | |||||
else if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) != 0) | |||||
{ | { | ||||
//const uint8_t note = midiEvent.data[1]; | //const uint8_t note = midiEvent.data[1]; | ||||
//const uint8_t pressure = midiEvent.data[2]; | //const uint8_t pressure = midiEvent.data[2]; | ||||
// unsupported | // unsupported | ||||
} | } | ||||
else if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0) | |||||
else if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0) | |||||
{ | { | ||||
const uint8_t control = midiEvent.data[1]; | const uint8_t control = midiEvent.data[1]; | ||||
const uint8_t value = midiEvent.data[2]; | const uint8_t value = midiEvent.data[2]; | ||||
fMidiInputPort->DispatchControlChange(control, value, channel, fragmentPos); | fMidiInputPort->DispatchControlChange(control, value, channel, fragmentPos); | ||||
} | } | ||||
else if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) != 0) | |||||
else if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) != 0) | |||||
{ | { | ||||
//const uint8_t pressure = midiEvent.data[1]; | //const uint8_t pressure = midiEvent.data[1]; | ||||
// unsupported | // unsupported | ||||
} | } | ||||
else if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) != 0) | |||||
else if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) != 0) | |||||
{ | { | ||||
const uint8_t lsb = midiEvent.data[1]; | const uint8_t lsb = midiEvent.data[1]; | ||||
const uint8_t msb = midiEvent.data[2]; | const uint8_t msb = midiEvent.data[2]; | ||||
@@ -873,8 +873,8 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) > 0 && pData->postProc.volume != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) > 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doVolume = (pData->hints & PLUGIN_CAN_VOLUME) > 0 && pData->postProc.volume != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) > 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
float oldBufLeft[doBalance ? frames : 1]; | float oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -1053,15 +1053,15 @@ public: | |||||
fRealName = info.InstrumentName.c_str(); | fRealName = info.InstrumentName.c_str(); | ||||
fLabel = info.Product.c_str(); | fLabel = info.Product.c_str(); | ||||
fMaker = info.Artists.c_str(); | fMaker = info.Artists.c_str(); | ||||
fFilename = filename; | |||||
pData->filename = filename; | |||||
if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) | if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) | ||||
fLabel += " (16 outs)"; | fLabel += " (16 outs)"; | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName((const char*)fRealName); | |||||
pData->name = pData->engine->getUniquePluginName((const char*)fRealName); | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// Register client | // Register client | ||||
@@ -1094,17 +1094,17 @@ public: | |||||
{ | { | ||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
fOptions |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
// load settings | // load settings | ||||
pData->idStr = kIsGIG ? "GIG" : "SFZ"; | pData->idStr = kIsGIG ? "GIG" : "SFZ"; | ||||
pData->idStr += "/"; | pData->idStr += "/"; | ||||
pData->idStr += label; | pData->idStr += label; | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
} | } | ||||
return true; | return true; | ||||
@@ -559,7 +559,7 @@ public: | |||||
if (LV2_IS_UTILITY(cat1, cat2)) | if (LV2_IS_UTILITY(cat1, cat2)) | ||||
return PLUGIN_CATEGORY_UTILITY; | return PLUGIN_CATEGORY_UTILITY; | ||||
return getPluginCategoryFromName(fName); | |||||
return getPluginCategoryFromName(pData->name); | |||||
} | } | ||||
long getUniqueId() const override | long getUniqueId() const override | ||||
@@ -643,7 +643,7 @@ public: | |||||
if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_FORCE_STEREO) | |||||
if (pData->options & PLUGIN_OPTION_FORCE_STEREO) | |||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | ||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
@@ -910,7 +910,7 @@ public: | |||||
{ | { | ||||
CarlaPlugin::setName(newName); | CarlaPlugin::setName(newName); | ||||
//QString guiTitle(QString("%1 (GUI)").arg((const char*)fName)); | |||||
//QString guiTitle(QString("%1 (GUI)").arg((const char*)pData->name)); | |||||
//if (pData->gui != nullptr) | //if (pData->gui != nullptr) | ||||
//pData->gui->setWindowTitle(guiTitle); | //pData->gui->setWindowTitle(guiTitle); | ||||
@@ -1136,8 +1136,8 @@ public: | |||||
{ | { | ||||
fUi.handle = nullptr; | fUi.handle = nullptr; | ||||
fUi.widget = nullptr; | fUi.widget = nullptr; | ||||
pData->engine->callback(ENGINE_CALLBACK_ERROR, fId, 0, 0, 0.0f, "Plugin refused to open its own UI"); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_ERROR, pData->id, 0, 0, 0.0f, "Plugin refused to open its own UI"); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0.0f, nullptr); | |||||
return; | return; | ||||
} | } | ||||
@@ -1198,8 +1198,8 @@ public: | |||||
delete pData->gui; | delete pData->gui; | ||||
pData->gui = nullptr; | pData->gui = nullptr; | ||||
pData->engine->callback(CALLBACK_ERROR, fId, 0, 0, 0.0f, "Plugin refused to open its own UI"); | |||||
pData->engine->callback(CALLBACK_SHOW_GUI, fId, -1, 0, 0.0f, nullptr); | |||||
pData->engine->callback(CALLBACK_ERROR, pData->id, 0, 0, 0.0f, "Plugin refused to open its own UI"); | |||||
pData->engine->callback(CALLBACK_SHOW_GUI, pData->id, -1, 0, 0.0f, nullptr); | |||||
return; | return; | ||||
} | } | ||||
@@ -1208,7 +1208,7 @@ public: | |||||
updateUi(); | updateUi(); | ||||
pData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)fName)); | |||||
pData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)pData->name)); | |||||
pData->gui->show(); | pData->gui->show(); | ||||
} | } | ||||
else | else | ||||
@@ -1271,7 +1271,7 @@ public: | |||||
if (fExt.uiidle != nullptr && fExt.uiidle->idle(fUi.handle) != 0) | if (fExt.uiidle != nullptr && fExt.uiidle->idle(fUi.handle) != 0) | ||||
{ | { | ||||
showCustomUI(false); | showCustomUI(false); | ||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -1376,7 +1376,7 @@ public: | |||||
fExt.worker = (const LV2_Worker_Interface*)fDescriptor->extension_data(LV2_WORKER__interface); | fExt.worker = (const LV2_Worker_Interface*)fDescriptor->extension_data(LV2_WORKER__interface); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1) && fExt.state == nullptr && fExt.worker == nullptr) | |||||
if ((pData->options & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1) && fExt.state == nullptr && fExt.worker == nullptr) | |||||
{ | { | ||||
if (fHandle2 == nullptr) | if (fHandle2 == nullptr) | ||||
fHandle2 = fDescriptor->instantiate(fDescriptor, sampleRate, fRdfDescriptor->Bundle, fFeatures); | fHandle2 = fDescriptor->instantiate(fDescriptor, sampleRate, fRdfDescriptor->Bundle, fFeatures); | ||||
@@ -1516,7 +1516,7 @@ public: | |||||
{ | { | ||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -2072,7 +2072,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -2088,7 +2088,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -2105,35 +2105,35 @@ public: | |||||
fEventsOut.ctrl->port = pData->event.portOut; | fEventsOut.ctrl->port = pData->event.portOut; | ||||
if (forcedStereoIn || forcedStereoOut) | if (forcedStereoIn || forcedStereoOut) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
else | else | ||||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
// plugin hints | // plugin hints | ||||
fHints = 0x0; | |||||
pData->hints = 0x0; | |||||
if (isRealtimeSafe()) | if (isRealtimeSafe()) | ||||
fHints |= PLUGIN_IS_RTSAFE; | |||||
pData->hints |= PLUGIN_IS_RTSAFE; | |||||
if (fUi.type != PLUGIN_UI_NULL) | if (fUi.type != PLUGIN_UI_NULL) | ||||
{ | { | ||||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||||
if (fUi.type == PLUGIN_UI_QT || fUi.type == PLUGIN_UI_PARENT) | if (fUi.type == PLUGIN_UI_QT || fUi.type == PLUGIN_UI_PARENT) | ||||
fHints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||||
pData->hints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||||
} | } | ||||
//if (LV2_IS_GENERATOR(fRdfDescriptor->Type[0], fRdfDescriptor->Type[1])) | //if (LV2_IS_GENERATOR(fRdfDescriptor->Type[0], fRdfDescriptor->Type[1])) | ||||
// fHints |= PLUGIN_IS_SYNTH; | |||||
// pData->hints |= PLUGIN_IS_SYNTH; | |||||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | ||||
fHints |= PLUGIN_CAN_DRYWET; | |||||
pData->hints |= PLUGIN_CAN_DRYWET; | |||||
if (aOuts > 0) | if (aOuts > 0) | ||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
if (aOuts >= 2 && aOuts % 2 == 0) | if (aOuts >= 2 && aOuts % 2 == 0) | ||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints &= ~PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | pData->extraHints &= ~PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | ||||
@@ -2215,10 +2215,10 @@ public: | |||||
// Update OSC Names | // Update OSC Names | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_midi_program_count(fId, count); | |||||
pData->engine->oscSend_control_set_midi_program_count(pData->id, count); | |||||
for (i=0; i < count; ++i) | for (i=0; i < count; ++i) | ||||
pData->engine->oscSend_control_set_midi_program_data(fId, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
pData->engine->oscSend_control_set_midi_program_data(pData->id, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -2280,7 +2280,7 @@ public: | |||||
if (programChanged) | if (programChanged) | ||||
setMidiProgram(pData->midiprog.current, true, true, true); | setMidiProgram(pData->midiprog.current, true, true, true); | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -2396,7 +2396,7 @@ public: | |||||
{ | { | ||||
k = fEventsIn.ctrlIndex; | k = fEventsIn.ctrlIndex; | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
for (i=0; i < MAX_MIDI_CHANNELS; ++i) | for (i=0; i < MAX_MIDI_CHANNELS; ++i) | ||||
{ | { | ||||
@@ -2670,7 +2670,7 @@ public: | |||||
// Event Input (System) | // Event Input (System) | ||||
bool allNotesOffSent = false; | bool allNotesOffSent = false; | ||||
bool sampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
bool sampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
uint32_t time, nEvents = (fEventsIn.ctrl->port != nullptr) ? fEventsIn.ctrl->port->getEventCount() : 0; | uint32_t time, nEvents = (fEventsIn.ctrl->port != nullptr) ? fEventsIn.ctrl->port->getEventCount() : 0; | ||||
uint32_t startTime = 0; | uint32_t startTime = 0; | ||||
@@ -2750,21 +2750,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -2823,7 +2823,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
uint8_t midiData[3]; | uint8_t midiData[3]; | ||||
midiData[0] = MIDI_STATUS_CONTROL_CHANGE + i; | midiData[0] = MIDI_STATUS_CONTROL_CHANGE + i; | ||||
@@ -2844,12 +2844,12 @@ public: | |||||
} | } | ||||
case kEngineControlEventTypeMidiBank: | case kEngineControlEventTypeMidiBank: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
nextBankId = ctrlEvent.param; | nextBankId = ctrlEvent.param; | ||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
const uint32_t nextProgramId = ctrlEvent.param; | const uint32_t nextProgramId = ctrlEvent.param; | ||||
@@ -2866,7 +2866,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
const uint32_t mtime(sampleAccurate ? startTime : time); | const uint32_t mtime(sampleAccurate ? startTime : time); | ||||
@@ -2887,7 +2887,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -2925,13 +2925,13 @@ public: | |||||
uint8_t channel = event.channel; | uint8_t channel = event.channel; | ||||
uint32_t mtime = sampleAccurate ? startTime : time; | uint32_t mtime = sampleAccurate ? startTime : time; | ||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
continue; | continue; | ||||
// Fix bad note-off | // Fix bad note-off | ||||
@@ -3204,8 +3204,8 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
bool isPair; | bool isPair; | ||||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | float bufValue, oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -3632,7 +3632,7 @@ protected: | |||||
// void guiClosedCallback() override | // void guiClosedCallback() override | ||||
// { | // { | ||||
// showGui(false); | // showGui(false); | ||||
// pData->engine->callback(CALLBACK_SHOW_GUI, fId, 0, 0, 0.0f, nullptr); | |||||
// pData->engine->callback(CALLBACK_SHOW_GUI, pData->id, 0, 0, 0.0f, nullptr); | |||||
// } | // } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -3701,9 +3701,9 @@ protected: | |||||
pData->midiprog.data[index].name = carla_strdup(progDesc->name ? progDesc->name : ""); | pData->midiprog.data[index].name = carla_strdup(progDesc->name ? progDesc->name : ""); | ||||
if (index == pData->midiprog.current) | if (index == pData->midiprog.current) | ||||
pData->engine->callback(ENGINE_CALLBACK_UPDATE, fId, 0, 0, 0.0, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UPDATE, pData->id, 0, 0, 0.0, nullptr); | |||||
else | else | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0, nullptr); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -3899,7 +3899,7 @@ protected: | |||||
fUi.handle = nullptr; | fUi.handle = nullptr; | ||||
fUi.widget = nullptr; | fUi.widget = nullptr; | ||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
uint32_t handleUiPortMap(const char* const symbol) | uint32_t handleUiPortMap(const char* const symbol) | ||||
@@ -4413,9 +4413,9 @@ public: | |||||
// get info | // get info | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName(fRdfDescriptor->Name); | |||||
pData->name = pData->engine->getUniquePluginName(fRdfDescriptor->Name); | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
@@ -4444,32 +4444,32 @@ public: | |||||
{ | { | ||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
if (getMidiInCount() > 0 || needsFixedBuffer()) | if (getMidiInCount() > 0 || needsFixedBuffer()) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
if (pData->engine->getOptions().forceStereo) | if (pData->engine->getOptions().forceStereo) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
if (getMidiInCount() > 0) | if (getMidiInCount() > 0) | ||||
{ | { | ||||
fOptions |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
fOptions |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
fOptions |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
} | } | ||||
// load settings | // load settings | ||||
pData->idStr = "LV2/"; | pData->idStr = "LV2/"; | ||||
pData->idStr += uri; | pData->idStr += uri; | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (getMidiInCount() > 0 || needsFixedBuffer()) | if (getMidiInCount() > 0 || needsFixedBuffer()) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
} | } | ||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
@@ -4488,7 +4488,7 @@ public: | |||||
//#ifdef BUILD_BRIDGE | //#ifdef BUILD_BRIDGE | ||||
// const bool preferUiBridges(pData->engine->getOptions().preferUiBridges); | // const bool preferUiBridges(pData->engine->getOptions().preferUiBridges); | ||||
//#else | //#else | ||||
// const bool preferUiBridges(pData->engine->getOptions().preferUiBridges && (fHints & PLUGIN_IS_BRIDGE) == 0); | |||||
// const bool preferUiBridges(pData->engine->getOptions().preferUiBridges && (pData->hints & PLUGIN_IS_BRIDGE) == 0); | |||||
//#endif | //#endif | ||||
for (uint32_t i=0; i < fRdfDescriptor->UICount; ++i) | for (uint32_t i=0; i < fRdfDescriptor->UICount; ++i) | ||||
@@ -4752,7 +4752,7 @@ public: | |||||
// ------------------------------------------------------- | // ------------------------------------------------------- | ||||
// initialize ui features (part 1) | // initialize ui features (part 1) | ||||
//QString guiTitle(QString("%1 (GUI)").arg((const char*)fName)); | |||||
//QString guiTitle(QString("%1 (GUI)").arg((const char*)pData->name)); | |||||
LV2_Extension_Data_Feature* const uiDataFt = new LV2_Extension_Data_Feature; | LV2_Extension_Data_Feature* const uiDataFt = new LV2_Extension_Data_Feature; | ||||
uiDataFt->data_access = fDescriptor->extension_data; | uiDataFt->data_access = fDescriptor->extension_data; | ||||
@@ -145,7 +145,7 @@ public: | |||||
carla_debug("NativePlugin::~NativePlugin()"); | carla_debug("NativePlugin::~NativePlugin()"); | ||||
// close UI | // close UI | ||||
if (fHints & PLUGIN_HAS_UI) | |||||
if (pData->hints & PLUGIN_HAS_UI) | |||||
{ | { | ||||
if (fIsUiVisible && fDescriptor != nullptr && fDescriptor->ui_show != nullptr && fHandle != nullptr) | if (fIsUiVisible && fDescriptor != nullptr && fDescriptor->ui_show != nullptr && fHandle != nullptr) | ||||
fDescriptor->ui_show(fHandle, false); | fDescriptor->ui_show(fHandle, false); | ||||
@@ -261,7 +261,7 @@ public: | |||||
if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | if (pData->engine->getProccessMode() != ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_FORCE_STEREO) | |||||
if (pData->options & PLUGIN_OPTION_FORCE_STEREO) | |||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | ||||
options |= PLUGIN_OPTION_FORCE_STEREO; | options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
@@ -571,7 +571,7 @@ public: | |||||
if (pData->ctrlChannel == static_cast<int32_t>(i)) | if (pData->ctrlChannel == static_cast<int32_t>(i)) | ||||
{ | { | ||||
pData->midiprog.current = index; | pData->midiprog.current = index; | ||||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, fId, index, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED, pData->id, index, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -603,7 +603,7 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast<int32_t>(pData->midiprog.count),); | CARLA_SAFE_ASSERT_RETURN(index >= -1 && index < static_cast<int32_t>(pData->midiprog.count),); | ||||
if ((fHints & PLUGIN_IS_SYNTH) != 0 && (pData->ctrlChannel < 0 || pData->ctrlChannel >= MAX_MIDI_CHANNELS)) | |||||
if ((pData->hints & PLUGIN_IS_SYNTH) != 0 && (pData->ctrlChannel < 0 || pData->ctrlChannel >= MAX_MIDI_CHANNELS)) | |||||
return; | return; | ||||
if (index >= 0) | if (index >= 0) | ||||
@@ -717,7 +717,7 @@ public: | |||||
mOuts = fDescriptor->midiOuts; | mOuts = fDescriptor->midiOuts; | ||||
params = (fDescriptor->get_parameter_count != nullptr && fDescriptor->get_parameter_info != nullptr) ? fDescriptor->get_parameter_count(fHandle) : 0; | params = (fDescriptor->get_parameter_count != nullptr && fDescriptor->get_parameter_info != nullptr) ? fDescriptor->get_parameter_count(fHandle) : 0; | ||||
if ((fOptions & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1) && mIns <= 1 && mOuts <= 1) | |||||
if ((pData->options & PLUGIN_OPTION_FORCE_STEREO) != 0 && (aIns == 1 || aOuts == 1) && mIns <= 1 && mOuts <= 1) | |||||
{ | { | ||||
if (fHandle2 == nullptr) | if (fHandle2 == nullptr) | ||||
fHandle2 = fDescriptor->instantiate(&fHost); | fHandle2 = fDescriptor->instantiate(&fHost); | ||||
@@ -784,7 +784,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -817,7 +817,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -852,7 +852,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -874,7 +874,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -996,7 +996,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -1012,7 +1012,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -1023,33 +1023,33 @@ public: | |||||
} | } | ||||
if (forcedStereoIn || forcedStereoOut) | if (forcedStereoIn || forcedStereoOut) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
else | else | ||||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||||
// plugin hints | // plugin hints | ||||
fHints = 0x0; | |||||
pData->hints = 0x0; | |||||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | ||||
fHints |= PLUGIN_CAN_DRYWET; | |||||
pData->hints |= PLUGIN_CAN_DRYWET; | |||||
if (aOuts > 0) | if (aOuts > 0) | ||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
if (aOuts >= 2 && aOuts % 2 == 0) | if (aOuts >= 2 && aOuts % 2 == 0) | ||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// native plugin hints | // native plugin hints | ||||
if (fDescriptor->hints & ::PLUGIN_IS_RTSAFE) | if (fDescriptor->hints & ::PLUGIN_IS_RTSAFE) | ||||
fHints |= PLUGIN_IS_RTSAFE; | |||||
pData->hints |= PLUGIN_IS_RTSAFE; | |||||
if (fDescriptor->hints & ::PLUGIN_IS_SYNTH) | if (fDescriptor->hints & ::PLUGIN_IS_SYNTH) | ||||
fHints |= PLUGIN_IS_SYNTH; | |||||
pData->hints |= PLUGIN_IS_SYNTH; | |||||
if (fDescriptor->hints & ::PLUGIN_HAS_UI) | if (fDescriptor->hints & ::PLUGIN_HAS_UI) | ||||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||||
if (fDescriptor->hints & ::PLUGIN_NEEDS_SINGLE_THREAD) | if (fDescriptor->hints & ::PLUGIN_NEEDS_SINGLE_THREAD) | ||||
fHints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||||
pData->hints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||||
if (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) | if (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) | ||||
fHints |= PLUGIN_NEEDS_FIXED_BUFFERS; | |||||
pData->hints |= PLUGIN_NEEDS_FIXED_BUFFERS; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints = 0x0; | pData->extraHints = 0x0; | ||||
@@ -1101,10 +1101,10 @@ public: | |||||
// Update OSC Names | // Update OSC Names | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_midi_program_count(fId, count); | |||||
pData->engine->oscSend_control_set_midi_program_count(pData->id, count); | |||||
for (i=0; i < count; ++i) | for (i=0; i < count; ++i) | ||||
pData->engine->oscSend_control_set_midi_program_data(fId, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
pData->engine->oscSend_control_set_midi_program_data(pData->id, i, pData->midiprog.data[i].bank, pData->midiprog.data[i].program, pData->midiprog.data[i].name); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -1151,7 +1151,7 @@ public: | |||||
if (programChanged) | if (programChanged) | ||||
setMidiProgram(pData->midiprog.current, true, true, true); | setMidiProgram(pData->midiprog.current, true, true, true); | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -1215,7 +1215,7 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | ||||
{ | { | ||||
@@ -1312,7 +1312,7 @@ public: | |||||
// Event Input (System) | // Event Input (System) | ||||
bool allNotesOffSent = false; | bool allNotesOffSent = false; | ||||
bool sampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
bool sampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
uint32_t time, nEvents = pData->event.portIn->getEventCount(); | uint32_t time, nEvents = pData->event.portIn->getEventCount(); | ||||
uint32_t startTime = 0; | uint32_t startTime = 0; | ||||
@@ -1378,21 +1378,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -1451,7 +1451,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
if (fMidiEventCount >= kPluginMaxMidiEvents*2) | if (fMidiEventCount >= kPluginMaxMidiEvents*2) | ||||
continue; | continue; | ||||
@@ -1470,12 +1470,12 @@ public: | |||||
} | } | ||||
case kEngineControlEventTypeMidiBank: | case kEngineControlEventTypeMidiBank: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
nextBankId = ctrlEvent.param; | nextBankId = ctrlEvent.param; | ||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel < MAX_MIDI_CHANNELS && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel < MAX_MIDI_CHANNELS && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
const uint32_t nextProgramId(ctrlEvent.param); | const uint32_t nextProgramId(ctrlEvent.param); | ||||
@@ -1500,7 +1500,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (fMidiEventCount >= kPluginMaxMidiEvents*2) | if (fMidiEventCount >= kPluginMaxMidiEvents*2) | ||||
continue; | continue; | ||||
@@ -1517,7 +1517,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -1553,13 +1553,13 @@ public: | |||||
uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | ||||
uint8_t channel = event.channel; | uint8_t channel = event.channel; | ||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
continue; | continue; | ||||
// Fix bad note-off | // Fix bad note-off | ||||
@@ -1734,8 +1734,8 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
bool isPair; | bool isPair; | ||||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | float bufValue, oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -2019,13 +2019,13 @@ protected: | |||||
bool handleWriteMidiEvent(const NativeMidiEvent* const event) | bool handleWriteMidiEvent(const NativeMidiEvent* const event) | ||||
{ | { | ||||
CARLA_ASSERT(fEnabled); | |||||
CARLA_ASSERT(pData->enabled); | |||||
CARLA_ASSERT(fIsProcessing); | CARLA_ASSERT(fIsProcessing); | ||||
CARLA_ASSERT(fMidiOut.count > 0 || pData->event.portOut != nullptr); | CARLA_ASSERT(fMidiOut.count > 0 || pData->event.portOut != nullptr); | ||||
CARLA_ASSERT(event != nullptr); | CARLA_ASSERT(event != nullptr); | ||||
CARLA_ASSERT(event->data[0] != 0); | CARLA_ASSERT(event->data[0] != 0); | ||||
if (! fEnabled) | |||||
if (! pData->enabled) | |||||
return false; | return false; | ||||
if (fMidiOut.count == 0) | if (fMidiOut.count == 0) | ||||
return false; | return false; | ||||
@@ -2064,7 +2064,7 @@ protected: | |||||
void handleUiClosed() | void handleUiClosed() | ||||
{ | { | ||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, 0, 0, 0.0f, nullptr); | |||||
fIsUiVisible = false; | fIsUiVisible = false; | ||||
} | } | ||||
@@ -2142,7 +2142,7 @@ protected: | |||||
case ::HOST_OPCODE_RELOAD_ALL: | case ::HOST_OPCODE_RELOAD_ALL: | ||||
break; | break; | ||||
case HOST_OPCODE_UI_UNAVAILABLE: | case HOST_OPCODE_UI_UNAVAILABLE: | ||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, fId, -1, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UI_STATE_CHANGED, pData->id, -1, 0, 0.0f, nullptr); | |||||
break; | break; | ||||
} | } | ||||
@@ -2226,40 +2226,40 @@ public: | |||||
// set icon | // set icon | ||||
if (std::strcmp(fDescriptor->label, "audiofile") == 0) | if (std::strcmp(fDescriptor->label, "audiofile") == 0) | ||||
fIconName = "file"; | |||||
pData->iconName = "file"; | |||||
else if (std::strcmp(fDescriptor->label, "midifile") == 0) | else if (std::strcmp(fDescriptor->label, "midifile") == 0) | ||||
fIconName = "file"; | |||||
pData->iconName = "file"; | |||||
else if (std::strcmp(fDescriptor->label, "sunvoxfile") == 0) | else if (std::strcmp(fDescriptor->label, "sunvoxfile") == 0) | ||||
fIconName = "file"; | |||||
pData->iconName = "file"; | |||||
else if (std::strcmp(fDescriptor->label, "3BandEQ") == 0) | else if (std::strcmp(fDescriptor->label, "3BandEQ") == 0) | ||||
fIconName = "distrho"; | |||||
pData->iconName = "distrho"; | |||||
else if (std::strcmp(fDescriptor->label, "3BandSplitter") == 0) | else if (std::strcmp(fDescriptor->label, "3BandSplitter") == 0) | ||||
fIconName = "distrho"; | |||||
pData->iconName = "distrho"; | |||||
else if (std::strcmp(fDescriptor->label, "Nekobi") == 0) | else if (std::strcmp(fDescriptor->label, "Nekobi") == 0) | ||||
fIconName = "distrho"; | |||||
pData->iconName = "distrho"; | |||||
else if (std::strcmp(fDescriptor->label, "Notes") == 0) | else if (std::strcmp(fDescriptor->label, "Notes") == 0) | ||||
fIconName = "distrho"; | |||||
pData->iconName = "distrho"; | |||||
else if (std::strcmp(fDescriptor->label, "PingPongPan") == 0) | else if (std::strcmp(fDescriptor->label, "PingPongPan") == 0) | ||||
fIconName = "distrho"; | |||||
pData->iconName = "distrho"; | |||||
else if (std::strcmp(fDescriptor->label, "StereoEnhancer") == 0) | else if (std::strcmp(fDescriptor->label, "StereoEnhancer") == 0) | ||||
fIconName = "distrho"; | |||||
pData->iconName = "distrho"; | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// get info | // get info | ||||
if (name != nullptr) | if (name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
else if (fDescriptor->name != nullptr) | else if (fDescriptor->name != nullptr) | ||||
fName = pData->engine->getUniquePluginName(fDescriptor->name); | |||||
pData->name = pData->engine->getUniquePluginName(fDescriptor->name); | |||||
else | else | ||||
fName = pData->engine->getUniquePluginName(label); | |||||
pData->name = pData->engine->getUniquePluginName(label); | |||||
{ | { | ||||
CARLA_ASSERT(fHost.uiName == nullptr); | CARLA_ASSERT(fHost.uiName == nullptr); | ||||
char uiName[fName.length()+6+1]; | |||||
std::strcpy(uiName, (const char*)fName); | |||||
char uiName[pData->name.length()+6+1]; | |||||
std::strcpy(uiName, (const char*)pData->name); | |||||
std::strcat(uiName, " (GUI)"); | std::strcat(uiName, " (GUI)"); | ||||
fHost.uiName = carla_strdup(uiName); | fHost.uiName = carla_strdup(uiName); | ||||
@@ -2294,34 +2294,34 @@ public: | |||||
const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0); | const bool hasMidiProgs(fDescriptor->get_midi_program_count != nullptr && fDescriptor->get_midi_program_count(fHandle) > 0); | ||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
if (hasMidiProgs && (fDescriptor->supports & ::PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) | if (hasMidiProgs && (fDescriptor->supports & ::PLUGIN_SUPPORTS_PROGRAM_CHANGES) == 0) | ||||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
if (pData->engine->getOptions().forceStereo) | if (pData->engine->getOptions().forceStereo) | ||||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_CHANNEL_PRESSURE) | if (fDescriptor->supports & ::PLUGIN_SUPPORTS_CHANNEL_PRESSURE) | ||||
fOptions |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_NOTE_AFTERTOUCH) | if (fDescriptor->supports & ::PLUGIN_SUPPORTS_NOTE_AFTERTOUCH) | ||||
fOptions |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_PITCHBEND) | if (fDescriptor->supports & ::PLUGIN_SUPPORTS_PITCHBEND) | ||||
fOptions |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_ALL_SOUND_OFF) | if (fDescriptor->supports & ::PLUGIN_SUPPORTS_ALL_SOUND_OFF) | ||||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
// load settings | // load settings | ||||
pData->idStr = "Native/"; | pData->idStr = "Native/"; | ||||
pData->idStr += label; | pData->idStr += label; | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
} | } | ||||
return true; | return true; | ||||
@@ -72,7 +72,7 @@ public: | |||||
carla_debug("VstPlugin::~VstPlugin()"); | carla_debug("VstPlugin::~VstPlugin()"); | ||||
// close UI | // close UI | ||||
if (fHints & PLUGIN_HAS_CUSTOM_UI) | |||||
if (pData->hints & PLUGIN_HAS_CUSTOM_UI) | |||||
{ | { | ||||
showCustomUI(false); | showCustomUI(false); | ||||
@@ -147,7 +147,7 @@ public: | |||||
if (fEffect->flags & effFlagsIsSynth) | if (fEffect->flags & effFlagsIsSynth) | ||||
return PLUGIN_CATEGORY_SYNTH; | return PLUGIN_CATEGORY_SYNTH; | ||||
return getPluginCategoryFromName(fName); | |||||
return getPluginCategoryFromName(pData->name); | |||||
} | } | ||||
long getUniqueId() const override | long getUniqueId() const override | ||||
@@ -167,7 +167,7 @@ public: | |||||
int32_t getChunkData(void** const dataPtr) const override | int32_t getChunkData(void** const dataPtr) const override | ||||
{ | { | ||||
CARLA_ASSERT(fOptions & PLUGIN_OPTION_USE_CHUNKS); | |||||
CARLA_ASSERT(pData->options & PLUGIN_OPTION_USE_CHUNKS); | |||||
CARLA_ASSERT(fEffect != nullptr); | CARLA_ASSERT(fEffect != nullptr); | ||||
CARLA_ASSERT(dataPtr != nullptr); | CARLA_ASSERT(dataPtr != nullptr); | ||||
@@ -194,7 +194,7 @@ public: | |||||
if (fEffect->flags & effFlagsProgramChunks) | if (fEffect->flags & effFlagsProgramChunks) | ||||
options |= PLUGIN_OPTION_USE_CHUNKS; | options |= PLUGIN_OPTION_USE_CHUNKS; | ||||
if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (fHints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
{ | { | ||||
options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | ||||
options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | ||||
@@ -289,7 +289,7 @@ public: | |||||
CarlaPlugin::setName(newName); | CarlaPlugin::setName(newName); | ||||
//if (pData->gui != nullptr) | //if (pData->gui != nullptr) | ||||
// pData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)fName)); | |||||
// pData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)pData->name)); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -309,7 +309,7 @@ public: | |||||
void setChunkData(const char* const stringData) override | void setChunkData(const char* const stringData) override | ||||
{ | { | ||||
CARLA_ASSERT(fOptions & PLUGIN_OPTION_USE_CHUNKS); | |||||
CARLA_ASSERT(pData->options & PLUGIN_OPTION_USE_CHUNKS); | |||||
CARLA_ASSERT(fEffect != nullptr); | CARLA_ASSERT(fEffect != nullptr); | ||||
CARLA_ASSERT(stringData != nullptr); | CARLA_ASSERT(stringData != nullptr); | ||||
@@ -427,7 +427,7 @@ public: | |||||
pData->gui->setSize(fGui.lastWidth, fGui.lastHeight); | pData->gui->setSize(fGui.lastWidth, fGui.lastHeight); | ||||
} | } | ||||
pData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)fName)); | |||||
pData->gui->setWindowTitle(QString("%1 (GUI)").arg((const char*)pData->name)); | |||||
pData->gui->show(); | pData->gui->show(); | ||||
} | } | ||||
else | else | ||||
@@ -440,8 +440,8 @@ public: | |||||
pData->gui = nullptr; | pData->gui = nullptr; | ||||
} | } | ||||
pData->engine->callback(CALLBACK_ERROR, fId, 0, 0, 0.0f, "Plugin refused to open its own UI"); | |||||
pData->engine->callback(CALLBACK_SHOW_GUI, fId, -1, 0, 0.0f, nullptr); | |||||
pData->engine->callback(CALLBACK_ERROR, pData->id, 0, 0, 0.0f, "Plugin refused to open its own UI"); | |||||
pData->engine->callback(CALLBACK_SHOW_GUI, pData->id, -1, 0, 0.0f, nullptr); | |||||
return; | return; | ||||
} | } | ||||
} | } | ||||
@@ -517,7 +517,7 @@ public: | |||||
aOuts = fEffect->numOutputs; | aOuts = fEffect->numOutputs; | ||||
params = fEffect->numParams; | params = fEffect->numParams; | ||||
if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (fHints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
{ | { | ||||
mIns = 1; | mIns = 1; | ||||
needsCtrlIn = true; | needsCtrlIn = true; | ||||
@@ -560,7 +560,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -585,7 +585,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -616,7 +616,7 @@ public: | |||||
VstParameterProperties prop; | VstParameterProperties prop; | ||||
carla_zeroStruct<VstParameterProperties>(prop); | carla_zeroStruct<VstParameterProperties>(prop); | ||||
if (fHints & PLUGIN_HAS_COCKOS_EXTENSIONS) | |||||
if (pData->hints & PLUGIN_HAS_COCKOS_EXTENSIONS) | |||||
{ | { | ||||
double range[2] = { 0.0, 1.0 }; | double range[2] = { 0.0, 1.0 }; | ||||
@@ -725,7 +725,7 @@ public: | |||||
pData->param.data[j].hints |= PARAMETER_USES_CUSTOM_TEXT; | pData->param.data[j].hints |= PARAMETER_USES_CUSTOM_TEXT; | ||||
#endif | #endif | ||||
if ((fHints & PLUGIN_USES_OLD_VSTSDK) != 0 || dispatcher(effCanBeAutomated, j, 0, nullptr, 0.0f) == 1) | |||||
if ((pData->hints & PLUGIN_USES_OLD_VSTSDK) != 0 || dispatcher(effCanBeAutomated, j, 0, nullptr, 0.0f) == 1) | |||||
pData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE; | pData->param.data[j].hints |= PARAMETER_IS_AUTOMABLE; | ||||
// no such thing as VST default parameters | // no such thing as VST default parameters | ||||
@@ -750,7 +750,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -766,7 +766,7 @@ public: | |||||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | ||||
{ | { | ||||
portName = fName; | |||||
portName = pData->name; | |||||
portName += ":"; | portName += ":"; | ||||
} | } | ||||
@@ -779,36 +779,36 @@ public: | |||||
// plugin hints | // plugin hints | ||||
const intptr_t vstCategory = dispatcher(effGetPlugCategory, 0, 0, nullptr, 0.0f); | const intptr_t vstCategory = dispatcher(effGetPlugCategory, 0, 0, nullptr, 0.0f); | ||||
fHints = 0x0; | |||||
pData->hints = 0x0; | |||||
//if (vstCategory == kPlugCategSynth || vstCategory == kPlugCategGenerator) | //if (vstCategory == kPlugCategSynth || vstCategory == kPlugCategGenerator) | ||||
// fHints |= PLUGIN_IS_SYNTH; | |||||
// pData->hints |= PLUGIN_IS_SYNTH; | |||||
if (fEffect->flags & effFlagsHasEditor) | if (fEffect->flags & effFlagsHasEditor) | ||||
{ | { | ||||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||||
if (! fGui.isOsc) | if (! fGui.isOsc) | ||||
fHints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||||
pData->hints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||||
} | } | ||||
if (dispatcher(effGetVstVersion, 0, 0, nullptr, 0.0f) < kVstVersion) | if (dispatcher(effGetVstVersion, 0, 0, nullptr, 0.0f) < kVstVersion) | ||||
fHints |= PLUGIN_USES_OLD_VSTSDK; | |||||
pData->hints |= PLUGIN_USES_OLD_VSTSDK; | |||||
if ((fEffect->flags & effFlagsCanReplacing) != 0 && fEffect->processReplacing != fEffect->process) | if ((fEffect->flags & effFlagsCanReplacing) != 0 && fEffect->processReplacing != fEffect->process) | ||||
fHints |= PLUGIN_CAN_PROCESS_REPLACING; | |||||
pData->hints |= PLUGIN_CAN_PROCESS_REPLACING; | |||||
if (static_cast<uintptr_t>(dispatcher(effCanDo, 0, 0, (void*)"hasCockosExtensions", 0.0f)) == 0xbeef0000) | if (static_cast<uintptr_t>(dispatcher(effCanDo, 0, 0, (void*)"hasCockosExtensions", 0.0f)) == 0xbeef0000) | ||||
fHints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||||
pData->hints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | ||||
fHints |= PLUGIN_CAN_DRYWET; | |||||
pData->hints |= PLUGIN_CAN_DRYWET; | |||||
if (aOuts > 0) | if (aOuts > 0) | ||||
fHints |= PLUGIN_CAN_VOLUME; | |||||
pData->hints |= PLUGIN_CAN_VOLUME; | |||||
if (aOuts >= 2 && aOuts % 2 == 0) | if (aOuts >= 2 && aOuts % 2 == 0) | ||||
fHints |= PLUGIN_CAN_BALANCE; | |||||
pData->hints |= PLUGIN_CAN_BALANCE; | |||||
// extra plugin hints | // extra plugin hints | ||||
pData->extraHints = 0x0; | pData->extraHints = 0x0; | ||||
@@ -829,7 +829,7 @@ public: | |||||
} | } | ||||
// check latency | // check latency | ||||
if (fHints & PLUGIN_CAN_DRYWET) | |||||
if (pData->hints & PLUGIN_CAN_DRYWET) | |||||
{ | { | ||||
#ifdef VESTIGE_HEADER | #ifdef VESTIGE_HEADER | ||||
char* const empty3Ptr = &fEffect->empty3[0]; | char* const empty3Ptr = &fEffect->empty3[0]; | ||||
@@ -899,10 +899,10 @@ public: | |||||
// Update OSC Names | // Update OSC Names | ||||
if (pData->engine->isOscControlRegistered()) | if (pData->engine->isOscControlRegistered()) | ||||
{ | { | ||||
pData->engine->oscSend_control_set_program_count(fId, count); | |||||
pData->engine->oscSend_control_set_program_count(pData->id, count); | |||||
for (i=0; i < count; ++i) | for (i=0; i < count; ++i) | ||||
pData->engine->oscSend_control_set_program_name(fId, i, pData->prog.names[i]); | |||||
pData->engine->oscSend_control_set_program_name(pData->id, i, pData->prog.names[i]); | |||||
} | } | ||||
#endif | #endif | ||||
@@ -957,7 +957,7 @@ public: | |||||
dispatcher(effSetProgram, 0, pData->prog.current, nullptr, 0.0f); | dispatcher(effSetProgram, 0, pData->prog.current, nullptr, 0.0f); | ||||
} | } | ||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_RELOAD_PROGRAMS, pData->id, 0, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
@@ -1005,7 +1005,7 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | for (k=0, i=MAX_MIDI_CHANNELS; k < MAX_MIDI_CHANNELS; ++k) | ||||
{ | { | ||||
@@ -1145,7 +1145,7 @@ public: | |||||
// Event Input (System) | // Event Input (System) | ||||
bool allNotesOffSent = false; | bool allNotesOffSent = false; | ||||
bool sampleAccurate = (fOptions & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
bool sampleAccurate = (pData->options & PLUGIN_OPTION_FIXED_BUFFERS) == 0; | |||||
uint32_t time, nEvents = pData->event.portIn->getEventCount(); | uint32_t time, nEvents = pData->event.portIn->getEventCount(); | ||||
uint32_t startTime = 0; | uint32_t startTime = 0; | ||||
@@ -1202,21 +1202,21 @@ public: | |||||
{ | { | ||||
float value; | float value; | ||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (fHints & PLUGIN_CAN_DRYWET) > 0) | |||||
if (MIDI_IS_CONTROL_BREATH_CONTROLLER(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_DRYWET) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value; | value = ctrlEvent.value; | ||||
setDryWet(value, false, false); | setDryWet(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_DRYWET, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (fHints & PLUGIN_CAN_VOLUME) > 0) | |||||
if (MIDI_IS_CONTROL_CHANNEL_VOLUME(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_VOLUME) > 0) | |||||
{ | { | ||||
value = ctrlEvent.value*127.0f/100.0f; | value = ctrlEvent.value*127.0f/100.0f; | ||||
setVolume(value, false, false); | setVolume(value, false, false); | ||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, PARAMETER_VOLUME, 0, value); | ||||
} | } | ||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (fHints & PLUGIN_CAN_BALANCE) > 0) | |||||
if (MIDI_IS_CONTROL_BALANCE(ctrlEvent.param) && (pData->hints & PLUGIN_CAN_BALANCE) > 0) | |||||
{ | { | ||||
float left, right; | float left, right; | ||||
value = ctrlEvent.value/0.5f - 1.0f; | value = ctrlEvent.value/0.5f - 1.0f; | ||||
@@ -1275,7 +1275,7 @@ public: | |||||
pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | pData->postponeRtEvent(kPluginPostRtEventParameterChange, static_cast<int32_t>(k), 0, value); | ||||
} | } | ||||
if ((fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
if ((pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) != 0 && ctrlEvent.param <= 0x5F) | |||||
{ | { | ||||
if (fMidiEventCount >= kPluginMaxMidiEvents*2) | if (fMidiEventCount >= kPluginMaxMidiEvents*2) | ||||
continue; | continue; | ||||
@@ -1299,7 +1299,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeMidiProgram: | case kEngineControlEventTypeMidiProgram: | ||||
if (event.channel == pData->ctrlChannel && (fOptions & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
if (event.channel == pData->ctrlChannel && (pData->options & PLUGIN_OPTION_MAP_PROGRAM_CHANGES) != 0) | |||||
{ | { | ||||
if (ctrlEvent.param < pData->prog.count) | if (ctrlEvent.param < pData->prog.count) | ||||
{ | { | ||||
@@ -1311,7 +1311,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllSoundOff: | case kEngineControlEventTypeAllSoundOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (fMidiEventCount >= kPluginMaxMidiEvents*2) | if (fMidiEventCount >= kPluginMaxMidiEvents*2) | ||||
continue; | continue; | ||||
@@ -1329,7 +1329,7 @@ public: | |||||
break; | break; | ||||
case kEngineControlEventTypeAllNotesOff: | case kEngineControlEventTypeAllNotesOff: | ||||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||||
{ | { | ||||
if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | if (event.channel == pData->ctrlChannel && ! allNotesOffSent) | ||||
{ | { | ||||
@@ -1366,13 +1366,13 @@ public: | |||||
uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | ||||
uint8_t channel = event.channel; | uint8_t channel = event.channel; | ||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (fOptions & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
if (MIDI_IS_STATUS_CHANNEL_PRESSURE(status) && (pData->options & PLUGIN_OPTION_SEND_CHANNEL_PRESSURE) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (fOptions & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
if (MIDI_IS_STATUS_CONTROL_CHANGE(status) && (pData->options & PLUGIN_OPTION_SEND_CONTROL_CHANGES) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (fOptions & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
if (MIDI_IS_STATUS_POLYPHONIC_AFTERTOUCH(status) && (pData->options & PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH) == 0) | |||||
continue; | continue; | ||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (fOptions & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
if (MIDI_IS_STATUS_PITCH_WHEEL_CONTROL(status) && (pData->options & PLUGIN_OPTION_SEND_PITCHBEND) == 0) | |||||
continue; | continue; | ||||
// Fix bad note-off | // Fix bad note-off | ||||
@@ -1508,7 +1508,7 @@ public: | |||||
fIsProcessing = true; | fIsProcessing = true; | ||||
if (fHints & PLUGIN_CAN_PROCESS_REPLACING) | |||||
if (pData->hints & PLUGIN_CAN_PROCESS_REPLACING) | |||||
{ | { | ||||
fEffect->processReplacing(fEffect, | fEffect->processReplacing(fEffect, | ||||
(pData->audioIn.count > 0) ? vstInBuffer : nullptr, | (pData->audioIn.count > 0) ? vstInBuffer : nullptr, | ||||
@@ -1541,9 +1541,9 @@ public: | |||||
// Post-processing (dry/wet, volume and balance) | // Post-processing (dry/wet, volume and balance) | ||||
{ | { | ||||
const bool doVolume = (fHints & PLUGIN_CAN_VOLUME) != 0 && pData->postProc.volume != 1.0f; | |||||
const bool doDryWet = (fHints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (fHints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
const bool doVolume = (pData->hints & PLUGIN_CAN_VOLUME) != 0 && pData->postProc.volume != 1.0f; | |||||
const bool doDryWet = (pData->hints & PLUGIN_CAN_DRYWET) != 0 && pData->postProc.dryWet != 1.0f; | |||||
const bool doBalance = (pData->hints & PLUGIN_CAN_BALANCE) != 0 && (pData->postProc.balanceLeft != -1.0f || pData->postProc.balanceRight != 1.0f); | |||||
bool isPair; | bool isPair; | ||||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | float bufValue, oldBufLeft[doBalance ? frames : 1]; | ||||
@@ -1733,7 +1733,7 @@ protected: | |||||
// void guiClosedCallback() override | // void guiClosedCallback() override | ||||
// { | // { | ||||
// showGui(false); | // showGui(false); | ||||
// pData->engine->callback(CALLBACK_SHOW_GUI, fId, 0, 0, 0.0f, nullptr); | |||||
// pData->engine->callback(CALLBACK_SHOW_GUI, pData->id, 0, 0, 0.0f, nullptr); | |||||
// } | // } | ||||
intptr_t dispatcher(int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) const | intptr_t dispatcher(int32_t opcode, int32_t index, intptr_t value, void* ptr, float opt) const | ||||
@@ -1787,7 +1787,7 @@ protected: | |||||
switch (opcode) | switch (opcode) | ||||
{ | { | ||||
case audioMasterAutomate: | case audioMasterAutomate: | ||||
if (! fEnabled) | |||||
if (! pData->enabled) | |||||
break; | break; | ||||
// plugins should never do this: | // plugins should never do this: | ||||
@@ -1840,7 +1840,7 @@ protected: | |||||
case audioMasterWantMidi: | case audioMasterWantMidi: | ||||
// Deprecated in VST SDK 2.4 | // Deprecated in VST SDK 2.4 | ||||
fHints |= PLUGIN_WANTS_MIDI_INPUT; | |||||
pData->hints |= PLUGIN_WANTS_MIDI_INPUT; | |||||
break; | break; | ||||
#endif | #endif | ||||
@@ -1853,12 +1853,12 @@ protected: | |||||
break; | break; | ||||
case audioMasterProcessEvents: | case audioMasterProcessEvents: | ||||
CARLA_ASSERT(fEnabled); | |||||
CARLA_ASSERT(pData->enabled); | |||||
CARLA_ASSERT(fIsProcessing); | CARLA_ASSERT(fIsProcessing); | ||||
CARLA_ASSERT(pData->event.portOut != nullptr); | CARLA_ASSERT(pData->event.portOut != nullptr); | ||||
CARLA_ASSERT(ptr != nullptr); | CARLA_ASSERT(ptr != nullptr); | ||||
if (! fEnabled) | |||||
if (! pData->enabled) | |||||
return 0; | return 0; | ||||
if (! fIsProcessing) | if (! fIsProcessing) | ||||
return 0; | return 0; | ||||
@@ -1928,11 +1928,11 @@ protected: | |||||
#if 0 | #if 0 | ||||
case audioMasterIOChanged: | case audioMasterIOChanged: | ||||
CARLA_ASSERT(fEnabled); | |||||
CARLA_ASSERT(pData->enabled); | |||||
// TESTING | // TESTING | ||||
if (! fEnabled) | |||||
if (! pData->enabled) | |||||
{ | { | ||||
ret = 1; | ret = 1; | ||||
break; | break; | ||||
@@ -2094,12 +2094,12 @@ protected: | |||||
if (pData->prog.current != current) | if (pData->prog.current != current) | ||||
{ | { | ||||
pData->prog.current = current; | pData->prog.current = current; | ||||
pData->engine->callback(ENGINE_CALLBACK_PROGRAM_CHANGED, fId, current, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_PROGRAM_CHANGED, pData->id, current, 0, 0.0f, nullptr); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
pData->engine->callback(ENGINE_CALLBACK_UPDATE, fId, 0, 0, 0.0f, nullptr); | |||||
pData->engine->callback(ENGINE_CALLBACK_UPDATE, pData->id, 0, 0, 0.0f, nullptr); | |||||
ret = 1; | ret = 1; | ||||
break; | break; | ||||
@@ -2224,7 +2224,7 @@ public: | |||||
if (name != nullptr) | if (name != nullptr) | ||||
{ | { | ||||
fName = pData->engine->getUniquePluginName(name); | |||||
pData->name = pData->engine->getUniquePluginName(name); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -2233,16 +2233,16 @@ public: | |||||
if (strBuf[0] != '\0') | if (strBuf[0] != '\0') | ||||
{ | { | ||||
fName = pData->engine->getUniquePluginName(strBuf); | |||||
pData->name = pData->engine->getUniquePluginName(strBuf); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
const char* const label = std::strrchr(filename, OS_SEP)+1; | const char* const label = std::strrchr(filename, OS_SEP)+1; | ||||
fName = pData->engine->getUniquePluginName(label); | |||||
pData->name = pData->engine->getUniquePluginName(label); | |||||
} | } | ||||
} | } | ||||
fFilename = filename; | |||||
pData->filename = filename; | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// register client | // register client | ||||
@@ -2266,10 +2266,10 @@ public: | |||||
dispatcher(effSetProcessPrecision, 0, kVstProcessPrecision32, nullptr, 0.0f); | dispatcher(effSetProcessPrecision, 0, kVstProcessPrecision32, nullptr, 0.0f); | ||||
if (dispatcher(effGetVstVersion, 0, 0, nullptr, 0.0f) < kVstVersion) | if (dispatcher(effGetVstVersion, 0, 0, nullptr, 0.0f) < kVstVersion) | ||||
fHints |= PLUGIN_USES_OLD_VSTSDK; | |||||
pData->hints |= PLUGIN_USES_OLD_VSTSDK; | |||||
if (static_cast<uintptr_t>(dispatcher(effCanDo, 0, 0, (void*)"hasCockosExtensions", 0.0f)) == 0xbeef0000) | if (static_cast<uintptr_t>(dispatcher(effCanDo, 0, 0, (void*)"hasCockosExtensions", 0.0f)) == 0xbeef0000) | ||||
fHints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||||
pData->hints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
// gui stuff | // gui stuff | ||||
@@ -2300,22 +2300,22 @@ public: | |||||
{ | { | ||||
// set default options | // set default options | ||||
fOptions = 0x0; | |||||
pData->options = 0x0; | |||||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||||
if (getMidiInCount() > 0) | if (getMidiInCount() > 0) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
if (fEffect->flags & effFlagsProgramChunks) | if (fEffect->flags & effFlagsProgramChunks) | ||||
fOptions |= PLUGIN_OPTION_USE_CHUNKS; | |||||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||||
if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (fHints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
if (vstPluginCanDo(fEffect, "receiveVstEvents") || vstPluginCanDo(fEffect, "receiveVstMidiEvent") || (fEffect->flags & effFlagsIsSynth) > 0 || (pData->hints & PLUGIN_WANTS_MIDI_INPUT)) | |||||
{ | { | ||||
fOptions |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
fOptions |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
fOptions |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
pData->options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE; | |||||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||||
} | } | ||||
// load settings | // load settings | ||||
@@ -2323,11 +2323,11 @@ public: | |||||
//pData->idStr += std::strrchr(filename, OS_SEP)+1; // FIXME! | //pData->idStr += std::strrchr(filename, OS_SEP)+1; // FIXME! | ||||
//pData->idStr += "/"; | //pData->idStr += "/"; | ||||
pData->idStr += CarlaString(getUniqueId()); | pData->idStr += CarlaString(getUniqueId()); | ||||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (getMidiInCount() > 0) | if (getMidiInCount() > 0) | ||||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||||
} | } | ||||
return true; | return true; | ||||
@@ -397,7 +397,7 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||||
#endif | #endif | ||||
// TODO: make this an option, put somewhere else | // TODO: make this an option, put somewhere else | ||||
if (getenv("WINE_RT") == nullptr) | |||||
if (std::getenv("WINE_RT") == nullptr) | |||||
{ | { | ||||
carla_setenv("WINE_RT", "15"); | carla_setenv("WINE_RT", "15"); | ||||
carla_setenv("WINE_SVR_RT", "10"); | carla_setenv("WINE_SVR_RT", "10"); | ||||
@@ -570,28 +570,22 @@ void carla_set_engine_callback(EngineCallbackFunc func, void* ptr) | |||||
//#endif | //#endif | ||||
} | } | ||||
#if 0 | |||||
#if 0 | |||||
void carla_set_engine_option(CarlaEngineOption option, int value, const char* valueStr) | |||||
void carla_set_engine_option(EngineOption option, int value, const char* valueStr) | |||||
{ | { | ||||
carla_debug("carla_set_engine_option(%i:%s, %i, \"%s\")", option, CB::EngineOption2Str(option), value, valueStr); | carla_debug("carla_set_engine_option(%i:%s, %i, \"%s\")", option, CB::EngineOption2Str(option), value, valueStr); | ||||
switch (option) | switch (option) | ||||
{ | { | ||||
case CB::ENGINE_OPTION_PROCESS_NAME: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
#ifdef USE_JUCE | |||||
juce::Thread::setCurrentThreadName(valueStr); | |||||
#endif | |||||
case CB::ENGINE_OPTION_DEBUG: | |||||
break; | break; | ||||
case CB::ENGINE_OPTION_PROCESS_MODE: | case CB::ENGINE_OPTION_PROCESS_MODE: | ||||
CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_PROCESS_MODE_SINGLE_CLIENT && value <= CB::ENGINE_PROCESS_MODE_BRIDGE,); | |||||
CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_PROCESS_MODE_SINGLE_CLIENT && value < CB::ENGINE_PROCESS_MODE_BRIDGE,); | |||||
gStandalone.engineOptions.processMode = static_cast<CB::EngineProcessMode>(value); | gStandalone.engineOptions.processMode = static_cast<CB::EngineProcessMode>(value); | ||||
break; | break; | ||||
case CB::ENGINE_OPTION_TRANSPORT_MODE: | case CB::ENGINE_OPTION_TRANSPORT_MODE: | ||||
CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_TRANSPORT_MODE_INTERNAL && value <= CB::ENGINE_TRANSPORT_MODE_BRIDGE,); | |||||
CARLA_SAFE_ASSERT_RETURN(value >= CB::ENGINE_TRANSPORT_MODE_INTERNAL && value < CB::ENGINE_TRANSPORT_MODE_BRIDGE,); | |||||
gStandalone.engineOptions.transportMode = static_cast<CB::EngineTransportMode>(value); | gStandalone.engineOptions.transportMode = static_cast<CB::EngineTransportMode>(value); | ||||
break; | break; | ||||
@@ -626,7 +620,7 @@ void carla_set_engine_option(CarlaEngineOption option, int value, const char* va | |||||
break; | break; | ||||
case CB::ENGINE_OPTION_AUDIO_NUM_PERIODS: | case CB::ENGINE_OPTION_AUDIO_NUM_PERIODS: | ||||
CARLA_SAFE_ASSERT_RETURN(value == 2 || value == 3,); | |||||
CARLA_SAFE_ASSERT_RETURN(value >= 2 && value <= 3,); | |||||
gStandalone.engineOptions.audioNumPeriods = static_cast<unsigned int>(value); | gStandalone.engineOptions.audioNumPeriods = static_cast<unsigned int>(value); | ||||
break; | break; | ||||
@@ -645,101 +639,15 @@ void carla_set_engine_option(CarlaEngineOption option, int value, const char* va | |||||
gStandalone.engineOptions.audioDevice = valueStr; | gStandalone.engineOptions.audioDevice = valueStr; | ||||
break; | break; | ||||
case CB::ENGINE_OPTION_PATH_RESOURCES: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.resourceDir = valueStr; | |||||
break; | |||||
#ifndef BUILD_BRIDGE | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_NATIVE: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_native = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_POSIX32: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_posix32 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_POSIX64: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_posix64 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_WIN32: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_win32 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_WIN64: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_win64 = valueStr; | |||||
break; | |||||
#endif | |||||
#ifdef WANT_LV2 | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_EXTERNAL: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Extrn = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_GTK2: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Gtk2 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_GTK3: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Gtk3 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_NTK: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Ntk = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_QT4: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Qt4 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_QT5: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Qt5 = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_COCOA: | |||||
case CB::ENGINE_OPTION_PATH_BINARIES: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | ||||
gStandalone.engineOptions.bridge_lv2Cocoa = valueStr; | |||||
gStandalone.engineOptions.binaryDir = valueStr; | |||||
break; | break; | ||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_WINDOWS: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2Win = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_LV2_X11: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_lv2X11 = valueStr; | |||||
break; | |||||
#endif | |||||
#ifdef WANT_VST | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_VST_MAC: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_vstMac = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_VST_HWND: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | |||||
gStandalone.engineOptions.bridge_vstHWND = valueStr; | |||||
break; | |||||
case CB::ENGINE_OPTION_PATH_BRIDGE_VST_X11: | |||||
case CB::ENGINE_OPTION_PATH_RESOURCES: | |||||
CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(valueStr != nullptr && valueStr[0] != '\0',); | ||||
gStandalone.engineOptions.bridge_vstX11 = valueStr; | |||||
gStandalone.engineOptions.resourceDir = valueStr; | |||||
break; | break; | ||||
#endif | |||||
} | } | ||||
if (gStandalone.engine != nullptr) | if (gStandalone.engine != nullptr) | ||||
@@ -748,45 +656,43 @@ void carla_set_engine_option(CarlaEngineOption option, int value, const char* va | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
void carla_set_file_callback(CarlaFileCallbackFunc func, void* ptr) | |||||
void carla_set_file_callback(FileCallbackFunc func, void* ptr) | |||||
{ | { | ||||
carla_debug("carla_set_file_callback(%p, %p)", func, ptr); | carla_debug("carla_set_file_callback(%p, %p)", func, ptr); | ||||
gFileHandler.callback = func; | |||||
gFileHandler.callbackPtr = ptr; | |||||
gStandalone.fileCallback = func; | |||||
gStandalone.fileCallbackPtr = ptr; | |||||
} | } | ||||
const char* carla_file_callback(CarlaFileCallbackOpcode action, bool isDir, const char* title, const char* filter) | |||||
const char* carla_file_callback(FileCallbackOpcode action, bool isDir, const char* title, const char* filter) | |||||
{ | { | ||||
if (gFileHandler.callback == nullptr) | |||||
if (gStandalone.fileCallback == nullptr) | |||||
return nullptr; | return nullptr; | ||||
return gFileHandler.callback(gFileHandler.callbackPtr, action, isDir, title, filter); | |||||
return gStandalone.fileCallback(gStandalone.fileCallbackPtr, action, isDir, title, filter); | |||||
} | } | ||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
#endif | |||||
bool carla_load_filename(const char* filename) | |||||
bool carla_load_file(const char* filename) | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | ||||
carla_debug("carla_load_filename(\"%s\")", filename); | |||||
carla_debug("carla_load_file(\"%s\")", filename); | |||||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||||
return gStandalone.engine->loadFilename(filename); | |||||
if (gStandalone.engine != nullptr) | |||||
return gStandalone.engine->loadFile(filename); | |||||
carla_stderr2("Engine is not running"); | carla_stderr2("Engine is not running"); | ||||
gStandalone.lastError = "Engine is not running"; | gStandalone.lastError = "Engine is not running"; | ||||
return false; | return false; | ||||
} | } | ||||
#if 0 | |||||
bool carla_load_project(const char* filename) | bool carla_load_project(const char* filename) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | ||||
carla_debug("carla_load_project(\"%s\")", filename); | carla_debug("carla_load_project(\"%s\")", filename); | ||||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||||
if (gStandalone.engine != nullptr) | |||||
return gStandalone.engine->loadProject(filename); | return gStandalone.engine->loadProject(filename); | ||||
carla_stderr2("Engine is not running"); | carla_stderr2("Engine is not running"); | ||||
@@ -799,7 +705,6 @@ bool carla_save_project(const char* filename) | |||||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | ||||
carla_debug("carla_save_project(\"%s\")", filename); | carla_debug("carla_save_project(\"%s\")", filename); | ||||
// allow to save even if engine isn't running | |||||
if (gStandalone.engine != nullptr) | if (gStandalone.engine != nullptr) | ||||
return gStandalone.engine->saveProject(filename); | return gStandalone.engine->saveProject(filename); | ||||
@@ -815,7 +720,7 @@ bool carla_patchbay_connect(int portA, int portB) | |||||
CARLA_SAFE_ASSERT_RETURN(portA != portB, false); | CARLA_SAFE_ASSERT_RETURN(portA != portB, false); | ||||
carla_debug("carla_patchbay_connect(%i, %i)", portA, portB); | carla_debug("carla_patchbay_connect(%i, %i)", portA, portB); | ||||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||||
if (gStandalone.engine != nullptr) | |||||
return gStandalone.engine->patchbayConnect(portA, portB); | return gStandalone.engine->patchbayConnect(portA, portB); | ||||
carla_stderr2("Engine is not running"); | carla_stderr2("Engine is not running"); | ||||
@@ -827,7 +732,7 @@ bool carla_patchbay_disconnect(int connectionId) | |||||
{ | { | ||||
carla_debug("carla_patchbay_disconnect(%i)", connectionId); | carla_debug("carla_patchbay_disconnect(%i)", connectionId); | ||||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||||
if (gStandalone.engine != nullptr) | |||||
return gStandalone.engine->patchbayDisconnect(connectionId); | return gStandalone.engine->patchbayDisconnect(connectionId); | ||||
carla_stderr2("Engine is not running"); | carla_stderr2("Engine is not running"); | ||||
@@ -839,11 +744,8 @@ bool carla_patchbay_refresh() | |||||
{ | { | ||||
carla_debug("carla_patchbay_refresh()"); | carla_debug("carla_patchbay_refresh()"); | ||||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||||
{ | |||||
gStandalone.engine->patchbayRefresh(); | |||||
return true; | |||||
} | |||||
if (gStandalone.engine != nullptr) | |||||
return gStandalone.engine->patchbayRefresh(); | |||||
carla_stderr2("Engine is not running"); | carla_stderr2("Engine is not running"); | ||||
gStandalone.lastError = "Engine is not running"; | gStandalone.lastError = "Engine is not running"; | ||||
@@ -851,7 +753,6 @@ bool carla_patchbay_refresh() | |||||
} | } | ||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
#endif | |||||
void carla_transport_play() | void carla_transport_play() | ||||
{ | { | ||||
@@ -885,7 +786,6 @@ uint64_t carla_get_current_transport_frame() | |||||
return timeInfo.frame; | return timeInfo.frame; | ||||
} | } | ||||
#if 0 | |||||
const CarlaTransportInfo* carla_get_transport_info() | const CarlaTransportInfo* carla_get_transport_info() | ||||
{ | { | ||||
static CarlaTransportInfo info; | static CarlaTransportInfo info; | ||||
@@ -900,7 +800,7 @@ const CarlaTransportInfo* carla_get_transport_info() | |||||
CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info); | CARLA_SAFE_ASSERT_RETURN(gStandalone.engine != nullptr, &info); | ||||
const EngineTimeInfo& timeInfo(gStandalone.engine->getTimeInfo()); | |||||
const CB::EngineTimeInfo& timeInfo(gStandalone.engine->getTimeInfo()); | |||||
info.playing = timeInfo.playing; | info.playing = timeInfo.playing; | ||||
info.frame = timeInfo.frame; | info.frame = timeInfo.frame; | ||||
@@ -915,8 +815,6 @@ const CarlaTransportInfo* carla_get_transport_info() | |||||
return &info; | return &info; | ||||
} | } | ||||
#endif | |||||
#endif | |||||
// ------------------------------------------------------------------------------------------------------------------- | // ------------------------------------------------------------------------------------------------------------------- | ||||
@@ -1103,24 +1103,24 @@ class Host(object): | |||||
# Get the complete license text of used third-party code and features. | # Get the complete license text of used third-party code and features. | ||||
# Returned string is in basic html format. | # Returned string is in basic html format. | ||||
def get_complete_license_text(self): | def get_complete_license_text(self): | ||||
return self.lib.carla_get_complete_license_text() | |||||
return charPtrToString(self.lib.carla_get_complete_license_text()) | |||||
# Get all the supported file types in carla_load_filename(). | |||||
# Get all the supported file extensions in carla_load_file(). | |||||
# Returned string uses this syntax: | # Returned string uses this syntax: | ||||
# @code | # @code | ||||
# "*.ext1;*.ext2;*.ext3" | # "*.ext1;*.ext2;*.ext3" | ||||
# @endcode | # @endcode | ||||
def get_supported_file_extensions(self): | def get_supported_file_extensions(self): | ||||
return self.lib.carla_get_supported_file_extensions() | |||||
return charPtrToString(self.lib.carla_get_supported_file_extensions()) | |||||
# Get how many engine drivers are available. | # Get how many engine drivers are available. | ||||
def get_engine_driver_count(self): | def get_engine_driver_count(self): | ||||
return self.lib.carla_get_engine_driver_count() | |||||
return int(self.lib.carla_get_engine_driver_count()) | |||||
# Get an engine driver name. | # Get an engine driver name. | ||||
# @param index Driver index | # @param index Driver index | ||||
def get_engine_driver_name(self, index): | def get_engine_driver_name(self, index): | ||||
return self.lib.carla_get_engine_driver_name(index) | |||||
return charPtrToString(self.lib.carla_get_engine_driver_name(index)) | |||||
# Get the device names of an engine driver. | # Get the device names of an engine driver. | ||||
# @param index Driver index | # @param index Driver index | ||||
@@ -1133,40 +1133,78 @@ class Host(object): | |||||
def get_engine_driver_device_info(self, index, name): | def get_engine_driver_device_info(self, index, name): | ||||
return structToDict(self.lib.carla_get_engine_driver_device_info(index, name)) | return structToDict(self.lib.carla_get_engine_driver_device_info(index, name)) | ||||
# Get how many internal plugins are available. | |||||
def get_internal_plugin_count(self): | def get_internal_plugin_count(self): | ||||
return self.lib.carla_get_internal_plugin_count() | |||||
return int(self.lib.carla_get_internal_plugin_count()) | |||||
def get_internal_plugin_info(self, internalPluginId): | |||||
return structToDict(self.lib.carla_get_internal_plugin_info(internalPluginId).contents) | |||||
# Get information about an internal plugin. | |||||
# @param index Internal plugin Id | |||||
def get_internal_plugin_info(self, index): | |||||
return structToDict(self.lib.carla_get_internal_plugin_info(index).contents) | |||||
# Initialize the engine. | |||||
# Make sure to call carla_engine_idle() at regular intervals afterwards. | |||||
# @param driverName Driver to use | |||||
# @param clientName Engine master client name | |||||
def engine_init(self, driverName, clientName): | def engine_init(self, driverName, clientName): | ||||
return self.lib.carla_engine_init(driverName.encode("utf-8"), clientName.encode("utf-8")) | |||||
return bool(self.lib.carla_engine_init(driverName.encode("utf-8"), clientName.encode("utf-8"))) | |||||
# Close the engine. | |||||
# This function always closes the engine even if it returns false. | |||||
# In other words, even when something goes wrong when closing the engine it still be closed nonetheless. | |||||
def engine_close(self): | def engine_close(self): | ||||
return self.lib.carla_engine_close() | |||||
return bool(self.lib.carla_engine_close()) | |||||
# Idle the engine. | |||||
# Do not call this if the engine is not running. | |||||
def engine_idle(self): | def engine_idle(self): | ||||
self.lib.carla_engine_idle() | self.lib.carla_engine_idle() | ||||
# Check if the engine is running. | |||||
def is_engine_running(self): | def is_engine_running(self): | ||||
return self.lib.carla_is_engine_running() | |||||
return bool(self.lib.carla_is_engine_running()) | |||||
# Tell the engine it's about to close. | |||||
# This is used to prevent the engine thread(s) from reactivating. | |||||
def set_engine_about_to_close(self): | def set_engine_about_to_close(self): | ||||
self.lib.carla_set_engine_about_to_close() | self.lib.carla_set_engine_about_to_close() | ||||
# Set the engine callback function. | |||||
# @param func Callback function | |||||
def set_engine_callback(self, func): | def set_engine_callback(self, func): | ||||
self._callback = EngineCallbackFunc(func) | |||||
self.lib.carla_set_engine_callback(self._callback, c_nullptr) | |||||
self._engineCallback = EngineCallbackFunc(func) | |||||
self.lib.carla_set_engine_callback(self._engineCallback, None) | |||||
# Set an engine option. | |||||
# @param option Option | |||||
# @param value Value as number | |||||
# @param valueStr Value as string | |||||
def set_engine_option(self, option, value, valueStr): | def set_engine_option(self, option, value, valueStr): | ||||
self.lib.carla_set_engine_option(option, value, valueStr.encode("utf-8")) | self.lib.carla_set_engine_option(option, value, valueStr.encode("utf-8")) | ||||
def load_filename(self, filename): | |||||
return self.lib.carla_load_filename(filename.encode("utf-8")) | |||||
# Set the file callback function. | |||||
# @param func Callback function | |||||
# @param ptr Callback pointer | |||||
def set_file_callback(self, func): | |||||
self._fileCallback = FileCallbackFunc(func) | |||||
self.lib.carla_set_file_callback(self._fileCallback, None) | |||||
# Load a file of any type.\n | |||||
# This will try to load a generic file as a plugin, | |||||
# either by direct handling (Csound, GIG, SF2 and SFZ) or by using an internal plugin (like Audio and MIDI). | |||||
# @param Filename Filename | |||||
# @see carla_get_supported_file_extensions() | |||||
def load_file(self, filename): | |||||
return self.lib.carla_load_file(filename.encode("utf-8")) | |||||
# Load a Carla project file. | |||||
# @param Filename Filename | |||||
# @note Currently loaded plugins are not removed; call carla_remove_all_plugins() first if needed. | |||||
def load_project(self, filename): | def load_project(self, filename): | ||||
return self.lib.carla_load_project(filename.encode("utf-8")) | return self.lib.carla_load_project(filename.encode("utf-8")) | ||||
# Save current project to a file. | |||||
# @param Filename Filename | |||||
def save_project(self, filename): | def save_project(self, filename): | ||||
return self.lib.carla_save_project(filename.encode("utf-8")) | return self.lib.carla_save_project(filename.encode("utf-8")) | ||||
@@ -1401,8 +1439,6 @@ class Host(object): | |||||
self.lib.carla_get_engine_driver_device_info.argtypes = [c_uint, c_char_p] | self.lib.carla_get_engine_driver_device_info.argtypes = [c_uint, c_char_p] | ||||
self.lib.carla_get_engine_driver_device_info.restype = POINTER(EngineDriverDeviceInfo) | self.lib.carla_get_engine_driver_device_info.restype = POINTER(EngineDriverDeviceInfo) | ||||
return | |||||
self.lib.carla_get_internal_plugin_count.argtypes = None | self.lib.carla_get_internal_plugin_count.argtypes = None | ||||
self.lib.carla_get_internal_plugin_count.restype = c_uint | self.lib.carla_get_internal_plugin_count.restype = c_uint | ||||
@@ -1424,14 +1460,16 @@ class Host(object): | |||||
self.lib.carla_set_engine_about_to_close.argtypes = None | self.lib.carla_set_engine_about_to_close.argtypes = None | ||||
self.lib.carla_set_engine_about_to_close.restype = None | self.lib.carla_set_engine_about_to_close.restype = None | ||||
return | |||||
self.lib.carla_set_engine_callback.argtypes = [EngineCallbackFunc, c_void_p] | self.lib.carla_set_engine_callback.argtypes = [EngineCallbackFunc, c_void_p] | ||||
self.lib.carla_set_engine_callback.restype = None | self.lib.carla_set_engine_callback.restype = None | ||||
self.lib.carla_set_engine_option.argtypes = [c_enum, c_int, c_char_p] | self.lib.carla_set_engine_option.argtypes = [c_enum, c_int, c_char_p] | ||||
self.lib.carla_set_engine_option.restype = None | self.lib.carla_set_engine_option.restype = None | ||||
self.lib.carla_load_filename.argtypes = [c_char_p] | |||||
self.lib.carla_load_filename.restype = c_bool | |||||
self.lib.carla_load_file.argtypes = [c_char_p] | |||||
self.lib.carla_load_file.restype = c_bool | |||||
self.lib.carla_load_project.argtypes = [c_char_p] | self.lib.carla_load_project.argtypes = [c_char_p] | ||||
self.lib.carla_load_project.restype = c_bool | self.lib.carla_load_project.restype = c_bool | ||||
@@ -69,18 +69,11 @@ | |||||
#endif | #endif | ||||
/* Common includes */ | /* Common includes */ | ||||
#ifdef CARLA_OS_WIN | |||||
# include <winsock2.h> | |||||
# include <windows.h> | |||||
#ifdef __cplusplus | |||||
# include <cstddef> | |||||
#else | #else | ||||
# include <unistd.h> | |||||
# ifndef __cdecl | |||||
# define __cdecl | |||||
# endif | |||||
#endif | |||||
#ifndef __cplusplus | |||||
# include <stdbool.h> | # include <stdbool.h> | ||||
# include <stddef.h> | |||||
#endif | #endif | ||||
/* Define various string format types */ | /* Define various string format types */ | ||||
@@ -32,6 +32,13 @@ | |||||
# include <stdint.h> | # include <stdint.h> | ||||
#endif | #endif | ||||
#ifdef CARLA_OS_WIN | |||||
# include <winsock2.h> | |||||
# include <windows.h> | |||||
#else | |||||
# include <unistd.h> | |||||
#endif | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// misc functions | // misc functions | ||||