@@ -931,7 +931,9 @@ void CarlaPlugin::setOption(const uint option, const bool yesNo) | |||||
else | else | ||||
pData->options &= ~option; | pData->options &= ~option; | ||||
#ifndef BUILD_BRIDGE | |||||
pData->saveSetting(option, yesNo); | pData->saveSetting(option, yesNo); | ||||
#endif | |||||
} | } | ||||
void CarlaPlugin::setEnabled(const bool yesNo) noexcept | void CarlaPlugin::setEnabled(const bool yesNo) noexcept | ||||
@@ -473,11 +473,13 @@ CarlaPlugin::ProtectedData::ProtectedData(CarlaEngine* const eng, const uint idx | |||||
extraHints(0x0), | extraHints(0x0), | ||||
transientTryCounter(0), | transientTryCounter(0), | ||||
latency(0), | latency(0), | ||||
#ifndef BUILD_BRIDGE | |||||
latencyBuffers(nullptr), | latencyBuffers(nullptr), | ||||
#endif | |||||
name(nullptr), | name(nullptr), | ||||
filename(nullptr), | filename(nullptr), | ||||
#ifndef BUILD_BRIDGE | |||||
iconName(nullptr), | iconName(nullptr), | ||||
#ifndef BUILD_BRIDGE | |||||
identifier(nullptr), | identifier(nullptr), | ||||
#endif | #endif | ||||
osc(eng, plug) {} | osc(eng, plug) {} | ||||
@@ -522,13 +524,13 @@ CarlaPlugin::ProtectedData::~ProtectedData() noexcept | |||||
filename = nullptr; | filename = nullptr; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
if (iconName != nullptr) | if (iconName != nullptr) | ||||
{ | { | ||||
delete[] iconName; | delete[] iconName; | ||||
iconName = nullptr; | iconName = nullptr; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
if (identifier != nullptr) | if (identifier != nullptr) | ||||
{ | { | ||||
delete[] identifier; | delete[] identifier; | ||||
@@ -584,6 +586,7 @@ CarlaPlugin::ProtectedData::~ProtectedData() noexcept | |||||
void CarlaPlugin::ProtectedData::clearBuffers() noexcept | void CarlaPlugin::ProtectedData::clearBuffers() noexcept | ||||
{ | { | ||||
#ifndef BUILD_BRIDGE | |||||
if (latencyBuffers != nullptr) | if (latencyBuffers != nullptr) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT(audioIn.count > 0); | CARLA_SAFE_ASSERT(audioIn.count > 0); | ||||
@@ -604,12 +607,13 @@ void CarlaPlugin::ProtectedData::clearBuffers() noexcept | |||||
{ | { | ||||
if (latency != 0) | if (latency != 0) | ||||
{ | { | ||||
#ifndef BUILD_BRIDGE | |||||
carla_safe_assert_int("latency != 0", __FILE__, __LINE__, static_cast<int>(latency)); | carla_safe_assert_int("latency != 0", __FILE__, __LINE__, static_cast<int>(latency)); | ||||
#endif | |||||
latency = 0; | latency = 0; | ||||
} | } | ||||
} | } | ||||
#else | |||||
latency = 0; | |||||
#endif | |||||
audioIn.clear(); | audioIn.clear(); | ||||
audioOut.clear(); | audioOut.clear(); | ||||
@@ -714,6 +718,7 @@ void* CarlaPlugin::ProtectedData::uiLibSymbol(const char* const symbol) const no | |||||
return lib_symbol(uiLib, symbol); | return lib_symbol(uiLib, symbol); | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
// Settings functions | // Settings functions | ||||
@@ -805,6 +810,7 @@ void CarlaPlugin::ProtectedData::tryTransient() noexcept | |||||
if (engine->getOptions().frontendWinId != 0) | if (engine->getOptions().frontendWinId != 0) | ||||
transientTryCounter = 1; | transientTryCounter = 1; | ||||
} | } | ||||
#endif | |||||
// ----------------------------------------------------------------------- | // ----------------------------------------------------------------------- | ||||
@@ -243,8 +243,8 @@ struct CarlaPlugin::ProtectedData { | |||||
// data 1 | // data 1 | ||||
const char* name; | const char* name; | ||||
const char* filename; | const char* filename; | ||||
#ifndef BUILD_BRIDGE | |||||
const char* iconName; | const char* iconName; | ||||
#ifndef BUILD_BRIDGE | |||||
const char* identifier; // used for save/restore settings per plugin | const char* identifier; // used for save/restore settings per plugin | ||||
#endif | #endif | ||||
@@ -348,6 +348,7 @@ struct CarlaPlugin::ProtectedData { | |||||
bool uiLibClose() noexcept; | bool uiLibClose() noexcept; | ||||
void* uiLibSymbol(const char* const symbol) const noexcept; | void* uiLibSymbol(const char* const symbol) const noexcept; | ||||
#ifndef BUILD_BRIDGE | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Settings functions | // Settings functions | ||||
@@ -358,6 +359,7 @@ struct CarlaPlugin::ProtectedData { | |||||
// Misc | // Misc | ||||
void tryTransient() noexcept; | void tryTransient() noexcept; | ||||
#endif | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -38,7 +38,7 @@ CARLA_BACKEND_START_NAMESPACE | |||||
class DssiPlugin : public CarlaPlugin | class DssiPlugin : public CarlaPlugin | ||||
{ | { | ||||
public: | public: | ||||
DssiPlugin(CarlaEngine* const engine, const uint id) | |||||
DssiPlugin(CarlaEngine* const engine, const uint id) noexcept | |||||
: CarlaPlugin(engine, id), | : CarlaPlugin(engine, id), | ||||
fHandle(nullptr), | fHandle(nullptr), | ||||
fHandle2(nullptr), | fHandle2(nullptr), | ||||
@@ -55,7 +55,7 @@ public: | |||||
pData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI); | pData->osc.thread.setMode(CarlaPluginThread::PLUGIN_THREAD_DSSI_GUI); | ||||
} | } | ||||
~DssiPlugin() override | |||||
~DssiPlugin() noexcept override | |||||
{ | { | ||||
carla_debug("DssiPlugin::~DssiPlugin()"); | carla_debug("DssiPlugin::~DssiPlugin()"); | ||||
@@ -87,9 +87,18 @@ public: | |||||
if (fDescriptor->cleanup != nullptr) | if (fDescriptor->cleanup != nullptr) | ||||
{ | { | ||||
if (fHandle != nullptr) | if (fHandle != nullptr) | ||||
fDescriptor->cleanup(fHandle); | |||||
{ | |||||
try { | |||||
fDescriptor->cleanup(fHandle); | |||||
} catch(...) {} | |||||
} | |||||
if (fHandle2 != nullptr) | if (fHandle2 != nullptr) | ||||
fDescriptor->cleanup(fHandle2); | |||||
{ | |||||
try { | |||||
fDescriptor->cleanup(fHandle2); | |||||
} catch(...) {} | |||||
} | |||||
} | } | ||||
fHandle = nullptr; | fHandle = nullptr; | ||||
@@ -166,18 +175,16 @@ public: | |||||
uint getOptionsAvailable() const noexcept override | uint getOptionsAvailable() const noexcept override | ||||
{ | { | ||||
#ifdef __USE_GNU | #ifdef __USE_GNU | ||||
const bool isAmSynth(strcasestr(pData->filename, "amsynth")); | |||||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst")); | |||||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||||
#else | #else | ||||
const bool isAmSynth(std::strstr(pData->filename, "amsynth")); | |||||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst")); | |||||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||||
#endif | #endif | ||||
uint options = 0x0; | uint options = 0x0; | ||||
options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | ||||
if (! (isAmSynth || isDssiVst)) | |||||
if (! isDssiVst) | |||||
{ | { | ||||
options |= PLUGIN_OPTION_FIXED_BUFFERS; | options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
@@ -218,9 +225,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->Label != nullptr) | if (fDescriptor->Label != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->Label, STR_MAX); | std::strncpy(strBuf, fDescriptor->Label, STR_MAX); | ||||
else | |||||
CarlaPlugin::getLabel(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | void getMaker(char* const strBuf) const noexcept override | ||||
@@ -228,9 +238,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->Maker != nullptr) | if (fDescriptor->Maker != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->Maker, STR_MAX); | std::strncpy(strBuf, fDescriptor->Maker, STR_MAX); | ||||
else | |||||
CarlaPlugin::getMaker(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getMaker(strBuf); | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | void getCopyright(char* const strBuf) const noexcept override | ||||
@@ -238,9 +251,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->Copyright != nullptr) | if (fDescriptor->Copyright != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->Copyright, STR_MAX); | std::strncpy(strBuf, fDescriptor->Copyright, STR_MAX); | ||||
else | |||||
CarlaPlugin::getCopyright(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getCopyright(strBuf); | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | void getRealName(char* const strBuf) const noexcept override | ||||
@@ -248,9 +264,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->Name != nullptr) | if (fDescriptor->Name != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->Name, STR_MAX); | std::strncpy(strBuf, fDescriptor->Name, STR_MAX); | ||||
else | |||||
CarlaPlugin::getRealName(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getRealName(strBuf); | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | ||||
@@ -260,10 +279,13 @@ public: | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
if (rindex < static_cast<int32_t>(fDescriptor->PortCount)) | |||||
if (rindex < static_cast<int32_t>(fDescriptor->PortCount) && fDescriptor->PortNames[rindex] != nullptr) | |||||
{ | |||||
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | ||||
else | |||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -541,7 +563,7 @@ public: | |||||
if (LADSPA_IS_PORT_INPUT(portType)) | if (LADSPA_IS_PORT_INPUT(portType)) | ||||
{ | { | ||||
uint32_t j = iAudioIn++; | |||||
const uint32_t j = iAudioIn++; | |||||
pData->audioIn.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true); | pData->audioIn.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true); | ||||
pData->audioIn.ports[j].rindex = i; | pData->audioIn.ports[j].rindex = i; | ||||
@@ -554,7 +576,7 @@ public: | |||||
} | } | ||||
else if (LADSPA_IS_PORT_OUTPUT(portType)) | else if (LADSPA_IS_PORT_OUTPUT(portType)) | ||||
{ | { | ||||
uint32_t j = iAudioOut++; | |||||
const uint32_t j = iAudioOut++; | |||||
pData->audioOut.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false); | pData->audioOut.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false); | ||||
pData->audioOut.ports[j].rindex = i; | pData->audioOut.ports[j].rindex = i; | ||||
@@ -570,13 +592,9 @@ public: | |||||
} | } | ||||
else if (LADSPA_IS_PORT_CONTROL(portType)) | else if (LADSPA_IS_PORT_CONTROL(portType)) | ||||
{ | { | ||||
uint32_t j = iCtrl++; | |||||
pData->param.data[j].hints = 0x0; | |||||
const uint32_t j = iCtrl++; | |||||
pData->param.data[j].index = static_cast<int32_t>(j); | pData->param.data[j].index = static_cast<int32_t>(j); | ||||
pData->param.data[j].rindex = static_cast<int32_t>(i); | pData->param.data[j].rindex = static_cast<int32_t>(i); | ||||
pData->param.data[j].midiCC = -1; | |||||
pData->param.data[j].midiChannel = 0; | |||||
pData->param.special[j] = PARAMETER_SPECIAL_NULL; | |||||
float min, max, def, step, stepSmall, stepLarge; | float min, max, def, step, stepSmall, stepLarge; | ||||
@@ -823,7 +841,9 @@ public: | |||||
{ | { | ||||
pData->latency = latency; | pData->latency = latency; | ||||
pData->client->setLatency(latency); | pData->client->setLatency(latency); | ||||
#ifndef BUILD_BRIDGE | |||||
pData->recreateLatencyBuffers(); | pData->recreateLatencyBuffers(); | ||||
#endif | |||||
} | } | ||||
break; | break; | ||||
@@ -1023,11 +1043,13 @@ public: | |||||
} | } | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
if (pData->latency > 0) | if (pData->latency > 0) | ||||
{ | { | ||||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | for (uint32_t i=0; i < pData->audioIn.count; ++i) | ||||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | ||||
} | } | ||||
#endif | |||||
pData->needsReset = false; | pData->needsReset = false; | ||||
} | } | ||||
@@ -1924,11 +1946,9 @@ public: | |||||
{ | { | ||||
#ifdef __USE_GNU | #ifdef __USE_GNU | ||||
const bool isAmSynth(strcasestr(pData->filename, "amsynth")); | |||||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst")); | |||||
const bool isDssiVst(strcasestr(pData->filename, "dssi-vst") != nullptr); | |||||
#else | #else | ||||
const bool isAmSynth(std::strstr(pData->filename, "amsynth")); | |||||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst")); | |||||
const bool isDssiVst(std::strstr(pData->filename, "dssi-vst") != nullptr); | |||||
#endif | #endif | ||||
// set default options | // set default options | ||||
@@ -1936,7 +1956,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | pData->options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | ||||
if (isAmSynth || isDssiVst) | |||||
if (isDssiVst) | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
if (pData->engine->getOptions().forceStereo) | if (pData->engine->getOptions().forceStereo) | ||||
@@ -1956,6 +1976,7 @@ public: | |||||
carla_stderr("WARNING: Plugin can ONLY use run_multiple_synths!"); | carla_stderr("WARNING: Plugin can ONLY use run_multiple_synths!"); | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("DSSI/"); | CarlaString identifier("DSSI/"); | ||||
@@ -1972,8 +1993,9 @@ public: | |||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | ||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (isAmSynth || isDssiVst) | |||||
if (isDssiVst) | |||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -41,7 +41,7 @@ CARLA_BACKEND_START_NAMESPACE | |||||
class FluidSynthPlugin : public CarlaPlugin | class FluidSynthPlugin : public CarlaPlugin | ||||
{ | { | ||||
public: | public: | ||||
FluidSynthPlugin(CarlaEngine* const engine, const unsigned int id, const bool use16Outs) | |||||
FluidSynthPlugin(CarlaEngine* const engine, const uint id, const bool use16Outs) | |||||
: CarlaPlugin(engine, id), | : CarlaPlugin(engine, id), | ||||
fUses16Outs(use16Outs), | fUses16Outs(use16Outs), | ||||
fSettings(nullptr), | fSettings(nullptr), | ||||
@@ -165,9 +165,9 @@ public: | |||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
// Information (per-plugin data) | // Information (per-plugin data) | ||||
unsigned int getOptionsAvailable() const noexcept override | |||||
uint getOptionsAvailable() const noexcept override | |||||
{ | { | ||||
unsigned int options = 0x0; | |||||
uint options = 0x0; | |||||
options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | options |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES; | ||||
options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES; | ||||
@@ -224,9 +224,12 @@ public: | |||||
void getLabel(char* const strBuf) const noexcept override | void getLabel(char* const strBuf) const noexcept override | ||||
{ | { | ||||
if (fLabel != nullptr) | if (fLabel != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fLabel, STR_MAX); | std::strncpy(strBuf, fLabel, STR_MAX); | ||||
else | |||||
CarlaPlugin::getLabel(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | void getMaker(char* const strBuf) const noexcept override | ||||
@@ -252,50 +255,49 @@ public: | |||||
{ | { | ||||
case FluidSynthReverbOnOff: | case FluidSynthReverbOnOff: | ||||
std::strncpy(strBuf, "Reverb On/Off", STR_MAX); | std::strncpy(strBuf, "Reverb On/Off", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthReverbRoomSize: | case FluidSynthReverbRoomSize: | ||||
std::strncpy(strBuf, "Reverb Room Size", STR_MAX); | std::strncpy(strBuf, "Reverb Room Size", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthReverbDamp: | case FluidSynthReverbDamp: | ||||
std::strncpy(strBuf, "Reverb Damp", STR_MAX); | std::strncpy(strBuf, "Reverb Damp", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthReverbLevel: | case FluidSynthReverbLevel: | ||||
std::strncpy(strBuf, "Reverb Level", STR_MAX); | std::strncpy(strBuf, "Reverb Level", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthReverbWidth: | case FluidSynthReverbWidth: | ||||
std::strncpy(strBuf, "Reverb Width", STR_MAX); | std::strncpy(strBuf, "Reverb Width", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusOnOff: | case FluidSynthChorusOnOff: | ||||
std::strncpy(strBuf, "Chorus On/Off", STR_MAX); | std::strncpy(strBuf, "Chorus On/Off", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusNr: | case FluidSynthChorusNr: | ||||
std::strncpy(strBuf, "Chorus Voice Count", STR_MAX); | std::strncpy(strBuf, "Chorus Voice Count", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusLevel: | case FluidSynthChorusLevel: | ||||
std::strncpy(strBuf, "Chorus Level", STR_MAX); | std::strncpy(strBuf, "Chorus Level", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusSpeedHz: | case FluidSynthChorusSpeedHz: | ||||
std::strncpy(strBuf, "Chorus Speed", STR_MAX); | std::strncpy(strBuf, "Chorus Speed", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusDepthMs: | case FluidSynthChorusDepthMs: | ||||
std::strncpy(strBuf, "Chorus Depth", STR_MAX); | std::strncpy(strBuf, "Chorus Depth", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusType: | case FluidSynthChorusType: | ||||
std::strncpy(strBuf, "Chorus Type", STR_MAX); | std::strncpy(strBuf, "Chorus Type", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthPolyphony: | case FluidSynthPolyphony: | ||||
std::strncpy(strBuf, "Polyphony", STR_MAX); | std::strncpy(strBuf, "Polyphony", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthInterpolation: | case FluidSynthInterpolation: | ||||
std::strncpy(strBuf, "Interpolation", STR_MAX); | std::strncpy(strBuf, "Interpolation", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthVoiceCount: | case FluidSynthVoiceCount: | ||||
std::strncpy(strBuf, "Voice Count", STR_MAX); | std::strncpy(strBuf, "Voice Count", STR_MAX); | ||||
break; | |||||
default: | |||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
break; | |||||
return; | |||||
} | } | ||||
CarlaPlugin::getParameterName(parameterId, strBuf); | |||||
} | } | ||||
void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | void getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept override | ||||
@@ -306,14 +308,13 @@ public: | |||||
{ | { | ||||
case FluidSynthChorusSpeedHz: | case FluidSynthChorusSpeedHz: | ||||
std::strncpy(strBuf, "Hz", STR_MAX); | std::strncpy(strBuf, "Hz", STR_MAX); | ||||
break; | |||||
return; | |||||
case FluidSynthChorusDepthMs: | case FluidSynthChorusDepthMs: | ||||
std::strncpy(strBuf, "ms", STR_MAX); | std::strncpy(strBuf, "ms", STR_MAX); | ||||
break; | |||||
default: | |||||
CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
break; | |||||
return; | |||||
} | } | ||||
CarlaPlugin::getParameterUnit(parameterId, strBuf); | |||||
} | } | ||||
void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | void getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept override | ||||
@@ -373,7 +374,7 @@ public: | |||||
void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override | void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override | ||||
{ | { | ||||
if (channel < MAX_MIDI_CHANNELS) | |||||
if (channel >= 0 && channel < MAX_MIDI_CHANNELS) | |||||
pData->midiprog.current = fCurMidiProgs[channel]; | pData->midiprog.current = fCurMidiProgs[channel]; | ||||
CarlaPlugin::setCtrlChannel(channel, sendOsc, sendCallback); | CarlaPlugin::setCtrlChannel(channel, sendOsc, sendCallback); | ||||
@@ -687,7 +688,6 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 1.0f; | pData->param.ranges[j].stepLarge = 1.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthReverbRoomSize; | j = FluidSynthReverbRoomSize; | ||||
@@ -703,7 +703,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthReverbDamp; | j = FluidSynthReverbDamp; | ||||
@@ -719,7 +718,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthReverbLevel; | j = FluidSynthReverbLevel; | ||||
@@ -735,7 +733,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthReverbWidth; | j = FluidSynthReverbWidth; | ||||
@@ -751,7 +748,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthChorusOnOff; | j = FluidSynthChorusOnOff; | ||||
@@ -767,7 +763,6 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 1.0f; | pData->param.ranges[j].stepLarge = 1.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthChorusNr; | j = FluidSynthChorusNr; | ||||
@@ -783,7 +778,6 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 10.0f; | pData->param.ranges[j].stepLarge = 10.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthChorusLevel; | j = FluidSynthChorusLevel; | ||||
@@ -799,7 +793,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthChorusSpeedHz; | j = FluidSynthChorusSpeedHz; | ||||
@@ -815,7 +808,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthChorusDepthMs; | j = FluidSynthChorusDepthMs; | ||||
@@ -831,7 +823,6 @@ public: | |||||
pData->param.ranges[j].step = 0.01f; | pData->param.ranges[j].step = 0.01f; | ||||
pData->param.ranges[j].stepSmall = 0.0001f; | pData->param.ranges[j].stepSmall = 0.0001f; | ||||
pData->param.ranges[j].stepLarge = 0.1f; | pData->param.ranges[j].stepLarge = 0.1f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthChorusType; | j = FluidSynthChorusType; | ||||
@@ -847,7 +838,6 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 1.0f; | pData->param.ranges[j].stepLarge = 1.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthPolyphony; | j = FluidSynthPolyphony; | ||||
@@ -863,7 +853,6 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 10.0f; | pData->param.ranges[j].stepLarge = 10.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthInterpolation; | j = FluidSynthInterpolation; | ||||
@@ -879,7 +868,6 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 1.0f; | pData->param.ranges[j].stepLarge = 1.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
// ---------------------- | // ---------------------- | ||||
j = FluidSynthVoiceCount; | j = FluidSynthVoiceCount; | ||||
@@ -895,7 +883,9 @@ public: | |||||
pData->param.ranges[j].step = 1.0f; | pData->param.ranges[j].step = 1.0f; | ||||
pData->param.ranges[j].stepSmall = 1.0f; | pData->param.ranges[j].stepSmall = 1.0f; | ||||
pData->param.ranges[j].stepLarge = 1.0f; | pData->param.ranges[j].stepLarge = 1.0f; | ||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
for (j=0; j<FluidSynthParametersMax; ++j) | |||||
fParamBuffers[j] = pData->param.ranges[j].def; | |||||
} | } | ||||
// --------------------------------------- | // --------------------------------------- | ||||
@@ -1647,6 +1637,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | ||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("SF2/"); | CarlaString identifier("SF2/"); | ||||
@@ -1659,6 +1650,7 @@ public: | |||||
// load settings | // load settings | ||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -411,11 +411,8 @@ public: | |||||
for (uint32_t j=0; j < params; ++j) | for (uint32_t j=0; j < params; ++j) | ||||
{ | { | ||||
pData->param.data[j].type = PARAMETER_INPUT; | pData->param.data[j].type = PARAMETER_INPUT; | ||||
pData->param.data[j].hints = 0x0; | |||||
pData->param.data[j].index = static_cast<int32_t>(j); | pData->param.data[j].index = static_cast<int32_t>(j); | ||||
pData->param.data[j].rindex = static_cast<int32_t>(j); | pData->param.data[j].rindex = static_cast<int32_t>(j); | ||||
pData->param.data[j].midiCC = -1; | |||||
pData->param.data[j].midiChannel = 0; | |||||
float min, max, def, step, stepSmall, stepLarge; | float min, max, def, step, stepSmall, stepLarge; | ||||
@@ -1122,6 +1119,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
String juceId(fDesc.createIdentifierString()); | String juceId(fDesc.createIdentifierString()); | ||||
@@ -1134,6 +1132,7 @@ public: | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -298,7 +298,7 @@ public: | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
if (rindex < static_cast<int32_t>(fDescriptor->PortCount)) | |||||
if (rindex < static_cast<int32_t>(fDescriptor->PortCount) && fDescriptor->PortNames[rindex] != nullptr) | |||||
{ | { | ||||
std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | std::strncpy(strBuf, fDescriptor->PortNames[rindex], STR_MAX); | ||||
return; | return; | ||||
@@ -904,11 +904,13 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
#ifndef BUILD_BRIDGE | |||||
if (pData->latency > 0) | if (pData->latency > 0) | ||||
{ | { | ||||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | for (uint32_t i=0; i < pData->audioIn.count; ++i) | ||||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | ||||
} | } | ||||
#endif | |||||
pData->needsReset = false; | pData->needsReset = false; | ||||
} | } | ||||
@@ -1485,6 +1487,7 @@ public: | |||||
if (pData->engine->getOptions().forceStereo) | if (pData->engine->getOptions().forceStereo) | ||||
pData->options |= PLUGIN_OPTION_FORCE_STEREO; | pData->options |= PLUGIN_OPTION_FORCE_STEREO; | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("LADSPA/"); | CarlaString identifier("LADSPA/"); | ||||
identifier += CarlaString(getUniqueId()); | identifier += CarlaString(getUniqueId()); | ||||
@@ -1498,6 +1501,7 @@ public: | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (isDssiVst) | if (isDssiVst) | ||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -332,17 +332,23 @@ public: | |||||
void getLabel(char* const strBuf) const noexcept override | void getLabel(char* const strBuf) const noexcept override | ||||
{ | { | ||||
if (fLabel != nullptr) | if (fLabel != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fLabel, STR_MAX); | std::strncpy(strBuf, fLabel, STR_MAX); | ||||
else | |||||
CarlaPlugin::getLabel(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | void getMaker(char* const strBuf) const noexcept override | ||||
{ | { | ||||
if (fMaker != nullptr) | if (fMaker != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fMaker, STR_MAX); | std::strncpy(strBuf, fMaker, STR_MAX); | ||||
else | |||||
CarlaPlugin::getMaker(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getMaker(strBuf); | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | void getCopyright(char* const strBuf) const noexcept override | ||||
@@ -353,9 +359,12 @@ public: | |||||
void getRealName(char* const strBuf) const noexcept override | void getRealName(char* const strBuf) const noexcept override | ||||
{ | { | ||||
if (fRealName != nullptr) | if (fRealName != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fRealName, STR_MAX); | std::strncpy(strBuf, fRealName, STR_MAX); | ||||
else | |||||
CarlaPlugin::getRealName(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getRealName(strBuf); | |||||
} | } | ||||
// ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||
@@ -377,7 +386,7 @@ public: | |||||
void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override | void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override | ||||
{ | { | ||||
if (channel < MAX_MIDI_CHANNELS) | |||||
if (channel >= 0 && channel < MAX_MIDI_CHANNELS) | |||||
pData->midiprog.current = fCurMidiProgs[channel]; | pData->midiprog.current = fCurMidiProgs[channel]; | ||||
CarlaPlugin::setCtrlChannel(channel, sendOsc, sendCallback); | CarlaPlugin::setCtrlChannel(channel, sendOsc, sendCallback); | ||||
@@ -1305,6 +1314,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | pData->options |= PLUGIN_OPTION_SEND_PITCHBEND; | ||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier(fFormat); | CarlaString identifier(fFormat); | ||||
identifier += "/"; | identifier += "/"; | ||||
@@ -1318,6 +1328,7 @@ public: | |||||
// load settings | // load settings | ||||
pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | pData->options = pData->loadSettings(pData->options, getOptionsAvailable()); | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -731,19 +731,16 @@ public: | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr, 0.0f); | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f); | CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), 0.0f); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
{ | { | ||||
const LV2_RDF_Port* const port(&fRdfDescriptor->Ports[rindex]); | const LV2_RDF_Port* const port(&fRdfDescriptor->Ports[rindex]); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < port->ScalePointCount, 0.0f); | |||||
if (scalePointId < port->ScalePointCount) | |||||
{ | |||||
const LV2_RDF_PortScalePoint* const portScalePoint(&port->ScalePoints[scalePointId]); | |||||
return portScalePoint->Value; | |||||
} | |||||
const LV2_RDF_PortScalePoint* const portScalePoint(&port->ScalePoints[scalePointId]); | |||||
return portScalePoint->Value; | |||||
} | } | ||||
return 0.0f; | return 0.0f; | ||||
@@ -917,23 +914,20 @@ public: | |||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fRdfDescriptor != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId),); | |||||
const int32_t rindex(pData->param.data[parameterId].rindex); | const int32_t rindex(pData->param.data[parameterId].rindex); | ||||
if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | if (rindex < static_cast<int32_t>(fRdfDescriptor->PortCount)) | ||||
{ | { | ||||
const LV2_RDF_Port* const port(&fRdfDescriptor->Ports[rindex]); | const LV2_RDF_Port* const port(&fRdfDescriptor->Ports[rindex]); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < port->ScalePointCount,); | |||||
if (scalePointId < port->ScalePointCount) | |||||
{ | |||||
const LV2_RDF_PortScalePoint* const portScalePoint(&port->ScalePoints[scalePointId]); | |||||
const LV2_RDF_PortScalePoint* const portScalePoint(&port->ScalePoints[scalePointId]); | |||||
if (portScalePoint->Label != nullptr) | |||||
{ | |||||
std::strncpy(strBuf, portScalePoint->Label, STR_MAX); | |||||
return; | |||||
} | |||||
if (portScalePoint->Label != nullptr) | |||||
{ | |||||
std::strncpy(strBuf, portScalePoint->Label, STR_MAX); | |||||
return; | |||||
} | } | ||||
} | } | ||||
@@ -1249,14 +1243,18 @@ public: | |||||
else if (fExt.uishow != nullptr) | else if (fExt.uishow != nullptr) | ||||
{ | { | ||||
fExt.uishow->show(fUi.handle); | fExt.uishow->show(fUi.handle); | ||||
# ifndef BUILD_BRIDGE | |||||
pData->tryTransient(); | pData->tryTransient(); | ||||
# endif | |||||
} | } | ||||
} | } | ||||
else | else | ||||
#endif | #endif | ||||
{ | { | ||||
LV2_EXTERNAL_UI_SHOW((LV2_External_UI_Widget*)fUi.widget); | LV2_EXTERNAL_UI_SHOW((LV2_External_UI_Widget*)fUi.widget); | ||||
#ifndef BUILD_BRIDGE | |||||
pData->tryTransient(); | pData->tryTransient(); | ||||
#endif | |||||
} | } | ||||
} | } | ||||
else | else | ||||
@@ -1574,7 +1572,7 @@ public: | |||||
{ | { | ||||
if (LV2_IS_PORT_INPUT(portTypes)) | if (LV2_IS_PORT_INPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iAudioIn++; | |||||
const uint32_t j = iAudioIn++; | |||||
pData->audioIn.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true); | pData->audioIn.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, true); | ||||
pData->audioIn.ports[j].rindex = i; | pData->audioIn.ports[j].rindex = i; | ||||
@@ -1587,7 +1585,7 @@ public: | |||||
} | } | ||||
else if (LV2_IS_PORT_OUTPUT(portTypes)) | else if (LV2_IS_PORT_OUTPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iAudioOut++; | |||||
const uint32_t j = iAudioOut++; | |||||
pData->audioOut.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false); | pData->audioOut.ports[j].port = (CarlaEngineAudioPort*)pData->client->addPort(kEnginePortTypeAudio, portName, false); | ||||
pData->audioOut.ports[j].rindex = i; | pData->audioOut.ports[j].rindex = i; | ||||
@@ -1605,13 +1603,13 @@ public: | |||||
{ | { | ||||
if (LV2_IS_PORT_INPUT(portTypes)) | if (LV2_IS_PORT_INPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iCvIn++; | |||||
const uint32_t j = iCvIn++; | |||||
fCvIn.ports[j].port = (CarlaEngineCVPort*)pData->client->addPort(kEnginePortTypeCV, portName, true); | fCvIn.ports[j].port = (CarlaEngineCVPort*)pData->client->addPort(kEnginePortTypeCV, portName, true); | ||||
fCvIn.ports[j].rindex = i; | fCvIn.ports[j].rindex = i; | ||||
} | } | ||||
else if (LV2_IS_PORT_OUTPUT(portTypes)) | else if (LV2_IS_PORT_OUTPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iCvOut++; | |||||
const uint32_t j = iCvOut++; | |||||
fCvOut.ports[j].port = (CarlaEngineCVPort*)pData->client->addPort(kEnginePortTypeCV, portName, false); | fCvOut.ports[j].port = (CarlaEngineCVPort*)pData->client->addPort(kEnginePortTypeCV, portName, false); | ||||
fCvOut.ports[j].rindex = i; | fCvOut.ports[j].rindex = i; | ||||
} | } | ||||
@@ -1622,7 +1620,7 @@ public: | |||||
{ | { | ||||
if (LV2_IS_PORT_INPUT(portTypes)) | if (LV2_IS_PORT_INPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iEvIn++; | |||||
const uint32_t j = iEvIn++; | |||||
fDescriptor->connect_port(fHandle, i, &fEventsIn.data[j].atom->atoms); | fDescriptor->connect_port(fHandle, i, &fEventsIn.data[j].atom->atoms); | ||||
@@ -1660,7 +1658,7 @@ public: | |||||
} | } | ||||
else if (LV2_IS_PORT_OUTPUT(portTypes)) | else if (LV2_IS_PORT_OUTPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iEvOut++; | |||||
const uint32_t j = iEvOut++; | |||||
fDescriptor->connect_port(fHandle, i, &fEventsOut.data[j].atom->atoms); | fDescriptor->connect_port(fHandle, i, &fEventsOut.data[j].atom->atoms); | ||||
@@ -1703,7 +1701,7 @@ public: | |||||
{ | { | ||||
if (LV2_IS_PORT_INPUT(portTypes)) | if (LV2_IS_PORT_INPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iEvIn++; | |||||
const uint32_t j = iEvIn++; | |||||
fDescriptor->connect_port(fHandle, i, fEventsIn.data[j].event); | fDescriptor->connect_port(fHandle, i, fEventsIn.data[j].event); | ||||
@@ -1741,7 +1739,7 @@ public: | |||||
} | } | ||||
else if (LV2_IS_PORT_OUTPUT(portTypes)) | else if (LV2_IS_PORT_OUTPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iEvOut++; | |||||
const uint32_t j = iEvOut++; | |||||
fDescriptor->connect_port(fHandle, i, fEventsOut.data[j].event); | fDescriptor->connect_port(fHandle, i, fEventsOut.data[j].event); | ||||
@@ -1784,7 +1782,7 @@ public: | |||||
{ | { | ||||
if (LV2_IS_PORT_INPUT(portTypes)) | if (LV2_IS_PORT_INPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iEvIn++; | |||||
const uint32_t j = iEvIn++; | |||||
fDescriptor->connect_port(fHandle, i, &fEventsIn.data[j].midi); | fDescriptor->connect_port(fHandle, i, &fEventsIn.data[j].midi); | ||||
@@ -1813,7 +1811,7 @@ public: | |||||
} | } | ||||
else if (LV2_IS_PORT_OUTPUT(portTypes)) | else if (LV2_IS_PORT_OUTPUT(portTypes)) | ||||
{ | { | ||||
uint32_t j = iEvOut++; | |||||
const uint32_t j = iEvOut++; | |||||
fDescriptor->connect_port(fHandle, i, &fEventsOut.data[j].midi); | fDescriptor->connect_port(fHandle, i, &fEventsOut.data[j].midi); | ||||
@@ -1849,13 +1847,9 @@ public: | |||||
const LV2_Property portDesignation(fRdfDescriptor->Ports[i].Designation); | const LV2_Property portDesignation(fRdfDescriptor->Ports[i].Designation); | ||||
const LV2_RDF_PortPoints portPoints(fRdfDescriptor->Ports[i].Points); | const LV2_RDF_PortPoints portPoints(fRdfDescriptor->Ports[i].Points); | ||||
uint32_t j = iCtrl++; | |||||
pData->param.data[j].hints = 0x0; | |||||
const uint32_t j = iCtrl++; | |||||
pData->param.data[j].index = static_cast<int32_t>(j); | pData->param.data[j].index = static_cast<int32_t>(j); | ||||
pData->param.data[j].rindex = static_cast<int32_t>(i); | pData->param.data[j].rindex = static_cast<int32_t>(i); | ||||
pData->param.data[j].midiCC = -1; | |||||
pData->param.data[j].midiChannel = 0; | |||||
pData->param.special[j] = PARAMETER_SPECIAL_NULL; | |||||
float min, max, def, step, stepSmall, stepLarge; | float min, max, def, step, stepSmall, stepLarge; | ||||
@@ -2455,11 +2449,13 @@ public: | |||||
} | } | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
if (pData->latency > 0) | if (pData->latency > 0) | ||||
{ | { | ||||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | for (uint32_t i=0; i < pData->audioIn.count; ++i) | ||||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | ||||
} | } | ||||
#endif | |||||
pData->needsReset = false; | pData->needsReset = false; | ||||
} | } | ||||
@@ -4637,6 +4633,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("LV2/"); | CarlaString identifier("LV2/"); | ||||
identifier += uri; | identifier += uri; | ||||
@@ -4648,6 +4645,7 @@ public: | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (getMidiInCount() > 0 || needsFixedBuffer()) | if (getMidiInCount() > 0 || needsFixedBuffer()) | ||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
#endif | |||||
} | } | ||||
// --------------------------------------------------------------- | // --------------------------------------------------------------- | ||||
@@ -333,11 +333,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr, 0.0f); | ||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0.0f); | CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr, 0.0f); | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f); | CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count, 0.0f); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId), 0.0f); | |||||
// FIXME - try | // FIXME - try | ||||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < param->scalePointCount, 0.0f); | |||||
const NativeParameterScalePoint* scalePoint(¶m->scalePoints[scalePointId]); | const NativeParameterScalePoint* scalePoint(¶m->scalePoints[scalePointId]); | ||||
return scalePoint->value; | return scalePoint->value; | ||||
} | } | ||||
@@ -351,9 +352,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->label != nullptr) | if (fDescriptor->label != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->label, STR_MAX); | std::strncpy(strBuf, fDescriptor->label, STR_MAX); | ||||
else | |||||
CarlaPlugin::getLabel(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getLabel(strBuf); | |||||
} | } | ||||
void getMaker(char* const strBuf) const noexcept override | void getMaker(char* const strBuf) const noexcept override | ||||
@@ -361,9 +365,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->maker != nullptr) | if (fDescriptor->maker != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->maker, STR_MAX); | std::strncpy(strBuf, fDescriptor->maker, STR_MAX); | ||||
else | |||||
CarlaPlugin::getMaker(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getMaker(strBuf); | |||||
} | } | ||||
void getCopyright(char* const strBuf) const noexcept override | void getCopyright(char* const strBuf) const noexcept override | ||||
@@ -371,9 +378,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->copyright != nullptr) | if (fDescriptor->copyright != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->copyright, STR_MAX); | std::strncpy(strBuf, fDescriptor->copyright, STR_MAX); | ||||
else | |||||
CarlaPlugin::getCopyright(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getCopyright(strBuf); | |||||
} | } | ||||
void getRealName(char* const strBuf) const noexcept override | void getRealName(char* const strBuf) const noexcept override | ||||
@@ -381,9 +391,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor != nullptr,); | ||||
if (fDescriptor->name != nullptr) | if (fDescriptor->name != nullptr) | ||||
{ | |||||
std::strncpy(strBuf, fDescriptor->name, STR_MAX); | std::strncpy(strBuf, fDescriptor->name, STR_MAX); | ||||
else | |||||
CarlaPlugin::getRealName(strBuf); | |||||
return; | |||||
} | |||||
CarlaPlugin::getRealName(strBuf); | |||||
} | } | ||||
void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | void getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept override | ||||
@@ -401,6 +414,7 @@ public: | |||||
std::strncpy(strBuf, param->name, STR_MAX); | std::strncpy(strBuf, param->name, STR_MAX); | ||||
return; | return; | ||||
} | } | ||||
carla_safe_assert("param->name != nullptr", __FILE__, __LINE__); | carla_safe_assert("param->name != nullptr", __FILE__, __LINE__); | ||||
return CarlaPlugin::getParameterName(parameterId, strBuf); | return CarlaPlugin::getParameterName(parameterId, strBuf); | ||||
} | } | ||||
@@ -443,6 +457,7 @@ public: | |||||
std::strncpy(strBuf, param->unit, STR_MAX); | std::strncpy(strBuf, param->unit, STR_MAX); | ||||
return; | return; | ||||
} | } | ||||
return CarlaPlugin::getParameterUnit(parameterId, strBuf); | return CarlaPlugin::getParameterUnit(parameterId, strBuf); | ||||
} | } | ||||
@@ -456,11 +471,12 @@ public: | |||||
CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fDescriptor->get_parameter_info != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | CARLA_SAFE_ASSERT_RETURN(fHandle != nullptr,); | ||||
CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | CARLA_SAFE_ASSERT_RETURN(parameterId < pData->param.count,); | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < getParameterScalePointCount(parameterId),); | |||||
// FIXME - try | // FIXME - try | ||||
if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | if (const NativeParameter* const param = fDescriptor->get_parameter_info(fHandle, parameterId)) | ||||
{ | { | ||||
CARLA_SAFE_ASSERT_RETURN(scalePointId < param->scalePointCount,); | |||||
const NativeParameterScalePoint* scalePoint(¶m->scalePoints[scalePointId]); | const NativeParameterScalePoint* scalePoint(¶m->scalePoints[scalePointId]); | ||||
if (scalePoint->label != nullptr) | if (scalePoint->label != nullptr) | ||||
@@ -468,6 +484,7 @@ public: | |||||
std::strncpy(strBuf, scalePoint->label, STR_MAX); | std::strncpy(strBuf, scalePoint->label, STR_MAX); | ||||
return; | return; | ||||
} | } | ||||
carla_safe_assert("scalePoint->label != nullptr", __FILE__, __LINE__); | carla_safe_assert("scalePoint->label != nullptr", __FILE__, __LINE__); | ||||
return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | return CarlaPlugin::getParameterScalePointLabel(parameterId, scalePointId, strBuf); | ||||
} | } | ||||
@@ -532,7 +549,7 @@ public: | |||||
void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override | void setCtrlChannel(const int8_t channel, const bool sendOsc, const bool sendCallback) noexcept override | ||||
{ | { | ||||
if (channel < MAX_MIDI_CHANNELS && pData->midiprog.count > 0) | |||||
if (channel >= 0 && channel < MAX_MIDI_CHANNELS && pData->midiprog.count > 0) | |||||
pData->midiprog.current = fCurMidiProgs[channel]; | pData->midiprog.current = fCurMidiProgs[channel]; | ||||
CarlaPlugin::setCtrlChannel(channel, sendOsc, sendCallback); | CarlaPlugin::setCtrlChannel(channel, sendOsc, sendCallback); | ||||
@@ -694,8 +711,10 @@ public: | |||||
return; | return; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
if ((fDescriptor->hints & ::PLUGIN_USES_PARENT_ID) == 0) | if ((fDescriptor->hints & ::PLUGIN_USES_PARENT_ID) == 0) | ||||
pData->tryTransient(); | pData->tryTransient(); | ||||
#endif | |||||
if (fDescriptor->ui_set_custom_data != nullptr) | if (fDescriptor->ui_set_custom_data != nullptr) | ||||
{ | { | ||||
@@ -949,12 +968,8 @@ public: | |||||
CARLA_SAFE_ASSERT_CONTINUE(paramInfo != nullptr); | CARLA_SAFE_ASSERT_CONTINUE(paramInfo != nullptr); | ||||
pData->param.data[j].type = PARAMETER_UNKNOWN; | pData->param.data[j].type = PARAMETER_UNKNOWN; | ||||
pData->param.data[j].hints = 0x0; | |||||
pData->param.data[j].index = static_cast<int32_t>(j); | pData->param.data[j].index = static_cast<int32_t>(j); | ||||
pData->param.data[j].rindex = static_cast<int32_t>(j); | pData->param.data[j].rindex = static_cast<int32_t>(j); | ||||
pData->param.data[j].midiCC = -1; | |||||
pData->param.data[j].midiChannel = 0; | |||||
pData->param.special[j] = PARAMETER_SPECIAL_NULL; | |||||
float min, max, def, step, stepSmall, stepLarge; | float min, max, def, step, stepSmall, stepLarge; | ||||
@@ -2341,6 +2356,7 @@ public: | |||||
if (fDescriptor->supports & ::PLUGIN_SUPPORTS_ALL_SOUND_OFF) | if (fDescriptor->supports & ::PLUGIN_SUPPORTS_ALL_SOUND_OFF) | ||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("Native/"); | CarlaString identifier("Native/"); | ||||
identifier += label; | identifier += label; | ||||
@@ -2352,6 +2368,7 @@ public: | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | if (getMidiInCount() > 0 || (fDescriptor->hints & ::PLUGIN_NEEDS_FIXED_BUFFERS) != 0) | ||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -700,11 +700,13 @@ public: | |||||
if (pData->needsReset) | if (pData->needsReset) | ||||
{ | { | ||||
#ifndef BUILD_BRIDGE | |||||
if (pData->latency > 0) | if (pData->latency > 0) | ||||
{ | { | ||||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | for (uint32_t i=0; i < pData->audioIn.count; ++i) | ||||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | ||||
} | } | ||||
#endif | |||||
pData->needsReset = false; | pData->needsReset = false; | ||||
} | } | ||||
@@ -1033,6 +1035,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("ReWire/"); | CarlaString identifier("ReWire/"); | ||||
identifier += fLabel; | identifier += fLabel; | ||||
@@ -1044,6 +1047,7 @@ public: | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
pData->options |= PLUGIN_OPTION_USE_CHUNKS; | pData->options |= PLUGIN_OPTION_USE_CHUNKS; | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||
@@ -620,11 +620,8 @@ public: | |||||
for (uint32_t j=0; j < params; ++j) | for (uint32_t j=0; j < params; ++j) | ||||
{ | { | ||||
pData->param.data[j].type = PARAMETER_INPUT; | pData->param.data[j].type = PARAMETER_INPUT; | ||||
pData->param.data[j].hints = 0x0; | |||||
pData->param.data[j].index = static_cast<int32_t>(j); | pData->param.data[j].index = static_cast<int32_t>(j); | ||||
pData->param.data[j].rindex = static_cast<int32_t>(j); | pData->param.data[j].rindex = static_cast<int32_t>(j); | ||||
pData->param.data[j].midiCC = -1; | |||||
pData->param.data[j].midiChannel = 0; | |||||
float min, max, def, step, stepSmall, stepLarge; | float min, max, def, step, stepSmall, stepLarge; | ||||
@@ -853,7 +850,9 @@ public: | |||||
#endif | #endif | ||||
pData->client->setLatency(pData->latency); | pData->client->setLatency(pData->latency); | ||||
#ifndef BUILD_BRIDGE | |||||
pData->recreateLatencyBuffers(); | pData->recreateLatencyBuffers(); | ||||
#endif | |||||
} | } | ||||
// special plugin fixes | // special plugin fixes | ||||
@@ -1056,11 +1055,13 @@ public: | |||||
} | } | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
if (pData->latency > 0) | if (pData->latency > 0) | ||||
{ | { | ||||
for (uint32_t i=0; i < pData->audioIn.count; ++i) | for (uint32_t i=0; i < pData->audioIn.count; ++i) | ||||
FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | FLOAT_CLEAR(pData->latencyBuffers[i], pData->latency); | ||||
} | } | ||||
#endif | |||||
pData->needsReset = false; | pData->needsReset = false; | ||||
} | } | ||||
@@ -2256,6 +2257,7 @@ public: | |||||
pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | pData->options |= PLUGIN_OPTION_SEND_ALL_SOUND_OFF; | ||||
} | } | ||||
#ifndef BUILD_BRIDGE | |||||
// set identifier string | // set identifier string | ||||
CarlaString identifier("VST/"); | CarlaString identifier("VST/"); | ||||
@@ -2274,6 +2276,7 @@ public: | |||||
// ignore settings, we need this anyway | // ignore settings, we need this anyway | ||||
if (getMidiInCount() > 0) | if (getMidiInCount() > 0) | ||||
pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | pData->options |= PLUGIN_OPTION_FIXED_BUFFERS; | ||||
#endif | |||||
} | } | ||||
return true; | return true; | ||||