Browse Source

Remove use of Carla{String,ScopedLocale,ScopedPointer} for DPF

Signed-off-by: falkTX <falktx@falktx.com>
pull/1961/merge
falkTX 3 months ago
parent
commit
84b3316b67
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
67 changed files with 484 additions and 1935 deletions
  1. +5
    -0
      Makefile
  2. +4
    -2
      source/backend/CarlaHostImpl.hpp
  3. +8
    -7
      source/backend/CarlaStandalone.cpp
  4. +5
    -6
      source/backend/CarlaStandaloneNSM.cpp
  5. +11
    -11
      source/backend/engine/CarlaEngine.cpp
  6. +5
    -5
      source/backend/engine/CarlaEngineBridge.cpp
  7. +5
    -21
      source/backend/engine/CarlaEngineClient.cpp
  8. +2
    -16
      source/backend/engine/CarlaEngineClient.hpp
  9. +38
    -54
      source/backend/engine/CarlaEngineGraph.cpp
  10. +5
    -5
      source/backend/engine/CarlaEngineInternal.cpp
  11. +7
    -21
      source/backend/engine/CarlaEngineInternal.hpp
  12. +23
    -23
      source/backend/engine/CarlaEngineJack.cpp
  13. +7
    -7
      source/backend/engine/CarlaEngineNative.cpp
  14. +10
    -9
      source/backend/engine/CarlaEngineOsc.hpp
  15. +1
    -1
      source/backend/engine/CarlaEnginePorts.cpp
  16. +4
    -4
      source/backend/engine/CarlaEngineRtAudio.cpp
  17. +1
    -1
      source/backend/engine/CarlaEngineSDL.cpp
  18. +14
    -13
      source/backend/plugin/CarlaPlugin.cpp
  19. +7
    -7
      source/backend/plugin/CarlaPluginAU.cpp
  20. +22
    -22
      source/backend/plugin/CarlaPluginBridge.cpp
  21. +6
    -20
      source/backend/plugin/CarlaPluginCLAP.cpp
  22. +4
    -4
      source/backend/plugin/CarlaPluginFluidSynth.cpp
  23. +5
    -18
      source/backend/plugin/CarlaPluginInternal.hpp
  24. +14
    -29
      source/backend/plugin/CarlaPluginJSFX.cpp
  25. +24
    -24
      source/backend/plugin/CarlaPluginJack.cpp
  26. +11
    -11
      source/backend/plugin/CarlaPluginLADSPADSSI.cpp
  27. +22
    -22
      source/backend/plugin/CarlaPluginLV2.cpp
  28. +13
    -13
      source/backend/plugin/CarlaPluginNative.cpp
  29. +3
    -3
      source/backend/plugin/CarlaPluginSFZero.cpp
  30. +7
    -7
      source/backend/plugin/CarlaPluginVST2.cpp
  31. +10
    -9
      source/backend/plugin/CarlaPluginVST3.cpp
  32. +6
    -7
      source/backend/utils/CachedPlugins.cpp
  33. +5
    -5
      source/backend/utils/Information.cpp
  34. +1
    -0
      source/backend/utils/PluginDiscovery.cpp
  35. +6
    -19
      source/bridges-ui/CarlaBridgeFormat.hpp
  36. +3
    -17
      source/bridges-ui/CarlaBridgeFormatLV2.cpp
  37. +12
    -10
      source/discovery/carla-discovery.cpp
  38. +0
    -1
      source/frontend/dialogs/jackappdialog.cpp
  39. +2
    -2
      source/frontend/pluginlist/pluginlistdialog.cpp
  40. +3
    -17
      source/includes/CarlaNativeExtUI.hpp
  41. +9
    -23
      source/includes/CarlaNativePrograms.hpp
  42. +2
    -3
      source/modules/sfzero/sfzero/SFZSample.h
  43. +5
    -5
      source/modules/water/containers/HashMap.h
  44. +4
    -4
      source/modules/water/containers/OwnedArray.h
  45. +4
    -4
      source/modules/water/files/DirectoryIterator.h
  46. +3
    -3
      source/modules/water/files/File.cpp
  47. +3
    -3
      source/modules/water/memory/SharedResourcePointer.h
  48. +3
    -3
      source/modules/water/processors/AudioProcessorGraph.h
  49. +3
    -3
      source/modules/water/threads/ChildProcess.h
  50. +4
    -4
      source/modules/water/xml/XmlDocument.cpp
  51. +3
    -3
      source/modules/water/xml/XmlDocument.h
  52. +5
    -20
      source/native-plugins/audio-file.cpp
  53. +3
    -17
      source/native-plugins/midi-pattern.cpp
  54. +24
    -43
      source/plugin/carla-lv2-export.cpp
  55. +5
    -18
      source/plugin/carla-lv2-ui.cpp
  56. +8
    -22
      source/plugin/carla-lv2.cpp
  57. +2
    -17
      source/plugin/carla-native-plugin.cpp
  58. +5
    -18
      source/utils/CarlaBinaryUtils.hpp
  59. +9
    -22
      source/utils/CarlaExternalUI.hpp
  60. +12
    -26
      source/utils/CarlaJsfxUtils.hpp
  61. +0
    -1
      source/utils/CarlaLogThread.hpp
  62. +5
    -18
      source/utils/CarlaMacUtils.cpp
  63. +16
    -15
      source/utils/CarlaPipeUtils.cpp
  64. +3
    -3
      source/utils/CarlaRunner.hpp
  65. +0
    -238
      source/utils/CarlaScopeUtils.hpp
  66. +0
    -923
      source/utils/CarlaString.hpp
  67. +3
    -3
      source/utils/CarlaThread.hpp

+ 5
- 0
Makefile View File

@@ -214,6 +214,11 @@ plugin-wine:
else else
plugin-wine: $(MODULEDIR)/dgl.wine.a plugin-wine: $(MODULEDIR)/dgl.wine.a
@$(MAKE) -C source/plugin wine @$(MAKE) -C source/plugin wine
ifeq ($(CPU_X86_64),true)
@$(MAKE) plugin-wine AR=x86_64-w64-mingw32-ar CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++
else ifeq ($(CPU_I386),true)
@$(MAKE) plugin-wine AR=i686-w64-mingw32-ar CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++
endif
endif endif


rest: libs rest: libs


+ 4
- 2
source/backend/CarlaHostImpl.hpp View File

@@ -20,13 +20,15 @@


#include "CarlaHost.h" #include "CarlaHost.h"
#include "CarlaUtils.h" #include "CarlaUtils.h"

#include "CarlaEngine.hpp" #include "CarlaEngine.hpp"
#include "CarlaUtils.hpp"


#if !(defined(BUILD_BRIDGE) || defined(CARLA_OS_WASM)) #if !(defined(BUILD_BRIDGE) || defined(CARLA_OS_WASM))
# define CARLA_CAN_USE_LOG_THREAD # define CARLA_CAN_USE_LOG_THREAD
# include "CarlaLogThread.hpp" # include "CarlaLogThread.hpp"
#else #else
# include "CarlaString.hpp"
# include "distrho/extra/String.hpp"
#endif #endif


namespace CB = CARLA_BACKEND_NAMESPACE; namespace CB = CARLA_BACKEND_NAMESPACE;
@@ -64,7 +66,7 @@ struct CarlaHostStandalone : CarlaHostHandleImpl {
bool logThreadEnabled; bool logThreadEnabled;
#endif #endif


CarlaString lastError;
String lastError;


CarlaHostStandalone() noexcept CarlaHostStandalone() noexcept
: CarlaHostHandleImpl(), : CarlaHostHandleImpl(),


+ 8
- 7
source/backend/CarlaStandalone.cpp View File

@@ -14,6 +14,7 @@
#include "ThreadSafeFFTW.hpp" #include "ThreadSafeFFTW.hpp"


#include "distrho/extra/Base64.hpp" #include "distrho/extra/Base64.hpp"
#include "distrho/extra/ScopedPointer.hpp"


#include "water/files/File.h" #include "water/files/File.h"


@@ -456,10 +457,10 @@ bool carla_engine_init_bridge(CarlaHostHandle handle,
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->isStandalone, "Must be a standalone host handle", false); CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->isStandalone, "Must be a standalone host handle", false);
CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine == nullptr, "Engine is already initialized", false); CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(handle->engine == nullptr, "Engine is already initialized", false);


CarlaScopedPointer<CarlaEngine> engine(CB::EngineInit::newBridge(audioBaseName,
rtClientBaseName,
nonRtClientBaseName,
nonRtServerBaseName));
ScopedPointer<CarlaEngine> engine(CB::EngineInit::newBridge(audioBaseName,
rtClientBaseName,
nonRtClientBaseName,
nonRtServerBaseName));


CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(engine != nullptr, "The selected audio driver is not available", false); CARLA_SAFE_ASSERT_WITH_LAST_ERROR_RETURN(engine != nullptr, "The selected audio driver is not available", false);


@@ -1726,7 +1727,7 @@ const char* carla_get_custom_data_value(CarlaHostHandle handle, uint pluginId, c
if (count == 0) if (count == 0)
return gNullCharPtr; return gNullCharPtr;


static CarlaString customDataValue;
static String customDataValue;


for (uint32_t i=0; i<count; ++i) for (uint32_t i=0; i<count; ++i)
{ {
@@ -1757,9 +1758,9 @@ const char* carla_get_chunk_data(CarlaHostHandle handle, uint pluginId)
const std::size_t dataSize(plugin->getChunkData(&data)); const std::size_t dataSize(plugin->getChunkData(&data));
CARLA_SAFE_ASSERT_RETURN(data != nullptr && dataSize > 0, gNullCharPtr); CARLA_SAFE_ASSERT_RETURN(data != nullptr && dataSize > 0, gNullCharPtr);


static CarlaString chunkData;
static String chunkData;


chunkData = CarlaString::asBase64(data, static_cast<std::size_t>(dataSize));
chunkData = String::asBase64(data, static_cast<std::size_t>(dataSize));
return chunkData.buffer(); return chunkData.buffer();
} }




+ 5
- 6
source/backend/CarlaStandaloneNSM.cpp View File

@@ -14,7 +14,6 @@
#define NSM_CLIENT_FEATURES ":switch:optional-gui:" #define NSM_CLIENT_FEATURES ":switch:optional-gui:"


#include "CarlaOscUtils.hpp" #include "CarlaOscUtils.hpp"
#include "CarlaString.hpp"


#include "water/files/File.h" #include "water/files/File.h"


@@ -471,7 +470,7 @@ protected:
const CarlaPluginInfo* const pluginInfo(carla_get_plugin_info(i)); const CarlaPluginInfo* const pluginInfo(carla_get_plugin_info(i));
CARLA_SAFE_ASSERT_CONTINUE(pluginInfo != nullptr); CARLA_SAFE_ASSERT_CONTINUE(pluginInfo != nullptr);


/*const*/ CarlaString pluginNameId(fClientNameId + "/" + CarlaString(pluginInfo->name).replace('/','_') + "/");
/*const*/ String pluginNameId(fClientNameId + "/" + String(pluginInfo->name).replace('/','_') + "/");


for (uint32_t j=0, paramCount = carla_get_parameter_count(i); j < paramCount; ++j) for (uint32_t j=0, paramCount = carla_get_parameter_count(i); j < paramCount; ++j)
{ {
@@ -493,8 +492,8 @@ protected:
if (paramData->hints & CB::PARAMETER_IS_READ_ONLY) if (paramData->hints & CB::PARAMETER_IS_READ_ONLY)
continue; continue;


const char* const dir = paramData->type == CB::PARAMETER_INPUT ? "in" : "out";
const CarlaString paramNameId = pluginNameId + CarlaString(paramInfo->name).replace('/','_');
const char* const dir = paramData->type == CB::PARAMETER_INPUT ? "in" : "out";
const String paramNameId = pluginNameId + String(paramInfo->name).replace('/','_');


const float defNorm = paramRanges->getNormalizedValue(paramRanges->def); const float defNorm = paramRanges->getNormalizedValue(paramRanges->def);


@@ -530,8 +529,8 @@ private:
lo_server_thread fServerThread; lo_server_thread fServerThread;
char* fServerURL; char* fServerURL;


CarlaString fClientNameId;
CarlaString fProjectPath;
String fClientNameId;
String fProjectPath;


bool fHasBroadcast; bool fHasBroadcast;
bool fHasOptionalGui; bool fHasOptionalGui;


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

@@ -534,7 +534,7 @@ bool CarlaEngine::addPlugin(const BinaryType btype,
}; };


CarlaPluginPtr plugin; CarlaPluginPtr plugin;
CarlaString bridgeBinary(pData->options.binaryDir);
String bridgeBinary(pData->options.binaryDir);


if (bridgeBinary.isNotEmpty()) if (bridgeBinary.isNotEmpty())
{ {
@@ -1130,19 +1130,19 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr); CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr);
carla_debug("CarlaEngine::getUniquePluginName(\"%s\")", name); carla_debug("CarlaEngine::getUniquePluginName(\"%s\")", name);


CarlaString sname;
String sname;
sname = name; sname = name;


if (sname.isEmpty()) if (sname.isEmpty())
{ {
sname = "(No name)"; sname = "(No name)";
return sname.dup();
return carla_strdup(sname);
} }


const std::size_t maxNameSize(carla_minConstrained<uint>(getMaxClientNameSize(), 0xff, 6U) - 6); // 6 = strlen(" (10)") + 1 const std::size_t maxNameSize(carla_minConstrained<uint>(getMaxClientNameSize(), 0xff, 6U) - 6); // 6 = strlen(" (10)") + 1


if (maxNameSize == 0 || ! isRunning()) if (maxNameSize == 0 || ! isRunning())
return sname.dup();
return carla_strdup(sname);


sname.truncate(maxNameSize); sname.truncate(maxNameSize);
sname.replace(':', '.'); // ':' is used in JACK1 to split client/port names sname.replace(':', '.'); // ':' is used in JACK1 to split client/port names
@@ -1207,7 +1207,7 @@ const char* CarlaEngine::getUniquePluginName(const char* const name) const
sname += " (2)"; sname += " (2)";
} }


return sname.dup();
return carla_strdup(sname);
} }


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -1222,8 +1222,8 @@ bool CarlaEngine::loadFile(const char* const filename)
File file(filename); File file(filename);
CARLA_SAFE_ASSERT_RETURN_ERR(file.exists(), "Requested file does not exist or is not a readable"); CARLA_SAFE_ASSERT_RETURN_ERR(file.exists(), "Requested file does not exist or is not a readable");


CarlaString baseName(file.getFileNameWithoutExtension().toRawUTF8());
CarlaString extension(file.getFileExtension().replace(".","").toLowerCase().toRawUTF8());
String baseName(file.getFileNameWithoutExtension().toRawUTF8());
String extension(file.getFileExtension().replace(".","").toLowerCase().toRawUTF8());


const uint curPluginId(pData->nextPluginId < pData->curPluginCount ? pData->nextPluginId : pData->curPluginCount); const uint curPluginId(pData->nextPluginId < pData->curPluginCount ? pData->nextPluginId : pData->curPluginCount);


