Browse Source

Enforce use of return value of a few CarlaPlugin functions

tags/v2.1-rc1
falkTX 6 years ago
parent
commit
92f7b267ec
10 changed files with 268 additions and 233 deletions
  1. +13
    -0
      source/backend/CarlaPlugin.hpp
  2. +19
    -15
      source/backend/CarlaStandalone.cpp
  3. +5
    -5
      source/backend/engine/CarlaEngine.cpp
  4. +26
    -21
      source/backend/engine/CarlaEngineBridge.cpp
  5. +150
    -160
      source/backend/engine/CarlaEngineNative.cpp
  6. +15
    -8
      source/backend/engine/CarlaEngineOscSend.cpp
  7. +25
    -24
      source/backend/plugin/CarlaPlugin.cpp
  8. +2
    -0
      source/native-plugins/resources/carla-plugin
  9. +8
    -0
      source/utils/CarlaPipeUtils.cpp
  10. +5
    -0
      source/utils/CarlaPipeUtils.hpp

+ 13
- 0
source/backend/CarlaPlugin.hpp View File

@@ -296,16 +296,19 @@ public:
/*!
* Get the plugin's label (URI for LV2 plugins).
*/
__attribute__((warn_unused_result))
virtual bool getLabel(char* const strBuf) const noexcept;

/*!
* Get the plugin's maker.
*/
__attribute__((warn_unused_result))
virtual bool getMaker(char* const strBuf) const noexcept;

/*!
* Get the plugin's copyright/license.
*/
__attribute__((warn_unused_result))
virtual bool getCopyright(char* const strBuf) const noexcept;

/*!
@@ -313,43 +316,51 @@ public:
*
* @see getName() and setName()
*/
__attribute__((warn_unused_result))
virtual bool getRealName(char* const strBuf) const noexcept;

/*!
* Get the name of the parameter @a parameterId.
*/
__attribute__((warn_unused_result))
virtual bool getParameterName(const uint32_t parameterId, char* const strBuf) const noexcept;

/*!
* Get the symbol of the parameter @a parameterId.
*/
__attribute__((warn_unused_result))
virtual bool getParameterSymbol(const uint32_t parameterId, char* const strBuf) const noexcept;

/*!
* Get the custom text of the parameter @a parameterId.
* @see PARAMETER_USES_CUSTOM_TEXT
*/
__attribute__((warn_unused_result))
virtual bool getParameterText(const uint32_t parameterId, char* const strBuf) noexcept;

/*!
* Get the unit of the parameter @a parameterId.
*/
__attribute__((warn_unused_result))
virtual bool getParameterUnit(const uint32_t parameterId, char* const strBuf) const noexcept;

/*!
* Get the comment (documentation) of the parameter @a parameterId.
*/
__attribute__((warn_unused_result))
virtual bool getParameterComment(const uint32_t parameterId, char* const strBuf) const noexcept;

/*!
* Get the group name of the parameter @a parameterId.
* @note The group name is prefixed by a unique symbol and ":".
*/
__attribute__((warn_unused_result))
virtual bool getParameterGroupName(const uint32_t parameterId, char* const strBuf) const noexcept;

/*!
* Get the scalepoint @a scalePointId label of the parameter @a parameterId.
*/
__attribute__((warn_unused_result))
virtual bool getParameterScalePointLabel(const uint32_t parameterId, const uint32_t scalePointId, char* const strBuf) const noexcept;

/*!
@@ -362,6 +373,7 @@ public:
/*!
* Get the name of the program at @a index.
*/
__attribute__((warn_unused_result))
bool getProgramName(const uint32_t index, char* const strBuf) const noexcept;

/*!
@@ -369,6 +381,7 @@ public:
*
* @see getMidiProgramInfo()
*/
__attribute__((warn_unused_result))
bool getMidiProgramName(const uint32_t index, char* const strBuf) const noexcept;

