From 92f7b267eccb6486ac019ff84854553bc46643c7 Mon Sep 17 00:00:00 2001 From: falkTX Date: Fri, 1 Nov 2019 09:31:36 +0100 Subject: [PATCH] Enforce use of return value of a few CarlaPlugin functions --- source/backend/CarlaPlugin.hpp | 13 + source/backend/CarlaStandalone.cpp | 34 +- source/backend/engine/CarlaEngine.cpp | 10 +- source/backend/engine/CarlaEngineBridge.cpp | 47 +-- source/backend/engine/CarlaEngineNative.cpp | 310 +++++++++---------- source/backend/engine/CarlaEngineOscSend.cpp | 23 +- source/backend/plugin/CarlaPlugin.cpp | 49 +-- source/native-plugins/resources/carla-plugin | 2 + source/utils/CarlaPipeUtils.cpp | 8 + source/utils/CarlaPipeUtils.hpp | 5 + 10 files changed, 268 insertions(+), 233 deletions(-) diff --git a/source/backend/CarlaPlugin.hpp b/source/backend/CarlaPlugin.hpp index dfb959155..a8bd73fd6 100644 --- a/source/backend/CarlaPlugin.hpp +++ b/source/backend/CarlaPlugin.hpp @@ -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; /*! diff --git a/source/backend/CarlaStandalone.cpp b/source/backend/CarlaStandalone.cpp index 442442a17..b282c7c30 100644 --- a/source/backend/CarlaStandalone.cpp +++ b/source/backend/CarlaStandalone.cpp @@ -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; } diff --git a/source/backend/engine/CarlaEngine.cpp b/source/backend/engine/CarlaEngine.cpp index 051f614d3..feb238bb6 100644 --- a/source/backend/engine/CarlaEngine.cpp +++ b/source/backend/engine/CarlaEngine.cpp @@ -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 << " \n"; outPlugin << " \n"; diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index 8f27f4b8b..4c9925641 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -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(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(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(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(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(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(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(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(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(index), strBuf); - const uint32_t strBufLen = static_cast(std::strlen(strBuf)); + char bufStr[STR_MAX+1]; + carla_zeroChars(bufStr, STR_MAX+1); + if (! plugin->getParameterText(static_cast(index), bufStr)) + bufStr[0] = '\0'; + + const uint32_t bufStrLen = static_cast(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(); diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index f84c8047a..aec914c90 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -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(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; igetParameterRanges(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(paramRanges.def), @@ -565,16 +584,13 @@ protected: static_cast(paramRanges.step), static_cast(paramRanges.stepSmall), static_cast(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(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; igetProgramName(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; igetMidiProgramData(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(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; diff --git a/source/backend/engine/CarlaEngineOscSend.cpp b/source/backend/engine/CarlaEngineOscSend.cpp index d4ecdf907..bc11e3ac7 100644 --- a/source/backend/engine/CarlaEngineOscSend.cpp +++ b/source/backend/engine/CarlaEngineOscSend.cpp @@ -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); diff --git a/source/backend/plugin/CarlaPlugin.cpp b/source/backend/plugin/CarlaPlugin.cpp index 190be54bd..68cb6f32e 100644 --- a/source/backend/plugin/CarlaPlugin.cpp +++ b/source/backend/plugin/CarlaPlugin.cpp @@ -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(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; iparam.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"; diff --git a/source/native-plugins/resources/carla-plugin b/source/native-plugins/resources/carla-plugin index 79074c8e0..a8ccb989d 100755 --- a/source/native-plugins/resources/carla-plugin +++ b/source/native-plugins/resources/carla-plugin @@ -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) diff --git a/source/utils/CarlaPipeUtils.cpp b/source/utils/CarlaPipeUtils.cpp index 06bfe50c9..5f784ca00 100644 --- a/source/utils/CarlaPipeUtils.cpp +++ b/source/utils/CarlaPipeUtils.cpp @@ -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); diff --git a/source/utils/CarlaPipeUtils.hpp b/source/utils/CarlaPipeUtils.hpp index 1c31fc3a8..eb5c2fb18 100644 --- a/source/utils/CarlaPipeUtils.hpp +++ b/source/utils/CarlaPipeUtils.hpp @@ -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. */