@@ -1330,7 +1330,7 @@ bool CarlaEngine::loadFile(const char* const filename)
if (extension == "xmz" || extension == "xiz") if (extension == "xmz" || extension == "xiz")
{ {
#ifdef HAVE_ZYN_DEPS #ifdef HAVE_ZYN_DEPS
CarlaString nicerName("Zyn - ");
String nicerName("Zyn - ");


const std::size_t sep(baseName.find('-')+1); const std::size_t sep(baseName.find('-')+1);


@@ -2109,7 +2109,7 @@ void CarlaEngine::setOption(const EngineOption option, const int value, const ch


if (value != 0) if (value != 0)
{ {
CarlaString interposerPath(CarlaString(pData->options.binaryDir) + "/libcarla_interposer-safe.so");
String interposerPath(String(pData->options.binaryDir) + "/libcarla_interposer-safe.so");
::setenv("LD_PRELOAD", interposerPath.buffer(), 1); ::setenv("LD_PRELOAD", interposerPath.buffer(), 1);
} }
else else
@@ -2655,7 +2655,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
{ {
carla_debug("CarlaEngine::loadProjectInternal(%p, %s) - START", &xmlDoc, bool2str(alwaysLoadConnections)); carla_debug("CarlaEngine::loadProjectInternal(%p, %s) - START", &xmlDoc, bool2str(alwaysLoadConnections));


CarlaScopedPointer<XmlElement> xmlElement(xmlDoc.getDocumentElement(true));
ScopedPointer<XmlElement> xmlElement(xmlDoc.getDocumentElement(true));
CARLA_SAFE_ASSERT_RETURN_ERR(xmlElement != nullptr, "Failed to parse project file"); CARLA_SAFE_ASSERT_RETURN_ERR(xmlElement != nullptr, "Failed to parse project file");


const water::String& xmlType(xmlElement->getTagName()); const water::String& xmlType(xmlElement->getTagName());
@@ -3012,7 +3012,7 @@ bool CarlaEngine::loadProjectInternal(water::XmlDocument& xmlDoc, const bool alw
switch (ptype) switch (ptype)
{ {
case PLUGIN_SF2: case PLUGIN_SF2:
if (CarlaString(stateSave.label).endsWith(" (16 outs)"))
if (String(stateSave.label).endsWith(" (16 outs)"))
extraStuff = kTrue; extraStuff = kTrue;
// fall through // fall through
case PLUGIN_LADSPA: case PLUGIN_LADSPA:


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

@@ -1139,7 +1139,7 @@ public:
{ {
CARLA_SAFE_ASSERT_BREAK(data != nullptr); CARLA_SAFE_ASSERT_BREAK(data != nullptr);


CarlaString dataBase64 = CarlaString::asBase64(data, dataSize);
String dataBase64 = String::asBase64(data, dataSize);
CARLA_SAFE_ASSERT_BREAK(dataBase64.length() > 0); CARLA_SAFE_ASSERT_BREAK(dataBase64.length() > 0);


water::String filePath(File::getSpecialLocation(File::tempDirectory).getFullPathName()); water::String filePath(File::getSpecialLocation(File::tempDirectory).getFullPathName());
@@ -1665,10 +1665,10 @@ private:
BridgeNonRtClientControl fShmNonRtClientControl; BridgeNonRtClientControl fShmNonRtClientControl;
BridgeNonRtServerControl fShmNonRtServerControl; BridgeNonRtServerControl fShmNonRtServerControl;


CarlaString fBaseNameAudioPool;
CarlaString fBaseNameRtClientControl;
CarlaString fBaseNameNonRtClientControl;
CarlaString fBaseNameNonRtServerControl;
String fBaseNameAudioPool;
String fBaseNameRtClientControl;
String fBaseNameNonRtClientControl;
String fBaseNameNonRtServerControl;


bool fClosingDown; bool fClosingDown;
bool fIsOffline; bool fIsOffline;


+ 5
- 21
source/backend/engine/CarlaEngineClient.cpp View File

@@ -1,30 +1,14 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaEngineClient.hpp" #include "CarlaEngineClient.hpp"
#include "CarlaEngineUtils.hpp" #include "CarlaEngineUtils.hpp"


#include "CarlaString.hpp"

CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


static void _getUniquePortName(CarlaString& sname, const CarlaStringList& list)
static void _getUniquePortName(String& sname, const CarlaStringList& list)
{ {
for (CarlaStringList::Itenerator it = list.begin2(); it.valid(); it.next()) for (CarlaStringList::Itenerator it = list.begin2(); it.valid(); it.next())
{ {
@@ -144,7 +128,7 @@ const char* CarlaEngineClient::ProtectedData::getUniquePortName(const char* cons
{ {
CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr); CARLA_SAFE_ASSERT_RETURN(name != nullptr && name[0] != '\0', nullptr);


CarlaString sname;
String sname;
sname = name; sname = name;


_getUniquePortName(sname, audioInList); _getUniquePortName(sname, audioInList);
@@ -154,7 +138,7 @@ const char* CarlaEngineClient::ProtectedData::getUniquePortName(const char* cons
_getUniquePortName(sname, eventInList); _getUniquePortName(sname, eventInList);
_getUniquePortName(sname, eventOutList); _getUniquePortName(sname, eventOutList);


return sname.dup();
return carla_strdup(sname);
} }


void CarlaEngineClient::ProtectedData::clearPorts() void CarlaEngineClient::ProtectedData::clearPorts()


+ 2
- 16
source/backend/engine/CarlaEngineClient.hpp View File

@@ -1,19 +1,5 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_ENGINE_CLIENT_HPP_INCLUDED #ifndef CARLA_ENGINE_CLIENT_HPP_INCLUDED
#define CARLA_ENGINE_CLIENT_HPP_INCLUDED #define CARLA_ENGINE_CLIENT_HPP_INCLUDED


+ 38
- 54
source/backend/engine/CarlaEngineGraph.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaEngineGraph.hpp" #include "CarlaEngineGraph.hpp"
#include "CarlaEngineInternal.hpp" #include "CarlaEngineInternal.hpp"
@@ -28,8 +14,6 @@ using water::jmax;
using water::jmin; using water::jmin;
using water::AudioProcessor; using water::AudioProcessor;
using water::MidiBuffer; using water::MidiBuffer;
using water::String;
using water::StringArray;


#define MAX_GRAPH_AUDIO_IO 64U #define MAX_GRAPH_AUDIO_IO 64U
#define MAX_GRAPH_CV_IO 32U #define MAX_GRAPH_CV_IO 32U
@@ -442,7 +426,7 @@ void ExternalGraph::refresh(const bool sendHost, const bool sendOSC, const char*
0, 0.0f, 0, 0.0f,
strBuf); strBuf);


const CarlaString groupNameIn(strBuf);
const String groupNameIn(strBuf);


for (LinkedList<PortNameToId>::Itenerator it = audioPorts.ins.begin2(); it.valid(); it.next()) for (LinkedList<PortNameToId>::Itenerator it = audioPorts.ins.begin2(); it.valid(); it.next())
{ {
@@ -474,7 +458,7 @@ void ExternalGraph::refresh(const bool sendHost, const bool sendOSC, const char*
0, 0.0f, 0, 0.0f,
strBuf); strBuf);


const CarlaString groupNameOut(strBuf);
const String groupNameOut(strBuf);


for (LinkedList<PortNameToId>::Itenerator it = audioPorts.outs.begin2(); it.valid(); it.next()) for (LinkedList<PortNameToId>::Itenerator it = audioPorts.outs.begin2(); it.valid(); it.next())
{ {
@@ -503,7 +487,7 @@ void ExternalGraph::refresh(const bool sendHost, const bool sendOSC, const char*
0, 0.0f, 0, 0.0f,
"Readable MIDI ports"); "Readable MIDI ports");


const CarlaString groupNamePlus("Readable MIDI ports:");
const String groupNamePlus("Readable MIDI ports:");


for (LinkedList<PortNameToId>::Itenerator it = midiPorts.ins.begin2(); it.valid(); it.next()) for (LinkedList<PortNameToId>::Itenerator it = midiPorts.ins.begin2(); it.valid(); it.next())
{ {
@@ -532,7 +516,7 @@ void ExternalGraph::refresh(const bool sendHost, const bool sendOSC, const char*
0, 0.0f, 0, 0.0f,
"Writable MIDI ports"); "Writable MIDI ports");


const CarlaString groupNamePlus("Writable MIDI ports:");
const String groupNamePlus("Writable MIDI ports:");


for (LinkedList<PortNameToId>::Itenerator it = midiPorts.outs.begin2(); it.valid(); it.next()) for (LinkedList<PortNameToId>::Itenerator it = midiPorts.outs.begin2(); it.valid(); it.next())
{ {
@@ -1271,53 +1255,53 @@ bool adjustPatchbayPortIdForWater(AudioProcessor::ChannelType& channelType, uint
} }


static inline static inline
const String getProcessorFullPortName(AudioProcessor* const proc, const uint32_t portId)
const water::String getProcessorFullPortName(AudioProcessor* const proc, const uint32_t portId)
{ {
CARLA_SAFE_ASSERT_RETURN(proc != nullptr, String());
CARLA_SAFE_ASSERT_RETURN(portId >= kAudioInputPortOffset, String());
CARLA_SAFE_ASSERT_RETURN(portId < kMaxPortOffset, String());
CARLA_SAFE_ASSERT_RETURN(proc != nullptr, {});
CARLA_SAFE_ASSERT_RETURN(portId >= kAudioInputPortOffset, {});
CARLA_SAFE_ASSERT_RETURN(portId < kMaxPortOffset, {});


String fullPortName(proc->getName());
water::String fullPortName(proc->getName());


/**/ if (portId >= kMidiOutputPortOffset) /**/ if (portId >= kMidiOutputPortOffset)
{ {
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumOutputChannels(AudioProcessor::ChannelTypeMIDI) > 0, String());
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumOutputChannels(AudioProcessor::ChannelTypeMIDI) > 0, {});
fullPortName += ":" + proc->getOutputChannelName(AudioProcessor::ChannelTypeMIDI, fullPortName += ":" + proc->getOutputChannelName(AudioProcessor::ChannelTypeMIDI,
portId-kMidiOutputPortOffset); portId-kMidiOutputPortOffset);
} }
else if (portId >= kMidiInputPortOffset) else if (portId >= kMidiInputPortOffset)
{ {
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumInputChannels(AudioProcessor::ChannelTypeMIDI) > 0, String());
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumInputChannels(AudioProcessor::ChannelTypeMIDI) > 0, {});
fullPortName += ":" + proc->getInputChannelName(AudioProcessor::ChannelTypeMIDI, fullPortName += ":" + proc->getInputChannelName(AudioProcessor::ChannelTypeMIDI,
portId-kMidiInputPortOffset); portId-kMidiInputPortOffset);
} }
else if (portId >= kCVOutputPortOffset) else if (portId >= kCVOutputPortOffset)
{ {
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumOutputChannels(AudioProcessor::ChannelTypeCV) > 0, String());
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumOutputChannels(AudioProcessor::ChannelTypeCV) > 0, {});
fullPortName += ":" + proc->getOutputChannelName(AudioProcessor::ChannelTypeCV, fullPortName += ":" + proc->getOutputChannelName(AudioProcessor::ChannelTypeCV,
portId-kCVOutputPortOffset); portId-kCVOutputPortOffset);
} }
else if (portId >= kCVInputPortOffset) else if (portId >= kCVInputPortOffset)
{ {
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumInputChannels(AudioProcessor::ChannelTypeCV) > 0, String());
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumInputChannels(AudioProcessor::ChannelTypeCV) > 0, {});
fullPortName += ":" + proc->getInputChannelName(AudioProcessor::ChannelTypeCV, fullPortName += ":" + proc->getInputChannelName(AudioProcessor::ChannelTypeCV,
portId-kCVInputPortOffset); portId-kCVInputPortOffset);
} }
else if (portId >= kAudioOutputPortOffset) else if (portId >= kAudioOutputPortOffset)
{ {
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumOutputChannels(AudioProcessor::ChannelTypeAudio) > 0, String());
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumOutputChannels(AudioProcessor::ChannelTypeAudio) > 0, {});
fullPortName += ":" + proc->getOutputChannelName(AudioProcessor::ChannelTypeAudio, fullPortName += ":" + proc->getOutputChannelName(AudioProcessor::ChannelTypeAudio,
portId-kAudioOutputPortOffset); portId-kAudioOutputPortOffset);
} }
else if (portId >= kAudioInputPortOffset) else if (portId >= kAudioInputPortOffset)
{ {
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumInputChannels(AudioProcessor::ChannelTypeAudio) > 0, String());
CARLA_SAFE_ASSERT_RETURN(proc->getTotalNumInputChannels(AudioProcessor::ChannelTypeAudio) > 0, {});
fullPortName += ":" + proc->getInputChannelName(AudioProcessor::ChannelTypeAudio, fullPortName += ":" + proc->getInputChannelName(AudioProcessor::ChannelTypeAudio,
portId-kAudioInputPortOffset); portId-kAudioInputPortOffset);
} }
else else
{ {
return String();
return {};
} }


return fullPortName; return fullPortName;
@@ -1539,10 +1523,10 @@ public:


// ------------------------------------------------------------------- // -------------------------------------------------------------------


const String getName() const override
const water::String getName() const override
{ {
const CarlaPluginPtr plugin = fPlugin; const CarlaPluginPtr plugin = fPlugin;
CARLA_SAFE_ASSERT_RETURN(plugin.get() != nullptr, String());
CARLA_SAFE_ASSERT_RETURN(plugin.get() != nullptr, {});


return plugin->getName(); return plugin->getName();
} }
@@ -1652,10 +1636,10 @@ public:
plugin->unlock(); plugin->unlock();
} }


const String getInputChannelName(ChannelType t, uint i) const override
const water::String getInputChannelName(ChannelType t, uint i) const override
{ {
const CarlaPluginPtr plugin = fPlugin; const CarlaPluginPtr plugin = fPlugin;
CARLA_SAFE_ASSERT_RETURN(plugin.get() != nullptr, String());
CARLA_SAFE_ASSERT_RETURN(plugin.get() != nullptr, {});


CarlaEngineClient* const client = plugin->getEngineClient(); CarlaEngineClient* const client = plugin->getEngineClient();


@@ -1669,13 +1653,13 @@ public:
return client->getEventPortName(true, i); return client->getEventPortName(true, i);
} }


return String();
return {};
} }


const String getOutputChannelName(ChannelType t, uint i) const override
const water::String getOutputChannelName(ChannelType t, uint i) const override
{ {
const CarlaPluginPtr plugin = fPlugin; const CarlaPluginPtr plugin = fPlugin;
CARLA_SAFE_ASSERT_RETURN(plugin.get() != nullptr, String());
CARLA_SAFE_ASSERT_RETURN(plugin.get() != nullptr, {});


CarlaEngineClient* const client(plugin->getEngineClient()); CarlaEngineClient* const client(plugin->getEngineClient());


@@ -1689,7 +1673,7 @@ public:
return client->getEventPortName(false, i); return client->getEventPortName(false, i);
} }


return String();
return {};
} }


void prepareToPlay(double, int) override {} void prepareToPlay(double, int) override {}
@@ -1729,23 +1713,23 @@ public:
inputNames(), inputNames(),
outputNames() {} outputNames() {}


const String getInputChannelName (ChannelType, uint _index) const override
const water::String getInputChannelName (ChannelType, uint _index) const override
{ {
const int index = static_cast<int>(_index); // FIXME const int index = static_cast<int>(_index); // FIXME
if (index < inputNames.size()) if (index < inputNames.size())
return inputNames[index]; return inputNames[index];
return String("Playback ") + String(index+1);
return water::String("Playback ") + String(index+1);
} }


const String getOutputChannelName (ChannelType, uint _index) const override
const water::String getOutputChannelName (ChannelType, uint _index) const override
{ {
const int index = static_cast<int>(_index); // FIXME const int index = static_cast<int>(_index); // FIXME
if (index < outputNames.size()) if (index < outputNames.size())
return outputNames[index]; return outputNames[index];
return String("Capture ") + String(index+1);
return water::String("Capture ") + String(index+1);
} }


void setNames(const bool setInputNames, const StringArray& names)
void setNames(const bool setInputNames, const water::StringArray& names)
{ {
if (setInputNames) if (setInputNames)
inputNames = names; inputNames = names;
@@ -1754,8 +1738,8 @@ public:
} }


private: private:
StringArray inputNames;
StringArray outputNames;
water::StringArray inputNames;
water::StringArray outputNames;
}; };


PatchbayGraph::PatchbayGraph(CarlaEngine* const engine, PatchbayGraph::PatchbayGraph(CarlaEngine* const engine,
@@ -1795,7 +1779,7 @@ PatchbayGraph::PatchbayGraph(CarlaEngine* const engine,
midiBuffer.ensureSize(kMaxEngineEventInternalCount*2); midiBuffer.ensureSize(kMaxEngineEventInternalCount*2);
midiBuffer.clear(); midiBuffer.clear();


StringArray channelNames;
water::StringArray channelNames;


switch (numAudioIns) switch (numAudioIns)
{ {
@@ -2378,10 +2362,10 @@ const char* const* PatchbayGraph::getConnections(const bool external) const
AudioProcessor* const procB(nodeB->getProcessor()); AudioProcessor* const procB(nodeB->getProcessor());
CARLA_SAFE_ASSERT_CONTINUE(procB != nullptr); CARLA_SAFE_ASSERT_CONTINUE(procB != nullptr);


String fullPortNameA(getProcessorFullPortName(procA, connectionToId.portA));
water::String fullPortNameA(getProcessorFullPortName(procA, connectionToId.portA));
CARLA_SAFE_ASSERT_CONTINUE(fullPortNameA.isNotEmpty()); CARLA_SAFE_ASSERT_CONTINUE(fullPortNameA.isNotEmpty());


String fullPortNameB(getProcessorFullPortName(procB, connectionToId.portB));
water::String fullPortNameB(getProcessorFullPortName(procB, connectionToId.portB));
CARLA_SAFE_ASSERT_CONTINUE(fullPortNameB.isNotEmpty()); CARLA_SAFE_ASSERT_CONTINUE(fullPortNameB.isNotEmpty());


connList.append(fullPortNameA.toRawUTF8()); connList.append(fullPortNameA.toRawUTF8());
@@ -2512,8 +2496,8 @@ bool PatchbayGraph::getGroupAndPortIdFromFullName(const bool external, const cha
if (external) if (external)
return extGraph.getGroupAndPortIdFromFullName(fullPortName, groupId, portId); return extGraph.getGroupAndPortIdFromFullName(fullPortName, groupId, portId);


String groupName(String(fullPortName).upToFirstOccurrenceOf(":", false, false));
String portName(String(fullPortName).fromFirstOccurrenceOf(":", false, false));
water::String groupName(water::String(fullPortName).upToFirstOccurrenceOf(":", false, false));
water::String portName(water::String(fullPortName).fromFirstOccurrenceOf(":", false, false));


for (int i=0, count=graph.getNumNodes(); i<count; ++i) for (int i=0, count=graph.getNumNodes(); i<count; ++i)
{ {


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

@@ -60,7 +60,7 @@ static const double kTicksPerBeat = 1920.0;
#if defined(HAVE_HYLIA) && !defined(BUILD_BRIDGE) #if defined(HAVE_HYLIA) && !defined(BUILD_BRIDGE)
static uint32_t calculate_link_latency(const double bufferSize, const double sampleRate) noexcept static uint32_t calculate_link_latency(const double bufferSize, const double sampleRate) noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(carla_isNotZero(sampleRate), 0);
CARLA_SAFE_ASSERT_RETURN(d_isNotZero(sampleRate), 0);


const long long int latency = llround(1.0e6 * bufferSize / sampleRate); const long long int latency = llround(1.0e6 * bufferSize / sampleRate);
CARLA_SAFE_ASSERT_RETURN(latency >= 0 && latency < UINT32_MAX, 0); CARLA_SAFE_ASSERT_RETURN(latency >= 0 && latency < UINT32_MAX, 0);
@@ -165,7 +165,7 @@ void EngineInternalTime::relocate(const uint64_t frame) noexcept


void EngineInternalTime::fillEngineTimeInfo(const uint32_t newFrames) noexcept void EngineInternalTime::fillEngineTimeInfo(const uint32_t newFrames) noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(carla_isNotZero(sampleRate),);
CARLA_SAFE_ASSERT_RETURN(d_isNotZero(sampleRate),);
CARLA_SAFE_ASSERT_RETURN(newFrames > 0,); CARLA_SAFE_ASSERT_RETURN(newFrames > 0,);


double ticktmp; double ticktmp;
@@ -248,7 +248,7 @@ void EngineInternalTime::fillEngineTimeInfo(const uint32_t newFrames) noexcept


void EngineInternalTime::fillJackTimeInfo(jack_position_t* const pos, const uint32_t newFrames) noexcept void EngineInternalTime::fillJackTimeInfo(jack_position_t* const pos, const uint32_t newFrames) noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(carla_isNotZero(sampleRate),);
CARLA_SAFE_ASSERT_RETURN(d_isNotZero(sampleRate),);
CARLA_SAFE_ASSERT_RETURN(newFrames > 0,); CARLA_SAFE_ASSERT_RETURN(newFrames > 0,);
CARLA_SAFE_ASSERT(transportMode == ENGINE_TRANSPORT_MODE_JACK); CARLA_SAFE_ASSERT(transportMode == ENGINE_TRANSPORT_MODE_JACK);


@@ -280,12 +280,12 @@ void EngineInternalTime::preProcess(const uint32_t numFrames)
const double new_bpb = hylia.timeInfo.beatsPerBar; const double new_bpb = hylia.timeInfo.beatsPerBar;
const double new_bpm = hylia.timeInfo.beatsPerMinute; const double new_bpm = hylia.timeInfo.beatsPerMinute;


if (new_bpb >= 1.0 && carla_isNotEqual(beatsPerBar, new_bpb))
if (new_bpb >= 1.0 && d_isNotEqual(beatsPerBar, new_bpb))
{ {
beatsPerBar = new_bpb; beatsPerBar = new_bpb;
needsReset = true; needsReset = true;
} }
if (new_bpm > 0.0 && carla_isNotEqual(beatsPerMinute, new_bpm))
if (new_bpm > 0.0 && d_isNotEqual(beatsPerMinute, new_bpm))
{ {
beatsPerMinute = new_bpm; beatsPerMinute = new_bpm;
needsReset = true; needsReset = true;


+ 7
- 21
source/backend/engine/CarlaEngineInternal.hpp View File

@@ -1,19 +1,5 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_ENGINE_INTERNAL_HPP_INCLUDED #ifndef CARLA_ENGINE_INTERNAL_HPP_INCLUDED
#define CARLA_ENGINE_INTERNAL_HPP_INCLUDED #define CARLA_ENGINE_INTERNAL_HPP_INCLUDED
@@ -284,8 +270,8 @@ struct CarlaEngine::ProtectedData {
#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
bool loadingProject; bool loadingProject;
bool ignoreClientPrefix; // backwards compat only bool ignoreClientPrefix; // backwards compat only
CarlaString currentProjectFilename;
CarlaString currentProjectFolder;
String currentProjectFilename;
String currentProjectFolder;
#endif #endif


uint32_t bufferSize; uint32_t bufferSize;
@@ -297,9 +283,9 @@ struct CarlaEngine::ProtectedData {
uint maxPluginNumber; // number of plugins allowed (0, 16, 99 or 255) uint maxPluginNumber; // number of plugins allowed (0, 16, 99 or 255)
uint nextPluginId; // invalid if == maxPluginNumber uint nextPluginId; // invalid if == maxPluginNumber


CarlaMutex envMutex;
CarlaString lastError;
CarlaString name;
CarlaMutex envMutex;
String lastError;
String name;
EngineOptions options; EngineOptions options;
EngineTimeInfo timeInfo; EngineTimeInfo timeInfo;




+ 23
- 23
source/backend/engine/CarlaEngineJack.cpp View File

@@ -769,13 +769,13 @@ public:
EngineInternalGraph& egraph, EngineInternalGraph& egraph,
CarlaRecursiveMutex& rmutex, CarlaRecursiveMutex& rmutex,
const CarlaPluginPtr plugin, const CarlaPluginPtr plugin,
const CarlaString& mainClientName,
const String& mainClientName,
jack_client_t* const jackClient) jack_client_t* const jackClient)
: CarlaEngineClientForSubclassing(engine, egraph, plugin), : CarlaEngineClientForSubclassing(engine, egraph, plugin),
#else #else
CarlaEngineJackClient(const CarlaEngine& engine, CarlaEngineJackClient(const CarlaEngine& engine,
CarlaRecursiveMutex& rmutex, CarlaRecursiveMutex& rmutex,
const CarlaString& mainClientName,
const String& mainClientName,
jack_client_t* const jackClient) jack_client_t* const jackClient)
: CarlaEngineClientForSubclassing(engine), : CarlaEngineClientForSubclassing(engine),
#endif #endif
@@ -1108,23 +1108,23 @@ public:
} }


#ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH #ifndef BUILD_BRIDGE_ALTERNATIVE_ARCH
bool renameInSingleClient(const CarlaString& newClientName)
bool renameInSingleClient(const String& newClientName)
{ {
const CarlaString clientNamePrefix(newClientName + ":");
const String clientNamePrefix(newClientName + ":");


return _renamePorts(fAudioPorts, clientNamePrefix) && return _renamePorts(fAudioPorts, clientNamePrefix) &&
_renamePorts(fCVPorts, clientNamePrefix) && _renamePorts(fCVPorts, clientNamePrefix) &&
_renamePorts(fEventPorts, clientNamePrefix); _renamePorts(fEventPorts, clientNamePrefix);
} }


void closeForRename(jack_client_t* const newClient, const CarlaString& newClientName) noexcept
void closeForRename(jack_client_t* const newClient, const String& newClientName) noexcept
{ {
if (fJackClient != nullptr) if (fJackClient != nullptr)
{ {
if (isActive()) if (isActive())
{ {
{ {
const CarlaString clientNamePrefix(newClientName + ":");
const String clientNamePrefix(newClientName + ":");


// store current client connections // store current client connections
const CarlaMutexLocker cml(fPreRenameMutex); const CarlaMutexLocker cml(fPreRenameMutex);
@@ -1203,13 +1203,13 @@ private:


CarlaMutex fPreRenameMutex; CarlaMutex fPreRenameMutex;
CarlaStringList fPreRenameConnections; CarlaStringList fPreRenameConnections;
CarlaString fPreRenamePluginId;
CarlaString fPreRenamePluginIcon;
String fPreRenamePluginId;
String fPreRenamePluginIcon;


CarlaScopedPointer<CarlaPluginPtr> fReservedPluginPtr;
ScopedPointer<CarlaPluginPtr> fReservedPluginPtr;


template<typename T> template<typename T>
bool _renamePorts(const LinkedList<T*>& t, const CarlaString& clientNamePrefix)
bool _renamePorts(const LinkedList<T*>& t, const String& clientNamePrefix)
{ {
for (typename LinkedList<T*>::Itenerator it = t.begin2(); it.valid(); it.next()) for (typename LinkedList<T*>::Itenerator it = t.begin2(); it.valid(); it.next())
{ {
@@ -1225,7 +1225,7 @@ private:


shortPortName += oldClientNameSep-shortPortName + 1; shortPortName += oldClientNameSep-shortPortName + 1;


const CarlaString newPortName(clientNamePrefix + shortPortName);
const String newPortName(clientNamePrefix + shortPortName);


if (! jackbridge_port_rename(fJackClient, port->fJackPort, newPortName)) if (! jackbridge_port_rename(fJackClient, port->fJackPort, newPortName))
return false; return false;
@@ -1235,7 +1235,7 @@ private:
} }


template<typename T> template<typename T>
void _savePortsConnections(const LinkedList<T*>& t, const CarlaString& clientNamePrefix)
void _savePortsConnections(const LinkedList<T*>& t, const String& clientNamePrefix)
{ {
for (typename LinkedList<T*>::Itenerator it = t.begin2(); it.valid(); it.next()) for (typename LinkedList<T*>::Itenerator it = t.begin2(); it.valid(); it.next())
{ {
@@ -1246,7 +1246,7 @@ private:
const char* const shortPortName(jackbridge_port_short_name(port->fJackPort)); const char* const shortPortName(jackbridge_port_short_name(port->fJackPort));
CARLA_SAFE_ASSERT_CONTINUE(shortPortName != nullptr && shortPortName[0] != '\0'); CARLA_SAFE_ASSERT_CONTINUE(shortPortName != nullptr && shortPortName[0] != '\0');


const CarlaString portName(clientNamePrefix + shortPortName);
const String portName(clientNamePrefix + shortPortName);


if (const char** const connections = jackbridge_port_get_all_connections(fJackClient, port->fJackPort)) if (const char** const connections = jackbridge_port_get_all_connections(fJackClient, port->fJackPort))
{ {
@@ -1311,7 +1311,7 @@ private:
#endif // BUILD_BRIDGE_ALTERNATIVE_ARCH #endif // BUILD_BRIDGE_ALTERNATIVE_ARCH


CarlaRecursiveMutex& fThreadSafeMetadataMutex; CarlaRecursiveMutex& fThreadSafeMetadataMutex;
const CarlaString& fMainClientName;
const String& fMainClientName;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackClient) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineJackClient)
}; };
@@ -1424,7 +1424,7 @@ public:
fExternalPatchbayHost = true; fExternalPatchbayHost = true;
fExternalPatchbayOsc = true; fExternalPatchbayOsc = true;


CarlaString truncatedClientName;
String truncatedClientName;


if (fClient == nullptr && clientName != nullptr) if (fClient == nullptr && clientName != nullptr)
{ {
@@ -1559,8 +1559,8 @@ public:


# ifdef HAVE_LIBLO # ifdef HAVE_LIBLO
{ {
const CarlaString& tcp(pData->osc.getServerPathTCP());
const CarlaString& udp(pData->osc.getServerPathUDP());
const String& tcp(pData->osc.getServerPathTCP());
const String& udp(pData->osc.getServerPathUDP());


if (tcp.isNotEmpty() || udp.isNotEmpty()) if (tcp.isNotEmpty() || udp.isNotEmpty())
{ {
@@ -2126,7 +2126,7 @@ public:
saveStatePtr = &saveState; saveStatePtr = &saveState;
} }


CarlaString uniqueName;
String uniqueName;


try { try {
const char* const tmpName = getUniquePluginName(newName); const char* const tmpName = getUniquePluginName(newName);
@@ -3233,7 +3233,7 @@ protected:
const CarlaJackPortHints& jackPortHints) const CarlaJackPortHints& jackPortHints)
{ {
bool groupFound; bool groupFound;
CarlaString groupName(portName);
String groupName(portName);
groupName.truncate(groupName.rfind(shortPortName, &groupFound)-1); groupName.truncate(groupName.rfind(shortPortName, &groupFound)-1);
CARLA_SAFE_ASSERT_RETURN(groupFound,); CARLA_SAFE_ASSERT_RETURN(groupFound,);


@@ -3463,7 +3463,7 @@ protected:
CARLA_SAFE_ASSERT_RETURN(newFullName != nullptr && newFullName[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(newFullName != nullptr && newFullName[0] != '\0',);


bool found; bool found;
CarlaString groupName(newFullName);
String groupName(newFullName);
groupName.truncate(groupName.rfind(newShortName, &found)-1); groupName.truncate(groupName.rfind(newShortName, &found)-1);
CARLA_SAFE_ASSERT_RETURN(found,); CARLA_SAFE_ASSERT_RETURN(found,);


@@ -3571,7 +3571,7 @@ private:
bool fExternalPatchbayOsc; bool fExternalPatchbayOsc;
bool fFreewheel; bool fFreewheel;


CarlaString fClientName;
String fClientName;
CarlaRecursiveMutex fThreadSafeMetadataMutex; CarlaRecursiveMutex fThreadSafeMetadataMutex;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -3579,7 +3579,7 @@ private:
#ifdef BUILD_BRIDGE #ifdef BUILD_BRIDGE
bool fIsRunning; bool fIsRunning;
#else #else
CarlaString fClientNamePrefix;
String fClientNamePrefix;


enum RackPorts { enum RackPorts {
kRackPortAudioIn1 = 0, kRackPortAudioIn1 = 0,
@@ -3798,7 +3798,7 @@ private:
uint groupId = 0; uint groupId = 0;


bool found; bool found;
CarlaString groupName(fullPortName);
String groupName(fullPortName);
groupName.truncate(groupName.rfind(shortPortName, &found)-1); groupName.truncate(groupName.rfind(shortPortName, &found)-1);


CARLA_SAFE_ASSERT_CONTINUE(found); CARLA_SAFE_ASSERT_CONTINUE(found);


+ 7
- 7
source/backend/engine/CarlaEngineNative.cpp View File

@@ -424,7 +424,7 @@ protected:
carla_zeroChars(tmpBuf, STR_MAX+1); carla_zeroChars(tmpBuf, STR_MAX+1);


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(tmpBuf, STR_MAX, "%.12g\n", newSampleRate); std::snprintf(tmpBuf, STR_MAX, "%.12g\n", newSampleRate);
} }


@@ -527,7 +527,7 @@ protected:
carla_zeroChars(tmpBuf, STR_MAX+1); carla_zeroChars(tmpBuf, STR_MAX+1);


const CarlaMutexLocker cml(fUiServer.getPipeLock()); const CarlaMutexLocker cml(fUiServer.getPipeLock());
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;


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


@@ -786,7 +786,7 @@ protected:
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(tmpBuf, STR_MAX, "%.12g\n", static_cast<double>(valuef)); std::snprintf(tmpBuf, STR_MAX, "%.12g\n", static_cast<double>(valuef));
} }
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
@@ -826,7 +826,7 @@ protected:


CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage("sample-rate\n"),); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage("sample-rate\n"),);
{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(tmpBuf, STR_MAX, "%.12g\n", pData->sampleRate); std::snprintf(tmpBuf, STR_MAX, "%.12g\n", pData->sampleRate);
} }
CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),); CARLA_SAFE_ASSERT_RETURN(fUiServer.writeMessage(tmpBuf),);
@@ -1233,7 +1233,7 @@ protected:
return; return;
} }


CarlaString path(pHost->resourceDir);
String path(pHost->resourceDir);


if (kIsPatchbay) if (kIsPatchbay)
path += CARLA_OS_SEP_STR "carla-plugin-patchbay"; path += CARLA_OS_SEP_STR "carla-plugin-patchbay";
@@ -1404,7 +1404,7 @@ protected:
carla_zeroChars(tmpBuf, STR_MAX+1); carla_zeroChars(tmpBuf, STR_MAX+1);


const CarlaMutexLocker cml(fUiServer.getPipeLock()); const CarlaMutexLocker cml(fUiServer.getPipeLock());
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
const EngineTimeInfo& timeInfo(pData->timeInfo); const EngineTimeInfo& timeInfo(pData->timeInfo);


// ------------------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------------------
@@ -1719,7 +1719,7 @@ private:
float fLastScaleFactor; float fLastScaleFactor;


float fParameters[kNumInParams+kNumOutParams]; float fParameters[kNumInParams+kNumOutParams];
CarlaString fLastProjectFolder;
String fLastProjectFolder;
CarlaMutex fPluginDeleterMutex; CarlaMutex fPluginDeleterMutex;


bool fOptionsForced; bool fOptionsForced;


+ 10
- 9
source/backend/engine/CarlaEngineOsc.hpp View File

@@ -9,10 +9,11 @@
#ifdef HAVE_LIBLO #ifdef HAVE_LIBLO


#include "CarlaBackend.h" #include "CarlaBackend.h"
#include "CarlaJuceUtils.hpp"
#include "CarlaPlugin.hpp" #include "CarlaPlugin.hpp"
#include "CarlaJuceUtils.hpp"
#include "CarlaOscUtils.hpp" #include "CarlaOscUtils.hpp"
#include "CarlaString.hpp"

#include "distrho/extra/String.hpp"


#define CARLA_ENGINE_OSC_HANDLE_ARGS const CarlaPluginPtr& plugin, \ #define CARLA_ENGINE_OSC_HANDLE_ARGS const CarlaPluginPtr& plugin, \
const int argc, const lo_arg* const* const argv, const char* const types const int argc, const lo_arg* const* const argv, const char* const types
@@ -56,12 +57,12 @@ public:


// ------------------------------------------------------------------- // -------------------------------------------------------------------


const CarlaString& getServerPathTCP() const noexcept
const String& getServerPathTCP() const noexcept
{ {
return fServerPathTCP; return fServerPathTCP;
} }


const CarlaString& getServerPathUDP() const noexcept
const String& getServerPathUDP() const noexcept
{ {
return fServerPathUDP; return fServerPathUDP;
} }
@@ -113,11 +114,11 @@ private:
CarlaOscData fControlDataTCP; CarlaOscData fControlDataTCP;
CarlaOscData fControlDataUDP; CarlaOscData fControlDataUDP;


CarlaString fName;
CarlaString fServerPathTCP;
CarlaString fServerPathUDP;
lo_server fServerTCP;
lo_server fServerUDP;
String fName;
String fServerPathTCP;
String fServerPathUDP;
lo_server fServerTCP;
lo_server fServerUDP;


// ------------------------------------------------------------------- // -------------------------------------------------------------------




+ 1
- 1
source/backend/engine/CarlaEnginePorts.cpp View File

@@ -106,7 +106,7 @@ void CarlaEngineCVPort::setRange(const float min, const float max) noexcept
carla_zeroChars(strBufMax, STR_MAX); carla_zeroChars(strBufMax, STR_MAX);


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(strBufMin, STR_MAX-1, "%.12g", static_cast<double>(min)); std::snprintf(strBufMin, STR_MAX-1, "%.12g", static_cast<double>(min));
std::snprintf(strBufMax, STR_MAX-1, "%.12g", static_cast<double>(max)); std::snprintf(strBufMax, STR_MAX-1, "%.12g", static_cast<double>(max));
} }


+ 4
- 4
source/backend/engine/CarlaEngineRtAudio.cpp View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaEngineGraph.hpp" #include "CarlaEngineGraph.hpp"
@@ -861,7 +861,7 @@ protected:
return CarlaEngine::connectExternalGraphPort(connectionType, portId, portName); return CarlaEngine::connectExternalGraphPort(connectionType, portId, portName);


case kExternalGraphConnectionMidiInput: { case kExternalGraphConnectionMidiInput: {
CarlaString newRtMidiPortName;
String newRtMidiPortName;
newRtMidiPortName += getName(); newRtMidiPortName += getName();
newRtMidiPortName += ":"; newRtMidiPortName += ":";
newRtMidiPortName += portName; newRtMidiPortName += portName;
@@ -913,7 +913,7 @@ protected:
} break; } break;


case kExternalGraphConnectionMidiOutput: { case kExternalGraphConnectionMidiOutput: {
CarlaString newRtMidiPortName;
String newRtMidiPortName;
newRtMidiPortName += getName(); newRtMidiPortName += getName();
newRtMidiPortName += ":"; newRtMidiPortName += ":";
newRtMidiPortName += portName; newRtMidiPortName += portName;
@@ -1037,7 +1037,7 @@ private:
uint64_t fLastEventTime; uint64_t fLastEventTime;


// current device name // current device name
CarlaString fDeviceName;
String fDeviceName;


// temp buffer for interleaved audio // temp buffer for interleaved audio
float* fAudioIntBufIn; float* fAudioIntBufIn;


+ 1
- 1
source/backend/engine/CarlaEngineSDL.cpp View File

@@ -400,7 +400,7 @@ private:
SDL_AudioDeviceID fDeviceId; SDL_AudioDeviceID fDeviceId;


// current device name // current device name
CarlaString fDeviceName;
String fDeviceName;


// deinterleaved buffers // deinterleaved buffers
uint fAudioOutCount; uint fAudioOutCount;


+ 14
- 13
source/backend/plugin/CarlaPlugin.cpp View File

@@ -8,12 +8,13 @@
#include "CarlaMathUtils.hpp" #include "CarlaMathUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"
#include "CarlaPluginUI.hpp" #include "CarlaPluginUI.hpp"
#include "CarlaScopeUtils.hpp"
// #include "CarlaScopeUtils.hpp"
#include "CarlaStringList.hpp" #include "CarlaStringList.hpp"


#include <ctime> #include <ctime>


#include "distrho/extra/Base64.hpp" #include "distrho/extra/Base64.hpp"
#include "distrho/extra/ScopedPointer.hpp"


#include "water/files/File.h" #include "water/files/File.h"
#include "water/streams/MemoryOutputStream.h" #include "water/streams/MemoryOutputStream.h"
@@ -557,7 +558,7 @@ const CarlaStateSave& CarlaPlugin::getStateSave(const bool callPrepareForSave)


if (data != nullptr && dataSize > 0) if (data != nullptr && dataSize > 0)
{ {
pData->stateSave.chunk = CarlaString::asBase64(data, dataSize).dup();
pData->stateSave.chunk = carla_strdup(String::asBase64(data, dataSize));


if (pluginType != PLUGIN_INTERNAL && pluginType != PLUGIN_JSFX) if (pluginType != PLUGIN_INTERNAL && pluginType != PLUGIN_JSFX)
usingChunk = true; usingChunk = true;
@@ -994,7 +995,7 @@ bool CarlaPlugin::loadStateFromFile(const char* const filename)
CARLA_SAFE_ASSERT_RETURN(file.existsAsFile(), false); CARLA_SAFE_ASSERT_RETURN(file.existsAsFile(), false);


XmlDocument xml(file); XmlDocument xml(file);
CarlaScopedPointer<XmlElement> xmlElement(xml.getDocumentElement(true));
ScopedPointer<XmlElement> xmlElement(xml.getDocumentElement(true));
CARLA_SAFE_ASSERT_RETURN(xmlElement != nullptr, false); CARLA_SAFE_ASSERT_RETURN(xmlElement != nullptr, false);
CARLA_SAFE_ASSERT_RETURN(xmlElement->getTagName().equalsIgnoreCase("carla-preset"), false); CARLA_SAFE_ASSERT_RETURN(xmlElement->getTagName().equalsIgnoreCase("carla-preset"), false);


@@ -1017,7 +1018,7 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
CARLA_SAFE_ASSERT_RETURN(lv2path != nullptr && lv2path[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(lv2path != nullptr && lv2path[0] != '\0', false);
carla_debug("CarlaPlugin::exportAsLV2(\"%s\")", lv2path); carla_debug("CarlaPlugin::exportAsLV2(\"%s\")", lv2path);


CarlaString bundlepath(lv2path);
String bundlepath(lv2path);


if (! bundlepath.endsWith(".lv2")) if (! bundlepath.endsWith(".lv2"))
bundlepath += ".lv2"; bundlepath += ".lv2";
@@ -1041,11 +1042,11 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
} }
} }


CarlaString symbol(pData->name);
String symbol(pData->name);
symbol.toBasic(); symbol.toBasic();


{ {
const CarlaString pluginFilename(bundlepath + CARLA_OS_SEP_STR + symbol + ".xml");
const String pluginFilename(bundlepath + CARLA_OS_SEP_STR + symbol + ".xml");


if (! saveStateToFile(pluginFilename)) if (! saveStateToFile(pluginFilename))
return false; return false;
@@ -1071,7 +1072,7 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
manifestStream << " lv2:requiredFeature <http://lv2plug.in/ns/ext/instance-access> .\n"; manifestStream << " lv2:requiredFeature <http://lv2plug.in/ns/ext/instance-access> .\n";
manifestStream << "\n"; manifestStream << "\n";


const CarlaString manifestFilename(bundlepath + CARLA_OS_SEP_STR "manifest.ttl");
const String manifestFilename(bundlepath + CARLA_OS_SEP_STR "manifest.ttl");
const File manifestFile(manifestFilename.buffer()); const File manifestFile(manifestFilename.buffer());


if (! manifestFile.replaceWithData(manifestStream.getData(), manifestStream.getDataSize())) if (! manifestFile.replaceWithData(manifestStream.getData(), manifestStream.getDataSize()))
@@ -1239,7 +1240,7 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)


if (strBufSymbol[0] == '\0') if (strBufSymbol[0] == '\0')
{ {
CarlaString s(strBufName);
String s(strBufName);
s.toBasic(); s.toBasic();
std::memcpy(strBufSymbol, s.buffer(), s.length()+1); std::memcpy(strBufSymbol, s.buffer(), s.length()+1);


@@ -1278,7 +1279,7 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
mainStream << " doap:maintainer [ foaf:name \"\"\"" << strBuf << "\"\"\" ] .\n"; mainStream << " doap:maintainer [ foaf:name \"\"\"" << strBuf << "\"\"\" ] .\n";
mainStream << "\n"; mainStream << "\n";


const CarlaString mainFilename(bundlepath + CARLA_OS_SEP_STR + symbol + ".ttl");
const String mainFilename(bundlepath + CARLA_OS_SEP_STR + symbol + ".ttl");
const File mainFile(mainFilename.buffer()); const File mainFile(mainFilename.buffer());


if (! mainFile.replaceWithData(mainStream.getData(), mainStream.getDataSize())) if (! mainFile.replaceWithData(mainStream.getData(), mainStream.getDataSize()))
@@ -1288,15 +1289,15 @@ bool CarlaPlugin::exportAsLV2(const char* const lv2path)
} }
} }


const CarlaString binaryFilename(bundlepath + CARLA_OS_SEP_STR + symbol + CARLA_LIB_EXT);
const String binaryFilename(bundlepath + CARLA_OS_SEP_STR + symbol + CARLA_LIB_EXT);


const File binaryFileSource(File::getSpecialLocation(File::currentExecutableFile).getSiblingFile("carla-bridge-lv2" CARLA_LIB_EXT)); const File binaryFileSource(File::getSpecialLocation(File::currentExecutableFile).getSiblingFile("carla-bridge-lv2" CARLA_LIB_EXT));
const File binaryFileTarget(binaryFilename.buffer()); const File binaryFileTarget(binaryFilename.buffer());


const EngineOptions& opts(pData->engine->getOptions()); const EngineOptions& opts(pData->engine->getOptions());


const CarlaString binFolderTarget(bundlepath + CARLA_OS_SEP_STR + "bin");
const CarlaString resFolderTarget(bundlepath + CARLA_OS_SEP_STR + "res");
const String binFolderTarget(bundlepath + CARLA_OS_SEP_STR + "bin");
const String resFolderTarget(bundlepath + CARLA_OS_SEP_STR + "res");


if (! binaryFileSource.copyFileTo(binaryFileTarget)) if (! binaryFileSource.copyFileTo(binaryFileTarget))
{ {
@@ -2490,7 +2491,7 @@ void CarlaPlugin::uiIdle()


carla_stdout("Trying to get window..."); carla_stdout("Trying to get window...");


CarlaString uiTitle;
String uiTitle;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {


+ 7
- 7
source/backend/plugin/CarlaPluginAU.cpp View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaPluginInternal.hpp" #include "CarlaPluginInternal.hpp"
@@ -248,7 +248,7 @@ public:
bool needsCtrlIn, needsCtrlOut, hasMidiIn, hasMidiOut; bool needsCtrlIn, needsCtrlOut, hasMidiIn, hasMidiOut;
needsCtrlIn = needsCtrlOut = hasMidiIn = hasMidiOut = false; needsCtrlIn = needsCtrlOut = hasMidiIn = hasMidiOut = false;


CarlaString portName;
String portName;
const uint portNameSize = pData->engine->getMaxPortNameSize(); const uint portNameSize = pData->engine->getMaxPortNameSize();


UInt32 outDataSize; UInt32 outDataSize;
@@ -400,7 +400,7 @@ public:
if (audioIns > 1) if (audioIns > 1)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(i + 1);
portName += String(i + 1);
} }
else else
portName += "input"; portName += "input";
@@ -425,7 +425,7 @@ public:
if (audioOuts > 1) if (audioOuts > 1)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(i + 1);
portName += String(i + 1);
} }
else else
portName += "output"; portName += "output";
@@ -1037,9 +1037,9 @@ private:
BundleLoader fBundleLoader; BundleLoader fBundleLoader;
AudioComponentPlugInInterface* fInterface; AudioComponentPlugInInterface* fInterface;
AudioBufferList* fAudioBufferData; AudioBufferList* fAudioBufferData;
CarlaString fName;
CarlaString fLabel;
CarlaString fMaker;
String fName;
String fLabel;
String fMaker;


struct Functions { struct Functions {
InitializeFn initialize; InitializeFn initialize;


+ 22
- 22
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -56,9 +56,9 @@ static water::String findWinePrefix(const water::String filename, const int recu


struct BridgeParamInfo { struct BridgeParamInfo {
float value; float value;
CarlaString name;
CarlaString symbol;
CarlaString unit;
String name;
String symbol;
String unit;


BridgeParamInfo() noexcept BridgeParamInfo() noexcept
: value(0.0f), : value(0.0f),
@@ -395,9 +395,9 @@ protected:
{ {
carla_stderr("CarlaPluginBridgeThread::run() - bridge crashed"); carla_stderr("CarlaPluginBridgeThread::run() - bridge crashed");


CarlaString errorString("Plugin '" + CarlaString(kPlugin->getName()) + "' has crashed!\n"
"Saving now will lose its current settings.\n"
"Please remove this plugin, and not rely on it from this point.");
String errorString("Plugin '" + String(kPlugin->getName()) + "' has crashed!\n"
"Saving now will lose its current settings.\n"
"Please remove this plugin, and not rely on it from this point.");
kEngine->callback(true, true, kEngine->callback(true, true,
ENGINE_CALLBACK_ERROR, kPlugin->getId(), 0, 0, 0, 0.0f, errorString); ENGINE_CALLBACK_ERROR, kPlugin->getId(), 0, 0, 0, 0.0f, errorString);
} }
@@ -415,10 +415,10 @@ private:
water::String fLabel; water::String fLabel;
water::String fShmIds; water::String fShmIds;
#ifndef CARLA_OS_WIN #ifndef CARLA_OS_WIN
CarlaString fWinePrefix;
String fWinePrefix;
#endif #endif


CarlaScopedPointer<ChildProcess> fProcess;
ScopedPointer<ChildProcess> fProcess;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginBridgeThread) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginBridgeThread)
}; };
@@ -1011,7 +1011,7 @@ public:
CARLA_SAFE_ASSERT_RETURN(data != nullptr,); CARLA_SAFE_ASSERT_RETURN(data != nullptr,);
CARLA_SAFE_ASSERT_RETURN(dataSize > 0,); CARLA_SAFE_ASSERT_RETURN(dataSize > 0,);


CarlaString dataBase64(CarlaString::asBase64(data, dataSize));
String dataBase64(String::asBase64(data, dataSize));
CARLA_SAFE_ASSERT_RETURN(dataBase64.length() > 0,); CARLA_SAFE_ASSERT_RETURN(dataBase64.length() > 0,);


water::String filePath(File::getSpecialLocation(File::tempDirectory).getFullPathName()); water::String filePath(File::getSpecialLocation(File::tempDirectory).getFullPathName());
@@ -1204,7 +1204,7 @@ public:
needsCtrlOut = true; needsCtrlOut = true;


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (uint32_t j=0; j < fInfo.aIns; ++j) for (uint32_t j=0; j < fInfo.aIns; ++j)
@@ -1224,7 +1224,7 @@ public:
else if (fInfo.aIns > 1) else if (fInfo.aIns > 1)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "input"; portName += "input";
@@ -1253,7 +1253,7 @@ public:
else if (fInfo.aOuts > 1) else if (fInfo.aOuts > 1)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "output"; portName += "output";
@@ -1284,7 +1284,7 @@ public:
else if (fInfo.cvIns > 1) else if (fInfo.cvIns > 1)
{ {
portName += "cv_input_"; portName += "cv_input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "cv_input"; portName += "cv_input";
@@ -1313,7 +1313,7 @@ public:
else if (fInfo.cvOuts > 1) else if (fInfo.cvOuts > 1)
{ {
portName += "cv_output_"; portName += "cv_output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "cv_output"; portName += "cv_output";
@@ -2897,7 +2897,7 @@ private:
uint fProcWaitTime; uint fProcWaitTime;
uint64_t fPendingEmbedCustomUI; uint64_t fPendingEmbedCustomUI;


CarlaString fBridgeBinary;
String fBridgeBinary;
CarlaPluginBridgeThread fBridgeThread; CarlaPluginBridgeThread fBridgeThread;


BridgeAudioPool fShmAudioPool; BridgeAudioPool fShmAudioPool;
@@ -2906,7 +2906,7 @@ private:
BridgeNonRtServerControl fShmNonRtServerControl; BridgeNonRtServerControl fShmNonRtServerControl;


#ifndef CARLA_OS_WIN #ifndef CARLA_OS_WIN
CarlaString fWinePrefix;
String fWinePrefix;
#endif #endif


class ReceivingParamText { class ReceivingParamText {
@@ -2974,10 +2974,10 @@ private:
uint32_t mIns, mOuts; uint32_t mIns, mOuts;
PluginCategory category; PluginCategory category;
uint optionsAvailable; uint optionsAvailable;
CarlaString name;
CarlaString label;
CarlaString maker;
CarlaString copyright;
String name;
String label;
String maker;
String copyright;
const char** aInNames; const char** aInNames;
const char** aOutNames; const char** aOutNames;
const char** cvInNames; const char** cvInNames;
@@ -3222,7 +3222,7 @@ private:
#else #else
void* data = &fInfo.chunk.front(); void* data = &fInfo.chunk.front();
#endif #endif
CarlaString dataBase64(CarlaString::asBase64(data, dataSize));
String dataBase64(String::asBase64(data, dataSize));
CARLA_SAFE_ASSERT_RETURN(dataBase64.length() > 0, true); CARLA_SAFE_ASSERT_RETURN(dataBase64.length() > 0, true);


water::String filePath(File::getSpecialLocation(File::tempDirectory).getFullPathName()); water::String filePath(File::getSpecialLocation(File::tempDirectory).getFullPathName());
@@ -3248,7 +3248,7 @@ private:


void _setUiTitleFromName() void _setUiTitleFromName()
{ {
CarlaString uiName(pData->name);
String uiName(pData->name);
uiName += " (GUI)"; uiName += " (GUI)";


const uint32_t size = static_cast<uint32_t>(uiName.length()); const uint32_t size = static_cast<uint32_t>(uiName.length());


+ 6
- 20
source/backend/plugin/CarlaPluginCLAP.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla CLAP Plugin
* Copyright (C) 2022-2023 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaPluginInternal.hpp" #include "CarlaPluginInternal.hpp"
#include "CarlaEngine.hpp" #include "CarlaEngine.hpp"
@@ -1085,7 +1071,7 @@ public:
if (!fUI.isCreated) if (!fUI.isCreated)
return; return;


CarlaString uiTitle;
String uiTitle;


if (title != nullptr) if (title != nullptr)
{ {
@@ -1552,7 +1538,7 @@ public:


const EngineProcessMode processMode = pData->engine->getProccessMode(); const EngineProcessMode processMode = pData->engine->getProccessMode();
const uint portNameSize = pData->engine->getMaxPortNameSize(); const uint portNameSize = pData->engine->getMaxPortNameSize();
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (uint32_t j=0; j < aIns; ++j) for (uint32_t j=0; j < aIns; ++j)
@@ -1568,7 +1554,7 @@ public:
if (aIns > 1) if (aIns > 1)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "input"; portName += "input";
@@ -1594,7 +1580,7 @@ public:
if (aOuts > 1) if (aOuts > 1)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "output"; portName += "output";


+ 4
- 4
source/backend/plugin/CarlaPluginFluidSynth.cpp View File

@@ -632,7 +632,7 @@ public:
pData->param.createNew(params, false); pData->param.createNew(params, false);


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;


// --------------------------------------- // ---------------------------------------
// Audio Outputs // Audio Outputs
@@ -654,7 +654,7 @@ public:
if ((i+2)/2 < 9) if ((i+2)/2 < 9)
portName += "0"; portName += "0";


portName += CarlaString((i+2)/2);
portName += String((i+2)/2);


if (i % 2 == 0) if (i % 2 == 0)
portName += "L"; portName += "L";
@@ -1702,12 +1702,12 @@ public:
// --------------------------------------------------------------- // ---------------------------------------------------------------
// get info // get info


CarlaString label2(label);
String label2(label);


if (kUse16Outs && ! label2.endsWith(" (16 outs)")) if (kUse16Outs && ! label2.endsWith(" (16 outs)"))
label2 += " (16 outs)"; label2 += " (16 outs)";


fLabel = label2.dup();
fLabel = carla_strdup(label2);
pData->filename = carla_strdup(filename); pData->filename = carla_strdup(filename);


if (name != nullptr && name[0] != '\0') if (name != nullptr && name[0] != '\0')


+ 5
- 18
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -1,19 +1,5 @@
/*
* Carla Plugin
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_PLUGIN_INTERNAL_HPP_INCLUDED #ifndef CARLA_PLUGIN_INTERNAL_HPP_INCLUDED
#define CARLA_PLUGIN_INTERNAL_HPP_INCLUDED #define CARLA_PLUGIN_INTERNAL_HPP_INCLUDED
@@ -26,9 +12,10 @@


#include "CarlaMIDI.h" #include "CarlaMIDI.h"
#include "CarlaMutex.hpp" #include "CarlaMutex.hpp"
#include "CarlaString.hpp"
#include "RtLinkedList.hpp" #include "RtLinkedList.hpp"


#include "distrho/extra/String.hpp"

CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@@ -286,7 +273,7 @@ struct CarlaPlugin::ProtectedData {


CarlaStateSave stateSave; CarlaStateSave stateSave;


CarlaString uiTitle;
String uiTitle;


struct ExternalNotes { struct ExternalNotes {
CarlaMutex mutex; CarlaMutex mutex;


+ 14
- 29
source/backend/plugin/CarlaPluginJSFX.cpp View File

@@ -1,19 +1,6 @@
/*
* Carla JSFX Plugin
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2021 Jean Pierre Cimalando
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


// TODO(jsfx) graphics section // TODO(jsfx) graphics section


@@ -35,8 +22,6 @@


using water::CharPointer_UTF8; using water::CharPointer_UTF8;
using water::File; using water::File;
using water::String;
using water::StringArray;


CARLA_BACKEND_START_NAMESPACE CARLA_BACKEND_START_NAMESPACE


@@ -332,7 +317,7 @@ public:
} }


const uint portNameSize = pData->engine->getMaxPortNameSize(); const uint portNameSize = pData->engine->getMaxPortNameSize();
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (uint32_t j = 0; j < aIns; ++j) for (uint32_t j = 0; j < aIns; ++j)
@@ -353,7 +338,7 @@ public:
else if (aIns > 1) else if (aIns > 1)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "input"; portName += "input";
@@ -383,7 +368,7 @@ public:
else if (aOuts > 1) else if (aOuts > 1)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "output"; portName += "output";
@@ -414,13 +399,13 @@ public:


// only use values as integer if we have a proper range // only use values as integer if we have a proper range
const bool isEnum = ysfx_slider_is_enum(fEffect, rindex) && const bool isEnum = ysfx_slider_is_enum(fEffect, rindex) &&
carla_isZero(min) &&
d_isZero(min) &&
max >= 0.0f && max >= 0.0f &&
carla_isEqual(max + 1.0f, static_cast<float>(ysfx_slider_get_enum_names(fEffect, rindex, nullptr, 0)));
d_isEqual(max + 1.0f, static_cast<float>(ysfx_slider_get_enum_names(fEffect, rindex, nullptr, 0)));


// NOTE: in case of incomplete slider specification without <min,max,step>; // NOTE: in case of incomplete slider specification without <min,max,step>;
// these are usually output-only sliders. // these are usually output-only sliders.
if (carla_isEqual(min, max))
if (d_isEqual(min, max))
{ {
// replace with a dummy range // replace with a dummy range
min = 0.0f; min = 0.0f;
@@ -929,10 +914,10 @@ public:
fUnit = CarlaJsfxUnit(); fUnit = CarlaJsfxUnit();


{ {
StringArray splitPaths;
water::StringArray splitPaths;


if (const char* paths = pData->engine->getOptions().pathJSFX) if (const char* paths = pData->engine->getOptions().pathJSFX)
splitPaths = StringArray::fromTokens(CharPointer_UTF8(paths), CARLA_OS_SPLIT_STR, "");
splitPaths = water::StringArray::fromTokens(CharPointer_UTF8(paths), CARLA_OS_SPLIT_STR, "");


File file; File file;
if (filename && filename[0] != '\0') if (filename && filename[0] != '\0')
@@ -977,8 +962,8 @@ public:
ysfx_config_u config(ysfx_config_new()); ysfx_config_u config(ysfx_config_new());
CARLA_SAFE_ASSERT_RETURN(config != nullptr, false); CARLA_SAFE_ASSERT_RETURN(config != nullptr, false);


const CarlaString rootPath = fUnit.getRootPath();
const CarlaString filePath = fUnit.getFilePath();
const String rootPath = fUnit.getRootPath();
const String filePath = fUnit.getFilePath();


ysfx_register_builtin_audio_formats(config.get()); ysfx_register_builtin_audio_formats(config.get());
ysfx_set_import_root(config.get(), rootPath); ysfx_set_import_root(config.get(), rootPath);
@@ -1021,7 +1006,7 @@ public:
pData->name = carla_strdup(ysfx_get_name(fEffect)); pData->name = carla_strdup(ysfx_get_name(fEffect));
} }


pData->filename = filePath.dup();
pData->filename = carla_strdup(filePath);


// --------------------------------------------------------------- // ---------------------------------------------------------------
// register client // register client


+ 24
- 24
source/backend/plugin/CarlaPluginJack.cpp View File

@@ -124,12 +124,12 @@ public:
char* getEnvVarsToExport() char* getEnvVarsToExport()
{ {
const EngineOptions& options(kEngine->getOptions()); const EngineOptions& options(kEngine->getOptions());
CarlaString binaryDir(options.binaryDir);
String binaryDir(options.binaryDir);
#ifdef HAVE_LIBLO #ifdef HAVE_LIBLO
const int sessionManager = fSetupLabel[4U] - '0'; const int sessionManager = fSetupLabel[4U] - '0';
#endif #endif


CarlaString ret;
String ret;
#ifdef CARLA_OS_MAC #ifdef CARLA_OS_MAC
ret += "export DYLD_LIBRARY_PATH=" + binaryDir + "/jack\n"; ret += "export DYLD_LIBRARY_PATH=" + binaryDir + "/jack\n";
ret += "export DYLD_INSERT_LIBRARIES=" + binaryDir + "/libcarla_interposer-jack-x11.dylib\n"; ret += "export DYLD_INSERT_LIBRARIES=" + binaryDir + "/libcarla_interposer-jack-x11.dylib\n";
@@ -151,12 +151,12 @@ public:
#endif #endif


if (kPlugin->getHints() & PLUGIN_HAS_CUSTOM_UI) if (kPlugin->getHints() & PLUGIN_HAS_CUSTOM_UI)
ret += "export CARLA_FRONTEND_WIN_ID=" + CarlaString(options.frontendWinId) + "\n";
ret += "export CARLA_FRONTEND_WIN_ID=" + String(options.frontendWinId) + "\n";


ret += "export CARLA_LIBJACK_SETUP=" + fSetupLabel + "\n"; ret += "export CARLA_LIBJACK_SETUP=" + fSetupLabel + "\n";
ret += "export CARLA_SHM_IDS=" + fShmIds + "\n"; ret += "export CARLA_SHM_IDS=" + fShmIds + "\n";


return ret.releaseBufferPointer();
return ret.getAndReleaseBuffer();
} }


protected: protected:
@@ -350,11 +350,11 @@ protected:
std::snprintf(winIdStr, STR_MAX, P_UINTPTR, options.frontendWinId); std::snprintf(winIdStr, STR_MAX, P_UINTPTR, options.frontendWinId);
winIdStr[STR_MAX] = '\0'; winIdStr[STR_MAX] = '\0';


const CarlaString libjackdir(CarlaString(options.binaryDir) + "/jack");
const String libjackdir(String(options.binaryDir) + "/jack");
#ifdef CARLA_OS_MAC #ifdef CARLA_OS_MAC
const CarlaString ldpreload(CarlaString(options.binaryDir) + "/libcarla_interposer-jack-x11.dylib");
const String ldpreload(String(options.binaryDir) + "/libcarla_interposer-jack-x11.dylib");
#else #else
const CarlaString ldpreload(CarlaString(options.binaryDir) + "/libcarla_interposer-jack-x11.so");
const String ldpreload(String(options.binaryDir) + "/libcarla_interposer-jack-x11.so");
#endif #endif


const ScopedEngineEnvironmentLocker _seel(kEngine); const ScopedEngineEnvironmentLocker _seel(kEngine);
@@ -435,7 +435,7 @@ protected:
{ {
carla_stderr("CarlaPluginJackThread::run() - application crashed"); carla_stderr("CarlaPluginJackThread::run() - application crashed");


CarlaString errorString("Plugin '" + CarlaString(kPlugin->getName()) + "' has crashed!\n"
String errorString("Plugin '" + String(kPlugin->getName()) + "' has crashed!\n"
"Saving now will lose its current settings.\n" "Saving now will lose its current settings.\n"
"Please remove this plugin, and not rely on it from this point."); "Please remove this plugin, and not rely on it from this point.");
kEngine->callback(true, true, kEngine->callback(true, true,
@@ -455,8 +455,8 @@ private:
CarlaEngine* const kEngine; CarlaEngine* const kEngine;
CarlaPlugin* const kPlugin; CarlaPlugin* const kPlugin;


CarlaString fShmIds;
CarlaString fSetupLabel;
String fShmIds;
String fSetupLabel;


#ifdef HAVE_LIBLO #ifdef HAVE_LIBLO
lo_address fOscClientAddress; lo_address fOscClientAddress;
@@ -464,10 +464,10 @@ private:
bool fHasOptionalGui; bool fHasOptionalGui;


struct ProjectData { struct ProjectData {
CarlaString appName;
CarlaString path;
CarlaString display;
CarlaString clientName;
String appName;
String path;
String display;
String clientName;


ProjectData() ProjectData()
: appName(), : appName(),
@@ -483,7 +483,7 @@ private:
CARLA_SAFE_ASSERT_RETURN(uniqueCodeID != nullptr && uniqueCodeID[0] != '\0', false); CARLA_SAFE_ASSERT_RETURN(uniqueCodeID != nullptr && uniqueCodeID[0] != '\0', false);
CARLA_SAFE_ASSERT_RETURN(appName.isNotEmpty(), false); CARLA_SAFE_ASSERT_RETURN(appName.isNotEmpty(), false);


CarlaString child(pluginName);
String child(pluginName);
child += "."; child += ".";
child += uniqueCodeID; child += uniqueCodeID;


@@ -500,7 +500,7 @@ private:
} fProject; } fProject;
#endif #endif


CarlaScopedPointer<ChildProcess> fProcess;
ScopedPointer<ChildProcess> fProcess;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginJackThread) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPluginJackThread)
}; };
@@ -847,7 +847,7 @@ public:
needsCtrlOut = true; needsCtrlOut = true;


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (uint8_t j=0; j < fInfo.aIns; ++j) for (uint8_t j=0; j < fInfo.aIns; ++j)
@@ -863,7 +863,7 @@ public:
if (fInfo.aIns > 1) if (fInfo.aIns > 1)
{ {
portName += "audio_in_"; portName += "audio_in_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
{ {
@@ -890,7 +890,7 @@ public:
if (fInfo.aOuts > 1) if (fInfo.aOuts > 1)
{ {
portName += "audio_out_"; portName += "audio_out_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
{ {
@@ -1807,7 +1807,7 @@ private:
struct Info { struct Info {
uint8_t aIns, aOuts; uint8_t aIns, aOuts;
uint8_t mIns, mOuts; uint8_t mIns, mOuts;
CarlaString setupLabel;
String setupLabel;
std::vector<uint8_t> chunk; std::vector<uint8_t> chunk;


Info() Info()
@@ -1870,7 +1870,7 @@ private:
char code[6]; char code[6];
code[5] = '\0'; code[5] = '\0';


CarlaString child;
String child;


for (;;) for (;;)
{ {
@@ -1949,21 +1949,21 @@ private:
const bool needsCancelableAction = ! pData->engine->isLoadingProject(); const bool needsCancelableAction = ! pData->engine->isLoadingProject();
const bool needsEngineIdle = pData->engine->getType() != kEngineTypePlugin; const bool needsEngineIdle = pData->engine->getType() != kEngineTypePlugin;


CarlaString actionName;
String actionName;


if (needsCancelableAction) if (needsCancelableAction)
{ {
if (fSetupHints & LIBJACK_FLAG_EXTERNAL_START) if (fSetupHints & LIBJACK_FLAG_EXTERNAL_START)
{ {
const EngineOptions& options(pData->engine->getOptions()); const EngineOptions& options(pData->engine->getOptions());
CarlaString binaryDir(options.binaryDir);
String binaryDir(options.binaryDir);


char* const hwVars = fBridgeThread.getEnvVarsToExport(); char* const hwVars = fBridgeThread.getEnvVarsToExport();


actionName = "Waiting for external JACK application start, please use the following environment variables:\n"; actionName = "Waiting for external JACK application start, please use the following environment variables:\n";
actionName += hwVars; actionName += hwVars;


delete[] hwVars;
std::free(hwVars);
} }
else else
{ {


+ 11
- 11
source/backend/plugin/CarlaPluginLADSPADSSI.cpp View File

@@ -159,12 +159,12 @@ public:
winIdStr[STR_MAX] = '\0'; winIdStr[STR_MAX] = '\0';


// for LD_PRELOAD // for LD_PRELOAD
CarlaString ldPreloadValue;
String ldPreloadValue;


if (winId != 0) if (winId != 0)
{ {
std::snprintf(winIdStr, STR_MAX, P_UINTPTR, winId); std::snprintf(winIdStr, STR_MAX, P_UINTPTR, winId);
ldPreloadValue = (CarlaString(kEngine->getOptions().binaryDir)
ldPreloadValue = (String(kEngine->getOptions().binaryDir)
+ "/libcarla_interposer-x11.so"); + "/libcarla_interposer-x11.so");
} }
else else
@@ -234,12 +234,12 @@ private:
CarlaEngine* const kEngine; CarlaEngine* const kEngine;
CarlaPlugin* const kPlugin; CarlaPlugin* const kPlugin;


CarlaString fBinary;
CarlaString fLabel;
CarlaString fUiTitle;
String fBinary;
String fLabel;
String fUiTitle;


const CarlaOscData& fOscData; const CarlaOscData& fOscData;
CarlaScopedPointer<ChildProcess> fProcess;
ScopedPointer<ChildProcess> fProcess;


bool waitForOscGuiShow() bool waitForOscGuiShow()
{ {
@@ -973,7 +973,7 @@ public:
} }


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;


for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; ++i) for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCtrl=0; i < portCount; ++i)
{ {
@@ -1002,7 +1002,7 @@ public:
if (aIns > 1) if (aIns > 1)
{ {
portName += "audio-in_"; portName += "audio-in_";
portName += CarlaString(iAudioIn+1);
portName += String(iAudioIn+1);
} }
else else
portName += "audio-in"; portName += "audio-in";
@@ -1012,7 +1012,7 @@ public:
if (aOuts > 1) if (aOuts > 1)
{ {
portName += "audio-out_"; portName += "audio-out_";
portName += CarlaString(iAudioOut+1);
portName += String(iAudioOut+1);
} }
else else
portName += "audio-out"; portName += "audio-out";
@@ -2879,7 +2879,7 @@ public:
// --------------------------------------------------------------- // ---------------------------------------------------------------
// check for fixed buffer size requirement // check for fixed buffer size requirement


fNeedsFixedBuffers = CarlaString(filename).contains("dssi-vst", true);
fNeedsFixedBuffers = String(filename).contains("dssi-vst", true);


if (fNeedsFixedBuffers && ! pData->engine->usesConstantBufferSize()) if (fNeedsFixedBuffers && ! pData->engine->usesConstantBufferSize())
{ {
@@ -2980,7 +2980,7 @@ public:
{ {
fUiFilename = guiFilename; fUiFilename = guiFilename;


CarlaString uiTitle;
String uiTitle;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {


+ 22
- 22
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -546,7 +546,7 @@ public:
{ {
char sampleRateStr[32]; char sampleRateStr[32];
{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(sampleRateStr, 31, "%.12g", kEngine->getSampleRate()); std::snprintf(sampleRateStr, 31, "%.12g", kEngine->getSampleRate());
} }
sampleRateStr[31] = '\0'; sampleRateStr[31] = '\0';
@@ -583,10 +583,10 @@ private:
CarlaEngine* const kEngine; CarlaEngine* const kEngine;
CarlaPluginLV2* const kPlugin; CarlaPluginLV2* const kPlugin;


CarlaString fFilename;
CarlaString fPluginURI;
CarlaString fUiURI;
UiState fUiState;
String fFilename;
String fPluginURI;
String fUiURI;
UiState fUiState;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeServerLV2) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeServerLV2)
}; };
@@ -1477,7 +1477,7 @@ public:


void setWindowTitle(const char* const title) noexcept void setWindowTitle(const char* const title) noexcept
{ {
CarlaString uiTitle;
String uiTitle;


if (title != nullptr) if (title != nullptr)
{ {
@@ -1490,7 +1490,7 @@ public:
} }


std::free(const_cast<char*>(fLv2Options.windowTitle)); std::free(const_cast<char*>(fLv2Options.windowTitle));
fLv2Options.windowTitle = uiTitle.releaseBufferPointer();
fLv2Options.windowTitle = uiTitle.getAndReleaseBuffer();


fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle); fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle);
fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].value = fLv2Options.windowTitle; fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].value = fLv2Options.windowTitle;
@@ -1845,7 +1845,7 @@ public:
tmpBuf[0xfe] = '\0'; tmpBuf[0xfe] = '\0';


const CarlaMutexLocker cml(fPipeServer.getPipeLock()); const CarlaMutexLocker cml(fPipeServer.getPipeLock());
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;


// write URI mappings // write URI mappings
uint32_t u = 0; uint32_t u = 0;
@@ -2544,7 +2544,7 @@ public:
} }


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;
uint32_t iCtrl = 0; uint32_t iCtrl = 0;


for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCvIn=0, iCvOut=0, iEvIn=0, iEvOut=0; i < portCount; ++i) for (uint32_t i=0, iAudioIn=0, iAudioOut=0, iCvIn=0, iCvOut=0, iEvIn=0, iEvOut=0; i < portCount; ++i)
@@ -5361,7 +5361,7 @@ public:


const char* getUiBridgeBinary(const LV2_Property type) const const char* getUiBridgeBinary(const LV2_Property type) const
{ {
CarlaString bridgeBinary(pData->engine->getOptions().binaryDir);
String bridgeBinary(pData->engine->getOptions().binaryDir);


if (bridgeBinary.isEmpty()) if (bridgeBinary.isEmpty())
return nullptr; return nullptr;
@@ -5406,7 +5406,7 @@ public:
if (! File(bridgeBinary.buffer()).existsAsFile()) if (! File(bridgeBinary.buffer()).existsAsFile())
return nullptr; return nullptr;


return bridgeBinary.dupSafe();
return carla_strdup_safe(bridgeBinary);
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -5833,7 +5833,7 @@ public:
return nullptr; return nullptr;
} }


CarlaString basedir(pData->engine->getName());
String basedir(pData->engine->getName());


if (temporary) if (temporary)
basedir += ".tmp"; basedir += ".tmp";
@@ -5896,7 +5896,7 @@ public:
return File(); return File();
} }


CarlaString basedir(pData->engine->getName());
String basedir(pData->engine->getName());


if (temporary) if (temporary)
basedir += ".tmp"; basedir += ".tmp";
@@ -5968,7 +5968,7 @@ public:
if (type == kUridAtomString || type == kUridAtomPath) if (type == kUridAtomString || type == kUridAtomPath)
cData.value = carla_strdup((const char*)value); cData.value = carla_strdup((const char*)value);
else else
cData.value = CarlaString::asBase64(value, size).dup();
cData.value = carla_strdup(String::asBase64(value, size));


return LV2_STATE_SUCCESS; return LV2_STATE_SUCCESS;
} }
@@ -5982,7 +5982,7 @@ public:
if (type == kUridAtomString || type == kUridAtomPath) if (type == kUridAtomString || type == kUridAtomPath)
newData.value = carla_strdup((const char*)value); newData.value = carla_strdup((const char*)value);
else else
newData.value = CarlaString::asBase64(value, size).dup();
newData.value = carla_strdup(String::asBase64(value, size));


pData->custom.append(newData); pData->custom.append(newData);


@@ -6657,7 +6657,7 @@ public:
} }
else if (feature.Required && ! is_lv2_feature_supported(feature.URI)) else if (feature.Required && ! is_lv2_feature_supported(feature.URI))
{ {
CarlaString msg("Plugin wants a feature that is not supported:\n");
String msg("Plugin wants a feature that is not supported:\n");
msg += feature.URI; msg += feature.URI;


canContinue = false; canContinue = false;
@@ -7175,7 +7175,7 @@ public:
{ {
carla_stdout("Will use UI-Bridge for '%s', binary: \"%s\"", pData->name, bridgeBinary); carla_stdout("Will use UI-Bridge for '%s', binary: \"%s\"", pData->name, bridgeBinary);


CarlaString uiTitle;
String uiTitle;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {
@@ -7187,7 +7187,7 @@ public:
uiTitle += " (GUI)"; uiTitle += " (GUI)";
} }


fLv2Options.windowTitle = uiTitle.releaseBufferPointer();
fLv2Options.windowTitle = uiTitle.getAndReleaseBuffer();


fUI.type = UI::TYPE_BRIDGE; fUI.type = UI::TYPE_BRIDGE;
fPipeServer.setData(bridgeBinary, fRdfDescriptor->URI, fUI.rdfDescriptor->URI); fPipeServer.setData(bridgeBinary, fRdfDescriptor->URI, fUI.rdfDescriptor->URI);
@@ -7321,7 +7321,7 @@ public:
// initialize ui data // initialize ui data


{ {
CarlaString uiTitle;
String uiTitle;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {
@@ -7333,7 +7333,7 @@ public:
uiTitle += " (GUI)"; uiTitle += " (GUI)";
} }


fLv2Options.windowTitle = uiTitle.releaseBufferPointer();
fLv2Options.windowTitle = uiTitle.getAndReleaseBuffer();
} }


fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle); fLv2Options.opts[CarlaPluginLV2Options::WindowTitle].size = (uint32_t)std::strlen(fLv2Options.windowTitle);
@@ -7557,7 +7557,7 @@ private:
EngineTimeInfo fLastTimeInfo; EngineTimeInfo fLastTimeInfo;


// if plugin provides path parameter, use it as fake "gui" // if plugin provides path parameter, use it as fake "gui"
CarlaString fFilePathURI;
String fFilePathURI;


struct Extensions { struct Extensions {
const LV2_Options_Interface* options; const LV2_Options_Interface* options;
@@ -8428,7 +8428,7 @@ CarlaPluginPtr CarlaPlugin::newLV2(const Initializer& init)
#ifndef CARLA_OS_WASM #ifndef CARLA_OS_WASM
if (needsArchBridge != nullptr) if (needsArchBridge != nullptr)
{ {
CarlaString bridgeBinary(init.engine->getOptions().binaryDir);
String bridgeBinary(init.engine->getOptions().binaryDir);
bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native"; bridgeBinary += CARLA_OS_SEP_STR "carla-bridge-native";


return CarlaPlugin::newBridge(init, BINARY_NATIVE, PLUGIN_LV2, needsArchBridge, bridgeBinary); return CarlaPlugin::newBridge(init, BINARY_NATIVE, PLUGIN_LV2, needsArchBridge, bridgeBinary);


+ 13
- 13
source/backend/plugin/CarlaPluginNative.cpp View File

@@ -698,7 +698,7 @@ public:


void setWindowTitle(const char* const title) noexcept void setWindowTitle(const char* const title) noexcept
{ {
CarlaString uiName;
String uiName;


if (title != nullptr) if (title != nullptr)
{ {
@@ -711,7 +711,7 @@ public:
} }


std::free(const_cast<char*>(fHost.uiName)); std::free(const_cast<char*>(fHost.uiName));
fHost.uiName = uiName.releaseBufferPointer();
fHost.uiName = uiName.getAndReleaseBuffer();


if (fDescriptor->dispatcher != nullptr && fIsUiVisible) if (fDescriptor->dispatcher != nullptr && fIsUiVisible)
{ {
@@ -1143,7 +1143,7 @@ public:
} }


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (j=0; j < aIns; ++j) for (j=0; j < aIns; ++j)
@@ -1163,7 +1163,7 @@ public:
else if (aIns > 1 && ! forcedStereoIn) else if (aIns > 1 && ! forcedStereoIn)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "input"; portName += "input";
@@ -1200,7 +1200,7 @@ public:
else if (aOuts > 1 && ! forcedStereoOut) else if (aOuts > 1 && ! forcedStereoOut)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "output"; portName += "output";
@@ -1237,7 +1237,7 @@ public:
else if (cvIns > 1) else if (cvIns > 1)
{ {
portName += "cv_input_"; portName += "cv_input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "cv_input"; portName += "cv_input";
@@ -1279,7 +1279,7 @@ public:
else if (cvOuts > 1) else if (cvOuts > 1)
{ {
portName += "cv_output_"; portName += "cv_output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "cv_output"; portName += "cv_output";
@@ -1317,7 +1317,7 @@ public:
} }


portName += "midi-in_"; portName += "midi-in_";
portName += CarlaString(j+1);
portName += String(j+1);
portName.truncate(portNameSize); portName.truncate(portNameSize);


fMidiIn.ports[j] = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, true, j); fMidiIn.ports[j] = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, true, j);
@@ -1341,7 +1341,7 @@ public:
} }


portName += "midi-out_"; portName += "midi-out_";
portName += CarlaString(j+1);
portName += String(j+1);
portName.truncate(portNameSize); portName.truncate(portNameSize);


fMidiOut.ports[j] = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, false, j); fMidiOut.ports[j] = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, false, j);
@@ -2950,7 +2950,7 @@ public:
{ {
CARLA_ASSERT(fHost.uiName == nullptr); CARLA_ASSERT(fHost.uiName == nullptr);


CarlaString uiName;
String uiName;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {
@@ -2962,7 +2962,7 @@ public:
uiName += " (GUI)"; uiName += " (GUI)";
} }


fHost.uiName = uiName.releaseBufferPointer();
fHost.uiName = uiName.getAndReleaseBuffer();
} }


// --------------------------------------------------------------- // ---------------------------------------------------------------
@@ -3068,8 +3068,8 @@ private:
bool fInlineDisplayNeedsRedraw; bool fInlineDisplayNeedsRedraw;
int64_t fInlineDisplayLastRedrawTime; int64_t fInlineDisplayLastRedrawTime;


CarlaString fLastProjectFilename;
CarlaString fLastProjectFolder;
String fLastProjectFilename;
String fLastProjectFolder;


float** fAudioAndCvInBuffers; float** fAudioAndCvInBuffers;
float** fAudioAndCvOutBuffers; float** fAudioAndCvOutBuffers;


+ 3
- 3
source/backend/plugin/CarlaPluginSFZero.cpp View File

@@ -214,7 +214,7 @@ public:
pData->param.createNew(1, false); pData->param.createNew(1, false);


const uint portNameSize(pData->engine->getMaxPortNameSize()); const uint portNameSize(pData->engine->getMaxPortNameSize());
CarlaString portName;
String portName;


// --------------------------------------- // ---------------------------------------
// Audio Outputs // Audio Outputs
@@ -700,9 +700,9 @@ public:


const water::String basename(File(filename).getFileNameWithoutExtension()); const water::String basename(File(filename).getFileNameWithoutExtension());


CarlaString label2(label != nullptr ? label : basename.toRawUTF8());
String label2(label != nullptr ? label : basename.toRawUTF8());


fLabel = label2.dup();
fLabel = carla_strdup(label2);
fRealName = carla_strdup(basename.toRawUTF8()); fRealName = carla_strdup(basename.toRawUTF8());


pData->filename = carla_strdup(filename); pData->filename = carla_strdup(filename);


+ 7
- 7
source/backend/plugin/CarlaPluginVST2.cpp View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaPluginInternal.hpp" #include "CarlaPluginInternal.hpp"
@@ -369,7 +369,7 @@ public:
if (fUI.window == nullptr || pData->uiTitle.isNotEmpty()) if (fUI.window == nullptr || pData->uiTitle.isNotEmpty())
return; return;


CarlaString uiTitle(pData->name);
String uiTitle(pData->name);
uiTitle += " (GUI)"; uiTitle += " (GUI)";
fUI.window->setTitle(uiTitle.buffer()); fUI.window->setTitle(uiTitle.buffer());
} }
@@ -501,7 +501,7 @@ public:


if (yesNo) if (yesNo)
{ {
CarlaString uiTitle;
String uiTitle;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {
@@ -733,7 +733,7 @@ public:


const EngineProcessMode processMode = pData->engine->getProccessMode(); const EngineProcessMode processMode = pData->engine->getProccessMode();
const uint portNameSize = pData->engine->getMaxPortNameSize(); const uint portNameSize = pData->engine->getMaxPortNameSize();
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (uint32_t j=0; j < aIns; ++j) for (uint32_t j=0; j < aIns; ++j)
@@ -749,7 +749,7 @@ public:
if (aIns > 1) if (aIns > 1)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "input"; portName += "input";
@@ -774,7 +774,7 @@ public:
if (aOuts > 1) if (aOuts > 1)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "output"; portName += "output";
@@ -2465,7 +2465,7 @@ public:
VST_Function vstFn; VST_Function vstFn;


#ifdef CARLA_OS_MAC #ifdef CARLA_OS_MAC
CarlaString filenameCheck(filename);
String filenameCheck(filename);
filenameCheck.toLower(); filenameCheck.toLower();


if (filenameCheck.endsWith(".vst") || filenameCheck.endsWith(".vst/")) if (filenameCheck.endsWith(".vst") || filenameCheck.endsWith(".vst/"))


+ 10
- 9
source/backend/plugin/CarlaPluginVST3.cpp View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


/* TODO list /* TODO list
@@ -9,6 +9,7 @@
#include "CarlaEngine.hpp" #include "CarlaEngine.hpp"


#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
#include "CarlaMathUtils.hpp"
#include "CarlaVst3Utils.hpp" #include "CarlaVst3Utils.hpp"


#include "CarlaPluginUI.hpp" #include "CarlaPluginUI.hpp"
@@ -1633,7 +1634,7 @@ public:


if (yesNo) if (yesNo)
{ {
CarlaString uiTitle;
String uiTitle;


if (pData->uiTitle.isNotEmpty()) if (pData->uiTitle.isNotEmpty())
{ {
@@ -1671,7 +1672,7 @@ public:
fUI.window->setTitle(uiTitle.buffer()); fUI.window->setTitle(uiTitle.buffer());


#ifndef CARLA_OS_MAC #ifndef CARLA_OS_MAC
if (carla_isNotZero(opts.uiScale))
if (d_isNotZero(opts.uiScale))
{ {
// TODO inform plugin of what UI scale we use // TODO inform plugin of what UI scale we use
} }
@@ -1775,7 +1776,7 @@ public:
#ifndef CARLA_OS_MAC #ifndef CARLA_OS_MAC
const EngineOptions& opts(pData->engine->getOptions()); const EngineOptions& opts(pData->engine->getOptions());


if (carla_isNotZero(opts.uiScale))
if (d_isNotZero(opts.uiScale))
{ {
// TODO // TODO
} }
@@ -2073,7 +2074,7 @@ public:


const EngineProcessMode processMode = pData->engine->getProccessMode(); const EngineProcessMode processMode = pData->engine->getProccessMode();
const uint portNameSize = pData->engine->getMaxPortNameSize(); const uint portNameSize = pData->engine->getMaxPortNameSize();
CarlaString portName;
String portName;


// Audio Ins // Audio Ins
for (uint32_t j=0; j < aIns; ++j) for (uint32_t j=0; j < aIns; ++j)
@@ -2089,7 +2090,7 @@ public:
if (aIns > 1) if (aIns > 1)
{ {
portName += "input_"; portName += "input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "input"; portName += "input";
@@ -2115,7 +2116,7 @@ public:
if (aOuts > 1) if (aOuts > 1)
{ {
portName += "output_"; portName += "output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "output"; portName += "output";
@@ -2141,7 +2142,7 @@ public:
if (cvIns > 1) if (cvIns > 1)
{ {
portName += "cv_input_"; portName += "cv_input_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "cv_input"; portName += "cv_input";
@@ -2167,7 +2168,7 @@ public:
if (cvOuts > 1) if (cvOuts > 1)
{ {
portName += "cv_output_"; portName += "cv_output_";
portName += CarlaString(j+1);
portName += String(j+1);
} }
else else
portName += "cv_output"; portName += "cv_output";


+ 6
- 7
source/backend/utils/CachedPlugins.cpp View File

@@ -1,10 +1,9 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaUtils.h" #include "CarlaUtils.h"


#include "CarlaNative.h" #include "CarlaNative.h"
#include "CarlaString.hpp"
#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
#include "CarlaLv2Utils.hpp" #include "CarlaLv2Utils.hpp"


@@ -178,7 +177,7 @@ static const CarlaCachedPluginInfo* get_cached_plugin_lv2(Lv2WorldClass& lv2Worl
// text data // text data


{ {
static CarlaString suri, sname, smaker, slicense;
static String suri, sname, smaker, slicense;
suri.clear(); sname.clear(); smaker.clear(); slicense.clear(); suri.clear(); sname.clear(); smaker.clear(); slicense.clear();


suri = lilvPlugin.get_uri().as_uri(); suri = lilvPlugin.get_uri().as_uri();
@@ -589,7 +588,7 @@ static const CarlaCachedPluginInfo* get_cached_plugin_sfz(const water::File& fil
{ {
static CarlaCachedPluginInfo info; static CarlaCachedPluginInfo info;


static CarlaString name, filename;
static String name, filename;


name = file.getFileNameWithoutExtension().toRawUTF8(); name = file.getFileNameWithoutExtension().toRawUTF8();
name.replace('_',' '); name.replace('_',' ');
@@ -627,8 +626,8 @@ static const CarlaCachedPluginInfo* get_cached_plugin_jsfx(const CB::CarlaJsfxUn


ysfx_config_u config(ysfx_config_new()); ysfx_config_u config(ysfx_config_new());


const CarlaString rootPath = unit.getRootPath();
const CarlaString filePath = unit.getFilePath();
const String rootPath = unit.getRootPath();
const String filePath = unit.getFilePath();


ysfx_register_builtin_audio_formats(config.get()); ysfx_register_builtin_audio_formats(config.get());
ysfx_set_import_root(config.get(), rootPath); ysfx_set_import_root(config.get(), rootPath);
@@ -653,7 +652,7 @@ static const CarlaCachedPluginInfo* get_cached_plugin_jsfx(const CB::CarlaJsfxUn
return &info; return &info;
} }


static CarlaString name, label, maker;
static String name, label, maker;
label = unit.getFileId(); label = unit.getFileId();
name = ysfx_get_name(effect.get()); name = ysfx_get_name(effect.get());
maker = ysfx_get_author(effect.get()); maker = ysfx_get_author(effect.get());


+ 5
- 5
source/backend/utils/Information.cpp View File

@@ -1,8 +1,7 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaUtils.h" #include "CarlaUtils.h"
#include "CarlaString.hpp"


#if defined(HAVE_FLUIDSYNTH) && !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH) #if defined(HAVE_FLUIDSYNTH) && !defined(BUILD_BRIDGE_ALTERNATIVE_ARCH)
# include <fluidsynth.h> # include <fluidsynth.h>
@@ -26,6 +25,7 @@
# pragma GCC diagnostic pop # pragma GCC diagnostic pop
#endif #endif


#include "distrho/extra/String.hpp"
#include "water/files/File.h" #include "water/files/File.h"


// ------------------------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------------------------
@@ -34,7 +34,7 @@ const char* carla_get_complete_license_text()
{ {
carla_debug("carla_get_complete_license_text()"); carla_debug("carla_get_complete_license_text()");


static CarlaString retText;
static String retText;


if (retText.isEmpty()) if (retText.isEmpty())
{ {
@@ -196,7 +196,7 @@ const char* carla_get_library_filename()
{ {
carla_debug("carla_get_library_filename()"); carla_debug("carla_get_library_filename()");


static CarlaString ret;
static String ret;


if (ret.isEmpty()) if (ret.isEmpty())
{ {
@@ -211,7 +211,7 @@ const char* carla_get_library_folder()
{ {
carla_debug("carla_get_library_folder()"); carla_debug("carla_get_library_folder()");


static CarlaString ret;
static String ret;


if (ret.isEmpty()) if (ret.isEmpty())
{ {


+ 1
- 0
source/backend/utils/PluginDiscovery.cpp View File

@@ -7,6 +7,7 @@
#include "CarlaBinaryUtils.hpp" #include "CarlaBinaryUtils.hpp"
#include "CarlaJuceUtils.hpp" #include "CarlaJuceUtils.hpp"
#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaScopeUtils.hpp"
#include "CarlaSha1Utils.hpp" #include "CarlaSha1Utils.hpp"


#include "distrho/extra/Time.hpp" #include "distrho/extra/Time.hpp"


+ 6
- 19
source/bridges-ui/CarlaBridgeFormat.hpp View File

@@ -1,19 +1,5 @@
/*
* Carla Bridge UI
* Copyright (C) 2011-2021 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_BRIDGE_FORMAT_HPP_INCLUDED #ifndef CARLA_BRIDGE_FORMAT_HPP_INCLUDED
#define CARLA_BRIDGE_FORMAT_HPP_INCLUDED #define CARLA_BRIDGE_FORMAT_HPP_INCLUDED
@@ -22,7 +8,8 @@


#include "CarlaLibUtils.hpp" #include "CarlaLibUtils.hpp"
#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaString.hpp"

#include "distrho/extra/String.hpp"


#include "lv2/atom.h" #include "lv2/atom.h"
#include "lv2/urid.h" #include "lv2/urid.h"
@@ -144,7 +131,7 @@ public:
/*! /*!
* Window title. * Window title.
*/ */
CarlaString windowTitle;
String windowTitle;


/*! /*!
* Transient window id (parent), zero if unset. * Transient window id (parent), zero if unset.
@@ -177,7 +164,7 @@ protected:
CarlaBridgeToolkit* fToolkit; CarlaBridgeToolkit* fToolkit;


lib_t fLib; lib_t fLib;
CarlaString fLibFilename;
String fLibFilename;
std::vector<uint8_t> fBase64ReservedChunk; std::vector<uint8_t> fBase64ReservedChunk;


/*! @internal */ /*! @internal */


+ 3
- 17
source/bridges-ui/CarlaBridgeFormatLV2.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla Bridge UI
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaBridgeFormat.hpp" #include "CarlaBridgeFormat.hpp"
#include "CarlaBridgeToolkit.hpp" #include "CarlaBridgeToolkit.hpp"
@@ -1555,7 +1541,7 @@ int main(int argc, const char* argv[])
// try to get sampleRate value // try to get sampleRate value
if (const char* const sampleRateStr = std::getenv("CARLA_SAMPLE_RATE")) if (const char* const sampleRateStr = std::getenv("CARLA_SAMPLE_RATE"))
{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
gInitialSampleRate = std::atof(sampleRateStr); gInitialSampleRate = std::atof(sampleRateStr);
} }




+ 12
- 10
source/discovery/carla-discovery.cpp View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaBackendUtils.hpp" #include "CarlaBackendUtils.hpp"
@@ -16,6 +16,8 @@
#include "CarlaVst3Utils.hpp" #include "CarlaVst3Utils.hpp"
#include "CarlaClapUtils.hpp" #include "CarlaClapUtils.hpp"


#include "distrho/extra/ScopedPointer.hpp"

#ifndef BUILDING_CARLA_FOR_WINE #ifndef BUILDING_CARLA_FOR_WINE
# include "CarlaPipeUtils.cpp" # include "CarlaPipeUtils.cpp"
#endif #endif
@@ -152,7 +154,7 @@ public:
}; };
#endif #endif


CarlaScopedPointer<DiscoveryPipe> gPipe;
ScopedPointer<DiscoveryPipe> gPipe;


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
// Don't print ELF/EXE related errors since discovery can find multi-architecture binaries // Don't print ELF/EXE related errors since discovery can find multi-architecture binaries
@@ -799,7 +801,7 @@ static void do_lv2_check(const char* const bundle, const bool doInit)
Lilv::Node bundleNode(lv2World.new_file_uri(nullptr, bundle)); Lilv::Node bundleNode(lv2World.new_file_uri(nullptr, bundle));
CARLA_SAFE_ASSERT_RETURN(bundleNode.is_uri(),); CARLA_SAFE_ASSERT_RETURN(bundleNode.is_uri(),);


CarlaString sBundle(bundleNode.as_uri());
String sBundle(bundleNode.as_uri());


if (! sBundle.endsWith("/")) if (! sBundle.endsWith("/"))
sBundle += "/"; sBundle += "/";
@@ -833,7 +835,7 @@ static void do_lv2_check(const char* const bundle, const bool doInit)
const char* const URI = it.getValue(nullptr); const char* const URI = it.getValue(nullptr);
CARLA_SAFE_ASSERT_CONTINUE(URI != nullptr); CARLA_SAFE_ASSERT_CONTINUE(URI != nullptr);


CarlaScopedPointer<const LV2_RDF_Descriptor> rdfDescriptor(lv2_rdf_new(URI, false));
ScopedPointer<const LV2_RDF_Descriptor> rdfDescriptor(lv2_rdf_new(URI, false));


if (rdfDescriptor == nullptr || rdfDescriptor->URI == nullptr) if (rdfDescriptor == nullptr || rdfDescriptor->URI == nullptr)
{ {
@@ -1155,9 +1157,9 @@ static bool do_vst2_check(lib_t& libHandle, const char* const filename, const bo
gVstCurrentUniqueId = effect->uniqueID; gVstCurrentUniqueId = effect->uniqueID;


char strBuf[STR_MAX+1]; char strBuf[STR_MAX+1];
CarlaString cName;
CarlaString cProduct;
CarlaString cVendor;
String cName;
String cProduct;
String cVendor;
PluginCategory category; PluginCategory category;
LinkedList<intptr_t> uniqueIds; LinkedList<intptr_t> uniqueIds;


@@ -2739,8 +2741,8 @@ static void do_fluidsynth_check(const char* const filename, const PluginType typ
delete_fluid_settings(f_settings); delete_fluid_settings(f_settings);
} }


CarlaString name(file.getFileNameWithoutExtension().toRawUTF8());
CarlaString label(name);
String name(file.getFileNameWithoutExtension().toRawUTF8());
String label(name);


// 2 channels // 2 channels
DISCOVERY_OUT("init", "------------"); DISCOVERY_OUT("init", "------------");
@@ -2852,7 +2854,7 @@ int main(int argc, const char* argv[])
const char* const filename = argv[2]; const char* const filename = argv[2];
const PluginType type = getPluginTypeFromString(stype); const PluginType type = getPluginTypeFromString(stype);


CarlaString filenameCheck(filename);
String filenameCheck(filename);
filenameCheck.toLower(); filenameCheck.toLower();


bool openLib; bool openLib;


+ 0
- 1
source/frontend/dialogs/jackappdialog.cpp View File

@@ -25,7 +25,6 @@
#include "qsafesettings.hpp" #include "qsafesettings.hpp"


#include "CarlaLibJackHints.h" #include "CarlaLibJackHints.h"
#include "CarlaString.hpp"


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------
// Jack Application Dialog // Jack Application Dialog


+ 2
- 2
source/frontend/pluginlist/pluginlistdialog.cpp View File

@@ -32,7 +32,7 @@
#include "CarlaJuceUtils.hpp" #include "CarlaJuceUtils.hpp"
#include "CarlaUtils.h" #include "CarlaUtils.h"


#include "CarlaString.hpp"
#include "distrho/extra/ScopedPointer.hpp"


#include <cstdlib> #include <cstdlib>


@@ -647,7 +647,7 @@ struct PluginListDialog::PrivateData {
bool useWineBridges = false; bool useWineBridges = false;
CarlaPluginDiscoveryHandle handle = nullptr; CarlaPluginDiscoveryHandle handle = nullptr;
QCarlaString tool; QCarlaString tool;
CarlaScopedPointer<PluginRefreshDialog> dialog;
ScopedPointer<PluginRefreshDialog> dialog;
Discovery() Discovery()
{ {
restart(); restart();


+ 3
- 17
source/includes/CarlaNativeExtUI.hpp View File

@@ -1,19 +1,5 @@
/*
* Carla Native Plugin API (C++)
* Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_NATIVE_EXTERNAL_UI_HPP_INCLUDED #ifndef CARLA_NATIVE_EXTERNAL_UI_HPP_INCLUDED
#define CARLA_NATIVE_EXTERNAL_UI_HPP_INCLUDED #define CARLA_NATIVE_EXTERNAL_UI_HPP_INCLUDED
@@ -220,7 +206,7 @@ protected:
#endif #endif


private: private:
CarlaString fExtUiPath;
String fExtUiPath;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NativePluginAndUiClass) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(NativePluginAndUiClass)
}; };


+ 9
- 23
source/includes/CarlaNativePrograms.hpp View File

@@ -1,19 +1,5 @@
/*
* Carla Native Plugin API (C++)
* Copyright (C) 2012-2024 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_NATIVE_PROGRAMS_HPP_INCLUDED #ifndef CARLA_NATIVE_PROGRAMS_HPP_INCLUDED
#define CARLA_NATIVE_PROGRAMS_HPP_INCLUDED #define CARLA_NATIVE_PROGRAMS_HPP_INCLUDED
@@ -23,14 +9,14 @@
#include "CarlaMathUtils.hpp" #include "CarlaMathUtils.hpp"
#include "CarlaMutex.hpp" #include "CarlaMutex.hpp"


#include "distrho/extra/String.hpp"

#include "water/files/File.h" #include "water/files/File.h"
#include "water/memory/SharedResourcePointer.h" #include "water/memory/SharedResourcePointer.h"
#include "water/text/StringArray.h" #include "water/text/StringArray.h"


using water::File; using water::File;
using water::SharedResourcePointer; using water::SharedResourcePointer;
using water::String;
using water::StringArray;


/*! /*!
* @defgroup CarlaNativeAPI Carla Native API * @defgroup CarlaNativeAPI Carla Native API
@@ -48,7 +34,7 @@ enum FileType {


template <FileType fileType> template <FileType fileType>
struct NativePluginPresetManager { struct NativePluginPresetManager {
StringArray filenames;
water::StringArray filenames;


NativePluginPresetManager(const char* const paths, const char* const wildcard) NativePluginPresetManager(const char* const paths, const char* const wildcard)
: filenames() : filenames()
@@ -58,9 +44,9 @@ struct NativePluginPresetManager {
if (paths == nullptr || paths[0] == '\0' || wildcard[0] == '\0') if (paths == nullptr || paths[0] == '\0' || wildcard[0] == '\0')
return; return;


const StringArray splitPaths(StringArray::fromTokens(paths, CARLA_OS_SPLIT_STR, ""));
const water::StringArray splitPaths(water::StringArray::fromTokens(paths, CARLA_OS_SPLIT_STR, ""));


for (String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it)
for (water::String *it = splitPaths.begin(), *end = splitPaths.end(); it != end; ++it)
{ {
std::vector<File> results; std::vector<File> results;


@@ -126,11 +112,11 @@ protected:
const NativePluginPresetManagerType& pm(kPrograms.get()); const NativePluginPresetManagerType& pm(kPrograms.get());
CARLA_SAFE_ASSERT_RETURN(index < pm.filenames.size(), nullptr); CARLA_SAFE_ASSERT_RETURN(index < pm.filenames.size(), nullptr);


fRetMidiProgramName = File(pm.filenames.strings.getUnchecked(index).toRawUTF8()).getFileNameWithoutExtension();
fRetMidiProgramName = File(pm.filenames.strings.getUnchecked(index).toRawUTF8()).getFileNameWithoutExtension().toRawUTF8();


fRetMidiProgram.bank = 0; fRetMidiProgram.bank = 0;
fRetMidiProgram.program = uindex; fRetMidiProgram.program = uindex;
fRetMidiProgram.name = fRetMidiProgramName.toRawUTF8();
fRetMidiProgram.name = fRetMidiProgramName;


return &fRetMidiProgram; return &fRetMidiProgram;
} }


+ 2
- 3
source/modules/sfzero/sfzero/SFZSample.h View File

@@ -9,11 +9,10 @@


#include "SFZCommon.h" #include "SFZCommon.h"


#include "distrho/extra/ScopedPointer.hpp"
#include "water/buffers/AudioSampleBuffer.h" #include "water/buffers/AudioSampleBuffer.h"
#include "water/files/File.h" #include "water/files/File.h"


#include "CarlaScopeUtils.hpp"

namespace sfzero namespace sfzero
{ {


@@ -42,7 +41,7 @@ public:


private: private:
water::File file_; water::File file_;
CarlaScopedPointer<water::AudioSampleBuffer> buffer_;
ScopedPointer<water::AudioSampleBuffer> buffer_;
double sampleRate_; double sampleRate_;
water::uint64 sampleLength_, loopStart_, loopEnd_; water::uint64 sampleLength_, loopStart_, loopEnd_;




+ 5
- 5
source/modules/water/containers/HashMap.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2018-2022 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2018-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -29,7 +29,7 @@
#include "Array.h" #include "Array.h"
#include "../text/String.h" #include "../text/String.h"
#include "CarlaScopeUtils.hpp"
#include "distrho/extra/ScopedPointer.hpp"
namespace water { namespace water {
@@ -141,7 +141,7 @@ public:
while (h != nullptr) while (h != nullptr)
{ {
const CarlaScopedPointer<HashEntry> deleter (h);
const ScopedPointer<HashEntry> deleter (h);
h = h->nextEntry; h = h->nextEntry;
} }
@@ -231,7 +231,7 @@ public:
{ {
if (entry->key == keyToRemove) if (entry->key == keyToRemove)
{ {
const CarlaScopedPointer<HashEntry> deleter (entry);
const ScopedPointer<HashEntry> deleter (entry);
entry = entry->nextEntry; entry = entry->nextEntry;
@@ -262,7 +262,7 @@ public:
{ {
if (entry->value == valueToRemove) if (entry->value == valueToRemove)
{ {
const CarlaScopedPointer<HashEntry> deleter (entry);
const ScopedPointer<HashEntry> deleter (entry);
entry = entry->nextEntry; entry = entry->nextEntry;


+ 4
- 4
source/modules/water/containers/OwnedArray.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -28,7 +28,7 @@
#include "ArrayAllocationBase.h" #include "ArrayAllocationBase.h"
#include "CarlaScopeUtils.hpp"
#include "distrho/extra/ScopedPointer.hpp"
namespace water { namespace water {
@@ -372,7 +372,7 @@ public:
{ {
if (indexToChange >= 0) if (indexToChange >= 0)
{ {
CarlaScopedPointer<ObjectClass> toDelete;
ScopedPointer<ObjectClass> toDelete;
{ {
if (indexToChange < numUsed) if (indexToChange < numUsed)
@@ -536,7 +536,7 @@ public:
*/ */
void remove (const size_t indexToRemove, bool deleteObject = true) void remove (const size_t indexToRemove, bool deleteObject = true)
{ {
CarlaScopedPointer<ObjectClass> toDelete;
ScopedPointer<ObjectClass> toDelete;
if (indexToRemove < numUsed) if (indexToRemove < numUsed)
{ {


+ 4
- 4
source/modules/water/files/DirectoryIterator.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2024 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -29,7 +29,7 @@
#include "File.h" #include "File.h"
#include "../text/StringArray.h" #include "../text/StringArray.h"
#include "CarlaScopeUtils.hpp"
#include "distrho/extra/ScopedPointer.hpp"
namespace water { namespace water {
@@ -123,7 +123,7 @@ private:
private: private:
friend class DirectoryIterator; friend class DirectoryIterator;
CarlaScopedPointer<Pimpl> pimpl;
ScopedPointer<Pimpl> pimpl;
CARLA_DECLARE_NON_COPYABLE (NativeIterator) CARLA_DECLARE_NON_COPYABLE (NativeIterator)
}; };
@@ -136,7 +136,7 @@ private:
const int whatToLookFor; const int whatToLookFor;
const bool isRecursive; const bool isRecursive;
bool hasBeenAdvanced; bool hasBeenAdvanced;
CarlaScopedPointer<DirectoryIterator> subIterator;
ScopedPointer<DirectoryIterator> subIterator;
File currentFile; File currentFile;
static StringArray parseWildcards (const String& pattern); static StringArray parseWildcards (const String& pattern);


+ 3
- 3
source/modules/water/files/File.cpp View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2024 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -714,7 +714,7 @@ File File::withFileExtension (const char* const newExtension) const
//============================================================================== //==============================================================================
FileInputStream* File::createInputStream() const FileInputStream* File::createInputStream() const
{ {
CarlaScopedPointer<FileInputStream> fin (new FileInputStream (*this));
ScopedPointer<FileInputStream> fin (new FileInputStream (*this));
if (fin->openedOk()) if (fin->openedOk())
return fin.release(); return fin.release();
@@ -724,7 +724,7 @@ FileInputStream* File::createInputStream() const
FileOutputStream* File::createOutputStream (const size_t bufferSize) const FileOutputStream* File::createOutputStream (const size_t bufferSize) const
{ {
CarlaScopedPointer<FileOutputStream> out (new FileOutputStream (*this, bufferSize));
ScopedPointer<FileOutputStream> out (new FileOutputStream (*this, bufferSize));
return out->failedToOpen() ? nullptr return out->failedToOpen() ? nullptr
: out.release(); : out.release();


+ 3
- 3
source/modules/water/memory/SharedResourcePointer.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2019 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -29,7 +29,7 @@
#include "ReferenceCountedObject.h" #include "ReferenceCountedObject.h"
#include "../threads/SpinLock.h" #include "../threads/SpinLock.h"
#include "CarlaScopeUtils.hpp"
#include "distrho/extra/ScopedPointer.hpp"
namespace water { namespace water {
@@ -144,7 +144,7 @@ private:
struct SharedObjectHolder : public ReferenceCountedObject struct SharedObjectHolder : public ReferenceCountedObject
{ {
SpinLock lock; SpinLock lock;
CarlaScopedPointer<SharedObjectType> sharedInstance;
ScopedPointer<SharedObjectType> sharedInstance;
int refCount; int refCount;
}; };


+ 3
- 3
source/modules/water/processors/AudioProcessorGraph.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2015 ROLI Ltd. Copyright (c) 2015 ROLI Ltd.
Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the GNU Permission is granted to use this software under the terms of the GNU
General Public License as published by the Free Software Foundation; General Public License as published by the Free Software Foundation;
@@ -112,7 +112,7 @@ public:
//============================================================================== //==============================================================================
friend class AudioProcessorGraph; friend class AudioProcessorGraph;
const CarlaScopedPointer<AudioProcessor> processor;
const ScopedPointer<AudioProcessor> processor;
bool isPrepared; bool isPrepared;
Node (uint32 nodeId, AudioProcessor*) noexcept; Node (uint32 nodeId, AudioProcessor*) noexcept;
@@ -405,7 +405,7 @@ private:
friend class AudioGraphIOProcessor; friend class AudioGraphIOProcessor;
struct AudioProcessorGraphBufferHelpers; struct AudioProcessorGraphBufferHelpers;
CarlaScopedPointer<AudioProcessorGraphBufferHelpers> audioAndCVBuffers;
ScopedPointer<AudioProcessorGraphBufferHelpers> audioAndCVBuffers;
MidiBuffer* currentMidiInputBuffer; MidiBuffer* currentMidiInputBuffer;
MidiBuffer currentMidiOutputBuffer; MidiBuffer currentMidiOutputBuffer;


+ 3
- 3
source/modules/water/threads/ChildProcess.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -28,7 +28,7 @@
#include "../text/StringArray.h" #include "../text/StringArray.h"
#include "CarlaScopeUtils.hpp"
#include "distrho/extra/ScopedPointer.hpp"
namespace water { namespace water {
@@ -103,7 +103,7 @@ public:
private: private:
//============================================================================== //==============================================================================
class ActiveProcess; class ActiveProcess;
CarlaScopedPointer<ActiveProcess> activeProcess;
ScopedPointer<ActiveProcess> activeProcess;
CARLA_DECLARE_NON_COPYABLE (ChildProcess) CARLA_DECLARE_NON_COPYABLE (ChildProcess)
}; };


+ 4
- 4
source/modules/water/xml/XmlDocument.cpp View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -121,7 +121,7 @@ XmlElement* XmlDocument::getDocumentElement (const bool onlyReadOuterDocumentEle
{ {
if (originalText.isEmpty() && inputSource != nullptr) if (originalText.isEmpty() && inputSource != nullptr)
{ {
CarlaScopedPointer<InputStream> in (inputSource->createInputStream());
ScopedPointer<InputStream> in (inputSource->createInputStream());
if (in != nullptr) if (in != nullptr)
{ {
@@ -160,7 +160,7 @@ String XmlDocument::getFileContents (const String& filename) const
{ {
if (inputSource != nullptr) if (inputSource != nullptr)
{ {
const CarlaScopedPointer<InputStream> in (inputSource->createInputStreamFor (filename.trim().unquoted()));
const ScopedPointer<InputStream> in (inputSource->createInputStreamFor (filename.trim().unquoted()));
if (in != nullptr) if (in != nullptr)
return in->readEntireStreamAsString(); return in->readEntireStreamAsString();
@@ -206,7 +206,7 @@ XmlElement* XmlDocument::parseDocumentElement (CharPointer_UTF8 textToParse,
{ {
lastError.clear(); lastError.clear();
CarlaScopedPointer<XmlElement> result (readNextElement (! onlyReadOuterDocumentElement));
ScopedPointer<XmlElement> result (readNextElement (! onlyReadOuterDocumentElement));
if (! errorOccurred) if (! errorOccurred)
return result.release(); return result.release();


+ 3
- 3
source/modules/water/xml/XmlDocument.h View File

@@ -3,7 +3,7 @@
This file is part of the Water library. This file is part of the Water library.
Copyright (c) 2016 ROLI Ltd. Copyright (c) 2016 ROLI Ltd.
Copyright (C) 2017-2022 Filipe Coelho <falktx@falktx.com>
Copyright (C) 2017-2025 Filipe Coelho <falktx@falktx.com>
Permission is granted to use this software under the terms of the ISC license Permission is granted to use this software under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license/ http://www.isc.org/downloads/software-support-policy/isc-license/
@@ -28,7 +28,7 @@
#include "../text/StringArray.h" #include "../text/StringArray.h"
#include "CarlaScopeUtils.hpp"
#include "distrho/extra/ScopedPointer.hpp"
namespace water { namespace water {
@@ -158,7 +158,7 @@ private:
String lastError, dtdText; String lastError, dtdText;
StringArray tokenisedDTD; StringArray tokenisedDTD;
bool needToLoadDTD, ignoreEmptyTextElements; bool needToLoadDTD, ignoreEmptyTextElements;
CarlaScopedPointer<FileInputSource> inputSource;
ScopedPointer<FileInputSource> inputSource;
XmlElement* parseDocumentElement (CharPointer_UTF8, bool outer); XmlElement* parseDocumentElement (CharPointer_UTF8, bool outer);
void setLastError (const String&, bool carryOn); void setLastError (const String&, bool carryOn);


+ 5
- 20
source/native-plugins/audio-file.cpp View File

@@ -1,22 +1,7 @@
/*
* Carla Native Plugins
* Copyright (C) 2013-2023 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaNativePrograms.hpp" #include "CarlaNativePrograms.hpp"
#include "CarlaString.hpp"


#include "audio-base.hpp" #include "audio-base.hpp"


@@ -522,7 +507,7 @@ protected:
{ {
fPendingFileReload = fPendingFileRead = false; fPendingFileReload = fPendingFileRead = false;


if (char* const filename = fFilename.releaseBufferPointer())
if (char* const filename = fFilename.getAndReleaseBuffer())
{ {
loadFilename(filename); loadFilename(filename);
std::free(filename); std::free(filename);
@@ -539,7 +524,7 @@ protected:
{ {
fVolumeFilter.setSampleRate(sampleRate); fVolumeFilter.setSampleRate(sampleRate);


if (char* const filename = fFilename.releaseBufferPointer())
if (char* const filename = fFilename.getAndReleaseBuffer())
{ {
loadFilename(filename); loadFilename(filename);
std::free(filename); std::free(filename);
@@ -679,7 +664,7 @@ private:
float fVolume = 1.f; float fVolume = 1.f;


AudioFileReader fReader; AudioFileReader fReader;
CarlaString fFilename;
String fFilename;


float fPreviewData[108] = {}; float fPreviewData[108] = {};




+ 3
- 17
source/native-plugins/midi-pattern.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla Native Plugins
* Copyright (C) 2012-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaNativeExtUI.hpp" #include "CarlaNativeExtUI.hpp"
#include "RtLinkedList.hpp" #include "RtLinkedList.hpp"
@@ -347,7 +333,7 @@ protected:
CARLA_SAFE_ASSERT_RETURN(writeMessage(strBuf),); CARLA_SAFE_ASSERT_RETURN(writeMessage(strBuf),);


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(strBuf, 0xff, "%.12g\n", beatsPerMinute); std::snprintf(strBuf, 0xff, "%.12g\n", beatsPerMinute);
} }




+ 24
- 43
source/plugin/carla-lv2-export.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla Native Plugins
* Copyright (C) 2013-2019 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#define CARLA_NATIVE_PLUGIN_LV2 #define CARLA_NATIVE_PLUGIN_LV2
#include "carla-base.cpp" #include "carla-base.cpp"
@@ -36,8 +22,7 @@
#include "lv2/lv2_external_ui.h" #include "lv2/lv2_external_ui.h"
#include "lv2/lv2_programs.h" #include "lv2/lv2_programs.h"


#include "CarlaString.hpp"

#include "distrho/extra/String.hpp"
#include "water/files/File.h" #include "water/files/File.h"
#include "water/text/StringArray.h" #include "water/text/StringArray.h"


@@ -51,18 +36,14 @@
# define PLUGIN_EXT ".so" # define PLUGIN_EXT ".so"
#endif #endif


using water::String;
using water::StringArray;
using water::water_uchar;

// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// Converts a parameter name to an LV2 compatible symbol // Converts a parameter name to an LV2 compatible symbol


static StringArray gUsedSymbols;
static water::StringArray gUsedSymbols;


static const String nameToSymbol(const String& name, const uint32_t portIndex)
static const water::String nameToSymbol(const water::String& name, const uint32_t portIndex)
{ {
String symbol, trimmedName = name.trim().toLowerCase();
water::String symbol, trimmedName = name.trim().toLowerCase();


if (trimmedName.isEmpty()) if (trimmedName.isEmpty())
{ {
@@ -76,7 +57,7 @@ static const String nameToSymbol(const String& name, const uint32_t portIndex)


for (int i=0; i < trimmedName.length(); ++i) for (int i=0; i < trimmedName.length(); ++i)
{ {
const water_uchar c = trimmedName[i];
const water::water_uchar c = trimmedName[i];


if (std::isalpha(static_cast<int>(c)) || std::isdigit(static_cast<int>(c))) if (std::isalpha(static_cast<int>(c)) || std::isdigit(static_cast<int>(c)))
symbol += c; symbol += c;
@@ -89,13 +70,13 @@ static const String nameToSymbol(const String& name, const uint32_t portIndex)
if (gUsedSymbols.contains(symbol)) if (gUsedSymbols.contains(symbol))
{ {
int offset = 2; int offset = 2;
String offsetStr = "_2";
water::String offsetStr = "_2";
symbol += offsetStr; symbol += offsetStr;


while (gUsedSymbols.contains(symbol)) while (gUsedSymbols.contains(symbol))
{ {
offset += 1; offset += 1;
String newOffsetStr = "_" + String(offset);
water::String newOffsetStr = "_" + water::String(offset);
symbol = symbol.replace(offsetStr, newOffsetStr); symbol = symbol.replace(offsetStr, newOffsetStr);
offsetStr = newOffsetStr; offsetStr = newOffsetStr;
} }
@@ -110,7 +91,7 @@ static const String nameToSymbol(const String& name, const uint32_t portIndex)


static void writeManifestFile(PluginListManager& plm, const uint32_t microVersion, const uint32_t minorVersion) static void writeManifestFile(PluginListManager& plm, const uint32_t microVersion, const uint32_t minorVersion)
{ {
String text;
water::String text;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Header // Header
@@ -240,11 +221,11 @@ static intptr_t host_dispatcher(NativeHostHandle, NativeHostDispatcherOpcode, in
static void writePluginFile(const NativePluginDescriptor* const pluginDesc, static void writePluginFile(const NativePluginDescriptor* const pluginDesc,
const uint32_t microVersion, const uint32_t minorVersion) const uint32_t microVersion, const uint32_t minorVersion)
{ {
const String pluginLabel(pluginDesc->label);
const String pluginFile("carla.lv2/" + pluginLabel + ".ttl");
const water::String pluginLabel(pluginDesc->label);
const water::String pluginFile("carla.lv2/" + pluginLabel + ".ttl");


uint32_t portIndex = 0; uint32_t portIndex = 0;
String text;
water::String text;


gUsedSymbols.clear(); gUsedSymbols.clear();


@@ -675,8 +656,8 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc,
for (uint32_t i=0; i < paramCount; ++i) for (uint32_t i=0; i < paramCount; ++i)
{ {
const NativeParameter* paramInfo(pluginDesc->get_parameter_info(pluginHandle, i)); const NativeParameter* paramInfo(pluginDesc->get_parameter_info(pluginHandle, i));
const String paramName(paramInfo->name != nullptr ? paramInfo->name : "");
const String paramUnit(paramInfo->unit != nullptr ? paramInfo->unit : "");
const water::String paramName(paramInfo->name != nullptr ? paramInfo->name : "");
const water::String paramUnit(paramInfo->unit != nullptr ? paramInfo->unit : "");


CARLA_SAFE_ASSERT_RETURN(paramInfo != nullptr,) CARLA_SAFE_ASSERT_RETURN(paramInfo != nullptr,)


@@ -688,19 +669,19 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc,
else else
text += " a lv2:InputPort, lv2:ControlPort ;\n"; text += " a lv2:InputPort, lv2:ControlPort ;\n";


text += " lv2:index " + String(portIndex++) + " ;\n";
text += " lv2:index " + water::String(portIndex++) + " ;\n";
text += " lv2:symbol \"" + nameToSymbol(paramName, i) + "\" ;\n"; text += " lv2:symbol \"" + nameToSymbol(paramName, i) + "\" ;\n";


if (paramName.isNotEmpty()) if (paramName.isNotEmpty())
text += " lv2:name \"" + paramName + "\" ;\n"; text += " lv2:name \"" + paramName + "\" ;\n";
else else
text += " lv2:name \"Port " + String(i+1) + "\" ;\n";
text += " lv2:name \"Port " + water::String(i+1) + "\" ;\n";


if ((paramInfo->hints & NATIVE_PARAMETER_IS_OUTPUT) == 0) if ((paramInfo->hints & NATIVE_PARAMETER_IS_OUTPUT) == 0)
text += " lv2:default " + String::formatted("%f", static_cast<double>(paramInfo->ranges.def)) + " ;\n";
text += " lv2:default " + water::String::formatted("%f", static_cast<double>(paramInfo->ranges.def)) + " ;\n";


text += " lv2:minimum " + String::formatted("%f", static_cast<double>(paramInfo->ranges.min)) + " ;\n";
text += " lv2:maximum " + String::formatted("%f", static_cast<double>(paramInfo->ranges.max)) + " ;\n";
text += " lv2:minimum " + water::String::formatted("%f", static_cast<double>(paramInfo->ranges.min)) + " ;\n";
text += " lv2:maximum " + water::String::formatted("%f", static_cast<double>(paramInfo->ranges.max)) + " ;\n";


if ((paramInfo->hints & NATIVE_PARAMETER_IS_AUTOMATABLE) == 0) if ((paramInfo->hints & NATIVE_PARAMETER_IS_AUTOMATABLE) == 0)
text += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ;\n"; text += " lv2:portProperty <" LV2_PORT_PROPS__expensive "> ;\n";
@@ -726,8 +707,8 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc,
else else
text += " [ "; text += " [ ";


text += "rdfs:label \"" + String(scalePoint->label) + "\" ;\n";
text += " rdf:value " + String::formatted("%f", static_cast<double>(scalePoint->value)) + " ";
text += "rdfs:label \"" + water::String(scalePoint->label) + "\" ;\n";
text += " rdf:value " + water::String::formatted("%f", static_cast<double>(scalePoint->value)) + " ";


if (j+1 == paramInfo->scalePointCount) if (j+1 == paramInfo->scalePointCount)
text += "] ;\n"; text += "] ;\n";
@@ -764,7 +745,7 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc,


text += " lv2:microVersion " + String(microVersion) + " ;\n"; text += " lv2:microVersion " + String(microVersion) + " ;\n";
text += " lv2:minorVersion " + String(minorVersion) + " ;\n"; text += " lv2:minorVersion " + String(minorVersion) + " ;\n";
text += " lv2:symbol \"" + CarlaString(pluginDesc->label).toBasic() + "\" .\n";
text += " lv2:symbol \"" + String(pluginDesc->label).toBasic() + "\" .\n";


#if 0 #if 0
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -777,7 +758,7 @@ static void writePluginFile(const NativePluginDescriptor* const pluginDesc,
const String presetsFile("carla.lv2/" + pluginLabel + "-presets.ttl"); const String presetsFile("carla.lv2/" + pluginLabel + "-presets.ttl");
std::fstream presetsStream(presetsFile.toRawUTF8(), std::ios::out); std::fstream presetsStream(presetsFile.toRawUTF8(), std::ios::out);


String presetId, presetText;
water::String presetId, presetText;


presetText += "@prefix lv2: <http://lv2plug.in/ns/lv2core#> .\n"; presetText += "@prefix lv2: <http://lv2plug.in/ns/lv2core#> .\n";
presetText += "@prefix pset: <http://lv2plug.in/ns/ext/presets#> .\n"; presetText += "@prefix pset: <http://lv2plug.in/ns/ext/presets#> .\n";


+ 5
- 18
source/plugin/carla-lv2-ui.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla Native Plugins
* Copyright (C) 2013-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef HAVE_PYQT #ifndef HAVE_PYQT
# error This file should not be built # error This file should not be built
@@ -21,7 +7,8 @@


#include "CarlaLv2Utils.hpp" #include "CarlaLv2Utils.hpp"
#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaScopeUtils.hpp"

#include "distrho/extra/ScopedSafeLocale.hpp"


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


@@ -138,7 +125,7 @@ public:
const float* const valuePtr = (const float*)buffer; const float* const valuePtr = (const float*)buffer;


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(msg, 127, "control %u %.12g", portIndex, static_cast<double>(*valuePtr)); std::snprintf(msg, 127, "control %u %.12g", portIndex, static_cast<double>(*valuePtr));
} }




+ 8
- 22
source/plugin/carla-lv2.cpp View File

@@ -1,19 +1,5 @@
/*
* Carla Native Plugins
* Copyright (C) 2013-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#define CARLA_NATIVE_PLUGIN_LV2 #define CARLA_NATIVE_PLUGIN_LV2
#include "carla-base.cpp" #include "carla-base.cpp"
@@ -21,8 +7,8 @@
#include "CarlaLv2Utils.hpp" #include "CarlaLv2Utils.hpp"
#include "CarlaMathUtils.hpp" #include "CarlaMathUtils.hpp"
#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaString.hpp"


#include "distrho/extra/String.hpp"
#include "water/files/File.h" #include "water/files/File.h"


static const char* const kPathForCarlaFiles = "carlafiles"; static const char* const kPathForCarlaFiles = "carlafiles";
@@ -566,7 +552,7 @@ public:
if (newpath == nullptr) if (newpath == nullptr)
return cleanupLastProjectPath(); return cleanupLastProjectPath();


fLastProjectPath = CarlaString(water::File(newpath).getParentDirectory().getFullPathName().toRawUTF8());
fLastProjectPath = String(water::File(newpath).getParentDirectory().getFullPathName().toRawUTF8());


if (freePath != nullptr && freePath->free_path != nullptr) if (freePath != nullptr && freePath->free_path != nullptr)
freePath->free_path(freePath->handle, newpath); freePath->free_path(freePath->handle, newpath);
@@ -765,7 +751,7 @@ public:
float value; float value;


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
value = static_cast<float>(std::atof(msgSplit+1)); value = static_cast<float>(std::atof(msgSplit+1));
} }


@@ -1169,8 +1155,8 @@ private:
uint32_t fMidiEventCount; uint32_t fMidiEventCount;
NativeMidiEvent fMidiEvents[kMaxMidiEvents]; NativeMidiEvent fMidiEvents[kMaxMidiEvents];


CarlaString fLastProjectPath;
CarlaString fLoadedFile;
String fLastProjectPath;
String fLoadedFile;
PreviewData fPreviewData; PreviewData fPreviewData;
volatile bool fNeedsNotifyFileChanged; volatile bool fNeedsNotifyFileChanged;
volatile int fPluginNeedsIdle; volatile int fPluginNeedsIdle;
@@ -1525,7 +1511,7 @@ const LV2_Descriptor* lv2_descriptor(uint32_t index)
const NativePluginDescriptor* const pluginDesc(plm.descs.getAt(index, nullptr)); const NativePluginDescriptor* const pluginDesc(plm.descs.getAt(index, nullptr));
CARLA_SAFE_ASSERT_RETURN(pluginDesc != nullptr, nullptr); CARLA_SAFE_ASSERT_RETURN(pluginDesc != nullptr, nullptr);


CarlaString tmpURI;
String tmpURI;
tmpURI = "http://kxstudio.sf.net/carla/plugins/"; tmpURI = "http://kxstudio.sf.net/carla/plugins/";
tmpURI += pluginDesc->label; tmpURI += pluginDesc->label;




+ 2
- 17
source/plugin/carla-native-plugin.cpp View File

@@ -1,25 +1,10 @@
/*
* Carla Plugin Host
* Copyright (C) 2011-2022 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaNativePlugin.h" #include "CarlaNativePlugin.h"
#include "CarlaHostImpl.hpp" #include "CarlaHostImpl.hpp"


#include "CarlaEngine.hpp" #include "CarlaEngine.hpp"
#include "CarlaString.hpp"


#include "water/files/File.h" #include "water/files/File.h"




+ 5
- 18
source/utils/CarlaBinaryUtils.hpp View File

@@ -1,25 +1,12 @@
/*
* Carla binary utils
* Copyright (C) 2014-2023 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_BINARY_UTILS_HPP_INCLUDED #ifndef CARLA_BINARY_UTILS_HPP_INCLUDED
#define CARLA_BINARY_UTILS_HPP_INCLUDED #define CARLA_BINARY_UTILS_HPP_INCLUDED


#include "CarlaBackend.h" #include "CarlaBackend.h"
#include "CarlaScopeUtils.hpp"

#include "distrho/extra/ScopedPointer.hpp"


#if defined(BUILDING_CARLA) #if defined(BUILDING_CARLA)
# include "water/files/FileInputStream.h" # include "water/files/FileInputStream.h"
@@ -140,7 +127,7 @@ BinaryType getBinaryTypeFromFile(const char* const filename)
using water::File; using water::File;
using water::FileInputStream; using water::FileInputStream;


CarlaScopedPointer<FileInputStream> stream(File(filename).createInputStream());
ScopedPointer<FileInputStream> stream(File(filename).createInputStream());
CARLA_SAFE_ASSERT_RETURN(stream != nullptr && ! stream->failedToOpen(), BINARY_NATIVE); CARLA_SAFE_ASSERT_RETURN(stream != nullptr && ! stream->failedToOpen(), BINARY_NATIVE);
#endif #endif




+ 9
- 22
source/utils/CarlaExternalUI.hpp View File

@@ -1,25 +1,12 @@
/*
* Carla External UI
* Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_EXTERNAL_UI_HPP_INCLUDED #ifndef CARLA_EXTERNAL_UI_HPP_INCLUDED
#define CARLA_EXTERNAL_UI_HPP_INCLUDED #define CARLA_EXTERNAL_UI_HPP_INCLUDED


#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaString.hpp"

#include "distrho/extra/String.hpp"


// ----------------------------------------------------------------------- // -----------------------------------------------------------------------


@@ -61,7 +48,7 @@ public:
void setData(const char* const filename, const double sampleRate, const char* const uiTitle) noexcept void setData(const char* const filename, const double sampleRate, const char* const uiTitle) noexcept
{ {
fFilename = filename; fFilename = filename;
fArg1 = CarlaString(sampleRate);
fArg1 = String(sampleRate);
fArg2 = uiTitle; fArg2 = uiTitle;
} }


@@ -92,10 +79,10 @@ protected:
} }


private: private:
CarlaString fFilename;
CarlaString fArg1;
CarlaString fArg2;
UiState fUiState;
String fFilename;
String fArg1;
String fArg2;
UiState fUiState;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaExternalUI) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaExternalUI)
}; };


+ 12
- 26
source/utils/CarlaJsfxUtils.hpp View File

@@ -1,27 +1,13 @@
/*
* Carla JSFX utils
* Copyright (C) 2021 Jean Pierre Cimalando
* Copyright (C) 2021-2024 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2021 Jean Pierre Cimalando
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#ifndef CARLA_JSFX_UTILS_HPP_INCLUDED #ifndef CARLA_JSFX_UTILS_HPP_INCLUDED
#define CARLA_JSFX_UTILS_HPP_INCLUDED #define CARLA_JSFX_UTILS_HPP_INCLUDED


#include "CarlaBackend.h" #include "CarlaBackend.h"
#include "CarlaString.hpp"


#include "distrho/extra/String.hpp"
#include "water/files/File.h" #include "water/files/File.h"


#ifdef YSFX_API #ifdef YSFX_API
@@ -127,9 +113,9 @@ struct CarlaJsfxCategories


class CarlaJsfxUnit class CarlaJsfxUnit
{ {
static CarlaString createFileId(const water::File& rootPath, const water::File& filePath)
static String createFileId(const water::File& rootPath, const water::File& filePath)
{ {
CarlaString fileId(filePath.getRelativePathFrom(rootPath).toRawUTF8());
String fileId(filePath.getRelativePathFrom(rootPath).toRawUTF8());
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
fileId.replace('\\', '/'); fileId.replace('\\', '/');
#endif #endif
@@ -152,25 +138,25 @@ public:
return fFileId.isNotEmpty(); return fFileId.isNotEmpty();
} }


const CarlaString& getFileId() const noexcept
const String& getFileId() const noexcept
{ {
return fFileId; return fFileId;
} }


const CarlaString& getFilePath() const noexcept
const String& getFilePath() const noexcept
{ {
return fFilePath; return fFilePath;
} }


const CarlaString& getRootPath() const noexcept
const String& getRootPath() const noexcept
{ {
return fRootPath; return fRootPath;
} }


private: private:
CarlaString fFileId;
CarlaString fFilePath;
CarlaString fRootPath;
String fFileId;
String fFilePath;
String fRootPath;
}; };


// -------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------


+ 0
- 1
source/utils/CarlaLogThread.hpp View File

@@ -5,7 +5,6 @@
#define CARLA_LOG_THREAD_HPP_INCLUDED #define CARLA_LOG_THREAD_HPP_INCLUDED


#include "CarlaBackend.h" #include "CarlaBackend.h"
#include "CarlaString.hpp"
#include "CarlaThread.hpp" #include "CarlaThread.hpp"


#include <fcntl.h> #include <fcntl.h>


+ 5
- 18
source/utils/CarlaMacUtils.cpp View File

@@ -1,26 +1,13 @@
/*
* Carla macOS utils
* Copyright (C) 2018-2023 Filipe Coelho <falktx@falktx.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* For a full copy of the GNU General Public License see the doc/GPL.txt file.
*/
// SPDX-FileCopyrightText: 2011-2025 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later


#include "CarlaDefines.h" #include "CarlaDefines.h"


#ifdef CARLA_OS_MAC #ifdef CARLA_OS_MAC


#include "CarlaMacUtils.hpp" #include "CarlaMacUtils.hpp"
#include "CarlaString.hpp"

#include "distrho/extra/String.hpp"


#include <sys/xattr.h> #include <sys/xattr.h>


@@ -65,7 +52,7 @@ const char* findBinaryInBundle(const char* const bundleDir)
const NSString* strRef = (NSString*)CFURLCopyFileSystemPath(absoluteURL, kCFURLPOSIXPathStyle); const NSString* strRef = (NSString*)CFURLCopyFileSystemPath(absoluteURL, kCFURLPOSIXPathStyle);
CARLA_SAFE_ASSERT_RETURN(strRef != nullptr, nullptr); CARLA_SAFE_ASSERT_RETURN(strRef != nullptr, nullptr);


static CarlaString ret;
static String ret;
ret = [strRef UTF8String]; ret = [strRef UTF8String];


CFRelease(absoluteURL); CFRelease(absoluteURL);


+ 16
- 15
source/utils/CarlaPipeUtils.cpp View File

@@ -3,10 +3,11 @@


#include "CarlaPipeUtils.hpp" #include "CarlaPipeUtils.hpp"
#include "CarlaProcessUtils.hpp" #include "CarlaProcessUtils.hpp"
#include "CarlaString.hpp"
#include "CarlaScopeUtils.hpp"
#include "CarlaMIDI.h" #include "CarlaMIDI.h"


#include "distrho/extra/Sleep.hpp" #include "distrho/extra/Sleep.hpp"
#include "distrho/extra/String.hpp"
#include "distrho/extra/Time.hpp" #include "distrho/extra/Time.hpp"


// needed for atom-util // needed for atom-util
@@ -328,14 +329,14 @@ bool startProcess(const char* const argv[], pid_t& pidinst) noexcept
case 0: { // child process case 0: { // child process
execvp(argv[0], const_cast<char* const*>(argv)); execvp(argv[0], const_cast<char* const*>(argv));


CarlaString error(std::strerror(errno));
String error(std::strerror(errno));
carla_stderr2("exec failed: %s", error.buffer()); carla_stderr2("exec failed: %s", error.buffer());


_exit(1); // this is not noexcept safe but doesn't matter anyway _exit(1); // this is not noexcept safe but doesn't matter anyway
} break; } break;


case -1: { // error case -1: { // error
CarlaString error(std::strerror(errno));
String error(std::strerror(errno));
carla_stderr2("vfork() failed: %s", error.buffer()); carla_stderr2("vfork() failed: %s", error.buffer());
} break; } break;
} }
@@ -401,7 +402,7 @@ bool waitForClientFirstMessage(const P& pipe, void* const ovRecv, void* const pr
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
carla_stderr("waitForClientFirstMessage() - read failed"); carla_stderr("waitForClientFirstMessage() - read failed");
#else #else
CarlaString error(std::strerror(errno));
String error(std::strerror(errno));
carla_stderr("waitForClientFirstMessage() - read failed: %s", error.buffer()); carla_stderr("waitForClientFirstMessage() - read failed: %s", error.buffer());
#endif #endif
} }
@@ -496,7 +497,7 @@ bool waitForChildToStop(const pid_t pid, const uint32_t timeOutMilliseconds, boo
} }
else else
{ {
CarlaString error(std::strerror(errno));
String error(std::strerror(errno));
carla_stderr("waitForChildToStop() - waitpid failed: %s", error.buffer()); carla_stderr("waitForChildToStop() - waitpid failed: %s", error.buffer());
return false; return false;
} }
@@ -552,7 +553,7 @@ void waitForChildToStopOrKillIt(pid_t& pid, const uint32_t timeOutMilliseconds)
} }
else else
{ {
CarlaString error(std::strerror(errno));
String error(std::strerror(errno));
carla_stderr("waitForChildToStopOrKillIt() - kill failed: %s", error.buffer()); carla_stderr("waitForChildToStopOrKillIt() - kill failed: %s", error.buffer());
} }
} }
@@ -594,8 +595,8 @@ struct CarlaPipeCommon::PrivateData {
CarlaMutex writeLock; CarlaMutex writeLock;


// temporary buffers for _readline() // temporary buffers for _readline()
mutable char tmpBuf[0xffff];
mutable CarlaString tmpStr;
mutable char tmpBuf[0xffff];
mutable String tmpStr;


PrivateData() noexcept PrivateData() noexcept
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
@@ -816,7 +817,7 @@ bool CarlaPipeCommon::readNextLineAsFloat(float& value) const noexcept
if (const char* const msg = _readlineblock(false)) if (const char* const msg = _readlineblock(false))
{ {
{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
value = static_cast<float>(std::atof(msg)); value = static_cast<float>(std::atof(msg));
} }
return true; return true;
@@ -832,7 +833,7 @@ bool CarlaPipeCommon::readNextLineAsDouble(double& value) const noexcept
if (const char* const msg = _readlineblock(false)) if (const char* const msg = _readlineblock(false))
{ {
{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
value = std::atof(msg); value = std::atof(msg);
} }
return true; return true;
@@ -1001,7 +1002,7 @@ bool CarlaPipeCommon::writeControlMessage(const uint32_t index, const float valu
return false; return false;


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(tmpBuf, 0xfe, "%.12g\n", static_cast<double>(value)); std::snprintf(tmpBuf, 0xfe, "%.12g\n", static_cast<double>(value));
} }


@@ -1156,7 +1157,7 @@ bool CarlaPipeCommon::writeLv2AtomMessage(const uint32_t index, const LV2_Atom*
tmpBuf[0xfe] = '\0'; tmpBuf[0xfe] = '\0';


const uint32_t atomTotalSize(lv2_atom_total_size(atom)); const uint32_t atomTotalSize(lv2_atom_total_size(atom));
CarlaString base64atom(CarlaString::asBase64(atom, atomTotalSize));
String base64atom(String::asBase64(atom, atomTotalSize));


const CarlaMutexLocker cml(pData->writeLock); const CarlaMutexLocker cml(pData->writeLock);


@@ -1200,7 +1201,7 @@ bool CarlaPipeCommon::writeLv2ParameterMessage(const char* const uri, const floa
return false; return false;


{ {
const CarlaScopedLocale csl;
const ScopedSafeLocale ssl;
std::snprintf(tmpBuf, 0xfe, "%.12g\n", static_cast<double>(value)); std::snprintf(tmpBuf, 0xfe, "%.12g\n", static_cast<double>(value));
} }


@@ -1328,7 +1329,7 @@ const char* CarlaPipeCommon::_readline(const bool allocReturn, const uint16_t si
if (allocReturn) if (allocReturn)
{ {
pData->tmpStr = pData->tmpBuf; pData->tmpStr = pData->tmpBuf;
return pData->tmpStr.releaseBufferPointer();
return pData->tmpStr.getAndReleaseBuffer();
} }


return pData->tmpBuf; return pData->tmpBuf;
@@ -1358,7 +1359,7 @@ const char* CarlaPipeCommon::_readline(const bool allocReturn, const uint16_t si
if (! allocReturn && ! tooBig) if (! allocReturn && ! tooBig)
return pData->tmpBuf; return pData->tmpBuf;


return allocReturn ? pData->tmpStr.releaseBufferPointer() : pData->tmpStr.buffer();
return allocReturn ? pData->tmpStr.getAndReleaseBuffer() : pData->tmpStr.buffer();
} }


const char* CarlaPipeCommon::_readlineblock(const bool allocReturn, const char* CarlaPipeCommon::_readlineblock(const bool allocReturn,


+ 3
- 3
source/utils/CarlaRunner.hpp View File

@@ -9,7 +9,7 @@
#ifndef CARLA_OS_WASM #ifndef CARLA_OS_WASM
# include "CarlaThread.hpp" # include "CarlaThread.hpp"
#else #else
# include "CarlaString.hpp"
# include "distrho/extra/String.hpp"
# include <emscripten/html5.h> # include <emscripten/html5.h>
#endif #endif


@@ -140,7 +140,7 @@ public:
* Returns the name of the runner. * Returns the name of the runner.
* This is the name that gets set in the constructor. * This is the name that gets set in the constructor.
*/ */
const CarlaString& getRunnerName() const noexcept
const String& getRunnerName() const noexcept
{ {
#ifndef CARLA_OS_WASM #ifndef CARLA_OS_WASM
return fRunnerThread.getThreadName(); return fRunnerThread.getThreadName();
@@ -194,7 +194,7 @@ private:


uint fTimeInterval; uint fTimeInterval;
#else #else
const CarlaString fRunnerName;
const String fRunnerName;
long fIntervalId; long fIntervalId;


void _runEntryPoint() noexcept void _runEntryPoint() noexcept


+ 0
- 238
source/utils/CarlaScopeUtils.hpp View File

@@ -93,244 +93,6 @@ private:
CARLA_PREVENT_HEAP_ALLOCATION CARLA_PREVENT_HEAP_ALLOCATION
}; };


// -----------------------------------------------------------------------
// CarlaScopedLocale class

class CarlaScopedLocale {
#ifdef CARLA_USE_NEWLOCALE
static constexpr locale_t kNullLocale = (locale_t)nullptr;
#endif

public:
CarlaScopedLocale() noexcept
#ifdef CARLA_USE_NEWLOCALE
: newloc(::newlocale(LC_NUMERIC_MASK, "C", kNullLocale)),
oldloc(newloc != kNullLocale ? ::uselocale(newloc) : kNullLocale) {}
#else
# ifdef CARLA_USE_CONFIGTHREADLOCALE
: oldthreadloc(_configthreadlocale(_ENABLE_PER_THREAD_LOCALE)),
# else
:
# endif
oldloc(carla_strdup_safe(::setlocale(LC_NUMERIC, nullptr)))
{
::setlocale(LC_NUMERIC, "C");
}
#endif

~CarlaScopedLocale() noexcept
{
#ifdef CARLA_USE_NEWLOCALE
if (oldloc != kNullLocale)
::uselocale(oldloc);
if (newloc != kNullLocale)
::freelocale(newloc);
#else // CARLA_USE_NEWLOCALE
if (oldloc != nullptr)
{
::setlocale(LC_NUMERIC, oldloc);
delete[] oldloc;
}

# ifdef CARLA_USE_CONFIGTHREADLOCALE
if (oldthreadloc != -1)
_configthreadlocale(oldthreadloc);
# endif
#endif // CARLA_USE_NEWLOCALE
}

private:
#ifdef CARLA_USE_NEWLOCALE
locale_t newloc, oldloc;
#else
# ifdef CARLA_USE_CONFIGTHREADLOCALE
const int oldthreadloc;
# endif
const char* const oldloc;
#endif

CARLA_DECLARE_NON_COPYABLE(CarlaScopedLocale)
CARLA_PREVENT_HEAP_ALLOCATION
};

//=====================================================================================================================
/**
This class holds a pointer which is automatically deleted when this object goes
out of scope.

Once a pointer has been passed to a CarlaScopedPointer, it will make sure that the pointer
gets deleted when the CarlaScopedPointer is deleted. Using the CarlaScopedPointer on the stack or
as member variables is a good way to use RAII to avoid accidentally leaking dynamically
created objects.

A CarlaScopedPointer can be used in pretty much the same way that you'd use a normal pointer
to an object. If you use the assignment operator to assign a different object to a
CarlaScopedPointer, the old one will be automatically deleted.

A const CarlaScopedPointer is guaranteed not to lose ownership of its object or change the
object to which it points during its lifetime. This means that making a copy of a const
CarlaScopedPointer is impossible, as that would involve the new copy taking ownership from the
old one.

If you need to get a pointer out of a CarlaScopedPointer without it being deleted, you
can use the release() method.

Something to note is the main difference between this class and the std::auto_ptr class,
which is that CarlaScopedPointer provides a cast-to-object operator, whereas std::auto_ptr
requires that you always call get() to retrieve the pointer. The advantages of providing
the cast is that you don't need to call get(), so can use the CarlaScopedPointer in pretty much
exactly the same way as a raw pointer. The disadvantage is that the compiler is free to
use the cast in unexpected and sometimes dangerous ways - in particular, it becomes difficult
to return a CarlaScopedPointer as the result of a function. To avoid this causing errors,
CarlaScopedPointer contains an overloaded constructor that should cause a syntax error in these
circumstances, but it does mean that instead of returning a CarlaScopedPointer from a function,
you'd need to return a raw pointer (or use a std::auto_ptr instead).
*/
template<class ObjectType>
class CarlaScopedPointer
{
public:
//=================================================================================================================
/** Creates a CarlaScopedPointer containing a null pointer. */
CarlaScopedPointer() noexcept
: object(nullptr) {}

/** Creates a CarlaScopedPointer that owns the specified object. */
CarlaScopedPointer(ObjectType* const objectToTakePossessionOf) noexcept
: object(objectToTakePossessionOf) {}

/** Creates a CarlaScopedPointer that takes its pointer from another CarlaScopedPointer.

Because a pointer can only belong to one CarlaScopedPointer, this transfers
the pointer from the other object to this one, and the other object is reset to
be a null pointer.
*/
CarlaScopedPointer(CarlaScopedPointer& objectToTransferFrom) noexcept
: object(objectToTransferFrom.object)
{
objectToTransferFrom.object = nullptr;
}

/** Destructor.
This will delete the object that this CarlaScopedPointer currently refers to.
*/
~CarlaScopedPointer()
{
delete object;
}

/** Changes this CarlaScopedPointer to point to a new object.

Because a pointer can only belong to one CarlaScopedPointer, this transfers
the pointer from the other object to this one, and the other object is reset to
be a null pointer.

If this CarlaScopedPointer already points to an object, that object
will first be deleted.
*/
CarlaScopedPointer& operator=(CarlaScopedPointer& objectToTransferFrom)
{
if (this != objectToTransferFrom.getAddress())
{
// Two CarlaScopedPointers should never be able to refer to the same object - if
// this happens, you must have done something dodgy!
CARLA_SAFE_ASSERT_RETURN(object == nullptr || object != objectToTransferFrom.object, *this);

ObjectType* const oldObject = object;
object = objectToTransferFrom.object;
objectToTransferFrom.object = nullptr;
delete oldObject;
}

return *this;
}

/** Changes this CarlaScopedPointer to point to a new object.

If this CarlaScopedPointer already points to an object, that object
will first be deleted.

The pointer that you pass in may be a nullptr.
*/
CarlaScopedPointer& operator=(ObjectType* const newObjectToTakePossessionOf)
{
if (object != newObjectToTakePossessionOf)
{
ObjectType* const oldObject = object;
object = newObjectToTakePossessionOf;
delete oldObject;
}

return *this;
}

//=================================================================================================================
/** Returns the object that this CarlaScopedPointer refers to. */
operator ObjectType*() const noexcept { return object; }

/** Returns the object that this CarlaScopedPointer refers to. */
ObjectType* get() const noexcept { return object; }

/** Returns the object that this CarlaScopedPointer refers to. */
ObjectType& operator*() const noexcept { return *object; }

/** Lets you access methods and properties of the object that this CarlaScopedPointer refers to. */
ObjectType* operator->() const noexcept { return object; }

//=================================================================================================================
/** Removes the current object from this CarlaScopedPointer without deleting it.
This will return the current object, and set the CarlaScopedPointer to a null pointer.
*/
ObjectType* release() noexcept { ObjectType* const o = object; object = nullptr; return o; }

//=================================================================================================================
/** Swaps this object with that of another CarlaScopedPointer.
The two objects simply exchange their pointers.
*/
void swapWith(CarlaScopedPointer<ObjectType>& other) noexcept
{
// Two CarlaScopedPointers should never be able to refer to the same object - if
// this happens, you must have done something dodgy!
CARLA_SAFE_ASSERT_RETURN(object != other.object || this == other.getAddress() || object == nullptr,);

std::swap(object, other.object);
}

private:
//=================================================================================================================
ObjectType* object;

// (Required as an alternative to the overloaded & operator).
const CarlaScopedPointer* getAddress() const noexcept { return this; }

#ifdef CARLA_PROPER_CPP11_SUPPORT
CarlaScopedPointer(const CarlaScopedPointer&) = delete;
CarlaScopedPointer& operator=(const CarlaScopedPointer&) = delete;
#else
CarlaScopedPointer(const CarlaScopedPointer&);
CarlaScopedPointer& operator=(const CarlaScopedPointer&);
#endif
};

//=====================================================================================================================
/** Compares a CarlaScopedPointer with another pointer.
This can be handy for checking whether this is a null pointer.
*/
template<class ObjectType>
bool operator==(const CarlaScopedPointer<ObjectType>& pointer1, ObjectType* const pointer2) noexcept
{
return static_cast<ObjectType*>(pointer1) == pointer2;
}

/** Compares a CarlaScopedPointer with another pointer.
This can be handy for checking whether this is a null pointer.
*/
template<class ObjectType>
bool operator!=(const CarlaScopedPointer<ObjectType>& pointer1, ObjectType* const pointer2) noexcept
{
return static_cast<ObjectType*>(pointer1) != pointer2;
}

//===================================================================================================================== //=====================================================================================================================
/** /**
Helper class providing an RAII-based mechanism for temporarily setting and Helper class providing an RAII-based mechanism for temporarily setting and


+ 0
- 923
source/utils/CarlaString.hpp View File

@@ -1,923 +0,0 @@
// SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
// SPDX-License-Identifier: GPL-2.0-or-later

#ifndef CARLA_STRING_HPP_INCLUDED
#define CARLA_STRING_HPP_INCLUDED

#include "CarlaMathUtils.hpp"
#include "CarlaScopeUtils.hpp"

#include <algorithm>

// -----------------------------------------------------------------------
// CarlaString class

class CARLA_API CarlaString
{
public:
// -------------------------------------------------------------------
// constructors (no explicit conversions allowed)

/*
* Empty string.
*/
explicit CarlaString() noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false) {}

/*
* Simple character.
*/
explicit CarlaString(const char c) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char ch[2];
ch[0] = c;
ch[1] = '\0';

_dup(ch);
}

/*
* Simple char string.
*/
explicit CarlaString(char* const strBuf, const bool reallocData = true) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
if (reallocData || strBuf == nullptr)
{
_dup(strBuf);
}
else
{
fBuffer = strBuf;
fBufferLen = std::strlen(strBuf);
fBufferAlloc = true;
}
}

/*
* Simple const char string.
*/
explicit CarlaString(const char* const strBuf) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
_dup(strBuf);
}

/*
* Integer.
*/
explicit CarlaString(const int value) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];
std::snprintf(strBuf, 0xff, "%d", value);
strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Unsigned integer, possibly in hexadecimal.
*/
explicit CarlaString(const unsigned int value, const bool hexadecimal = false) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];
std::snprintf(strBuf, 0xff, hexadecimal ? "0x%x" : "%u", value);
strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Long integer.
*/
explicit CarlaString(const long value) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];
std::snprintf(strBuf, 0xff, "%ld", value);
strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Long unsigned integer, possibly hexadecimal.
*/
explicit CarlaString(const unsigned long value, const bool hexadecimal = false) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];
std::snprintf(strBuf, 0xff, hexadecimal ? "0x%lx" : "%lu", value);
strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Long long integer.
*/
explicit CarlaString(const long long value) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];
std::snprintf(strBuf, 0xff, "%lld", value);
strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Long long unsigned integer, possibly hexadecimal.
*/
explicit CarlaString(const unsigned long long value, const bool hexadecimal = false) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];
std::snprintf(strBuf, 0xff, hexadecimal ? "0x%llx" : "%llu", value);
strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Single-precision floating point number.
*/
explicit CarlaString(const float value) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];

{
const CarlaScopedLocale csl;
std::snprintf(strBuf, 0xff, "%.12g", static_cast<double>(value));
}

strBuf[0xff] = '\0';

_dup(strBuf);
}

/*
* Double-precision floating point number.
*/
explicit CarlaString(const double value) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
char strBuf[0xff+1];

{
const CarlaScopedLocale csl;
std::snprintf(strBuf, 0xff, "%.24g", value);
}

strBuf[0xff] = '\0';

_dup(strBuf);
}

// -------------------------------------------------------------------
// non-explicit constructor

/*
* Create string from another string.
*/
CarlaString(const CarlaString& str) noexcept
: fBuffer(_null()),
fBufferLen(0),
fBufferAlloc(false)
{
_dup(str.fBuffer);
}

// -------------------------------------------------------------------
// destructor

/*
* Destructor.
*/
~CarlaString() noexcept
{
CARLA_SAFE_ASSERT_RETURN(fBuffer != nullptr,);

if (fBufferAlloc)
std::free(fBuffer);

fBuffer = nullptr;
fBufferLen = 0;
fBufferAlloc = false;
}

// -------------------------------------------------------------------
// public methods

/*
* Get length of the string.
*/
std::size_t length() const noexcept
{
return fBufferLen;
}

/*
* Check if the string is empty.
*/
bool isEmpty() const noexcept
{
return (fBufferLen == 0);
}

/*
* Check if the string is not empty.
*/
bool isNotEmpty() const noexcept
{
return (fBufferLen != 0);
}

/*
* Check if the string contains a specific character, case-sensitive.
*/
bool contains(const char c) const noexcept
{
for (std::size_t i=0; i<fBufferLen; ++i)
{
if (fBuffer[i] == c)
return true;
}

return false;
}

/*
* Check if the string contains another string, optionally ignoring case.
*/
bool contains(const char* const strBuf, const bool ignoreCase = false) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(strBuf != nullptr, false);

if (ignoreCase)
return carla_strcasestr(fBuffer, strBuf) != nullptr;

return std::strstr(fBuffer, strBuf) != nullptr;
}

/*
* Check if character at 'pos' is a digit.
*/
bool isDigit(const std::size_t pos) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(pos < fBufferLen, false);

return (fBuffer[pos] >= '0' && fBuffer[pos] <= '9');
}

/*
* Check if the string starts with the character 'c'.
*/
bool startsWith(const char c) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(c != '\0', false);

return (fBufferLen > 0 && fBuffer[0] == c);
}

/*
* Check if the string starts with the string 'prefix'.
*/
bool startsWith(const char* const prefix) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(prefix != nullptr, false);

const std::size_t prefixLen(std::strlen(prefix));

if (fBufferLen < prefixLen)
return false;

return (std::strncmp(fBuffer, prefix, prefixLen) == 0);
}

/*
* Check if the string ends with the character 'c'.
*/
bool endsWith(const char c) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(c != '\0', false);

return (fBufferLen > 0 && fBuffer[fBufferLen-1] == c);
}

/*
* Check if the string ends with the string 'suffix'.
*/
bool endsWith(const char* const suffix) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(suffix != nullptr, false);

const std::size_t suffixLen(std::strlen(suffix));

if (fBufferLen < suffixLen)
return false;

return (std::strncmp(fBuffer + (fBufferLen-suffixLen), suffix, suffixLen) == 0);
}

/*
* Find the first occurrence of character 'c' in the string.
* Returns "length()" if the character is not found.
*/
std::size_t find(const char c, bool* const found = nullptr) const noexcept
{
if (fBufferLen == 0 || c == '\0')
{
if (found != nullptr)
*found = false;
return fBufferLen;
}

for (std::size_t i=0; i < fBufferLen; ++i)
{
if (fBuffer[i] == c)
{
if (found != nullptr)
*found = true;
return i;
}
}

if (found != nullptr)
*found = false;
return fBufferLen;
}

/*
* Find the first occurrence of string 'strBuf' in the string.
* Returns "length()" if the string is not found.
*/
std::size_t find(const char* const strBuf, bool* const found = nullptr) const noexcept
{
if (fBufferLen == 0 || strBuf == nullptr || strBuf[0] == '\0')
{
if (found != nullptr)
*found = false;
return fBufferLen;
}

if (char* const subStrBuf = std::strstr(fBuffer, strBuf))
{
const ssize_t ret = subStrBuf - fBuffer;

if (ret < 0)
{
// should never happen!
carla_safe_assert_int("ret >= 0", __FILE__, __LINE__, int(ret));

if (found != nullptr)
*found = false;
return fBufferLen;
}

if (found != nullptr)
*found = true;
return static_cast<std::size_t>(ret);
}

if (found != nullptr)
*found = false;
return fBufferLen;
}

/*
* Find the last occurrence of character 'c' in the string.
* Returns "length()" if the character is not found.
*/
std::size_t rfind(const char c, bool* const found = nullptr) const noexcept
{
if (fBufferLen == 0 || c == '\0')
{
if (found != nullptr)
*found = false;
return fBufferLen;
}

for (std::size_t i=fBufferLen; i > 0; --i)
{
if (fBuffer[i-1] == c)
{
if (found != nullptr)
*found = true;
return i-1;
}
}

if (found != nullptr)
*found = false;
return fBufferLen;
}

/*
* Find the last occurrence of string 'strBuf' in the string.
* Returns "length()" if the string is not found.
*/
std::size_t rfind(const char* const strBuf, bool* const found = nullptr) const noexcept
{
if (found != nullptr)
*found = false;

if (fBufferLen == 0 || strBuf == nullptr || strBuf[0] == '\0')
return fBufferLen;

const std::size_t strBufLen(std::strlen(strBuf));

std::size_t ret = fBufferLen;
const char* tmpBuf = fBuffer;

for (std::size_t i=0; i < fBufferLen; ++i)
{
if (std::strstr(tmpBuf+1, strBuf) == nullptr && std::strncmp(tmpBuf, strBuf, strBufLen) == 0)
{
if (found != nullptr)
*found = true;
break;
}

--ret;
++tmpBuf;
}

return fBufferLen-ret;
}

/*
* Clear the string.
*/
void clear() noexcept
{
truncate(0);
}

/*
* Replace all occurrences of character 'before' with character 'after'.
*/
CarlaString& replace(const char before, const char after) noexcept
{
CARLA_SAFE_ASSERT_RETURN(before != '\0' && after != '\0', *this);

for (std::size_t i=0; i < fBufferLen; ++i)
{
if (fBuffer[i] == before)
fBuffer[i] = after;
}

return *this;
}

/*
* Truncate the string to size 'n'.
*/
CarlaString& truncate(const std::size_t n) noexcept
{
if (n >= fBufferLen)
return *this;

fBuffer[n] = '\0';
fBufferLen = n;

return *this;
}

/*
* Convert all non-basic characters to '_'.
*/
CarlaString& toBasic() noexcept
{
for (std::size_t i=0; i < fBufferLen; ++i)
{
if (fBuffer[i] >= '0' && fBuffer[i] <= '9')
continue;
if (fBuffer[i] >= 'A' && fBuffer[i] <= 'Z')
continue;
if (fBuffer[i] >= 'a' && fBuffer[i] <= 'z')
continue;
if (fBuffer[i] == '_')
continue;

fBuffer[i] = '_';
}

return *this;
}

/*
* Convert all ascii characters to lowercase.
*/
CarlaString& toLower() noexcept
{
static const char kCharDiff('a' - 'A');

for (std::size_t i=0; i < fBufferLen; ++i)
{
if (fBuffer[i] >= 'A' && fBuffer[i] <= 'Z')
fBuffer[i] = static_cast<char>(fBuffer[i] + kCharDiff);
}

return *this;
}

/*
* Convert all ascii characters to uppercase.
*/
CarlaString& toUpper() noexcept
{
static const char kCharDiff('a' - 'A');

for (std::size_t i=0; i < fBufferLen; ++i)
{
if (fBuffer[i] >= 'a' && fBuffer[i] <= 'z')
fBuffer[i] = static_cast<char>(fBuffer[i] - kCharDiff);
}

return *this;
}

/*
* Direct access to the string buffer (read-only).
*/
const char* buffer() const noexcept
{
return fBuffer;
}

/*
* Return a duplicate string buffer.
* May throw.
*/
const char* dup() const
{
return carla_strdup(fBuffer);
}

/*
* Return a duplicate string buffer or null.
*/
const char* dupSafe() const noexcept
{
return carla_strdup_safe(fBuffer);
}

/*
* Release the buffer pointer while clearing this string.
* This allows to keep a pointer to the buffer after this object is deleted.
*/
char* releaseBufferPointer() noexcept
{
char* ret = fBufferLen > 0 ? fBuffer : nullptr;
fBuffer = _null();
fBufferLen = 0;
fBufferAlloc = false;
return ret;
}

// -------------------------------------------------------------------
// base64 stuff, based on http://www.adp-gmbh.ch/cpp/common/base64.html
// Copyright (C) 2004-2008 René Nyffenegger

static CarlaString asBase64(const void* const data, const std::size_t dataSize)
{
static const char* const kBase64Chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";

static constexpr const std::size_t kTmpBufSize = 65536U;

const uchar* bytesToEncode((const uchar*)data);

uint i=0, j=0;
uint charArray3[3], charArray4[4];

char strBuf[kTmpBufSize+1];
strBuf[kTmpBufSize] = '\0';
std::size_t strBufIndex = 0;

CarlaString ret;

for (std::size_t s=0; s<dataSize; ++s)
{
charArray3[i++] = *(bytesToEncode++);

if (i == 3)
{
charArray4[0] = (charArray3[0] & 0xfc) >> 2;
charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
charArray4[3] = charArray3[2] & 0x3f;

for (i=0; i<4; ++i)
strBuf[strBufIndex++] = kBase64Chars[charArray4[i]];

if (strBufIndex >= kTmpBufSize-7)
{
strBuf[strBufIndex] = '\0';
strBufIndex = 0;
ret += strBuf;
}

i = 0;
}
}

if (i != 0)
{
for (j=i; j<3; ++j)
charArray3[j] = '\0';

charArray4[0] = (charArray3[0] & 0xfc) >> 2;
charArray4[1] = ((charArray3[0] & 0x03) << 4) + ((charArray3[1] & 0xf0) >> 4);
charArray4[2] = ((charArray3[1] & 0x0f) << 2) + ((charArray3[2] & 0xc0) >> 6);
charArray4[3] = charArray3[2] & 0x3f;

for (j=0; j<4 && i<3 && j<i+1; ++j)
strBuf[strBufIndex++] = kBase64Chars[charArray4[j]];

for (; i++ < 3;)
strBuf[strBufIndex++] = '=';
}

if (strBufIndex != 0)
{
strBuf[strBufIndex] = '\0';
ret += strBuf;
}

return ret;
}

// -------------------------------------------------------------------
// public operators

operator const char*() const noexcept
{
return fBuffer;
}

char operator[](const std::size_t pos) const noexcept
{
if (pos < fBufferLen)
return fBuffer[pos];

carla_safe_assert("pos < fBufferLen", __FILE__, __LINE__);

static char fallback = '\0';
return fallback;
}

char& operator[](const std::size_t pos) noexcept
{
if (pos < fBufferLen)
return fBuffer[pos];

carla_safe_assert("pos < fBufferLen", __FILE__, __LINE__);

static char fallback = '\0';
return fallback;
}

bool operator==(const char* const strBuf) const noexcept
{
return (strBuf != nullptr && std::strcmp(fBuffer, strBuf) == 0);
}

bool operator==(const CarlaString& str) const noexcept
{
return operator==(str.fBuffer);
}

bool operator!=(const char* const strBuf) const noexcept
{
return !operator==(strBuf);
}

bool operator!=(const CarlaString& str) const noexcept
{
return !operator==(str.fBuffer);
}

CarlaString& operator=(const char* const strBuf) noexcept
{
_dup(strBuf);

return *this;
}

CarlaString& operator=(const CarlaString& str) noexcept
{
_dup(str.fBuffer);

return *this;
}

CarlaString& operator+=(const char* const strBuf) noexcept
{
if (strBuf == nullptr || strBuf[0] == '\0')
return *this;

const std::size_t strBufLen = std::strlen(strBuf);

// for empty strings, we can just take the appended string as our entire data
if (isEmpty())
{
_dup(strBuf, strBufLen);
return *this;
}

// we have some data ourselves, reallocate to add the new stuff
char* const newBuf = (char*)realloc(fBufferAlloc ? fBuffer : nullptr, fBufferLen + strBufLen + 1);
CARLA_SAFE_ASSERT_RETURN(newBuf != nullptr, *this);

std::memcpy(newBuf + fBufferLen, strBuf, strBufLen + 1);

fBuffer = newBuf;
fBufferLen += strBufLen;
fBufferAlloc = true;

return *this;
}

CarlaString& operator+=(const CarlaString& str) noexcept
{
return operator+=(str.fBuffer);
}

CarlaString operator+(const char* const strBuf) noexcept
{
if (strBuf == nullptr || strBuf[0] == '\0')
return *this;
if (isEmpty())
return CarlaString(strBuf);

const std::size_t strBufLen = std::strlen(strBuf);
const std::size_t newBufSize = fBufferLen + strBufLen;
char* const newBuf = (char*)std::malloc(newBufSize + 1);
CARLA_SAFE_ASSERT_RETURN(newBuf != nullptr, CarlaString());

std::memcpy(newBuf, fBuffer, fBufferLen);
std::memcpy(newBuf + fBufferLen, strBuf, strBufLen + 1);

return CarlaString(newBuf, false);
}

CarlaString operator+(const CarlaString& str) noexcept
{
return operator+(str.fBuffer);
}

// needed for std::map compatibility
bool operator<(const CarlaString& str) const noexcept
{
return std::strcmp(fBuffer, str.fBuffer) < 0;
}

// -------------------------------------------------------------------

private:
char* fBuffer; // the actual string buffer
std::size_t fBufferLen; // string length
bool fBufferAlloc; // wherever the buffer is allocated, not using _null()

/*
* Static null string.
* Prevents allocation for new and/or empty strings.
*/
static char* _null() noexcept
{
static char sNull = '\0';
return &sNull;
}

/*
* Helper function.
* Called whenever the string needs to be allocated.
*
* Notes:
* - Allocates string only if 'strBuf' is not null and new string contents are different
* - If 'strBuf' is null, 'size' must be 0
*/
void _dup(const char* const strBuf, const std::size_t size = 0) noexcept
{
if (strBuf != nullptr)
{
// don't recreate string if contents match
if (std::strcmp(fBuffer, strBuf) == 0)
return;

if (fBufferAlloc)
std::free(fBuffer);

fBufferLen = (size > 0) ? size : std::strlen(strBuf);
fBuffer = (char*)std::malloc(fBufferLen+1);

if (fBuffer == nullptr)
{
fBuffer = _null();
fBufferLen = 0;
fBufferAlloc = false;
return;
}

fBufferAlloc = true;

std::strcpy(fBuffer, strBuf);
fBuffer[fBufferLen] = '\0';
}
else
{
CARLA_SAFE_ASSERT_UINT(size == 0, static_cast<uint>(size));

// don't recreate null string
if (! fBufferAlloc)
return;

CARLA_SAFE_ASSERT(fBuffer != nullptr);
std::free(fBuffer);

fBuffer = _null();
fBufferLen = 0;
fBufferAlloc = false;
}
}

CARLA_PREVENT_HEAP_ALLOCATION
};

// -----------------------------------------------------------------------

static inline
CarlaString operator+(const CarlaString& strBefore, const char* const strBufAfter) noexcept
{
if (strBufAfter == nullptr || strBufAfter[0] == '\0')
return strBefore;
if (strBefore.isEmpty())
return CarlaString(strBufAfter);

const std::size_t strBeforeLen = strBefore.length();
const std::size_t strBufAfterLen = std::strlen(strBufAfter);
const std::size_t newBufSize = strBeforeLen + strBufAfterLen;
char* const newBuf = (char*)std::malloc(newBufSize + 1);
CARLA_SAFE_ASSERT_RETURN(newBuf != nullptr, CarlaString());

std::memcpy(newBuf, strBefore.buffer(), strBeforeLen);
std::memcpy(newBuf + strBeforeLen, strBufAfter, strBufAfterLen + 1);

return CarlaString(newBuf, false);
}

static inline
CarlaString operator+(const char* const strBufBefore, const CarlaString& strAfter) noexcept
{
if (strAfter.isEmpty())
return CarlaString(strBufBefore);
if (strBufBefore == nullptr || strBufBefore[0] == '\0')
return strAfter;

const std::size_t strBufBeforeLen = std::strlen(strBufBefore);
const std::size_t strAfterLen = strAfter.length();
const std::size_t newBufSize = strBufBeforeLen + strAfterLen;
char* const newBuf = (char*)std::malloc(newBufSize + 1);
CARLA_SAFE_ASSERT_RETURN(newBuf != nullptr, CarlaString());

std::memcpy(newBuf, strBufBefore, strBufBeforeLen);
std::memcpy(newBuf + strBufBeforeLen, strAfter.buffer(), strAfterLen + 1);

return CarlaString(newBuf, false);
}

// -----------------------------------------------------------------------

#endif // CARLA_STRING_HPP_INCLUDED

+ 3
- 3
source/utils/CarlaThread.hpp View File

@@ -5,9 +5,9 @@
#define CARLA_THREAD_HPP_INCLUDED #define CARLA_THREAD_HPP_INCLUDED


#include "CarlaMutex.hpp" #include "CarlaMutex.hpp"
#include "CarlaString.hpp"
#include "CarlaProcessUtils.hpp" #include "CarlaProcessUtils.hpp"
#include "distrho/extra/Sleep.hpp" #include "distrho/extra/Sleep.hpp"
#include "distrho/extra/String.hpp"


#ifdef CARLA_OS_WASM #ifdef CARLA_OS_WASM
# error Threads do not work under wasm! # error Threads do not work under wasm!
@@ -213,7 +213,7 @@ public:
* Returns the name of the thread. * Returns the name of the thread.
* This is the name that gets set in the constructor. * This is the name that gets set in the constructor.
*/ */
const CarlaString& getThreadName() const noexcept
const String& getThreadName() const noexcept
{ {
return fName; return fName;
} }
@@ -249,7 +249,7 @@ public:
private: private:
CarlaMutex fLock; // Thread lock CarlaMutex fLock; // Thread lock
CarlaSignal fSignal; // Thread start wait signal CarlaSignal fSignal; // Thread start wait signal
const CarlaString fName; // Thread name
const String fName; // Thread name
volatile pthread_t fHandle; // Handle for this thread volatile pthread_t fHandle; // Handle for this thread
volatile bool fShouldExit; // true if thread should exit volatile bool fShouldExit; // true if thread should exit




Loading…
Cancel
Save