/*!


+ 19
- 15
source/backend/CarlaStandalone.cpp View File

@@ -1190,6 +1190,7 @@ const CarlaPluginInfo* carla_get_plugin_info(uint pluginId)
carla_debug("carla_get_plugin_info(%i)", pluginId);

char strBuf[STR_MAX+1];
carla_zeroChars(strBuf, STR_MAX+1);

retInfo.type = plugin->getType();
retInfo.category = plugin->getCategory();
@@ -1202,17 +1203,12 @@ const CarlaPluginInfo* carla_get_plugin_info(uint pluginId)
retInfo.optionsAvailable = plugin->getOptionsAvailable();
retInfo.optionsEnabled = plugin->getOptionsEnabled();

carla_zeroChars(strBuf, STR_MAX+1);
plugin->getLabel(strBuf);
retInfo.label = carla_strdup_safe(strBuf);

carla_zeroChars(strBuf, STR_MAX+1);
plugin->getMaker(strBuf);
retInfo.maker = carla_strdup_safe(strBuf);

carla_zeroChars(strBuf, STR_MAX+1);
plugin->getCopyright(strBuf);
retInfo.copyright = carla_strdup_safe(strBuf);
if (plugin->getLabel(strBuf))
retInfo.label = carla_strdup_safe(strBuf);
if (plugin->getMaker(strBuf))
retInfo.maker = carla_strdup_safe(strBuf);
if (plugin->getCopyright(strBuf))
retInfo.copyright = carla_strdup_safe(strBuf);

checkStringPtr(retInfo.filename);
checkStringPtr(retInfo.name);
@@ -1656,7 +1652,9 @@ const char* carla_get_parameter_text(uint pluginId, uint32_t parameterId)
static char textBuf[STR_MAX+1];
carla_zeroChars(textBuf, STR_MAX+1);

plugin->getParameterText(parameterId, textBuf);
if (! plugin->getParameterText(parameterId, textBuf))
textBuf[0] = '\0';

return textBuf;
}

@@ -1673,7 +1671,9 @@ const char* carla_get_program_name(uint pluginId, uint32_t programId)
static char programName[STR_MAX+1];
carla_zeroChars(programName, STR_MAX+1);

plugin->getProgramName(programId, programName);
if (! plugin->getProgramName(programId, programName))
programName[0] = '\0';

return programName;
}

@@ -1690,7 +1690,9 @@ const char* carla_get_midi_program_name(uint pluginId, uint32_t midiProgramId)
static char midiProgramName[STR_MAX+1];
carla_zeroChars(midiProgramName, STR_MAX+1);

plugin->getMidiProgramName(midiProgramId, midiProgramName);
if (! plugin->getMidiProgramName(midiProgramId, midiProgramName))
midiProgramName[0] = '\0';

return midiProgramName;
}

@@ -1705,7 +1707,9 @@ const char* carla_get_real_plugin_name(uint pluginId)
static char realPluginName[STR_MAX+1];
carla_zeroChars(realPluginName, STR_MAX+1);

plugin->getRealName(realPluginName);
if (! plugin->getRealName(realPluginName))
realPluginName[0] = '\0';

return realPluginName;
}



+ 5
- 5
source/backend/engine/CarlaEngine.cpp View File

@@ -839,7 +839,9 @@ bool CarlaEngine::clonePlugin(const uint id)

char label[STR_MAX+1];
carla_zeroChars(label, STR_MAX+1);
plugin->getLabel(label);

if (! plugin->getLabel(label))
label[0] = '\0';

const uint pluginCountBefore(pData->curPluginCount);

@@ -2094,6 +2096,7 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons
}

char strBuf[STR_MAX+1];
carla_zeroChars(strBuf, STR_MAX+1);

for (uint i=0; i < pData->curPluginCount; ++i)
{
@@ -2106,10 +2109,7 @@ void CarlaEngine::saveProjectInternal(water::MemoryOutputStream& outStream) cons

outPlugin << "\n";

strBuf[0] = '\0';
plugin->getRealName(strBuf);

if (strBuf[0] != '\0')
if (plugin->getRealName(strBuf))
outPlugin << " <!-- " << xmlSafeString(strBuf, true) << " -->\n";

outPlugin << " <Plugin>\n";


+ 26
- 21
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -301,6 +301,8 @@ public:
CARLA_SAFE_ASSERT(fLastPingTime > 0);

char bufStr[STR_MAX+1];
carla_zeroChars(bufStr, STR_MAX+1);

uint32_t bufStrSize;

const CarlaEngineClient* const client(plugin->getEngineClient());
@@ -323,26 +325,26 @@ public:
// uint/size, str[] (realName), uint/size, str[] (label), uint/size, str[] (maker), uint/size, str[] (copyright)
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPluginInfo2);

carla_zeroChars(bufStr, STR_MAX);
plugin->getRealName(bufStr);
if (! plugin->getRealName(bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 64U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);

carla_zeroChars(bufStr, STR_MAX);
plugin->getLabel(bufStr);
if (! plugin->getLabel(bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 256U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);

carla_zeroChars(bufStr, STR_MAX);
plugin->getMaker(bufStr);
if (! plugin->getMaker(bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 64U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);

carla_zeroChars(bufStr, STR_MAX);
plugin->getCopyright(bufStr);
if (! plugin->getCopyright(bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 64U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
@@ -453,20 +455,20 @@ public:
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerParameterData2);
fShmNonRtServerControl.writeUInt(i);

carla_zeroChars(bufStr, STR_MAX);
plugin->getParameterName(i, bufStr);
if (plugin->getParameterName(i, bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 32U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);

carla_zeroChars(bufStr, STR_MAX);
plugin->getParameterSymbol(i, bufStr);
if (plugin->getParameterSymbol(i, bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 64U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);

carla_zeroChars(bufStr, STR_MAX);
plugin->getParameterUnit(i, bufStr);
if (plugin->getParameterUnit(i, bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 32U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
@@ -517,8 +519,8 @@ public:
fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerProgramName);
fShmNonRtServerControl.writeUInt(i);

carla_zeroChars(bufStr, STR_MAX);
plugin->getProgramName(i, bufStr);
if (plugin->getProgramName(i, bufStr))
bufStr[0] = '\0';
bufStrSize = carla_fixedValue(1U, 32U, static_cast<uint32_t>(std::strlen(bufStr)));
fShmNonRtServerControl.writeUInt(bufStrSize);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrSize);
@@ -892,17 +894,20 @@ public:

if (index >= 0 && plugin != nullptr && plugin->isEnabled())
{
char strBuf[STR_MAX];
plugin->getParameterText(static_cast<uint32_t>(index), strBuf);
const uint32_t strBufLen = static_cast<uint32_t>(std::strlen(strBuf));
char bufStr[STR_MAX+1];
carla_zeroChars(bufStr, STR_MAX+1);
if (! plugin->getParameterText(static_cast<uint32_t>(index), bufStr))
bufStr[0] = '\0';

const uint32_t bufStrLen = static_cast<uint32_t>(std::strlen(bufStr));

const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex);

fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSetParameterText);

fShmNonRtServerControl.writeInt(index);
fShmNonRtServerControl.writeUInt(strBufLen);
fShmNonRtServerControl.writeCustomData(strBuf, strBufLen);
fShmNonRtServerControl.writeUInt(bufStrLen);
fShmNonRtServerControl.writeCustomData(bufStr, bufStrLen);
fShmNonRtServerControl.commitWrite();

fShmNonRtServerControl.waitIfDataIsReachingLimit();


+ 150
- 160
source/backend/engine/CarlaEngineNative.cpp View File

@@ -424,88 +424,97 @@ protected:

void uiServerSendPluginInfo(CarlaPlugin* const plugin)
{
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);
char tmpBuf[STR_MAX+1];
carla_zeroChars(tmpBuf, STR_MAX+1);

const CarlaMutexLocker cml(fUiServer.getPipeLock());

const uint pluginId(plugin->getId());

std::sprintf(tmpBuf, "PLUGIN_INFO_%i\n", pluginId);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "%i:%i:%i:" P_INT64 ":%i:%i\n", plugin->getType(), plugin->getCategory(), plugin->getHints(), plugin->getUniqueId(), plugin->getOptionsAvailable(), plugin->getOptionsEnabled());
if (! fUiServer.writeMessage(tmpBuf))
return;
std::sprintf(tmpBuf, "%i:%i:%i:" P_INT64 ":%i:%i\n",
plugin->getType(), plugin->getCategory(),
plugin->getHints(), plugin->getUniqueId(),
plugin->getOptionsAvailable(), plugin->getOptionsEnabled());
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

if (const char* const filename = plugin->getFilename())
{
std::sprintf(tmpBuf, "%s", filename);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
std::snprintf(tmpBuf, STR_MAX, "%s", filename);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
if (! fUiServer.writeMessage("\n"))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

if (const char* const name = plugin->getName())
{
std::sprintf(tmpBuf, "%s", name);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
std::snprintf(tmpBuf, STR_MAX, "%s", name);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
if (! fUiServer.writeMessage("\n"))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

if (const char* const iconName = plugin->getIconName())
{
std::sprintf(tmpBuf, "%s", iconName);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
std::snprintf(tmpBuf, STR_MAX, "%s", iconName);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
if (! fUiServer.writeMessage("\n"))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

plugin->getRealName(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getRealName(tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

plugin->getLabel(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getLabel(tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

plugin->getMaker(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getMaker(tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

plugin->getCopyright(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getCopyright(tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}
else
{
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

std::sprintf(tmpBuf, "AUDIO_COUNT_%i:%i:%i\n", pluginId, plugin->getAudioInCount(), plugin->getAudioOutCount());
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "MIDI_COUNT_%i:%i:%i\n", pluginId, plugin->getMidiInCount(), plugin->getMidiOutCount());
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

fUiServer.flushMessages();
}

void uiServerSendPluginParameters(CarlaPlugin* const plugin)
{
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);
char tmpBuf[STR_MAX+1];
carla_zeroChars(tmpBuf, STR_MAX+1);

const CarlaMutexLocker cml(fUiServer.getPipeLock());
const CarlaScopedLocale csl;
@@ -515,12 +524,10 @@ protected:
for (int32_t i=PARAMETER_ACTIVE; i>PARAMETER_MAX; --i)
{
std::sprintf(tmpBuf, "PARAMVAL_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "%f\n", static_cast<double>(plugin->getInternalParameterValue(i)));
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

fUiServer.flushMessages();
}
@@ -530,8 +537,7 @@ protected:
count = plugin->getParameterCount();

std::sprintf(tmpBuf, "PARAMETER_COUNT_%i:%i:%i:%i\n", pluginId, ins, outs, count);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

for (uint32_t i=0; i<count; ++i)
{
@@ -539,24 +545,37 @@ protected:
const ParameterRanges& paramRanges(plugin->getParameterRanges(i));

std::sprintf(tmpBuf, "PARAMETER_DATA_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "%i:%i:%i:%i\n", paramData.type, paramData.hints, paramData.midiChannel, paramData.midiCC);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

plugin->getParameterName(i, tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getParameterName(i, tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
} else {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

plugin->getParameterUnit(i, tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getParameterUnit(i, tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
} else {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

if (plugin->getParameterComment(i, tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
} else {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

if (plugin->getParameterGroupName(i, tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
} else {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

std::sprintf(tmpBuf, "PARAMETER_RANGES_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "%f:%f:%f:%f:%f:%f\n",
static_cast<double>(paramRanges.def),
@@ -565,16 +584,13 @@ protected:
static_cast<double>(paramRanges.step),
static_cast<double>(paramRanges.stepSmall),
static_cast<double>(paramRanges.stepLarge));
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "PARAMVAL_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "%f\n", static_cast<double>(plugin->getParameterValue(i)));
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
}

fUiServer.flushMessages();
@@ -582,8 +598,8 @@ protected:

void uiServerSendPluginPrograms(CarlaPlugin* const plugin)
{
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);
char tmpBuf[STR_MAX+1];
carla_zeroChars(tmpBuf, STR_MAX+1);

const CarlaMutexLocker cml(fUiServer.getPipeLock());

@@ -591,42 +607,38 @@ protected:

uint32_t count = plugin->getProgramCount();
std::sprintf(tmpBuf, "PROGRAM_COUNT_%i:%i:%i\n", pluginId, count, plugin->getCurrentProgram());
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

for (uint32_t i=0; i<count; ++i)
{
std::sprintf(tmpBuf, "PROGRAM_NAME_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

plugin->getProgramName(i, tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
if (plugin->getProgramName(i, tmpBuf)) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
} else {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}
}

fUiServer.flushMessages();

count = plugin->getMidiProgramCount();
std::sprintf(tmpBuf, "MIDI_PROGRAM_COUNT_%i:%i:%i\n", pluginId, count, plugin->getCurrentMidiProgram());
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

for (uint32_t i=0; i<count; ++i)
{
std::sprintf(tmpBuf, "MIDI_PROGRAM_DATA_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
std::snprintf(tmpBuf, STR_MAX, "MIDI_PROGRAM_DATA_%i:%i\n", pluginId, i);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

const MidiProgramData& mpData(plugin->getMidiProgramData(i));

std::sprintf(tmpBuf, "%i:%i\n", mpData.bank, mpData.program);
if (! fUiServer.writeMessage(tmpBuf))
return;
std::snprintf(tmpBuf, STR_MAX, "%i:%i\n", mpData.bank, mpData.program);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

std::sprintf(tmpBuf, "%s", mpData.name);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;
std::snprintf(tmpBuf, STR_MAX, "%s", mpData.name);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(tmpBuf),);
}

fUiServer.flushMessages();
@@ -634,8 +646,8 @@ protected:

void uiServerSendPluginProperties(CarlaPlugin* const plugin)
{
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);
char tmpBuf[STR_MAX+1];
carla_zeroChars(tmpBuf, STR_MAX+1);

const CarlaMutexLocker cml(fUiServer.getPipeLock());

@@ -643,8 +655,7 @@ protected:

uint32_t count = plugin->getCustomDataCount();
std::sprintf(tmpBuf, "CUSTOM_DATA_COUNT_%i:%i\n", pluginId, count);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

for (uint32_t i=0; i<count; ++i)
{
@@ -655,8 +666,7 @@ protected:
continue;

std::sprintf(tmpBuf, "CUSTOM_DATA_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

if (! fUiServer.writeAndFixMessage(customData.type))
return;
@@ -746,28 +756,31 @@ protected:
const CarlaMutexLocker cml(fUiServer.getPipeLock());

std::sprintf(tmpBuf, "ENGINE_CALLBACK_%i\n", int(action));
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
std::sprintf(tmpBuf, "%u\n", pluginId);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
std::sprintf(tmpBuf, "%i\n", value1);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
std::sprintf(tmpBuf, "%i\n", value2);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
std::sprintf(tmpBuf, "%i\n", value3);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
{
const CarlaScopedLocale csl;
std::sprintf(tmpBuf, "%f\n", static_cast<double>(valuef));
}
if (! fUiServer.writeMessage(tmpBuf))
return;
if (! fUiServer.writeAndFixMessage(valueStr != nullptr ? valueStr : ""))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

if (valueStr != nullptr) {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(valueStr),);
} else {
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeEmptyMessage(),);
}

fUiServer.flushMessages();
}
@@ -794,40 +807,31 @@ protected:
CARLA_SAFE_ASSERT_RETURN(fIsRunning,);
CARLA_SAFE_ASSERT_RETURN(fUiServer.isPipeRunning(),);

char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);
char tmpBuf[STR_MAX+1];
carla_zeroChars(tmpBuf, STR_MAX+1);

const CarlaMutexLocker cml(fUiServer.getPipeLock());

#if defined(HAVE_LIBLO) && !defined(BUILD_BRIDGE)
if (! fUiServer.writeAndFixMessage("osc-urls"))
return;
if (! fUiServer.writeAndFixMessage(pData->osc.getServerPathTCP()))
return;
if (! fUiServer.writeAndFixMessage(pData->osc.getServerPathUDP()))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage("osc-urls\n"),);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(pData->osc.getServerPathTCP()),);
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeAndFixMessage(pData->osc.getServerPathUDP()),);
#endif

if (! fUiServer.writeAndFixMessage("max-plugin-number"))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage("max-plugin-number\n"),);
std::sprintf(tmpBuf, "%i\n", pData->maxPluginNumber);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

if (! fUiServer.writeAndFixMessage("buffer-size"))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage("buffer-size\n"),);
std::sprintf(tmpBuf, "%i\n", pData->bufferSize);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

if (! fUiServer.writeAndFixMessage("sample-rate"))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage("sample-rate\n"),);
{
const CarlaScopedLocale csl;
std::sprintf(tmpBuf, "%f\n", pData->sampleRate);
}
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);

fUiServer.flushMessages();
}
@@ -837,8 +841,8 @@ protected:
CARLA_SAFE_ASSERT_RETURN(fIsRunning,);
CARLA_SAFE_ASSERT_RETURN(fUiServer.isPipeRunning(),);

char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);
char tmpBuf[STR_MAX+1];
carla_zeroChars(tmpBuf, STR_MAX+1);

const EngineOptions& options(pData->options);
const CarlaMutexLocker cml(fUiServer.getPipeLock());
@@ -847,28 +851,23 @@ protected:
const std::size_t optionsForcedStrSize(fOptionsForced ? 5 : 6);

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PROCESS_MODE);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
std::sprintf(tmpBuf, "%i\n", options.processMode);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_TRANSPORT_MODE);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
std::sprintf(tmpBuf, "%i\n", options.transportMode);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_FORCE_STEREO);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.forceStereo ? "true\n" : "false\n"))
@@ -876,8 +875,7 @@ protected:
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_PLUGIN_BRIDGES);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.preferPluginBridges ? "true\n" : "false\n"))
@@ -885,8 +883,7 @@ protected:
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_UI_BRIDGES);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.preferUiBridges ? "true\n" : "false\n"))
@@ -894,8 +891,7 @@ protected:
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UIS_ALWAYS_ON_TOP);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.uisAlwaysOnTop ? "true\n" : "false\n"))
@@ -903,43 +899,35 @@ protected:
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_MAX_PARAMETERS);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
std::sprintf(tmpBuf, "%i\n", options.maxParameters);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UI_BRIDGES_TIMEOUT);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
std::sprintf(tmpBuf, "%i\n", options.uiBridgesTimeout);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PATH_BINARIES);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage("true\n", 5))
return;
std::sprintf(tmpBuf, "%s\n", options.binaryDir);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
fUiServer.flushMessages();

std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PATH_RESOURCES);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
if (! fUiServer.writeMessage("true\n", 5))
return;
std::sprintf(tmpBuf, "%s\n", options.resourceDir);
if (! fUiServer.writeMessage(tmpBuf))
return;
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
fUiServer.flushMessages();
}

@@ -965,8 +953,10 @@ protected:
const ParameterData& paramData(plugin->getParameterData(index));
const ParameterRanges& paramRanges(plugin->getParameterRanges(index));

plugin->getParameterName(index, strBufName);
plugin->getParameterUnit(index, strBufUnit);
if (! plugin->getParameterName(index, strBufName))
carla_zeroChars(strBufName, STR_MAX+1);
if (! plugin->getParameterUnit(index, strBufUnit))
carla_zeroChars(strBufUnit, STR_MAX+1);

uint hints = 0x0;



+ 15
- 8
source/backend/engine/CarlaEngineOscSend.cpp View File

@@ -60,10 +60,14 @@ void CarlaEngineOsc::sendPluginInfo(const CarlaPlugin* const plugin) const noexc
carla_zeroChars(bufMaker, STR_MAX+1);
carla_zeroChars(bufCopyright, STR_MAX+1);

plugin->getRealName(bufRealName);
plugin->getLabel(bufLabel);
plugin->getMaker(bufMaker);
plugin->getCopyright(bufCopyright);
if (! plugin->getRealName(bufRealName))
bufRealName[0] = '\0';
if (! plugin->getLabel(bufLabel))
bufLabel[0] = '\0';
if (! plugin->getMaker(bufMaker))
bufMaker[0] = '\0';
if (! plugin->getCopyright(bufCopyright))
bufCopyright[0] = '\0';

const char* name = plugin->getName();
const char* filename = plugin->getFilename();
@@ -131,12 +135,14 @@ void CarlaEngineOsc::sendPluginParameterInfo(const CarlaPlugin* const plugin, co
carla_zeroChars(bufName, STR_MAX+1);
carla_zeroChars(bufUnit, STR_MAX+1);

if (! plugin->getParameterName(index, bufName))
bufName[0] = '\0';
if (! plugin->getParameterUnit(index, bufUnit))
bufUnit[0] = '\0';

const ParameterData& paramData(plugin->getParameterData(index));
const ParameterRanges& paramRanges(plugin->getParameterRanges(index));

plugin->getParameterName(index, bufName);
plugin->getParameterUnit(index, bufUnit);

char targetPath[std::strlen(fControlDataTCP.path)+20];
std::strcpy(targetPath, fControlDataTCP.path);
std::strcat(targetPath, "/param");
@@ -197,7 +203,8 @@ void CarlaEngineOsc::sendPluginProgram(const CarlaPlugin* const plugin, const ui

char strBuf[STR_MAX+1];
carla_zeroChars(strBuf, STR_MAX+1);
plugin->getProgramName(index, strBuf);
if (! plugin->getProgramName(index, strBuf))
strBuf[0] = '\0';

char targetPath[std::strlen(fControlDataTCP.path)+6];
std::strcpy(targetPath, fControlDataTCP.path);


+ 25
- 24
source/backend/plugin/CarlaPlugin.cpp View File

@@ -476,7 +476,8 @@ void CarlaPlugin::randomizeParameters() noexcept
if ((paramData.hints & PARAMETER_IS_ENABLED) == 0)
continue;

getParameterName(i, strBuf);
if (! getParameterName(i, strBuf))
strBuf[0] = '\0';

if (std::strstr(strBuf, "olume") != nullptr)
continue;
@@ -513,11 +514,13 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave)
const PluginType pluginType(getType());

char strBuf[STR_MAX+1];
carla_zeroChars(strBuf, STR_MAX+1);

// ---------------------------------------------------------------
// Basic info

getLabel(strBuf);
if (! getLabel(strBuf))
strBuf[0] = '\0';

pData->stateSave.type = carla_strdup(getPluginTypeAsString(pluginType));
pData->stateSave.name = carla_strdup(pData->name);
@@ -608,10 +611,12 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave)
stateParameter->midiChannel = paramData.midiChannel;
#endif

getParameterName(i, strBuf);
if (! getParameterName(i, strBuf))
strBuf[0] = '\0';
stateParameter->name = carla_strdup(strBuf);

getParameterSymbol(i, strBuf);
if (! getParameterSymbol(i, strBuf))
strBuf[0] = '\0';
stateParameter->symbol = carla_strdup(strBuf);;

if (! dummy)
@@ -650,11 +655,12 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave)

void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave)
{
char strBuf[STR_MAX+1];
const bool usesMultiProgs(pData->hints & PLUGIN_USES_MULTI_PROGS);

const PluginType pluginType(getType());

char strBuf[STR_MAX+1];
carla_zeroChars(strBuf, STR_MAX+1);

// ---------------------------------------------------------------
// Part 1 - PRE-set custom data (only those which reload programs)

@@ -695,10 +701,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave)
{
for (uint32_t i=0; i < pData->prog.count; ++i)
{
strBuf[0] = '\0';
getProgramName(i, strBuf);

if (strBuf[0] != '\0' && std::strcmp(stateSave.currentProgramName, strBuf) == 0)
if (getProgramName(i, strBuf) && std::strcmp(stateSave.currentProgramName, strBuf) == 0)
{
programId = static_cast<int32_t>(i);
break;
@@ -726,10 +729,7 @@ void CarlaPlugin::loadStateSave(const CarlaStateSave& stateSave)
{
for (uint32_t i=0; i < pData->param.count; ++i)
{
strBuf[0] = '\0';
getParameterSymbol(i, strBuf);

if (strBuf[0] != '\0')
if (getParameterSymbol(i, strBuf))
{
ParamSymbol* const paramSymbol(new ParamSymbol(i, strBuf));
paramSymbols.append(paramSymbol);
@@ -1167,7 +1167,8 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)

char strBufName[STR_MAX+1];
char strBufSymbol[STR_MAX+1];
strBufName[STR_MAX] = strBufSymbol[STR_MAX] = '\0';
carla_zeroChars(strBufName, STR_MAX+1);
carla_zeroChars(strBufSymbol, STR_MAX+1);

for (uint32_t i=0; i<pData->param.count; ++i)
{
@@ -1191,9 +1192,10 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)

// TODO logarithmic, enabled (not on gui), automable, samplerate, scalepoints

strBufName[0] = strBufSymbol[0] = '\0';
getParameterName(i, strBufName);
getParameterSymbol(i, strBufSymbol);
if (! getParameterName(i, strBufName))
strBufName[0] = '\0';
if (! getParameterSymbol(i, strBufSymbol))
strBufSymbol[0] = '\0';

if (strBufSymbol[0] == '\0')
{
@@ -1211,10 +1213,7 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
}

if (uniqueSymbolNames.contains(strBufSymbol))
{
std::snprintf(strBufSymbol, STR_MAX, "clv2_param_%d", i+1);
strBufSymbol[STR_MAX] = '\0';
}

mainStream << " lv2:index " << portIndexNum << " ;\n";
mainStream << " lv2:symbol \"" << strBufSymbol << "\" ;\n";
@@ -1228,9 +1227,11 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
mainStream << " ] ;\n";
}

char strBuf[STR_MAX];
getMaker(strBuf);
strBuf[STR_MAX-1] = '\0';
char strBuf[STR_MAX+1];
carla_zeroChars(strBuf, STR_MAX+1);

if (! getMaker(strBuf))
strBuf[0] = '\0';

mainStream << " rdfs:comment \"Plugin generated using Carla LV2 export.\" ;\n";
mainStream << " doap:name \"\"\"" << getName() << "\"\"\" ;\n";


+ 2
- 0
source/native-plugins/resources/carla-plugin View File

@@ -286,6 +286,8 @@ class CarlaMiniW(ExternalUI, HostWindow):
'name': paramName,
'symbol': "",
'unit': paramUnit,
'comment': paramUnit,
'groupName': paramUnit,
'scalePointCount': 0,
}
self.host._set_parameterInfo(pluginId, paramId, paramInfo)


+ 8
- 0
source/utils/CarlaPipeUtils.cpp View File

@@ -925,6 +925,14 @@ bool CarlaPipeCommon::writeAndFixMessage(const char* const msg) const noexcept
return _writeMsgBuffer(fixedMsg, size+1);
}

bool CarlaPipeCommon::writeEmptyMessage() const noexcept
{
if (pData->pipeClosed)
return false;

return _writeMsgBuffer("\n", 1);
}

bool CarlaPipeCommon::flushMessages() const noexcept
{
CARLA_SAFE_ASSERT_RETURN(pData->pipeSend != INVALID_PIPE_VALUE, false);


+ 5
- 0
source/utils/CarlaPipeUtils.hpp View File

@@ -164,6 +164,11 @@ public:
*/
bool writeAndFixMessage(const char* const msg) const noexcept;

/*!
* Write an empty message, which means a single '\n'.
*/
bool writeEmptyMessage() const noexcept;

/*!
* Flush all messages currently in cache.
*/


Loading…
Cancel
Save