@@ -20,7 +20,6 @@ | |||
#include "CarlaBackend.h" | |||
#include "CarlaMIDI.h" | |||
#include "CarlaString.hpp" | |||
#ifdef BUILD_BRIDGE | |||
struct CarlaOscData; | |||
@@ -239,10 +238,10 @@ struct EngineOptions { | |||
unsigned int audioNumPeriods; | |||
unsigned int audioBufferSize; | |||
unsigned int audioSampleRate; | |||
CarlaString audioDevice; | |||
const char* audioDevice; | |||
CarlaString binaryDir; | |||
CarlaString resourceDir; | |||
const char* binaryDir; | |||
const char* resourceDir; | |||
EngineOptions() | |||
#ifdef CARLA_OS_LINUX | |||
@@ -260,7 +259,31 @@ struct EngineOptions { | |||
uiBridgesTimeout(4000), | |||
audioNumPeriods(2), | |||
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 bool fIsInput; | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEnginePort) | |||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEnginePort) | |||
#endif | |||
}; | |||
@@ -425,7 +448,7 @@ public: | |||
protected: | |||
float* fBuffer; | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineAudioPort) | |||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineAudioPort) | |||
#endif | |||
}; | |||
@@ -481,7 +504,7 @@ public: | |||
protected: | |||
float* fBuffer; | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineCVPort) | |||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineCVPort) | |||
#endif | |||
}; | |||
@@ -574,7 +597,7 @@ public: | |||
protected: | |||
EngineEvent* fBuffer; | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineEventPort) | |||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineEventPort) | |||
#endif | |||
}; | |||
@@ -647,7 +670,7 @@ protected: | |||
bool fActive; | |||
uint32_t fLatency; | |||
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineClient) | |||
CARLA_DECLARE_NON_COPY_CLASS(CarlaEngineClient) | |||
#endif | |||
}; | |||
@@ -846,22 +869,20 @@ public: | |||
// 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, | |||
* 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); | |||
/*! | |||
* Save current project to \a filename.\n | |||
* (project files have *.carxp extension) | |||
* Save current project to a file. | |||
*/ | |||
bool saveProject(const char* const filename); | |||
@@ -871,58 +892,37 @@ public: | |||
/*! | |||
* Get the current engine driver hints. | |||
*/ | |||
unsigned int getHints() const noexcept | |||
{ | |||
return fHints; | |||
} | |||
unsigned int getHints() const noexcept; | |||
/*! | |||
* Get the current buffer size. | |||
*/ | |||
uint32_t getBufferSize() const noexcept | |||
{ | |||
return fBufferSize; | |||
} | |||
uint32_t getBufferSize() const noexcept; | |||
/*! | |||
* Get the current sample rate. | |||
*/ | |||
double getSampleRate() const noexcept | |||
{ | |||
return fSampleRate; | |||
} | |||
double getSampleRate() const noexcept; | |||
/*! | |||
* 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. | |||
*/ | |||
EngineProcessMode getProccessMode() const noexcept | |||
{ | |||
return fOptions.processMode; | |||
} | |||
EngineProcessMode getProccessMode() const noexcept; | |||
/*! | |||
* 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). | |||
*/ | |||
const EngineTimeInfo& getTimeInfo() const noexcept | |||
{ | |||
return fTimeInfo; | |||
} | |||
const EngineTimeInfo& getTimeInfo() const noexcept; | |||
// ------------------------------------------------------------------- | |||
// Information (peaks) | |||
@@ -968,7 +968,7 @@ public: | |||
/*! | |||
* Force the engine to resend all patchbay clients, ports and connections again. | |||
*/ | |||
virtual void patchbayRefresh(); | |||
virtual bool patchbayRefresh(); | |||
// ------------------------------------------------------------------- | |||
// Transport | |||
@@ -1073,42 +1073,6 @@ public: | |||
// ------------------------------------------------------------------- | |||
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. | |||
*/ | |||
@@ -1251,7 +1215,7 @@ public: | |||
void oscSend_control_exit(); | |||
#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(); | |||
/*! | |||
* 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: | |||
* @code | |||
* "*.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); | |||
#ifndef BUILD_BRIDGE | |||
#ifdef BUILD_BRIDGE | |||
/*! | |||
* Initialize the engine in bridged mode. | |||
* @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 | |||
* 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(); | |||
@@ -564,42 +564,48 @@ CARLA_EXPORT bool carla_is_engine_running(); | |||
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); | |||
#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); | |||
#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); | |||
/*! | |||
* 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, | |||
* 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); | |||
/*! | |||
* 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); | |||
@@ -19,14 +19,13 @@ | |||
#define CARLA_PLUGIN_HPP_INCLUDED | |||
#include "CarlaBackend.h" | |||
#include "CarlaString.hpp" | |||
// Avoid including extra libs here | |||
typedef void* lo_address; | |||
typedef struct _NativePluginDescriptor NativePluginDescriptor; | |||
#ifndef LADSPA_RDF_HPP_INCLUDED | |||
//#ifndef LADSPA_RDF_HPP_INCLUDED | |||
struct LADSPA_RDF_Descriptor; | |||
#endif | |||
//#endif | |||
CARLA_BACKEND_START_NAMESPACE | |||
@@ -109,30 +108,21 @@ public: | |||
* | |||
* \see setId() | |||
*/ | |||
unsigned int getId() const noexcept | |||
{ | |||
return fId; | |||
} | |||
unsigned int getId() const noexcept; | |||
/*! | |||
* Get the plugin's hints. | |||
* | |||
* \see PluginHints | |||
*/ | |||
unsigned int getHints() const noexcept | |||
{ | |||
return fHints; | |||
} | |||
unsigned int getHints() const noexcept; | |||
/*! | |||
* Get the plugin's options (currently in use). | |||
* | |||
* \see PluginOptions, getAvailableOptions() and setOption() | |||
*/ | |||
unsigned int getOptionsEnabled() const noexcept | |||
{ | |||
return fOptions; | |||
} | |||
unsigned int getOptionsEnabled() const noexcept; | |||
/*! | |||
* Check if the plugin is enabled.\n | |||
@@ -140,10 +130,7 @@ public: | |||
* | |||
* \see setEnabled() | |||
*/ | |||
bool isEnabled() const noexcept | |||
{ | |||
return fEnabled; | |||
} | |||
bool isEnabled() const noexcept; | |||
/*! | |||
* Get the plugin's internal name.\n | |||
@@ -151,27 +138,18 @@ public: | |||
* | |||
* \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 | |||
* (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. | |||
*/ | |||
const char* getIconName() const noexcept | |||
{ | |||
return (const char*)fIconName; | |||
} | |||
const char* getIconName() const noexcept; | |||
/*! | |||
* Get the plugin's category (delay, filter, synth, etc). | |||
@@ -870,54 +848,6 @@ public: | |||
// ------------------------------------------------------------------- | |||
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. | |||
*/ | |||
@@ -963,7 +893,7 @@ protected: | |||
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 | |||
CarlaEngine::CarlaEngine() | |||
: fHints(0x0), | |||
fBufferSize(0), | |||
fSampleRate(0.0), | |||
pData(new CarlaEngineProtectedData(this)) | |||
: pData(new CarlaEngineProtectedData(this)) | |||
{ | |||
carla_debug("CarlaEngine::CarlaEngine()"); | |||
} | |||
@@ -519,7 +516,7 @@ unsigned int CarlaEngine::getMaxPluginNumber() const noexcept | |||
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->plugins == nullptr, "Invalid engine internal data (err #3)"); | |||
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->nextPluginId = 0; | |||
switch (fOptions.processMode) | |||
switch (pData->options.processMode) | |||
{ | |||
case ENGINE_PROCESS_MODE_SINGLE_CLIENT: | |||
case ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS: | |||
@@ -560,10 +557,10 @@ bool CarlaEngine::init(const char* const clientName) | |||
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]; | |||
@@ -582,7 +579,7 @@ bool CarlaEngine::init(const char* const clientName) | |||
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->nextPluginId == pData->maxPluginNumber, "Invalid engine internal data (err #8)"); | |||
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; | |||
} | |||
fName.clear(); | |||
pData->name.clear(); | |||
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) | |||
{ | |||
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; | |||
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; | |||
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; | |||
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; | |||
default: | |||
bridgeBinary = nullptr; | |||
@@ -718,11 +715,11 @@ bool CarlaEngine::addPlugin(const BinaryType btype, const PluginType ptype, cons | |||
} | |||
# 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 | |||
if (btype != BINARY_NATIVE || (fOptions.preferPluginBridges && bridgeBinary != nullptr)) | |||
if (btype != BINARY_NATIVE || (pData->options.preferPluginBridges && bridgeBinary != nullptr)) | |||
{ | |||
if (bridgeBinary != nullptr) | |||
{ | |||
@@ -845,7 +842,7 @@ bool CarlaEngine::removePlugin(const unsigned int id) | |||
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); | |||
#ifndef BUILD_BRIDGE | |||
@@ -991,7 +988,7 @@ bool CarlaEngine::switchPlugins(const unsigned int idA, const unsigned int idB) | |||
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); | |||
#ifndef BUILD_BRIDGE // TODO | |||
@@ -1108,10 +1105,10 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const | |||
// ----------------------------------------------------------------------- | |||
// 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_debug("CarlaEngine::loadFilename(\"%s\")", filename); | |||
carla_debug("CarlaEngine::loadFile(\"%s\")", filename); | |||
#ifdef USE_JUCE | |||
using namespace juce; | |||
@@ -1373,6 +1370,65 @@ bool CarlaEngine::saveProject(const char* const filename) | |||
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) | |||
@@ -1428,9 +1484,10 @@ bool CarlaEngine::patchbayDisconnect(int) | |||
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) | |||
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; | |||
case ENGINE_OPTION_TRANSPORT_MODE: | |||
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); | |||
fOptions.transportMode = static_cast<EngineTransportMode>(value); | |||
pData->options.transportMode = static_cast<EngineTransportMode>(value); | |||
break; | |||
case ENGINE_OPTION_FORCE_STEREO: | |||
fOptions.forceStereo = (value != 0); | |||
pData->options.forceStereo = (value != 0); | |||
break; | |||
case ENGINE_OPTION_PREFER_PLUGIN_BRIDGES: | |||
fOptions.preferPluginBridges = (value != 0); | |||
pData->options.preferPluginBridges = (value != 0); | |||
break; | |||
case ENGINE_OPTION_PREFER_UI_BRIDGES: | |||
fOptions.preferUiBridges = (value != 0); | |||
pData->options.preferUiBridges = (value != 0); | |||
break; | |||
case ENGINE_OPTION_UIS_ALWAYS_ON_TOP: | |||
fOptions.uisAlwaysOnTop = (value != 0); | |||
pData->options.uisAlwaysOnTop = (value != 0); | |||
break; | |||
case ENGINE_OPTION_MAX_PARAMETERS: | |||
if (value < 1) | |||
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; | |||
case ENGINE_OPTION_UI_BRIDGES_TIMEOUT: | |||
if (value < 1) | |||
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; | |||
case ENGINE_OPTION_AUDIO_NUM_PERIODS: | |||
if (value < 2 || value > 3) | |||
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; | |||
case ENGINE_OPTION_AUDIO_BUFFER_SIZE: | |||
if (value < 8) | |||
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; | |||
case ENGINE_OPTION_AUDIO_SAMPLE_RATE: | |||
if (value < 22050) | |||
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; | |||
case ENGINE_OPTION_AUDIO_DEVICE: | |||
fOptions.audioDevice = valueStr; | |||
pData->options.audioDevice = valueStr; | |||
break; | |||
case ENGINE_OPTION_PATH_BINARIES: | |||
fOptions.binaryDir = valueStr; | |||
pData->options.binaryDir = valueStr; | |||
break; | |||
case ENGINE_OPTION_PATH_RESOURCES: | |||
fOptions.resourceDir = valueStr; | |||
pData->options.resourceDir = valueStr; | |||
break; | |||
} | |||
} | |||
@@ -1671,12 +1728,12 @@ void CarlaEngine::runPendingRtEvents() | |||
pData->doNextPluginAction(true); | |||
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; | |||
void* callbackPtr; | |||
CarlaString lastError; | |||
unsigned int hints; | |||
uint32_t bufferSize; | |||
double sampleRate; | |||
bool aboutToClose; // don't re-activate thread if true | |||
unsigned int curPluginCount; // number of plugins loaded (0...max) | |||
unsigned int maxPluginNumber; // number of plugins allowed (0, 16, 99 or 255) | |||
unsigned int nextPluginId; // invalid if == maxPluginNumber | |||
CarlaString lastError; | |||
CarlaString name; | |||
EngineOptions options; | |||
EngineTimeInfo timeInfo; | |||
EnginePluginData* plugins; | |||
struct InternalEvents { | |||
@@ -213,6 +220,9 @@ struct CarlaEngineProtectedData { | |||
oscData(nullptr), | |||
callback(nullptr), | |||
callbackPtr(nullptr), | |||
hints(0x0), | |||
bufferSize(0), | |||
sampleRate(0.0), | |||
aboutToClose(false), | |||
curPluginCount(0), | |||
maxPluginNumber(0), | |||
@@ -579,13 +579,13 @@ public: | |||
carla_debug("CarlaEngineJack::CarlaEngineJack()"); | |||
#ifdef BUILD_BRIDGE | |||
fOptions.processMode = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS; | |||
pData->options.processMode = ENGINE_PROCESS_MODE_MULTIPLE_CLIENTS; | |||
#else | |||
carla_fill<jack_port_t*>(fRackPorts, kRackPortCount, nullptr); | |||
#endif | |||
// 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); | |||
} | |||
@@ -608,7 +608,7 @@ public: | |||
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; | |||
@@ -625,7 +625,7 @@ public: | |||
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; | |||
@@ -666,8 +666,8 @@ public: | |||
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_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_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[kRackPortAudioIn2] = jackbridge_port_register(fClient, "audio-in2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | |||
@@ -715,13 +715,13 @@ public: | |||
return false; | |||
#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 | |||
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); | |||
} | |||
@@ -743,7 +743,7 @@ public: | |||
#else | |||
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[kRackPortAudioIn2]); | |||
@@ -856,8 +856,8 @@ public: | |||
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); | |||
@@ -868,11 +868,11 @@ public: | |||
jackbridge_set_process_callback(client, carla_jack_process_callback, this); | |||
jackbridge_on_shutdown(client, carla_jack_shutdown_callback, this); | |||
#else | |||
if (fOptions.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
if (pData->options.processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
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); | |||
@@ -912,13 +912,13 @@ public: | |||
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); | |||
// TODO - use rename port if single-client | |||
// 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()); | |||
@@ -1039,9 +1039,9 @@ public: | |||
return false; | |||
} | |||
void patchbayRefresh() override | |||
bool patchbayRefresh() override | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr,); | |||
CARLA_SAFE_ASSERT_RETURN(fClient != nullptr, false); | |||
fLastGroupId = 0; | |||
fLastPortId = 0; | |||
@@ -1053,6 +1053,8 @@ public: | |||
fGroupIconsChanged.clear(); | |||
initJackPatchbay(jackbridge_get_client_name(fClient)); | |||
return true; | |||
} | |||
#endif | |||
@@ -1061,7 +1063,7 @@ public: | |||
void transportPlay() override | |||
{ | |||
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||
if (pData->options.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||
CarlaEngine::transportPlay(); | |||
else if (fClient != nullptr) | |||
jackbridge_transport_start(fClient); | |||
@@ -1069,7 +1071,7 @@ public: | |||
void transportPause() override | |||
{ | |||
if (fOptions.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||
if (pData->options.transportMode == ENGINE_TRANSPORT_MODE_INTERNAL) | |||
CarlaEngine::transportPause(); | |||
else if (fClient != nullptr) | |||
jackbridge_transport_stop(fClient); | |||
@@ -1077,7 +1079,7 @@ public: | |||
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); | |||
else if (fClient != nullptr) | |||
jackbridge_transport_locate(fClient, frame); | |||
@@ -1088,19 +1090,19 @@ public: | |||
protected: | |||
void handleJackBufferSizeCallback(const uint32_t newBufferSize) | |||
{ | |||
if (fBufferSize == newBufferSize) | |||
if (pData->bufferSize == newBufferSize) | |||
return; | |||
fBufferSize = newBufferSize; | |||
pData->bufferSize = newBufferSize; | |||
bufferSizeChanged(newBufferSize); | |||
} | |||
void handleJackSampleRateCallback(const double newSampleRate) | |||
{ | |||
if (fSampleRate == newSampleRate) | |||
if (pData->sampleRate == newSampleRate) | |||
return; | |||
fSampleRate = newSampleRate; | |||
pData->sampleRate = newSampleRate; | |||
sampleRateChanged(newSampleRate); | |||
} | |||
@@ -1115,39 +1117,39 @@ protected: | |||
void saveTransportInfo() | |||
{ | |||
if (fOptions.transportMode != ENGINE_TRANSPORT_MODE_JACK) | |||
if (pData->options.transportMode != ENGINE_TRANSPORT_MODE_JACK) | |||
return; | |||
fTransportPos.unique_1 = fTransportPos.unique_2 + 1; // invalidate | |||
fTransportState = jackbridge_transport_query(fClient, &fTransportPos); | |||
fTimeInfo.playing = (fTransportState == JackTransportRolling); | |||
pData->timeInfo.playing = (fTransportState == JackTransportRolling); | |||
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) | |||
{ | |||
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 | |||
fTimeInfo.valid = 0x0; | |||
pData->timeInfo.valid = 0x0; | |||
} | |||
else | |||
{ | |||
fTimeInfo.frame = 0; | |||
fTimeInfo.valid = 0x0; | |||
pData->timeInfo.frame = 0; | |||
pData->timeInfo.valid = 0x0; | |||
} | |||
} | |||
@@ -1159,7 +1161,7 @@ protected: | |||
{ | |||
#ifndef BUILD_BRIDGE | |||
// 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 audioIn2 = (float*)jackbridge_port_get_buffer(fRackPorts[kRackPortAudioIn2], nframes); | |||
@@ -1193,7 +1195,7 @@ protected: | |||
return runPendingRtEvents(); | |||
#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) | |||
{ | |||
@@ -1210,7 +1212,7 @@ protected: | |||
return runPendingRtEvents(); | |||
} | |||
if (fOptions.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
if (pData->options.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK) | |||
{ | |||
// get buffers from jack | |||
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) | |||
{ | |||
if (fOptions.processMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
if (pData->options.processMode != ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
return; | |||
for (unsigned int i=0; i < pData->curPluginCount; ++i) | |||
@@ -114,9 +114,9 @@ public: | |||
#endif | |||
// 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 | |||
@@ -162,13 +162,13 @@ public: | |||
return false; | |||
} | |||
if (fOptions.audioDevice.isNotEmpty()) | |||
if (pData->options.audioDevice != nullptr) | |||
{ | |||
for (unsigned int i=0; i < devCount; ++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; | |||
fConnectName = devInfo.name.c_str(); | |||
@@ -205,10 +205,10 @@ public: | |||
else | |||
fAudioIsInterleaved = true; | |||
fBufferSize = fOptions.audioBufferSize; | |||
pData->bufferSize = pData->options.audioBufferSize; | |||
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) | |||
{ | |||
@@ -228,7 +228,7 @@ public: | |||
fAudioCountIn = iParams.nChannels; | |||
fAudioCountOut = oParams.nChannels; | |||
fSampleRate = fAudio.getStreamSampleRate(); | |||
pData->sampleRate = fAudio.getStreamSampleRate(); | |||
CARLA_ASSERT(fAudioCountOut > 0); | |||
@@ -237,7 +237,7 @@ public: | |||
fAudioBufIn = new float*[fAudioCountIn]; | |||
for (uint i=0; i < fAudioCountIn; ++i) | |||
fAudioBufIn[i] = new float[fBufferSize]; | |||
fAudioBufIn[i] = new float[pData->bufferSize]; | |||
} | |||
if (fAudioCountOut > 0) | |||
@@ -245,13 +245,13 @@ public: | |||
fAudioBufOut = new float*[fAudioCountOut]; | |||
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; | |||
@@ -639,12 +639,9 @@ public: | |||
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]; | |||
@@ -840,7 +837,7 @@ protected: | |||
// assert buffers | |||
CARLA_ASSERT(nframes != 0); | |||
CARLA_ASSERT_INT2(nframes == fBufferSize, nframes, fBufferSize); | |||
CARLA_ASSERT_INT2(nframes == pData->bufferSize, nframes, pData->bufferSize); | |||
CARLA_ASSERT(outsPtr != nullptr); | |||
if (pData->curPluginCount == 0 || fAudioCountOut == 0 || ! fAudioIsReady) | |||
@@ -905,17 +902,17 @@ protected: | |||
engineEvent.channel = midiChannel; | |||
if (midiEvent.time < fTimeInfo.frame) | |||
if (midiEvent.time < pData->timeInfo.frame) | |||
{ | |||
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 | |||
engineEvent.time = midiEvent.time - fTimeInfo.frame; | |||
engineEvent.time = midiEvent.time - pData->timeInfo.frame; | |||
if (MIDI_IS_STATUS_CONTROL_CHANGE(midiStatus)) | |||
{ | |||
@@ -1143,7 +1140,7 @@ protected: | |||
timeStamp = 0.0; | |||
RtMidiEvent midiEvent; | |||
midiEvent.time = fTimeInfo.frame + (timeStamp*(double)fBufferSize); | |||
midiEvent.time = pData->timeInfo.frame + (timeStamp*(double)pData->bufferSize); | |||
if (midiEvent.time < lastTime) | |||
midiEvent.time = lastTime; | |||
@@ -258,7 +258,7 @@ public: | |||
pData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_BRIDGE); | |||
fHints |= PLUGIN_IS_BRIDGE; | |||
pData->hints |= PLUGIN_IS_BRIDGE; | |||
} | |||
~BridgePlugin() override | |||
@@ -348,7 +348,7 @@ public: | |||
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); | |||
#if 0 | |||
@@ -637,7 +637,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -661,7 +661,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -684,7 +684,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -700,7 +700,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -842,21 +842,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -914,7 +914,7 @@ public: | |||
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.writeLong(event.time); | |||
@@ -928,12 +928,12 @@ public: | |||
} | |||
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; | |||
break; | |||
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); | |||
@@ -956,14 +956,14 @@ public: | |||
break; | |||
case kEngineControlEventTypeAllSoundOff: | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
// TODO | |||
} | |||
break; | |||
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) | |||
{ | |||
@@ -986,13 +986,13 @@ public: | |||
uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | |||
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; | |||
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; | |||
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; | |||
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; | |||
// Fix bad note-off | |||
@@ -1106,9 +1106,9 @@ public: | |||
// 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; | |||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | |||
@@ -1350,7 +1350,7 @@ public: | |||
CARLA_ASSERT(maker != nullptr); | |||
CARLA_ASSERT(copyright != nullptr); | |||
fHints = hints | PLUGIN_IS_BRIDGE; | |||
pData->hints = hints | PLUGIN_IS_BRIDGE; | |||
fInfo.category = static_cast<PluginCategory>(category); | |||
fInfo.uniqueId = uniqueId; | |||
@@ -1360,8 +1360,8 @@ public: | |||
fInfo.maker = maker; | |||
fInfo.copyright = copyright; | |||
if (fName.isEmpty()) | |||
fName = name; | |||
if (pData->name.isEmpty()) | |||
pData->name = name; | |||
break; | |||
} | |||
@@ -1507,7 +1507,7 @@ public: | |||
break; | |||
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) | |||
fSaved = true; | |||
@@ -1698,9 +1698,9 @@ public: | |||
// set info | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
fFilename = filename; | |||
pData->filename = filename; | |||
fBridgeBinary = bridgeBinary; | |||
// --------------------------------------------------------------- | |||
@@ -1786,8 +1786,8 @@ public: | |||
fShmControl.commitWrite(); | |||
// 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 | |||
{ | |||
@@ -1809,7 +1809,7 @@ public: | |||
if (fInitError || ! fInitiated) | |||
{ | |||
// unregister so it gets handled properly | |||
pData->engine->registerEnginePlugin(fId, nullptr); | |||
pData->engine->registerEnginePlugin(pData->id, nullptr); | |||
pData->osc.thread.stop(6000); | |||
@@ -1822,14 +1822,14 @@ public: | |||
// --------------------------------------------------------------- | |||
// register client | |||
if (fName.isEmpty()) | |||
if (pData->name.isEmpty()) | |||
{ | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
else if (label != nullptr) | |||
fName = pData->engine->getUniquePluginName(label); | |||
pData->name = pData->engine->getUniquePluginName(label); | |||
else | |||
fName = pData->engine->getUniquePluginName("unknown"); | |||
pData->name = pData->engine->getUniquePluginName("unknown"); | |||
} | |||
pData->client = pData->engine->addClient(this); | |||
@@ -222,13 +222,7 @@ unsigned int CarlaPluginProtectedData::loadSettings(const unsigned int options, | |||
// Constructor and destructor | |||
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_ASSERT(id < engine->getMaxPluginNumber()); | |||
@@ -267,6 +261,41 @@ CarlaPlugin::~CarlaPlugin() | |||
// ------------------------------------------------------------------- | |||
// 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 | |||
{ | |||
return pData->latency; | |||
@@ -497,9 +526,9 @@ const SaveState& CarlaPlugin::getSaveState() | |||
getLabel(strBuf); | |||
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.binary = carla_strdup(fFilename); | |||
pData->saveState.binary = carla_strdup(pData->filename); | |||
pData->saveState.uniqueID = getUniqueId(); | |||
// --------------------------------------------------------------- | |||
@@ -520,7 +549,7 @@ const SaveState& CarlaPlugin::getSaveState() | |||
// --------------------------------------------------------------- | |||
// Chunk | |||
if (fOptions & PLUGIN_OPTION_USE_CHUNKS) | |||
if (pData->options & PLUGIN_OPTION_USE_CHUNKS) | |||
{ | |||
void* data = nullptr; | |||
const int32_t dataSize(getChunkData(&data)); | |||
@@ -798,7 +827,7 @@ void CarlaPlugin::loadSaveState(const SaveState& saveState) | |||
// --------------------------------------------------------------- | |||
// 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); | |||
// --------------------------------------------------------------- | |||
@@ -884,14 +913,14 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename) | |||
void CarlaPlugin::setId(const unsigned int newId) noexcept | |||
{ | |||
fId = newId; | |||
pData->id = newId; | |||
} | |||
void CarlaPlugin::setName(const char* const newName) | |||
{ | |||
CARLA_ASSERT(newName != nullptr && newName[0] != '\0'); | |||
fName = newName; | |||
pData->name = newName; | |||
} | |||
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); | |||
if (yesNo) | |||
fOptions |= option; | |||
pData->options |= option; | |||
else | |||
fOptions &= ~option; | |||
pData->options &= ~option; | |||
pData->saveSetting(option, yesNo); | |||
} | |||
void CarlaPlugin::setEnabled(const bool yesNo) | |||
{ | |||
if (fEnabled == yesNo) | |||
if (pData->enabled == yesNo) | |||
return; | |||
fEnabled = yesNo; | |||
pData->enabled = yesNo; | |||
pData->masterMutex.lock(); | |||
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); | |||
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) | |||
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 | |||
return; | |||
@@ -970,10 +999,10 @@ void CarlaPlugin::setDryWet(const float value, const bool sendOsc, const bool se | |||
pData->postProc.dryWet = fixedValue; | |||
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) | |||
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) | |||
@@ -988,10 +1017,10 @@ void CarlaPlugin::setVolume(const float value, const bool sendOsc, const bool se | |||
pData->postProc.volume = fixedValue; | |||
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) | |||
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) | |||
@@ -1006,10 +1035,10 @@ void CarlaPlugin::setBalanceLeft(const float value, const bool sendOsc, const bo | |||
pData->postProc.balanceLeft = fixedValue; | |||
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) | |||
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) | |||
@@ -1024,10 +1053,10 @@ void CarlaPlugin::setBalanceRight(const float value, const bool sendOsc, const b | |||
pData->postProc.balanceRight = fixedValue; | |||
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) | |||
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) | |||
@@ -1042,10 +1071,10 @@ void CarlaPlugin::setPanning(const float value, const bool sendOsc, const bool s | |||
pData->postProc.panning = fixedValue; | |||
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) | |||
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 | |||
@@ -1065,12 +1094,12 @@ void CarlaPlugin::setCtrlChannel(const int8_t channel, const bool sendOsc, const | |||
const float ctrlf(channel); | |||
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) | |||
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); | |||
#else | |||
return; | |||
@@ -1099,11 +1128,11 @@ void CarlaPlugin::setParameterValue(const uint32_t parameterId, const float valu | |||
uiParameterChange(parameterId, value); | |||
if (sendOsc) | |||
pData->engine->oscSend_control_set_parameter_value(fId, parameterId, value); | |||
pData->engine->oscSend_control_set_parameter_value(pData->id, parameterId, value); | |||
#endif | |||
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 | |||
return; | |||
@@ -1164,12 +1193,12 @@ void CarlaPlugin::setParameterMidiChannel(const uint32_t parameterId, uint8_t ch | |||
#ifndef BUILD_BRIDGE | |||
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) | |||
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 | |||
#else | |||
return; | |||
@@ -1193,12 +1222,12 @@ void CarlaPlugin::setParameterMidiCC(const uint32_t parameterId, int16_t cc, con | |||
#ifndef BUILD_BRIDGE | |||
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) | |||
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 | |||
#else | |||
return; | |||
@@ -1305,11 +1334,11 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO | |||
#ifndef BUILD_BRIDGE | |||
if (sendOsc) | |||
pData->engine->oscSend_control_set_program(fId, fixedIndex); | |||
pData->engine->oscSend_control_set_program(pData->id, fixedIndex); | |||
#endif | |||
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 | |||
if (fixedIndex >= 0) | |||
@@ -1331,12 +1360,12 @@ void CarlaPlugin::setProgram(int32_t index, const bool sendGui, const bool sendO | |||
if (sendOsc || sendCallback) | |||
{ | |||
#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 | |||
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 | |||
if (sendOsc) | |||
pData->engine->oscSend_control_set_midi_program(fId, fixedIndex); | |||
pData->engine->oscSend_control_set_midi_program(pData->id, fixedIndex); | |||
#endif | |||
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) | |||
{ | |||
@@ -1393,12 +1422,12 @@ void CarlaPlugin::setMidiProgram(int32_t index, const bool sendGui, const bool s | |||
if (sendOsc || sendCallback) | |||
{ | |||
#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 | |||
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() | |||
{ | |||
if (! fEnabled) | |||
if (! pData->enabled) | |||
return; | |||
if (fHints & PLUGIN_NEEDS_SINGLE_THREAD) | |||
if (pData->hints & PLUGIN_NEEDS_SINGLE_THREAD) | |||
{ | |||
// Process postponed events | |||
postRtEventsRun(); | |||
@@ -1522,7 +1551,7 @@ void CarlaPlugin::registerToOscClient() | |||
#endif | |||
#ifndef BUILD_BRIDGE | |||
pData->engine->oscSend_control_add_plugin_start(fId, fName); | |||
pData->engine->oscSend_control_add_plugin_start(pData->id, pData->name); | |||
#endif | |||
// Base data | |||
@@ -1537,9 +1566,9 @@ void CarlaPlugin::registerToOscClient() | |||
getCopyright(bufCopyright); | |||
#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 | |||
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 | |||
} | |||
@@ -1553,7 +1582,7 @@ void CarlaPlugin::registerToOscClient() | |||
pData->engine->oscSend_bridge_midi_count(getMidiInCount(), getMidiOutCount(), getMidiInCount() + getMidiOutCount()); | |||
pData->engine->oscSend_bridge_parameter_count(cIns, cOuts, cTotals); | |||
#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 | |||
} | |||
@@ -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_set_parameter_value(i, getParameterValue(i)); | |||
#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 | |||
} | |||
} | |||
@@ -1598,12 +1627,12 @@ void CarlaPlugin::registerToOscClient() | |||
pData->engine->oscSend_bridge_set_program(pData->prog.current); | |||
#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) | |||
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 | |||
} | |||
@@ -1622,31 +1651,31 @@ void CarlaPlugin::registerToOscClient() | |||
pData->engine->oscSend_bridge_set_midi_program(pData->midiprog.current); | |||
#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) | |||
{ | |||
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 | |||
} | |||
#ifndef BUILD_BRIDGE | |||
pData->engine->oscSend_control_add_plugin_end(fId); | |||
pData->engine->oscSend_control_add_plugin_end(pData->id); | |||
// 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 | |||
} | |||
@@ -1680,7 +1709,7 @@ void CarlaPlugin::updateOscData(const lo_address& source, const char* const url) | |||
} | |||
#ifndef BUILD_BRIDGE | |||
if (fHints & PLUGIN_IS_BRIDGE) | |||
if (pData->hints & PLUGIN_IS_BRIDGE) | |||
return; | |||
#endif | |||
@@ -1775,13 +1804,13 @@ void CarlaPlugin::sendMidiSingleNote(const uint8_t channel, const uint8_t note, | |||
if (sendOsc) | |||
{ | |||
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 | |||
pData->engine->oscSend_control_note_off(fId, channel, note); | |||
pData->engine->oscSend_control_note_off(pData->id, channel, note); | |||
} | |||
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 | |||
@@ -1821,7 +1850,7 @@ void CarlaPlugin::postRtEventsRun() | |||
case kPluginPostRtEventDebug: | |||
#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 | |||
break; | |||
@@ -1835,10 +1864,10 @@ void CarlaPlugin::postRtEventsRun() | |||
{ | |||
// Update OSC control client | |||
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 | |||
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 | |||
break; | |||
@@ -1851,10 +1880,10 @@ void CarlaPlugin::postRtEventsRun() | |||
#ifndef BUILD_BRIDGE | |||
// Update OSC control client | |||
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 | |||
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 | |||
{ | |||
@@ -1866,12 +1895,12 @@ void CarlaPlugin::postRtEventsRun() | |||
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 | |||
@@ -1885,10 +1914,10 @@ void CarlaPlugin::postRtEventsRun() | |||
#ifndef BUILD_BRIDGE | |||
// Update OSC control client | |||
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 | |||
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 | |||
{ | |||
@@ -1900,12 +1929,12 @@ void CarlaPlugin::postRtEventsRun() | |||
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 | |||
@@ -1918,10 +1947,10 @@ void CarlaPlugin::postRtEventsRun() | |||
#ifndef BUILD_BRIDGE | |||
// Update OSC control client | |||
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 | |||
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 | |||
break; | |||
@@ -1932,10 +1961,10 @@ void CarlaPlugin::postRtEventsRun() | |||
#ifndef BUILD_BRIDGE | |||
// Update OSC control client | |||
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 | |||
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 | |||
break; | |||
} | |||
@@ -2043,8 +2072,8 @@ CarlaPlugin::ScopedDisabler::ScopedDisabler(CarlaPlugin* const plugin) | |||
plugin->pData->masterMutex.lock(); | |||
if (plugin->fEnabled) | |||
plugin->fEnabled = false; | |||
if (plugin->pData->enabled) | |||
plugin->pData->enabled = false; | |||
if (plugin->pData->client->isActive()) | |||
plugin->pData->client->deactivate(); | |||
@@ -2064,7 +2093,7 @@ CarlaPlugin::ScopedDisabler::~ScopedDisabler() | |||
if (fPlugin->pData->client == nullptr) | |||
return; | |||
fPlugin->fEnabled = true; | |||
fPlugin->pData->enabled = true; | |||
fPlugin->pData->client->activate(); | |||
fPlugin->pData->masterMutex.unlock(); | |||
} | |||
@@ -31,7 +31,7 @@ | |||
#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 | |||
#include "juce_audio_basics.h" | |||
@@ -491,21 +491,33 @@ struct CarlaPluginProtectedData { | |||
CarlaEngine* const engine; | |||
CarlaEngineClient* client; | |||
unsigned int id; | |||
unsigned int hints; | |||
unsigned int options; | |||
bool active; | |||
bool enabled; | |||
bool needsReset; | |||
void* lib; | |||
void* uiLib; | |||
// misc | |||
int8_t ctrlChannel; | |||
unsigned int extraHints; | |||
CarlaString idStr; | |||
int patchbayClientId; | |||
// latency | |||
uint32_t latency; | |||
float** latencyBuffers; | |||
// data | |||
// data 1 | |||
CarlaString name; | |||
CarlaString filename; | |||
CarlaString iconName; | |||
CarlaString idStr; | |||
// data 2 | |||
PluginAudioData audioIn; | |||
PluginAudioData audioOut; | |||
PluginEventData event; | |||
@@ -624,12 +636,17 @@ struct CarlaPluginProtectedData { | |||
CarlaPluginProtectedData(CarlaEngine* const eng, CarlaPlugin* const plug) | |||
: engine(eng), | |||
client(nullptr), | |||
id(0), | |||
hints(0x0), | |||
options(0x0), | |||
active(false), | |||
enabled(false), | |||
needsReset(false), | |||
lib(nullptr), | |||
uiLib(nullptr), | |||
ctrlChannel(0), | |||
extraHints(0x0), | |||
patchbayClientId(0), | |||
latency(0), | |||
latencyBuffers(nullptr), | |||
osc(eng, plug) {} | |||
@@ -53,7 +53,7 @@ public: | |||
carla_debug("DssiPlugin::~DssiPlugin()"); | |||
// close UI | |||
if (fHints & PLUGIN_HAS_CUSTOM_UI) | |||
if (pData->hints & PLUGIN_HAS_CUSTOM_UI) | |||
{ | |||
showCustomUI(false); | |||
@@ -74,7 +74,7 @@ public: | |||
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); | |||
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)) | |||
return PLUGIN_CATEGORY_SYNTH; | |||
return getPluginCategoryFromName(fName); | |||
return getPluginCategoryFromName(pData->name); | |||
} | |||
long getUniqueId() const override | |||
@@ -136,7 +136,7 @@ public: | |||
int32_t getChunkData(void** const dataPtr) const override | |||
{ | |||
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->get_custom_data != nullptr, 0); | |||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0); | |||
@@ -156,8 +156,8 @@ public: | |||
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; | |||
@@ -169,7 +169,7 @@ public: | |||
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; | |||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | |||
options |= PLUGIN_OPTION_FORCE_STEREO; | |||
@@ -311,7 +311,7 @@ public: | |||
void setChunkData(const char* const stringData) override | |||
{ | |||
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->set_custom_data != 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) | |||
fHandle2 = fDescriptor->instantiate(fDescriptor, (unsigned long)sampleRate); | |||
@@ -505,7 +505,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -705,7 +705,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -721,7 +721,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -732,27 +732,27 @@ public: | |||
} | |||
if (forcedStereoIn || forcedStereoOut) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
else | |||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
// plugin hints | |||
fHints = 0x0; | |||
pData->hints = 0x0; | |||
if (LADSPA_IS_HARD_RT_CAPABLE(fDescriptor->Properties)) | |||
fHints |= PLUGIN_IS_RTSAFE; | |||
pData->hints |= PLUGIN_IS_RTSAFE; | |||
if (fGuiFilename != nullptr) | |||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | |||
fHints |= PLUGIN_CAN_DRYWET; | |||
pData->hints |= PLUGIN_CAN_DRYWET; | |||
if (aOuts > 0) | |||
fHints |= PLUGIN_CAN_VOLUME; | |||
pData->hints |= PLUGIN_CAN_VOLUME; | |||
if (aOuts >= 2 && aOuts % 2 == 0) | |||
fHints |= PLUGIN_CAN_BALANCE; | |||
pData->hints |= PLUGIN_CAN_BALANCE; | |||
// extra plugin hints | |||
pData->extraHints = 0x0; | |||
@@ -764,7 +764,7 @@ public: | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
// check latency | |||
if (fHints & PLUGIN_CAN_DRYWET) | |||
if (pData->hints & PLUGIN_CAN_DRYWET) | |||
{ | |||
for (uint32_t i=0; i < pData->param.count; ++i) | |||
{ | |||
@@ -860,10 +860,10 @@ public: | |||
// Update OSC Names | |||
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) | |||
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 | |||
@@ -910,7 +910,7 @@ public: | |||
if (programChanged) | |||
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 (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
midiEventCount = MAX_MIDI_CHANNELS*2; | |||
carla_zeroStruct<snd_seq_event_t>(fMidiEvents, midiEventCount); | |||
@@ -1049,7 +1049,7 @@ public: | |||
// Event Input (System) | |||
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 startTime = 0; | |||
@@ -1111,21 +1111,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -1184,7 +1184,7 @@ public: | |||
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) | |||
continue; | |||
@@ -1204,12 +1204,12 @@ public: | |||
} | |||
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; | |||
break; | |||
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; | |||
@@ -1226,7 +1226,7 @@ public: | |||
break; | |||
case kEngineControlEventTypeAllSoundOff: | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
if (midiEventCount >= kPluginMaxMidiEvents) | |||
continue; | |||
@@ -1243,7 +1243,7 @@ public: | |||
break; | |||
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) | |||
{ | |||
@@ -1318,7 +1318,7 @@ public: | |||
} | |||
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 pressure = engineEvent.data[2]; | |||
@@ -1332,7 +1332,7 @@ public: | |||
} | |||
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 value = engineEvent.data[2]; | |||
@@ -1346,7 +1346,7 @@ public: | |||
} | |||
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]; | |||
@@ -1358,7 +1358,7 @@ public: | |||
} | |||
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 msb = engineEvent.data[2]; | |||
@@ -1505,8 +1505,8 @@ public: | |||
// 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; | |||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | |||
@@ -1859,16 +1859,16 @@ public: | |||
// get info | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
else if (fDescriptor->Name != nullptr) | |||
fName = pData->engine->getUniquePluginName(fDescriptor->Name); | |||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Name); | |||
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 | |||
@@ -1919,29 +1919,29 @@ public: | |||
// 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 | |||
fOptions = 0x0; | |||
pData->options = 0x0; | |||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (isAmSynth || isDssiVst) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
if (pData->engine->getOptions().forceStereo) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
if (fUsesCustomData) | |||
fOptions |= PLUGIN_OPTION_USE_CHUNKS; | |||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | |||
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) | |||
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 += "/"; | |||
pData->idStr += label; | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
if (isAmSynth || isDssiVst) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
} | |||
return true; | |||
@@ -462,7 +462,7 @@ public: | |||
// if (pData->ctrlChannel == static_cast<int32_t>(i)) | |||
// { | |||
// 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) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -578,7 +578,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -593,7 +593,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -612,7 +612,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -630,7 +630,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -853,10 +853,10 @@ public: | |||
// --------------------------------------- | |||
// 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 | |||
pData->extraHints = 0x0; | |||
@@ -929,10 +929,10 @@ public: | |||
// Update OSC Names | |||
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) | |||
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 | |||
@@ -974,7 +974,7 @@ public: | |||
} | |||
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 (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) | |||
{ | |||
@@ -1112,21 +1112,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -1185,7 +1185,7 @@ public: | |||
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); | |||
} | |||
@@ -1194,12 +1194,12 @@ public: | |||
} | |||
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; | |||
break; | |||
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 progId(ctrlEvent.param); | |||
@@ -1221,7 +1221,7 @@ public: | |||
break; | |||
case kEngineControlEventTypeAllSoundOff: | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
#ifdef FLUIDSYNTH_VERSION_NEW_API | |||
fluid_synth_all_sounds_off(fSynth, event.channel); | |||
@@ -1232,7 +1232,7 @@ public: | |||
break; | |||
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) | |||
{ | |||
@@ -1280,27 +1280,27 @@ public: | |||
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 pressure = midiEvent.data[2]; | |||
// 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 value = midiEvent.data[2]; | |||
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]; | |||
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 msb = midiEvent.data[2]; | |||
@@ -1388,8 +1388,8 @@ public: | |||
{ | |||
// 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]; | |||
@@ -1556,16 +1556,16 @@ public: | |||
// --------------------------------------------------------------- | |||
// get info | |||
fFilename = filename; | |||
fLabel = label; | |||
pData->filename = filename; | |||
fLabel = label; | |||
if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) | |||
fLabel += " (16 outs)"; | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
else | |||
fName = pData->engine->getUniquePluginName(label); | |||
pData->name = pData->engine->getUniquePluginName(label); | |||
// --------------------------------------------------------------- | |||
// register client | |||
@@ -1583,18 +1583,18 @@ public: | |||
{ | |||
// 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 | |||
pData->idStr = "SF2/"; | |||
pData->idStr += label; | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
} | |||
return true; | |||
@@ -127,7 +127,7 @@ public: | |||
return PLUGIN_CATEGORY_SYNTH; | |||
} | |||
return getPluginCategoryFromName(fName); | |||
return getPluginCategoryFromName(pData->name); | |||
} | |||
long getUniqueId() const override | |||
@@ -165,7 +165,7 @@ public: | |||
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; | |||
@@ -175,7 +175,7 @@ public: | |||
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; | |||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | |||
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) | |||
fHandle2 = fDescriptor->instantiate(fDescriptor, (unsigned long)sampleRate); | |||
@@ -509,7 +509,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -704,7 +704,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -720,7 +720,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -731,24 +731,24 @@ public: | |||
} | |||
if (forcedStereoIn || forcedStereoOut) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
else | |||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
// plugin hints | |||
fHints = 0x0; | |||
pData->hints = 0x0; | |||
if (LADSPA_IS_HARD_RT_CAPABLE(fDescriptor->Properties)) | |||
fHints |= PLUGIN_IS_RTSAFE; | |||
pData->hints |= PLUGIN_IS_RTSAFE; | |||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | |||
fHints |= PLUGIN_CAN_DRYWET; | |||
pData->hints |= PLUGIN_CAN_DRYWET; | |||
if (aOuts > 0) | |||
fHints |= PLUGIN_CAN_VOLUME; | |||
pData->hints |= PLUGIN_CAN_VOLUME; | |||
if (aOuts >= 2 && aOuts % 2 == 0) | |||
fHints |= PLUGIN_CAN_BALANCE; | |||
pData->hints |= PLUGIN_CAN_BALANCE; | |||
// extra plugin hints | |||
pData->extraHints = 0x0; | |||
@@ -757,7 +757,7 @@ public: | |||
pData->extraHints |= PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
// check latency | |||
if (fHints & PLUGIN_CAN_DRYWET) | |||
if (pData->hints & PLUGIN_CAN_DRYWET) | |||
{ | |||
for (uint32_t i=0; i < pData->param.count; ++i) | |||
{ | |||
@@ -891,7 +891,7 @@ public: | |||
// ---------------------------------------------------------------------------------------------------- | |||
// 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 timeOffset = 0; | |||
@@ -936,21 +936,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -1137,8 +1137,8 @@ public: | |||
// 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; | |||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | |||
@@ -1422,18 +1422,18 @@ public: | |||
fRdfDescriptor = ladspa_rdf_dup(rdfDescriptor); | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
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) | |||
fName = pData->engine->getUniquePluginName(fDescriptor->Name); | |||
pData->name = pData->engine->getUniquePluginName(fDescriptor->Name); | |||
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 | |||
@@ -1461,16 +1461,16 @@ public: | |||
// load plugin settings | |||
{ | |||
const bool isDssiVst = fFilename.contains("dssi-vst", true); | |||
const bool isDssiVst = pData->filename.contains("dssi-vst", true); | |||
// set default options | |||
fOptions = 0x0; | |||
pData->options = 0x0; | |||
if (isDssiVst) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
if (pData->engine->getOptions().forceStereo) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
// load settings | |||
pData->idStr = "LADSPA/"; | |||
@@ -1479,11 +1479,11 @@ public: | |||
pData->idStr += CarlaString(getUniqueId()); | |||
pData->idStr += "/"; | |||
pData->idStr += label; | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
if (isDssiVst) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
} | |||
return true; | |||
@@ -312,7 +312,7 @@ public: | |||
if (pData->engine->isOffline()) | |||
{ | |||
fEngineChannel->PrepareLoadInstrument((const char*)fFilename, rIndex); | |||
fEngineChannel->PrepareLoadInstrument((const char*)pData->filename, rIndex); | |||
fEngineChannel->LoadInstrument(); | |||
} | |||
else | |||
@@ -360,7 +360,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -375,7 +375,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -394,7 +394,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -407,10 +407,10 @@ public: | |||
// --------------------------------------- | |||
// 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 | |||
pData->extraHints = 0x0; | |||
@@ -466,10 +466,10 @@ public: | |||
// Update OSC Names | |||
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) | |||
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 | |||
@@ -479,7 +479,7 @@ public: | |||
} | |||
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 (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) | |||
{ | |||
@@ -572,7 +572,7 @@ public: | |||
// Event Input (System) | |||
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 startTime = 0; | |||
@@ -632,21 +632,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -705,7 +705,7 @@ public: | |||
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); | |||
} | |||
@@ -714,12 +714,12 @@ public: | |||
} | |||
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; | |||
break; | |||
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; | |||
@@ -736,14 +736,14 @@ public: | |||
break; | |||
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); | |||
} | |||
break; | |||
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) | |||
{ | |||
@@ -789,27 +789,27 @@ public: | |||
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 pressure = midiEvent.data[2]; | |||
// 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 value = midiEvent.data[2]; | |||
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]; | |||
// 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 msb = midiEvent.data[2]; | |||
@@ -873,8 +873,8 @@ public: | |||
// 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]; | |||
@@ -1053,15 +1053,15 @@ public: | |||
fRealName = info.InstrumentName.c_str(); | |||
fLabel = info.Product.c_str(); | |||
fMaker = info.Artists.c_str(); | |||
fFilename = filename; | |||
pData->filename = filename; | |||
if (kUses16Outs && ! fLabel.endsWith(" (16 outs)")) | |||
fLabel += " (16 outs)"; | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
else | |||
fName = pData->engine->getUniquePluginName((const char*)fRealName); | |||
pData->name = pData->engine->getUniquePluginName((const char*)fRealName); | |||
// --------------------------------------------------------------- | |||
// Register client | |||
@@ -1094,17 +1094,17 @@ public: | |||
{ | |||
// 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 | |||
pData->idStr = kIsGIG ? "GIG" : "SFZ"; | |||
pData->idStr += "/"; | |||
pData->idStr += label; | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
} | |||
return true; | |||
@@ -559,7 +559,7 @@ public: | |||
if (LV2_IS_UTILITY(cat1, cat2)) | |||
return PLUGIN_CATEGORY_UTILITY; | |||
return getPluginCategoryFromName(fName); | |||
return getPluginCategoryFromName(pData->name); | |||
} | |||
long getUniqueId() const override | |||
@@ -643,7 +643,7 @@ public: | |||
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; | |||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | |||
options |= PLUGIN_OPTION_FORCE_STEREO; | |||
@@ -910,7 +910,7 @@ public: | |||
{ | |||
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) | |||
//pData->gui->setWindowTitle(guiTitle); | |||
@@ -1136,8 +1136,8 @@ public: | |||
{ | |||
fUi.handle = 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; | |||
} | |||
@@ -1198,8 +1198,8 @@ public: | |||
delete pData->gui; | |||
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; | |||
} | |||
@@ -1208,7 +1208,7 @@ public: | |||
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(); | |||
} | |||
else | |||
@@ -1271,7 +1271,7 @@ public: | |||
if (fExt.uiidle != nullptr && fExt.uiidle->idle(fUi.handle) != 0) | |||
{ | |||
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); | |||
} | |||
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) | |||
fHandle2 = fDescriptor->instantiate(fDescriptor, sampleRate, fRdfDescriptor->Bundle, fFeatures); | |||
@@ -1516,7 +1516,7 @@ public: | |||
{ | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -2072,7 +2072,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -2088,7 +2088,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -2105,35 +2105,35 @@ public: | |||
fEventsOut.ctrl->port = pData->event.portOut; | |||
if (forcedStereoIn || forcedStereoOut) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
else | |||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
// plugin hints | |||
fHints = 0x0; | |||
pData->hints = 0x0; | |||
if (isRealtimeSafe()) | |||
fHints |= PLUGIN_IS_RTSAFE; | |||
pData->hints |= PLUGIN_IS_RTSAFE; | |||
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) | |||
fHints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||
pData->hints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||
} | |||
//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)) | |||
fHints |= PLUGIN_CAN_DRYWET; | |||
pData->hints |= PLUGIN_CAN_DRYWET; | |||
if (aOuts > 0) | |||
fHints |= PLUGIN_CAN_VOLUME; | |||
pData->hints |= PLUGIN_CAN_VOLUME; | |||
if (aOuts >= 2 && aOuts % 2 == 0) | |||
fHints |= PLUGIN_CAN_BALANCE; | |||
pData->hints |= PLUGIN_CAN_BALANCE; | |||
// extra plugin hints | |||
pData->extraHints &= ~PLUGIN_EXTRA_HINT_CAN_RUN_RACK; | |||
@@ -2215,10 +2215,10 @@ public: | |||
// Update OSC Names | |||
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) | |||
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 | |||
@@ -2280,7 +2280,7 @@ public: | |||
if (programChanged) | |||
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; | |||
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) | |||
{ | |||
@@ -2670,7 +2670,7 @@ public: | |||
// Event Input (System) | |||
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 startTime = 0; | |||
@@ -2750,21 +2750,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -2823,7 +2823,7 @@ public: | |||
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]; | |||
midiData[0] = MIDI_STATUS_CONTROL_CHANGE + i; | |||
@@ -2844,12 +2844,12 @@ public: | |||
} | |||
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; | |||
break; | |||
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; | |||
@@ -2866,7 +2866,7 @@ public: | |||
break; | |||
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); | |||
@@ -2887,7 +2887,7 @@ public: | |||
break; | |||
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) | |||
{ | |||
@@ -2925,13 +2925,13 @@ public: | |||
uint8_t channel = event.channel; | |||
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; | |||
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; | |||
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; | |||
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; | |||
// Fix bad note-off | |||
@@ -3204,8 +3204,8 @@ public: | |||
// 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; | |||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | |||
@@ -3632,7 +3632,7 @@ protected: | |||
// void guiClosedCallback() override | |||
// { | |||
// 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 : ""); | |||
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 | |||
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.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) | |||
@@ -4413,9 +4413,9 @@ public: | |||
// get info | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
else | |||
fName = pData->engine->getUniquePluginName(fRdfDescriptor->Name); | |||
pData->name = pData->engine->getUniquePluginName(fRdfDescriptor->Name); | |||
// --------------------------------------------------------------- | |||
// register client | |||
@@ -4444,32 +4444,32 @@ public: | |||
{ | |||
// 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()) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
if (pData->engine->getOptions().forceStereo) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
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 | |||
pData->idStr = "LV2/"; | |||
pData->idStr += uri; | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
if (getMidiInCount() > 0 || needsFixedBuffer()) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
} | |||
// --------------------------------------------------------------- | |||
@@ -4488,7 +4488,7 @@ public: | |||
//#ifdef BUILD_BRIDGE | |||
// const bool preferUiBridges(pData->engine->getOptions().preferUiBridges); | |||
//#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 | |||
for (uint32_t i=0; i < fRdfDescriptor->UICount; ++i) | |||
@@ -4752,7 +4752,7 @@ public: | |||
// ------------------------------------------------------- | |||
// 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; | |||
uiDataFt->data_access = fDescriptor->extension_data; | |||
@@ -145,7 +145,7 @@ public: | |||
carla_debug("NativePlugin::~NativePlugin()"); | |||
// close UI | |||
if (fHints & PLUGIN_HAS_UI) | |||
if (pData->hints & PLUGIN_HAS_UI) | |||
{ | |||
if (fIsUiVisible && fDescriptor != nullptr && fDescriptor->ui_show != nullptr && fHandle != nullptr) | |||
fDescriptor->ui_show(fHandle, false); | |||
@@ -261,7 +261,7 @@ public: | |||
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; | |||
else if (pData->audioIn.count <= 1 && pData->audioOut.count <= 1 && (pData->audioIn.count != 0 || pData->audioOut.count != 0)) | |||
options |= PLUGIN_OPTION_FORCE_STEREO; | |||
@@ -571,7 +571,7 @@ public: | |||
if (pData->ctrlChannel == static_cast<int32_t>(i)) | |||
{ | |||
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(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; | |||
if (index >= 0) | |||
@@ -717,7 +717,7 @@ public: | |||
mOuts = fDescriptor->midiOuts; | |||
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) | |||
fHandle2 = fDescriptor->instantiate(&fHost); | |||
@@ -784,7 +784,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -817,7 +817,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -852,7 +852,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -874,7 +874,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -996,7 +996,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -1012,7 +1012,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -1023,33 +1023,33 @@ public: | |||
} | |||
if (forcedStereoIn || forcedStereoOut) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
else | |||
fOptions &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options &= ~PLUGIN_OPTION_FORCE_STEREO; | |||
// plugin hints | |||
fHints = 0x0; | |||
pData->hints = 0x0; | |||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | |||
fHints |= PLUGIN_CAN_DRYWET; | |||
pData->hints |= PLUGIN_CAN_DRYWET; | |||
if (aOuts > 0) | |||
fHints |= PLUGIN_CAN_VOLUME; | |||
pData->hints |= PLUGIN_CAN_VOLUME; | |||
if (aOuts >= 2 && aOuts % 2 == 0) | |||
fHints |= PLUGIN_CAN_BALANCE; | |||
pData->hints |= PLUGIN_CAN_BALANCE; | |||
// native plugin hints | |||
if (fDescriptor->hints & ::PLUGIN_IS_RTSAFE) | |||
fHints |= PLUGIN_IS_RTSAFE; | |||
pData->hints |= PLUGIN_IS_RTSAFE; | |||
if (fDescriptor->hints & ::PLUGIN_IS_SYNTH) | |||
fHints |= PLUGIN_IS_SYNTH; | |||
pData->hints |= PLUGIN_IS_SYNTH; | |||
if (fDescriptor->hints & ::PLUGIN_HAS_UI) | |||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||
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) | |||
fHints |= PLUGIN_NEEDS_FIXED_BUFFERS; | |||
pData->hints |= PLUGIN_NEEDS_FIXED_BUFFERS; | |||
// extra plugin hints | |||
pData->extraHints = 0x0; | |||
@@ -1101,10 +1101,10 @@ public: | |||
// Update OSC Names | |||
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) | |||
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 | |||
@@ -1151,7 +1151,7 @@ public: | |||
if (programChanged) | |||
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 (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) | |||
{ | |||
@@ -1312,7 +1312,7 @@ public: | |||
// Event Input (System) | |||
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 startTime = 0; | |||
@@ -1378,21 +1378,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -1451,7 +1451,7 @@ public: | |||
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) | |||
continue; | |||
@@ -1470,12 +1470,12 @@ public: | |||
} | |||
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; | |||
break; | |||
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); | |||
@@ -1500,7 +1500,7 @@ public: | |||
break; | |||
case kEngineControlEventTypeAllSoundOff: | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
if (fMidiEventCount >= kPluginMaxMidiEvents*2) | |||
continue; | |||
@@ -1517,7 +1517,7 @@ public: | |||
break; | |||
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) | |||
{ | |||
@@ -1553,13 +1553,13 @@ public: | |||
uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | |||
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; | |||
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; | |||
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; | |||
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; | |||
// Fix bad note-off | |||
@@ -1734,8 +1734,8 @@ public: | |||
// 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; | |||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | |||
@@ -2019,13 +2019,13 @@ protected: | |||
bool handleWriteMidiEvent(const NativeMidiEvent* const event) | |||
{ | |||
CARLA_ASSERT(fEnabled); | |||
CARLA_ASSERT(pData->enabled); | |||
CARLA_ASSERT(fIsProcessing); | |||
CARLA_ASSERT(fMidiOut.count > 0 || pData->event.portOut != nullptr); | |||
CARLA_ASSERT(event != nullptr); | |||
CARLA_ASSERT(event->data[0] != 0); | |||
if (! fEnabled) | |||
if (! pData->enabled) | |||
return false; | |||
if (fMidiOut.count == 0) | |||
return false; | |||
@@ -2064,7 +2064,7 @@ protected: | |||
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; | |||
} | |||
@@ -2142,7 +2142,7 @@ protected: | |||
case ::HOST_OPCODE_RELOAD_ALL: | |||
break; | |||
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; | |||
} | |||
@@ -2226,40 +2226,40 @@ public: | |||
// set icon | |||
if (std::strcmp(fDescriptor->label, "audiofile") == 0) | |||
fIconName = "file"; | |||
pData->iconName = "file"; | |||
else if (std::strcmp(fDescriptor->label, "midifile") == 0) | |||
fIconName = "file"; | |||
pData->iconName = "file"; | |||
else if (std::strcmp(fDescriptor->label, "sunvoxfile") == 0) | |||
fIconName = "file"; | |||
pData->iconName = "file"; | |||
else if (std::strcmp(fDescriptor->label, "3BandEQ") == 0) | |||
fIconName = "distrho"; | |||
pData->iconName = "distrho"; | |||
else if (std::strcmp(fDescriptor->label, "3BandSplitter") == 0) | |||
fIconName = "distrho"; | |||
pData->iconName = "distrho"; | |||
else if (std::strcmp(fDescriptor->label, "Nekobi") == 0) | |||
fIconName = "distrho"; | |||
pData->iconName = "distrho"; | |||
else if (std::strcmp(fDescriptor->label, "Notes") == 0) | |||
fIconName = "distrho"; | |||
pData->iconName = "distrho"; | |||
else if (std::strcmp(fDescriptor->label, "PingPongPan") == 0) | |||
fIconName = "distrho"; | |||
pData->iconName = "distrho"; | |||
else if (std::strcmp(fDescriptor->label, "StereoEnhancer") == 0) | |||
fIconName = "distrho"; | |||
pData->iconName = "distrho"; | |||
// --------------------------------------------------------------- | |||
// get info | |||
if (name != nullptr) | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
else if (fDescriptor->name != nullptr) | |||
fName = pData->engine->getUniquePluginName(fDescriptor->name); | |||
pData->name = pData->engine->getUniquePluginName(fDescriptor->name); | |||
else | |||
fName = pData->engine->getUniquePluginName(label); | |||
pData->name = pData->engine->getUniquePluginName(label); | |||
{ | |||
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)"); | |||
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); | |||
// set default options | |||
fOptions = 0x0; | |||
pData->options = 0x0; | |||
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) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
if (pData->engine->getOptions().forceStereo) | |||
fOptions |= PLUGIN_OPTION_FORCE_STEREO; | |||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | |||
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) | |||
fOptions |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
pData->options |= PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH; | |||
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) | |||
fOptions |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | |||
// load settings | |||
pData->idStr = "Native/"; | |||
pData->idStr += label; | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
} | |||
return true; | |||
@@ -72,7 +72,7 @@ public: | |||
carla_debug("VstPlugin::~VstPlugin()"); | |||
// close UI | |||
if (fHints & PLUGIN_HAS_CUSTOM_UI) | |||
if (pData->hints & PLUGIN_HAS_CUSTOM_UI) | |||
{ | |||
showCustomUI(false); | |||
@@ -147,7 +147,7 @@ public: | |||
if (fEffect->flags & effFlagsIsSynth) | |||
return PLUGIN_CATEGORY_SYNTH; | |||
return getPluginCategoryFromName(fName); | |||
return getPluginCategoryFromName(pData->name); | |||
} | |||
long getUniqueId() const override | |||
@@ -167,7 +167,7 @@ public: | |||
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(dataPtr != nullptr); | |||
@@ -194,7 +194,7 @@ public: | |||
if (fEffect->flags & effFlagsProgramChunks) | |||
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_CHANNEL_PRESSURE; | |||
@@ -289,7 +289,7 @@ public: | |||
CarlaPlugin::setName(newName); | |||
//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 | |||
{ | |||
CARLA_ASSERT(fOptions & PLUGIN_OPTION_USE_CHUNKS); | |||
CARLA_ASSERT(pData->options & PLUGIN_OPTION_USE_CHUNKS); | |||
CARLA_ASSERT(fEffect != nullptr); | |||
CARLA_ASSERT(stringData != nullptr); | |||
@@ -427,7 +427,7 @@ public: | |||
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(); | |||
} | |||
else | |||
@@ -440,8 +440,8 @@ public: | |||
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; | |||
} | |||
} | |||
@@ -517,7 +517,7 @@ public: | |||
aOuts = fEffect->numOutputs; | |||
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; | |||
needsCtrlIn = true; | |||
@@ -560,7 +560,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -585,7 +585,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -616,7 +616,7 @@ public: | |||
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 }; | |||
@@ -725,7 +725,7 @@ public: | |||
pData->param.data[j].hints |= PARAMETER_USES_CUSTOM_TEXT; | |||
#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; | |||
// no such thing as VST default parameters | |||
@@ -750,7 +750,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -766,7 +766,7 @@ public: | |||
if (processMode == ENGINE_PROCESS_MODE_SINGLE_CLIENT) | |||
{ | |||
portName = fName; | |||
portName = pData->name; | |||
portName += ":"; | |||
} | |||
@@ -779,36 +779,36 @@ public: | |||
// plugin hints | |||
const intptr_t vstCategory = dispatcher(effGetPlugCategory, 0, 0, nullptr, 0.0f); | |||
fHints = 0x0; | |||
pData->hints = 0x0; | |||
//if (vstCategory == kPlugCategSynth || vstCategory == kPlugCategGenerator) | |||
// fHints |= PLUGIN_IS_SYNTH; | |||
// pData->hints |= PLUGIN_IS_SYNTH; | |||
if (fEffect->flags & effFlagsHasEditor) | |||
{ | |||
fHints |= PLUGIN_HAS_CUSTOM_UI; | |||
pData->hints |= PLUGIN_HAS_CUSTOM_UI; | |||
if (! fGui.isOsc) | |||
fHints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||
pData->hints |= PLUGIN_NEEDS_SINGLE_THREAD; | |||
} | |||
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) | |||
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) | |||
fHints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||
pData->hints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||
if (aOuts > 0 && (aIns == aOuts || aIns == 1)) | |||
fHints |= PLUGIN_CAN_DRYWET; | |||
pData->hints |= PLUGIN_CAN_DRYWET; | |||
if (aOuts > 0) | |||
fHints |= PLUGIN_CAN_VOLUME; | |||
pData->hints |= PLUGIN_CAN_VOLUME; | |||
if (aOuts >= 2 && aOuts % 2 == 0) | |||
fHints |= PLUGIN_CAN_BALANCE; | |||
pData->hints |= PLUGIN_CAN_BALANCE; | |||
// extra plugin hints | |||
pData->extraHints = 0x0; | |||
@@ -829,7 +829,7 @@ public: | |||
} | |||
// check latency | |||
if (fHints & PLUGIN_CAN_DRYWET) | |||
if (pData->hints & PLUGIN_CAN_DRYWET) | |||
{ | |||
#ifdef VESTIGE_HEADER | |||
char* const empty3Ptr = &fEffect->empty3[0]; | |||
@@ -899,10 +899,10 @@ public: | |||
// Update OSC Names | |||
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) | |||
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 | |||
@@ -957,7 +957,7 @@ public: | |||
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 (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) | |||
{ | |||
@@ -1145,7 +1145,7 @@ public: | |||
// Event Input (System) | |||
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 startTime = 0; | |||
@@ -1202,21 +1202,21 @@ public: | |||
{ | |||
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; | |||
setDryWet(value, false, false); | |||
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; | |||
setVolume(value, false, false); | |||
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; | |||
value = ctrlEvent.value/0.5f - 1.0f; | |||
@@ -1275,7 +1275,7 @@ public: | |||
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) | |||
continue; | |||
@@ -1299,7 +1299,7 @@ public: | |||
break; | |||
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) | |||
{ | |||
@@ -1311,7 +1311,7 @@ public: | |||
break; | |||
case kEngineControlEventTypeAllSoundOff: | |||
if (fOptions & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
if (pData->options & PLUGIN_OPTION_SEND_ALL_SOUND_OFF) | |||
{ | |||
if (fMidiEventCount >= kPluginMaxMidiEvents*2) | |||
continue; | |||
@@ -1329,7 +1329,7 @@ public: | |||
break; | |||
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) | |||
{ | |||
@@ -1366,13 +1366,13 @@ public: | |||
uint8_t status = MIDI_GET_STATUS_FROM_DATA(midiEvent.data); | |||
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; | |||
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; | |||
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; | |||
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; | |||
// Fix bad note-off | |||
@@ -1508,7 +1508,7 @@ public: | |||
fIsProcessing = true; | |||
if (fHints & PLUGIN_CAN_PROCESS_REPLACING) | |||
if (pData->hints & PLUGIN_CAN_PROCESS_REPLACING) | |||
{ | |||
fEffect->processReplacing(fEffect, | |||
(pData->audioIn.count > 0) ? vstInBuffer : nullptr, | |||
@@ -1541,9 +1541,9 @@ public: | |||
// 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; | |||
float bufValue, oldBufLeft[doBalance ? frames : 1]; | |||
@@ -1733,7 +1733,7 @@ protected: | |||
// void guiClosedCallback() override | |||
// { | |||
// 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 | |||
@@ -1787,7 +1787,7 @@ protected: | |||
switch (opcode) | |||
{ | |||
case audioMasterAutomate: | |||
if (! fEnabled) | |||
if (! pData->enabled) | |||
break; | |||
// plugins should never do this: | |||
@@ -1840,7 +1840,7 @@ protected: | |||
case audioMasterWantMidi: | |||
// Deprecated in VST SDK 2.4 | |||
fHints |= PLUGIN_WANTS_MIDI_INPUT; | |||
pData->hints |= PLUGIN_WANTS_MIDI_INPUT; | |||
break; | |||
#endif | |||
@@ -1853,12 +1853,12 @@ protected: | |||
break; | |||
case audioMasterProcessEvents: | |||
CARLA_ASSERT(fEnabled); | |||
CARLA_ASSERT(pData->enabled); | |||
CARLA_ASSERT(fIsProcessing); | |||
CARLA_ASSERT(pData->event.portOut != nullptr); | |||
CARLA_ASSERT(ptr != nullptr); | |||
if (! fEnabled) | |||
if (! pData->enabled) | |||
return 0; | |||
if (! fIsProcessing) | |||
return 0; | |||
@@ -1928,11 +1928,11 @@ protected: | |||
#if 0 | |||
case audioMasterIOChanged: | |||
CARLA_ASSERT(fEnabled); | |||
CARLA_ASSERT(pData->enabled); | |||
// TESTING | |||
if (! fEnabled) | |||
if (! pData->enabled) | |||
{ | |||
ret = 1; | |||
break; | |||
@@ -2094,12 +2094,12 @@ protected: | |||
if (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; | |||
break; | |||
@@ -2224,7 +2224,7 @@ public: | |||
if (name != nullptr) | |||
{ | |||
fName = pData->engine->getUniquePluginName(name); | |||
pData->name = pData->engine->getUniquePluginName(name); | |||
} | |||
else | |||
{ | |||
@@ -2233,16 +2233,16 @@ public: | |||
if (strBuf[0] != '\0') | |||
{ | |||
fName = pData->engine->getUniquePluginName(strBuf); | |||
pData->name = pData->engine->getUniquePluginName(strBuf); | |||
} | |||
else | |||
{ | |||
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 | |||
@@ -2266,10 +2266,10 @@ public: | |||
dispatcher(effSetProcessPrecision, 0, kVstProcessPrecision32, nullptr, 0.0f); | |||
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) | |||
fHints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||
pData->hints |= PLUGIN_HAS_COCKOS_EXTENSIONS; | |||
// --------------------------------------------------------------- | |||
// gui stuff | |||
@@ -2300,22 +2300,22 @@ public: | |||
{ | |||
// set default options | |||
fOptions = 0x0; | |||
pData->options = 0x0; | |||
fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | |||
if (getMidiInCount() > 0) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
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 | |||
@@ -2323,11 +2323,11 @@ public: | |||
//pData->idStr += std::strrchr(filename, OS_SEP)+1; // FIXME! | |||
//pData->idStr += "/"; | |||
pData->idStr += CarlaString(getUniqueId()); | |||
fOptions = pData->loadSettings(fOptions, getOptionsAvailable()); | |||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | |||
// ignore settings, we need this anyway | |||
if (getMidiInCount() > 0) | |||
fOptions |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | |||
} | |||
return true; | |||
@@ -397,7 +397,7 @@ bool carla_engine_init(const char* driverName, const char* clientName) | |||
#endif | |||
// 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_SVR_RT", "10"); | |||
@@ -570,28 +570,22 @@ void carla_set_engine_callback(EngineCallbackFunc func, void* ptr) | |||
//#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); | |||
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; | |||
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); | |||
break; | |||
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); | |||
break; | |||
@@ -626,7 +620,7 @@ void carla_set_engine_option(CarlaEngineOption option, int value, const char* va | |||
break; | |||
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); | |||
break; | |||
@@ -645,101 +639,15 @@ void carla_set_engine_option(CarlaEngineOption option, int value, const char* va | |||
gStandalone.engineOptions.audioDevice = valueStr; | |||
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',); | |||
gStandalone.engineOptions.bridge_lv2Cocoa = valueStr; | |||
gStandalone.engineOptions.binaryDir = valueStr; | |||
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',); | |||
gStandalone.engineOptions.bridge_vstX11 = valueStr; | |||
gStandalone.engineOptions.resourceDir = valueStr; | |||
break; | |||
#endif | |||
} | |||
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); | |||
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 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_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"); | |||
gStandalone.lastError = "Engine is not running"; | |||
return false; | |||
} | |||
#if 0 | |||
bool carla_load_project(const char* filename) | |||
{ | |||
CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false); | |||
carla_debug("carla_load_project(\"%s\")", filename); | |||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||
if (gStandalone.engine != nullptr) | |||
return gStandalone.engine->loadProject(filename); | |||
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_debug("carla_save_project(\"%s\")", filename); | |||
// allow to save even if engine isn't running | |||
if (gStandalone.engine != nullptr) | |||
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_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); | |||
carla_stderr2("Engine is not running"); | |||
@@ -827,7 +732,7 @@ bool carla_patchbay_disconnect(int connectionId) | |||
{ | |||
carla_debug("carla_patchbay_disconnect(%i)", connectionId); | |||
if (gStandalone.engine != nullptr && gStandalone.engine->isRunning()) | |||
if (gStandalone.engine != nullptr) | |||
return gStandalone.engine->patchbayDisconnect(connectionId); | |||
carla_stderr2("Engine is not running"); | |||
@@ -839,11 +744,8 @@ bool 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"); | |||
gStandalone.lastError = "Engine is not running"; | |||
@@ -851,7 +753,6 @@ bool carla_patchbay_refresh() | |||
} | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
#endif | |||
void carla_transport_play() | |||
{ | |||
@@ -885,7 +786,6 @@ uint64_t carla_get_current_transport_frame() | |||
return timeInfo.frame; | |||
} | |||
#if 0 | |||
const CarlaTransportInfo* carla_get_transport_info() | |||
{ | |||
static CarlaTransportInfo info; | |||
@@ -900,7 +800,7 @@ const CarlaTransportInfo* carla_get_transport_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.frame = timeInfo.frame; | |||
@@ -915,8 +815,6 @@ const CarlaTransportInfo* carla_get_transport_info() | |||
return &info; | |||
} | |||
#endif | |||
#endif | |||
// ------------------------------------------------------------------------------------------------------------------- | |||
@@ -1103,24 +1103,24 @@ class Host(object): | |||
# Get the complete license text of used third-party code and features. | |||
# Returned string is in basic html format. | |||
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: | |||
# @code | |||
# "*.ext1;*.ext2;*.ext3" | |||
# @endcode | |||
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. | |||
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. | |||
# @param index Driver 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. | |||
# @param index Driver index | |||
@@ -1133,40 +1133,78 @@ class Host(object): | |||
def get_engine_driver_device_info(self, 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): | |||
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): | |||
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): | |||
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): | |||
self.lib.carla_engine_idle() | |||
# Check if the engine is running. | |||
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): | |||
self.lib.carla_set_engine_about_to_close() | |||
# Set the engine callback function. | |||
# @param func Callback function | |||
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): | |||
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): | |||
return self.lib.carla_load_project(filename.encode("utf-8")) | |||
# Save current project to a file. | |||
# @param Filename Filename | |||
def save_project(self, filename): | |||
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.restype = POINTER(EngineDriverDeviceInfo) | |||
return | |||
self.lib.carla_get_internal_plugin_count.argtypes = None | |||
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.restype = None | |||
return | |||
self.lib.carla_set_engine_callback.argtypes = [EngineCallbackFunc, c_void_p] | |||
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.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.restype = c_bool | |||
@@ -69,18 +69,11 @@ | |||
#endif | |||
/* Common includes */ | |||
#ifdef CARLA_OS_WIN | |||
# include <winsock2.h> | |||
# include <windows.h> | |||
#ifdef __cplusplus | |||
# include <cstddef> | |||
#else | |||
# include <unistd.h> | |||
# ifndef __cdecl | |||
# define __cdecl | |||
# endif | |||
#endif | |||
#ifndef __cplusplus | |||
# include <stdbool.h> | |||
# include <stddef.h> | |||
#endif | |||
/* Define various string format types */ | |||
@@ -32,6 +32,13 @@ | |||
# include <stdint.h> | |||
#endif | |||
#ifdef CARLA_OS_WIN | |||
# include <winsock2.h> | |||
# include <windows.h> | |||
#else | |||
# include <unistd.h> | |||
#endif | |||
// ----------------------------------------------------------------------- | |||
// misc functions | |||