diff --git a/resources/ui/carla_edit.ui b/resources/ui/carla_edit.ui
index 4e4acba09..0bd4cdd83 100644
--- a/resources/ui/carla_edit.ui
+++ b/resources/ui/carla_edit.ui
@@ -302,7 +302,7 @@ Plugin Name
-
- Force stereo
+ Force stereo (needs restart)
diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp
index b344ad0f4..3f103ffcd 100644
--- a/source/backend/CarlaPlugin.hpp
+++ b/source/backend/CarlaPlugin.hpp
@@ -426,23 +426,14 @@ public:
*
* \see id()
*/
- void setId(const unsigned int id)
- {
- fId = id;
- }
+ void setId(const unsigned int id);
/*!
* Set a plugin's option.
*
* \see options()
*/
- void setOption(const unsigned int option, const bool yesNo)
- {
- if (yesNo)
- fOptions |= option;
- else
- fOptions &= ~option;
- }
+ void setOption(const unsigned int option, const bool yesNo);
/*!
* Enable or disable the plugin according to \a yesNo.
@@ -452,10 +443,7 @@ public:
*
* \see enabled()
*/
- void setEnabled(const bool yesNo)
- {
- fEnabled = yesNo;
- }
+ void setEnabled(const bool yesNo);
/*!
* Set plugin as active according to \a active.
@@ -681,11 +669,6 @@ public:
*/
virtual void sampleRateChanged(const double newSampleRate);
- /*!
- * Initialize all RT buffers of the plugin.
- */
- virtual void initBuffers();
-
/*!
* TODO.
*/
@@ -696,6 +679,19 @@ public:
*/
void unlock();
+ // -------------------------------------------------------------------
+ // Plugin buffers
+
+ /*!
+ * Initialize all RT buffers of the plugin.
+ */
+ virtual void initBuffers();
+
+ /*!
+ * Delete and clear all RT buffers.
+ */
+ virtual void clearBuffers();
+
// -------------------------------------------------------------------
// OSC stuff
diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp
index e3789bc75..65b6d3cbb 100644
--- a/source/backend/plugin/CarlaPlugin.cpp
+++ b/source/backend/plugin/CarlaPlugin.cpp
@@ -22,6 +22,7 @@
#include
#include
+#include
CARLA_BACKEND_START_NAMESPACE
@@ -146,6 +147,86 @@ const char* CarlaPluginProtectedData::libError(const char* const filename)
return lib_error(filename);
}
+// -------------------------------------------------------------------
+// Settings functions
+
+void CarlaPluginProtectedData::saveSetting(const unsigned int option, const bool yesNo)
+{
+ QSettings settings("falkTX", "CarlaPluginSettings");
+ settings.beginGroup((const char*)idStr);
+
+ switch (option)
+ {
+ case PLUGIN_OPTION_FIXED_BUFFER:
+ settings.setValue("FixedBuffer", yesNo);
+ break;
+ case PLUGIN_OPTION_FORCE_STEREO:
+ settings.setValue("ForceStereo", yesNo);
+ break;
+ case PLUGIN_OPTION_MAP_PROGRAM_CHANGES:
+ settings.setValue("MapProgramChanges", yesNo);
+ break;
+ case PLUGIN_OPTION_USE_CHUNKS:
+ settings.setValue("UseChunks", yesNo);
+ break;
+ case PLUGIN_OPTION_SEND_CONTROL_CHANGES:
+ settings.setValue("SendControlChanges", yesNo);
+ break;
+ case PLUGIN_OPTION_SEND_CHANNEL_PRESSURE:
+ settings.setValue("SendChannelPressure", yesNo);
+ break;
+ case PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH:
+ settings.setValue("SendNoteAftertouch", yesNo);
+ break;
+ case PLUGIN_OPTION_SEND_PITCHBEND:
+ settings.setValue("SendPitchbend", yesNo);
+ break;
+ case PLUGIN_OPTION_SEND_ALL_SOUND_OFF:
+ settings.setValue("SendAllSoundOff", yesNo);
+ break;
+ default:
+ break;
+ }
+
+ settings.endGroup();
+}
+
+unsigned int CarlaPluginProtectedData::loadSettings(const unsigned int options, const unsigned int availOptions)
+{
+ QSettings settings("falkTX", "CarlaPluginSettings");
+ settings.beginGroup((const char*)idStr);
+
+ unsigned int newOptions = 0x0;
+
+#define CHECK_AND_SET_OPTION(STR, BIT) \
+ if ((availOptions & BIT) != 0 || BIT == PLUGIN_OPTION_FORCE_STEREO) \
+ { \
+ if (settings.contains(STR)) \
+ { \
+ if (settings.value(STR, bool(options & BIT)).toBool()) \
+ newOptions |= BIT; \
+ } \
+ else if (options & BIT) \
+ newOptions |= BIT; \
+ }
+
+ CHECK_AND_SET_OPTION("FixedBuffer", PLUGIN_OPTION_FIXED_BUFFER);
+ CHECK_AND_SET_OPTION("ForceStereo", PLUGIN_OPTION_FORCE_STEREO);
+ CHECK_AND_SET_OPTION("MapProgramChanges", PLUGIN_OPTION_MAP_PROGRAM_CHANGES);
+ CHECK_AND_SET_OPTION("UseChunks", PLUGIN_OPTION_USE_CHUNKS);
+ CHECK_AND_SET_OPTION("SendControlChanges", PLUGIN_OPTION_SEND_CONTROL_CHANGES);
+ CHECK_AND_SET_OPTION("SendChannelPressure", PLUGIN_OPTION_SEND_CHANNEL_PRESSURE);
+ CHECK_AND_SET_OPTION("SendNoteAftertouch", PLUGIN_OPTION_SEND_NOTE_AFTERTOUCH);
+ CHECK_AND_SET_OPTION("SendPitchbend", PLUGIN_OPTION_SEND_PITCHBEND);
+ CHECK_AND_SET_OPTION("SendAllSoundOff", PLUGIN_OPTION_SEND_ALL_SOUND_OFF);
+
+#undef CHECK_AND_SET_OPTION
+
+ settings.endGroup();
+
+ return newOptions;
+}
+
// -------------------------------------------------------------------
// Plugin Helpers
@@ -199,9 +280,6 @@ CarlaPlugin::CarlaPlugin(CarlaEngine* const engine, const unsigned int id)
CARLA_ASSERT(id == 0);
break;
}
-
- if (engine->getOptions().forceStereo)
- fOptions |= PLUGIN_OPTION_FORCE_STEREO;
}
CarlaPlugin::~CarlaPlugin()
@@ -900,6 +978,31 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename)
// -------------------------------------------------------------------
// Set data (internal stuff)
+void CarlaPlugin::setId(const unsigned int id)
+{
+ fId = id;
+}
+
+void CarlaPlugin::setOption(const unsigned int option, const bool yesNo)
+{
+ CARLA_ASSERT(availableOptions() & option);
+
+ if (yesNo)
+ fOptions |= option;
+ else
+ fOptions &= ~option;
+
+ kData->saveSetting(option, yesNo);
+}
+
+void CarlaPlugin::setEnabled(const bool yesNo)
+{
+ fEnabled = yesNo;
+}
+
+// -------------------------------------------------------------------
+// Set data (internal stuff)
+
void CarlaPlugin::setActive(const bool active, const bool sendOsc, const bool sendCallback)
{
if (kData->active == active)
@@ -1432,13 +1535,6 @@ void CarlaPlugin::sampleRateChanged(const double)
{
}
-void CarlaPlugin::initBuffers()
-{
- kData->audioIn.initBuffers(kData->engine);
- kData->audioOut.initBuffers(kData->engine);
- kData->event.initBuffers(kData->engine);
-}
-
bool CarlaPlugin::tryLock()
{
return kData->masterMutex.tryLock();
@@ -1449,6 +1545,21 @@ void CarlaPlugin::unlock()
kData->masterMutex.unlock();
}
+// -------------------------------------------------------------------
+// Plugin buffers
+
+void CarlaPlugin::initBuffers()
+{
+ kData->audioIn.initBuffers(kData->engine);
+ kData->audioOut.initBuffers(kData->engine);
+ kData->event.initBuffers(kData->engine);
+}
+
+void CarlaPlugin::clearBuffers()
+{
+ kData->clearBuffers();
+}
+
// -------------------------------------------------------------------
// OSC stuff
diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp
index 8b181b6d8..4a85d4d3e 100644
--- a/source/backend/plugin/CarlaPluginInternal.hpp
+++ b/source/backend/plugin/CarlaPluginInternal.hpp
@@ -396,6 +396,7 @@ struct CarlaPluginProtectedData {
// misc
int8_t ctrlChannel;
unsigned int extraHints;
+ CarlaString idStr;
// latency
uint32_t latency;
@@ -654,6 +655,12 @@ struct CarlaPluginProtectedData {
void* libSymbol(const char* const symbol);
const char* libError(const char* const filename);
+ // -------------------------------------------------------------------
+ // Settings functions, see CarlaPlugin.cpp
+
+ void saveSetting(const unsigned int option, const bool yesNo);
+ unsigned int loadSettings(const unsigned int options, const unsigned int availOptions);
+
// -------------------------------------------------------------------
// Static helper functions
diff --git a/source/backend/plugin/DssiPlugin.cpp b/source/backend/plugin/DssiPlugin.cpp
index b5b1f062e..a3399179d 100644
--- a/source/backend/plugin/DssiPlugin.cpp
+++ b/source/backend/plugin/DssiPlugin.cpp
@@ -39,7 +39,8 @@ public:
fDssiDescriptor(nullptr),
fAudioInBuffers(nullptr),
fAudioOutBuffers(nullptr),
- fParamBuffers(nullptr)
+ fParamBuffers(nullptr),
+ fLastChunk(nullptr)
{
carla_debug("DssiPlugin::DssiPlugin(%p, %i)", engine, id);
@@ -90,6 +91,12 @@ public:
fDssiDescriptor = nullptr;
}
+ if (fLastChunk != nullptr)
+ {
+ std::free(fLastChunk);
+ fLastChunk = nullptr;
+ }
+
clearBuffers();
}
@@ -145,10 +152,8 @@ public:
#ifdef __USE_GNU
const bool isDssiVst = fFilename.contains("dssi-vst", true);
- const bool isZASX = fFilename.contains("zynaddsubfx", true);
#else
const bool isDssiVst = fFilename.contains("dssi-vst");
- const bool isZASX = fFilename.contains("zynaddsubfx");
#endif
unsigned int options = 0x0;
@@ -164,15 +169,16 @@ public:
{
if (kData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK)
{
- if (kData->audioIn.count <= 1 && kData->audioOut.count <= 1 && (kData->audioIn.count != 0 || kData->audioOut.count != 0))
+ if (fOptions & PLUGIN_OPTION_FORCE_STEREO)
+ options |= PLUGIN_OPTION_FORCE_STEREO;
+ else if (kData->audioIn.count <= 1 && kData->audioOut.count <= 1 && (kData->audioIn.count != 0 || kData->audioOut.count != 0))
options |= PLUGIN_OPTION_FORCE_STEREO;
}
- if (! isZASX)
- options |= PLUGIN_OPTION_FIXED_BUFFER;
+ options |= PLUGIN_OPTION_FIXED_BUFFER;
}
- if (kData->extraHints & PLUGIN_HINT_HAS_MIDI_IN)
+ if (fDssiDescriptor->run_synth != nullptr || fDssiDescriptor->run_multiple_synths != nullptr)
{
options |= PLUGIN_OPTION_SEND_CONTROL_CHANGES;
options |= PLUGIN_OPTION_SEND_CHANNEL_PRESSURE;
@@ -310,12 +316,22 @@ public:
if (fDssiDescriptor->set_custom_data == nullptr)
return;
- // FIXME
- fChunk = QByteArray::fromBase64(QByteArray(stringData));
- //fChunk.toBase64();
+ if (fLastChunk != nullptr)
+ {
+ std::free(fLastChunk);
+ fLastChunk = nullptr;
+ }
+
+ const size_t size(CarlaString(stringData).exportAsBase64Binary(&fLastChunk));
- const ScopedSingleProcessLocker spl(this, true);
- fDssiDescriptor->set_custom_data(fHandle, fChunk.data(), (unsigned long)fChunk.size());
+ CARLA_ASSERT(size > 0);
+ CARLA_ASSERT(fLastChunk != nullptr);
+
+ if (size > 0 && fLastChunk != nullptr)
+ {
+ const ScopedSingleProcessLocker spl(this, true);
+ fDssiDescriptor->set_custom_data(fHandle, fLastChunk, static_cast(size));
+ }
}
void setMidiProgram(int32_t index, const bool sendGui, const bool sendOsc, const bool sendCallback)
@@ -706,7 +722,7 @@ public:
portName += ":";
}
- portName += "event-in";
+ portName += "events-in";
portName.truncate(portNameSize);
kData->event.portIn = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, true);
@@ -722,21 +738,19 @@ public:
portName += ":";
}
- portName += "event-out";
+ portName += "events-out";
portName.truncate(portNameSize);
kData->event.portOut = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, false);
}
+ if (forcedStereoIn || forcedStereoOut)
+ fOptions |= PLUGIN_OPTION_FORCE_STEREO;
+ else
+ fOptions &= ~PLUGIN_OPTION_FORCE_STEREO;
+
// plugin hints
- const bool hasGUI = (fHints & PLUGIN_HAS_GUI);
-#ifdef __USE_GNU
- const bool isDssiVst = fFilename.contains("dssi-vst", true);
- const bool isZASX = fFilename.contains("zynaddsubfx", true);
-#else
- const bool isDssiVst = fFilename.contains("dssi-vst");
- const bool isZASX = fFilename.contains("zynaddsubfx");
-#endif
+ const bool hasGUI = (fHints & PLUGIN_HAS_GUI);
fHints = 0x0;
@@ -764,34 +778,6 @@ public:
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0))
kData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK;
- // plugin options
- fOptions = 0x0;
-
- fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
-
- if (forcedStereoIn || forcedStereoOut)
- fOptions |= PLUGIN_OPTION_FORCE_STEREO;
-
- if (isDssiVst)
- {
- fOptions |= PLUGIN_OPTION_FIXED_BUFFER;
-
- if (kData->engine->getOptions().useDssiVstChunks && fDssiDescriptor->get_custom_data != nullptr && fDssiDescriptor->set_custom_data != nullptr)
- fOptions |= PLUGIN_OPTION_USE_CHUNKS;
- }
- else if (isZASX)
- {
- fOptions |= PLUGIN_OPTION_FIXED_BUFFER;
- }
-
- if (mIns > 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;
- }
-
// check latency
if (fHints & PLUGIN_CAN_DRYWET)
{
@@ -845,6 +831,9 @@ public:
bufferSizeChanged(kData->engine->getBufferSize());
reloadPrograms(true);
+ if (kData->active)
+ activate();
+
carla_debug("DssiPlugin::reload() - end");
}
@@ -988,7 +977,7 @@ public:
unsigned long midiEventCount = 0;
// --------------------------------------------------------------------------------------------------------
- // Check if not active before
+ // Check if needs reset
if (kData->needsReset)
{
@@ -1592,6 +1581,7 @@ public:
void bufferSizeChanged(const uint32_t newBufferSize)
{
+ CARLA_ASSERT_INT(newBufferSize > 0, newBufferSize);
carla_debug("DssiPlugin::bufferSizeChanged(%i) - start", newBufferSize);
for (uint32_t i=0; i < kData->audioIn.count; ++i)
@@ -1648,6 +1638,17 @@ public:
carla_debug("DssiPlugin::bufferSizeChanged(%i) - start", newBufferSize);
}
+ void sampleRateChanged(const double newSampleRate)
+ {
+ CARLA_ASSERT_INT(newSampleRate > 0.0, newSampleRate);
+ carla_debug("DssiPlugin::sampleRateChanged(%i) - start", newSampleRate);
+
+ // TODO
+ (void)newSampleRate;
+
+ carla_debug("DssiPlugin::sampleRateChanged(%i) - end", newSampleRate);
+ }
+
// -------------------------------------------------------------------
// Post-poned events
@@ -1760,7 +1761,7 @@ public:
fParamBuffers = nullptr;
}
- kData->clearBuffers();
+ CarlaPlugin::clearBuffers();
carla_debug("DssiPlugin::clearBuffers() - end");
}
@@ -1880,8 +1881,47 @@ public:
fHints |= PLUGIN_HAS_GUI;
}
- // TODO - load settings for options:
- //fOptions & PLUGIN_OPTION_FORCE_STEREO
+ // ---------------------------------------------------------------
+ // load plugin settings
+
+ {
+#ifdef __USE_GNU
+ const bool isDssiVst = fFilename.contains("dssi-vst", true);
+#else
+ const bool isDssiVst = fFilename.contains("dssi-vst");
+#endif
+
+ // set default options
+ fOptions = 0x0;
+
+ fOptions |= PLUGIN_OPTION_MAP_PROGRAM_CHANGES;
+
+ if (kData->engine->getOptions().forceStereo)
+ fOptions |= PLUGIN_OPTION_FORCE_STEREO;
+
+ if (isDssiVst)
+ {
+ fOptions |= PLUGIN_OPTION_FIXED_BUFFER;
+
+ if (kData->engine->getOptions().useDssiVstChunks && fDssiDescriptor->get_custom_data != nullptr && fDssiDescriptor->set_custom_data != nullptr)
+ fOptions |= 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;
+ }
+
+ // load settings
+ kData->idStr = "DSSI/";
+ kData->idStr += std::strrchr(filename, OS_SEP)+1;
+ kData->idStr += "/";
+ kData->idStr += label;
+ fOptions = kData->loadSettings(fOptions, availableOptions());
+ }
return true;
}
@@ -1892,11 +1932,11 @@ private:
const LADSPA_Descriptor* fDescriptor;
const DSSI_Descriptor* fDssiDescriptor;
- float** fAudioInBuffers;
- float** fAudioOutBuffers;
- float* fParamBuffers;
+ float** fAudioInBuffers;
+ float** fAudioOutBuffers;
+ float* fParamBuffers;
+ uint8_t* fLastChunk;
snd_seq_event_t fMidiEvents[MAX_MIDI_EVENTS];
- QByteArray fChunk;
CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(DssiPlugin)
};
diff --git a/source/backend/plugin/LadspaPlugin.cpp b/source/backend/plugin/LadspaPlugin.cpp
index bc0efec4b..7bfee4754 100644
--- a/source/backend/plugin/LadspaPlugin.cpp
+++ b/source/backend/plugin/LadspaPlugin.cpp
@@ -170,7 +170,9 @@ public:
if (kData->engine->getProccessMode() != PROCESS_MODE_CONTINUOUS_RACK)
{
- if (kData->audioIn.count <= 1 && kData->audioOut.count <= 1 && (kData->audioIn.count != 0 || kData->audioOut.count != 0))
+ if (fOptions & PLUGIN_OPTION_FORCE_STEREO)
+ options |= PLUGIN_OPTION_FORCE_STEREO;
+ else if (kData->audioIn.count <= 1 && kData->audioOut.count <= 1 && (kData->audioIn.count != 0 || kData->audioOut.count != 0))
options |= PLUGIN_OPTION_FORCE_STEREO;
}
@@ -710,6 +712,11 @@ public:
kData->event.portOut = (CarlaEngineEventPort*)kData->client->addPort(kEnginePortTypeEvent, portName, false);
}
+ if (forcedStereoIn || forcedStereoOut)
+ fOptions |= PLUGIN_OPTION_FORCE_STEREO;
+ else
+ fOptions &= ~PLUGIN_OPTION_FORCE_STEREO;
+
// plugin hints
fHints = 0x0;
@@ -728,12 +735,6 @@ public:
if (aIns <= 2 && aOuts <= 2 && (aIns == aOuts || aIns == 0 || aOuts == 0))
kData->extraHints |= PLUGIN_HINT_CAN_RUN_RACK;
- // plugin options
- fOptions = 0x0;
-
- if (forcedStereoIn || forcedStereoOut)
- fOptions |= PLUGIN_OPTION_FORCE_STEREO;
-
// check latency
if (fHints & PLUGIN_CAN_DRYWET)
{
@@ -1212,6 +1213,7 @@ public:
void bufferSizeChanged(const uint32_t newBufferSize)
{
+ CARLA_ASSERT_INT(newBufferSize > 0, newBufferSize);
carla_debug("LadspaPlugin::bufferSizeChanged(%i) - start", newBufferSize);
for (uint32_t i=0; i < kData->audioIn.count; ++i)
@@ -1268,8 +1270,19 @@ public:
carla_debug("LadspaPlugin::bufferSizeChanged(%i) - end", newBufferSize);
}
+ void sampleRateChanged(const double newSampleRate)
+ {
+ CARLA_ASSERT_INT(newSampleRate > 0.0, newSampleRate);
+ carla_debug("LadspaPlugin::sampleRateChanged(%i) - start", newSampleRate);
+
+ // TODO
+ (void)newSampleRate;
+
+ carla_debug("LadspaPlugin::sampleRateChanged(%i) - end", newSampleRate);
+ }
+
// -------------------------------------------------------------------
- // Cleanup
+ // Plugin buffers
void clearBuffers()
{
@@ -1311,7 +1324,7 @@ public:
fParamBuffers = nullptr;
}
- kData->clearBuffers();
+ CarlaPlugin::clearBuffers();
carla_debug("LadspaPlugin::clearBuffers() - end");
}
@@ -1426,8 +1439,25 @@ public:
return false;
}
- // TODO - load settings for options:
- //fOptions & PLUGIN_OPTION_FORCE_STEREO
+ // ---------------------------------------------------------------
+ // load plugin settings
+
+ {
+ // set default options
+ fOptions = 0x0;
+
+ if (kData->engine->getOptions().forceStereo)
+ fOptions |= PLUGIN_OPTION_FORCE_STEREO;
+
+ // load settings
+ kData->idStr = "LADSPA/";
+ kData->idStr += std::strrchr(filename, OS_SEP)+1;
+ kData->idStr += "/";
+ kData->idStr += CarlaString(uniqueId());
+ kData->idStr += "/";
+ kData->idStr += label;
+ fOptions = kData->loadSettings(fOptions, availableOptions());
+ }
return true;
}
diff --git a/source/backend/plugin/Makefile b/source/backend/plugin/Makefile
index 18f9a088b..d13cf9e1e 100644
--- a/source/backend/plugin/Makefile
+++ b/source/backend/plugin/Makefile
@@ -54,7 +54,7 @@ debug:
# --------------------------------------------------------------
-%.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaPluginGui.hpp CarlaPluginInternal.hpp CarlaPluginThread.hpp moc_CarlaPluginGui.cpp
+%.cpp.o: %.cpp ../CarlaBackend.hpp ../CarlaEngine.hpp ../CarlaPlugin.hpp CarlaPluginGui.hpp CarlaPluginInternal.hpp CarlaPluginThread.hpp
$(CXX) $< $(BUILD_CXX_FLAGS) -c -o $@
moc_%.cpp: %.hpp
diff --git a/source/backend/standalone/CarlaStandalone.cpp b/source/backend/standalone/CarlaStandalone.cpp
index 7e6bf272b..983859a1b 100644
--- a/source/backend/standalone/CarlaStandalone.cpp
+++ b/source/backend/standalone/CarlaStandalone.cpp
@@ -760,9 +760,9 @@ const CarlaPluginInfo* carla_get_plugin_info(unsigned int pluginId)
if (CarlaPlugin* const plugin = standalone.engine->getPlugin(pluginId))
{
- char strBufLabel[STR_MAX] = { 0 };
- char strBufMaker[STR_MAX] = { 0 };
- char strBufCopyright[STR_MAX] = { 0 };
+ char strBufLabel[STR_MAX+1] = { '\0' };
+ char strBufMaker[STR_MAX+1] = { '\0' };
+ char strBufCopyright[STR_MAX+1] = { '\0' };
info.type = plugin->type();
info.category = plugin->category();
@@ -906,9 +906,9 @@ const CarlaParameterInfo* carla_get_parameter_info(unsigned int pluginId, uint32
{
if (parameterId < plugin->parameterCount())
{
- char strBufName[STR_MAX] = { 0 };
- char strBufSymbol[STR_MAX] = { 0 };
- char strBufUnit[STR_MAX] = { 0 };
+ char strBufName[STR_MAX+1] = { '\0' };
+ char strBufSymbol[STR_MAX+1] = { '\0' };
+ char strBufUnit[STR_MAX+1] = { '\0' };
info.scalePointCount = plugin->parameterScalePointCount(parameterId);
@@ -957,7 +957,7 @@ const CarlaScalePointInfo* carla_get_parameter_scalepoint_info(unsigned int plug
{
if (scalePointId < plugin->parameterScalePointCount(parameterId))
{
- char strBufLabel[STR_MAX] = { 0 };
+ char strBufLabel[STR_MAX+1] = { '\0' };
info.value = plugin->getParameterScalePointValue(parameterId, scalePointId);
@@ -1181,8 +1181,8 @@ const char* carla_get_parameter_text(unsigned int pluginId, uint32_t parameterId
if (standalone.engine == nullptr)
return nullptr;
- static char textBuf[STR_MAX];
- carla_zeroMem(textBuf, sizeof(char)*STR_MAX);
+ static char textBuf[STR_MAX+1];
+ carla_fill(textBuf, STR_MAX+1, '\0');
if (CarlaPlugin* const plugin = standalone.engine->getPlugin(pluginId))
{
@@ -1208,8 +1208,8 @@ const char* carla_get_program_name(unsigned int pluginId, uint32_t programId)
if (standalone.engine == nullptr)
return nullptr;
- static char programName[STR_MAX];
- carla_zeroMem(programName, sizeof(char)*STR_MAX);
+ static char programName[STR_MAX+1];
+ carla_fill(programName, STR_MAX+1, '\0');
if (CarlaPlugin* const plugin = standalone.engine->getPlugin(pluginId))
{
@@ -1236,8 +1236,8 @@ const char* carla_get_midi_program_name(unsigned int pluginId, uint32_t midiProg
if (standalone.engine == nullptr)
return nullptr;
- static char midiProgramName[STR_MAX];
- carla_zeroMem(midiProgramName, sizeof(char)*STR_MAX);
+ static char midiProgramName[STR_MAX+1];
+ carla_fill(midiProgramName, STR_MAX+1, '\0');
if (CarlaPlugin* const plugin = standalone.engine->getPlugin(pluginId))
{
@@ -1264,8 +1264,8 @@ const char* carla_get_real_plugin_name(unsigned int pluginId)
if (standalone.engine == nullptr)
return nullptr;
- static char realPluginName[STR_MAX];
- carla_zeroMem(realPluginName, sizeof(char)*STR_MAX);
+ static char realPluginName[STR_MAX+1];
+ carla_fill(realPluginName, STR_MAX+1, '\0');
if (CarlaPlugin* const plugin = standalone.engine->getPlugin(pluginId))
{
diff --git a/source/discovery/carla-discovery.cpp b/source/discovery/carla-discovery.cpp
index af1e86937..16d374626 100644
--- a/source/discovery/carla-discovery.cpp
+++ b/source/discovery/carla-discovery.cpp
@@ -1071,7 +1071,7 @@ void do_vst_check(void* const libHandle, const bool init)
return;
}
- char strBuf[STR_MAX] = { 0 };
+ char strBuf[STR_MAX+1] = { 0 };
CarlaString cName;
CarlaString cProduct;
CarlaString cVendor;
@@ -1100,14 +1100,14 @@ void do_vst_check(void* const libHandle, const bool init)
return;
}
- carla_zeroMem(strBuf, sizeof(char)*STR_MAX);
+ carla_fill(strBuf, STR_MAX+1, '\0');
if (effect->dispatcher(effect, effGetVendorString, 0, 0, strBuf, 0.0f) == 1)
cVendor = strBuf;
while (gVstCurrentUniqueId != 0)
{
- carla_zeroMem(strBuf, sizeof(char)*STR_MAX);
+ carla_fill(strBuf, STR_MAX+1, '\0');
if (effect->dispatcher(effect, effGetProductString, 0, 0, strBuf, 0.0f) == 1)
cProduct = strBuf;
@@ -1276,7 +1276,7 @@ void do_vst_check(void* const libHandle, const bool init)
if (vstCategory == kPlugCategShell)
{
- carla_zeroMem(strBuf, sizeof(char)*STR_MAX);
+ carla_fill(strBuf, STR_MAX+1, '\0');
if ((gVstCurrentUniqueId = effect->dispatcher(effect, effShellGetNextPlugin, 0, 0, strBuf, 0.0f)) != 0)
cName = strBuf;