Browse Source

Optimize pipe reads, by reducing allocations

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.1-rc2
falkTX 5 years ago
parent
commit
9a6c17dc56
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
9 changed files with 160 additions and 171 deletions
  1. +15
    -33
      source/backend/engine/CarlaEngineNative.cpp
  2. +2
    -4
      source/backend/plugin/CarlaPluginLV2.cpp
  3. +1
    -1
      source/backend/utils/PipeClient.cpp
  4. +6
    -11
      source/bridges-ui/CarlaBridgeFormat.cpp
  5. +21
    -21
      source/frontend/carla-plugin
  6. +3
    -3
      source/frontend/externalui.py
  7. +2
    -3
      source/includes/CarlaNativeExtUI.hpp
  8. +90
    -75
      source/utils/CarlaPipeUtils.cpp
  9. +20
    -20
      source/utils/CarlaPipeUtils.hpp

+ 15
- 33
source/backend/engine/CarlaEngineNative.cpp View File

@@ -1725,7 +1725,7 @@ private:


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


bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
bool CarlaEngineNativeUI::msgReceived(const char* const msg) noexcept
{ {
if (CarlaExternalUI::msgReceived(msg)) if (CarlaExternalUI::msgReceived(msg))
return true; return true;
@@ -1740,14 +1740,11 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(option), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(option), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(value), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsInt(value), true);
readNextLineAsString(valueStr); // can be null
readNextLineAsString(valueStr, false); // can be null


try { try {
fEngine->setOption(static_cast<EngineOption>(option), value, valueStr); fEngine->setOption(static_cast<EngineOption>(option), value, valueStr);
} CARLA_SAFE_EXCEPTION("setOption"); } CARLA_SAFE_EXCEPTION("setOption");

if (valueStr != nullptr)
delete[] valueStr;
} }
else if (std::strcmp(msg, "clear_engine_xruns") == 0) else if (std::strcmp(msg, "clear_engine_xruns") == 0)
{ {
@@ -1761,37 +1758,31 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
{ {
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true);


try { try {
ok = fEngine->loadFile(filename); ok = fEngine->loadFile(filename);
} CARLA_SAFE_EXCEPTION("loadFile"); } CARLA_SAFE_EXCEPTION("loadFile");

delete[] filename;
} }
else if (std::strcmp(msg, "load_project") == 0) else if (std::strcmp(msg, "load_project") == 0)
{ {
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true);


try { try {
ok = fEngine->loadProject(filename, true); ok = fEngine->loadProject(filename, true);
} CARLA_SAFE_EXCEPTION("loadProject"); } CARLA_SAFE_EXCEPTION("loadProject");

delete[] filename;
} }
else if (std::strcmp(msg, "save_project") == 0) else if (std::strcmp(msg, "save_project") == 0)
{ {
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true);


try { try {
ok = fEngine->saveProject(filename, true); ok = fEngine->saveProject(filename, true);
} CARLA_SAFE_EXCEPTION("saveProject"); } CARLA_SAFE_EXCEPTION("saveProject");

delete[] filename;
} }
else if (std::strcmp(msg, "clear_project_filename") == 0) else if (std::strcmp(msg, "clear_project_filename") == 0)
{ {
@@ -1868,9 +1859,9 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(btype), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(btype), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(ptype), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(ptype), true);
readNextLineAsString(filename); // can be null
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(name), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(label), true);
readNextLineAsString(filename, true); // can be null
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(name, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(label, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsLong(uniqueId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsLong(uniqueId), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(options), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(options), true);


@@ -1917,11 +1908,9 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
const char* newName; const char* newName;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(newName), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(newName, false), true);


ok = fEngine->renamePlugin(pluginId, newName); ok = fEngine->renamePlugin(pluginId, newName);

delete[] newName;
} }
else if (std::strcmp(msg, "clone_plugin") == 0) else if (std::strcmp(msg, "clone_plugin") == 0)
{ {
@@ -1955,15 +1944,13 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
{ {
plugin->loadStateFromFile(filename); plugin->loadStateFromFile(filename);
_updateParamValues(plugin, pluginId, false, true); _updateParamValues(plugin, pluginId, false, true);
} }

delete[] filename;
} }
else if (std::strcmp(msg, "save_plugin_state") == 0) else if (std::strcmp(msg, "save_plugin_state") == 0)
{ {
@@ -1971,12 +1958,10 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
const char* filename; const char* filename;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(filename, false), true);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
plugin->saveStateToFile(filename); plugin->saveStateToFile(filename);

delete[] filename;
} }
else if (std::strcmp(msg, "set_option") == 0) else if (std::strcmp(msg, "set_option") == 0)
{ {
@@ -2169,16 +2154,15 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
const char* value; const char* value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(type), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(type, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value, false), true);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
plugin->setCustomData(type, key, value, true); plugin->setCustomData(type, key, value, true);


delete[] type; delete[] type;
delete[] key; delete[] key;
delete[] value;
} }
else if (std::strcmp(msg, "set_chunk_data") == 0) else if (std::strcmp(msg, "set_chunk_data") == 0)
{ {
@@ -2186,7 +2170,7 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
const char* cdata; const char* cdata;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(pluginId), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(cdata), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(cdata, false), true);


if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId)) if (CarlaPlugin* const plugin = fEngine->getPlugin(pluginId))
{ {
@@ -2198,8 +2182,6 @@ bool CarlaEngineNativeUI::msgReceived(const char*const msg) noexcept
#endif #endif
_updateParamValues(plugin, pluginId, false, true); _updateParamValues(plugin, pluginId, false, true);
} }

delete[] cdata;
} }
else if (std::strcmp(msg, "prepare_for_save") == 0) else if (std::strcmp(msg, "prepare_for_save") == 0)
{ {


+ 2
- 4
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -7257,10 +7257,9 @@ bool CarlaPipeServerLV2::msgReceived(const char* const msg) noexcept


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(index), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(index), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(size), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(size), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(base64atom), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(base64atom, false), true);


std::vector<uint8_t> chunk(carla_getChunkFromBase64String(base64atom)); std::vector<uint8_t> chunk(carla_getChunkFromBase64String(base64atom));
delete[] base64atom;
CARLA_SAFE_ASSERT_RETURN(chunk.size() >= sizeof(LV2_Atom), true); CARLA_SAFE_ASSERT_RETURN(chunk.size() >= sizeof(LV2_Atom), true);


#ifdef CARLA_PROPER_CPP11_SUPPORT #ifdef CARLA_PROPER_CPP11_SUPPORT
@@ -7296,7 +7295,7 @@ bool CarlaPipeServerLV2::msgReceived(const char* const msg) noexcept
const char* uri; const char* uri;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(urid), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(urid), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uri), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uri, false), true);


if (urid != 0) if (urid != 0)
{ {
@@ -7305,7 +7304,6 @@ bool CarlaPipeServerLV2::msgReceived(const char* const msg) noexcept
} CARLA_SAFE_EXCEPTION("msgReceived urid"); } CARLA_SAFE_EXCEPTION("msgReceived urid");
} }


delete[] uri;
return true; return true;
} }




+ 1
- 1
source/backend/utils/PipeClient.cpp View File

@@ -88,7 +88,7 @@ public:
#endif #endif


delete[] fLastReadLine; delete[] fLastReadLine;
fLastReadLine = CarlaPipeClient::_readlineblock(timeout);
fLastReadLine = CarlaPipeClient::_readlineblock(true, timeout);
return fLastReadLine; return fLastReadLine;
} }




+ 6
- 11
source/bridges-ui/CarlaBridgeFormat.cpp View File

@@ -158,13 +158,12 @@ bool CarlaBridgeFormat::msgReceived(const char* const msg) noexcept
const char* key; const char* key;
const char* value; const char* value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value, false), true);


dspStateChanged(key, value); dspStateChanged(key, value);


delete[] key; delete[] key;
delete[] value;
return true; return true;
} }


@@ -189,10 +188,9 @@ bool CarlaBridgeFormat::msgReceived(const char* const msg) noexcept


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(index), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(index), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(atomTotalSize), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(atomTotalSize), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(base64atom), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(base64atom, false), true);


std::vector<uint8_t> chunk(carla_getChunkFromBase64String(base64atom)); std::vector<uint8_t> chunk(carla_getChunkFromBase64String(base64atom));
delete[] base64atom;
CARLA_SAFE_ASSERT_RETURN(chunk.size() >= sizeof(LV2_Atom), true); CARLA_SAFE_ASSERT_RETURN(chunk.size() >= sizeof(LV2_Atom), true);


#ifdef CARLA_PROPER_CPP11_SUPPORT #ifdef CARLA_PROPER_CPP11_SUPPORT
@@ -215,12 +213,11 @@ bool CarlaBridgeFormat::msgReceived(const char* const msg) noexcept
const char* uri; const char* uri;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(urid), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsUInt(urid), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uri), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(uri, false), true);


if (urid != 0) if (urid != 0)
dspURIDReceived(urid, uri); dspURIDReceived(urid, uri);


delete[] uri;
return true; return true;
} }


@@ -235,7 +232,7 @@ bool CarlaBridgeFormat::msgReceived(const char* const msg) noexcept
CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(opts.uiScale), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsFloat(opts.uiScale), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(opts.useTheme), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(opts.useTheme), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(opts.useThemeColors), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsBool(opts.useThemeColors), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(opts.windowTitle), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(opts.windowTitle, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsULong(transientWindowId), true); CARLA_SAFE_ASSERT_RETURN(readNextLineAsULong(transientWindowId), true);
opts.transientWindowId = transientWindowId; opts.transientWindowId = transientWindowId;


@@ -279,11 +276,9 @@ bool CarlaBridgeFormat::msgReceived(const char* const msg) noexcept
{ {
const char* title; const char* title;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(title), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(title, false), true);


fToolkit->setTitle(title); fToolkit->setTitle(title);

delete[] title;
return true; return true;
} }




+ 21
- 21
source/frontend/carla-plugin View File

@@ -199,7 +199,7 @@ class CarlaMiniW(ExternalUI, HostWindow):
value2 = int(self.readlineblock()) value2 = int(self.readlineblock())
value3 = int(self.readlineblock()) value3 = int(self.readlineblock())
valuef = float(self.readlineblock()) valuef = float(self.readlineblock())
valueStr = self.readlineblock().replace("\r", "\n")
valueStr = self.readlineblock()


self.host._setViaCallback(action, pluginId, value1, value2, value3, valuef, valueStr) self.host._setViaCallback(action, pluginId, value1, value2, value3, valuef, valueStr)
engineCallback(self.host, action, pluginId, value1, value2, value3, valuef, valueStr) engineCallback(self.host, action, pluginId, value1, value2, value3, valuef, valueStr)
@@ -238,13 +238,13 @@ class CarlaMiniW(ExternalUI, HostWindow):
self.host._add(pluginId) self.host._add(pluginId)


type_, category, hints, uniqueId, optsAvail, optsEnabled = [int(i) for i in self.readlineblock().split(":")] type_, category, hints, uniqueId, optsAvail, optsEnabled = [int(i) for i in self.readlineblock().split(":")]
filename = self.readlineblock().replace("\r", "\n")
name = self.readlineblock().replace("\r", "\n")
iconName = self.readlineblock().replace("\r", "\n")
realName = self.readlineblock().replace("\r", "\n")
label = self.readlineblock().replace("\r", "\n")
maker = self.readlineblock().replace("\r", "\n")
copyright = self.readlineblock().replace("\r", "\n")
filename = self.readlineblock()
name = self.readlineblock()
iconName = self.readlineblock()
realName = self.readlineblock()
label = self.readlineblock()
maker = self.readlineblock()
copyright = self.readlineblock()


pinfo = { pinfo = {
'type': type_, 'type': type_,
@@ -280,10 +280,10 @@ class CarlaMiniW(ExternalUI, HostWindow):
pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_DATA_", "").split(":")] pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_DATA_", "").split(":")]
paramType, paramHints, mappedControlIndex, midiChannel = [int(i) for i in self.readlineblock().split(":")] paramType, paramHints, mappedControlIndex, midiChannel = [int(i) for i in self.readlineblock().split(":")]
mappedMinimum, mappedMaximum = [float(i) for i in self.readlineblock().split(":")] mappedMinimum, mappedMaximum = [float(i) for i in self.readlineblock().split(":")]
paramName = self.readlineblock().replace("\r", "\n")
paramUnit = self.readlineblock().replace("\r", "\n")
paramComment = self.readlineblock().replace("\r", "\n")
paramGroupName = self.readlineblock().replace("\r", "\n")
paramName = self.readlineblock()
paramUnit = self.readlineblock()
paramComment = self.readlineblock()
paramGroupName = self.readlineblock()


paramInfo = { paramInfo = {
'name': paramName, 'name': paramName,
@@ -328,7 +328,7 @@ class CarlaMiniW(ExternalUI, HostWindow):


elif msg.startswith("PROGRAM_NAME_"): elif msg.startswith("PROGRAM_NAME_"):
pluginId, progId = [int(i) for i in msg.replace("PROGRAM_NAME_", "").split(":")] pluginId, progId = [int(i) for i in msg.replace("PROGRAM_NAME_", "").split(":")]
progName = self.readlineblock().replace("\r", "\n")
progName = self.readlineblock()
self.host._set_programName(pluginId, progId, progName) self.host._set_programName(pluginId, progId, progName)


elif msg.startswith("MIDI_PROGRAM_COUNT_"): elif msg.startswith("MIDI_PROGRAM_COUNT_"):
@@ -339,7 +339,7 @@ class CarlaMiniW(ExternalUI, HostWindow):
elif msg.startswith("MIDI_PROGRAM_DATA_"): elif msg.startswith("MIDI_PROGRAM_DATA_"):
pluginId, midiProgId = [int(i) for i in msg.replace("MIDI_PROGRAM_DATA_", "").split(":")] pluginId, midiProgId = [int(i) for i in msg.replace("MIDI_PROGRAM_DATA_", "").split(":")]
bank, program = [int(i) for i in self.readlineblock().split(":")] bank, program = [int(i) for i in self.readlineblock().split(":")]
name = self.readlineblock().replace("\r", "\n")
name = self.readlineblock()
self.host._set_midiProgramData(pluginId, midiProgId, {'bank': bank, 'program': program, 'name': name}) self.host._set_midiProgramData(pluginId, midiProgId, {'bank': bank, 'program': program, 'name': name})


elif msg.startswith("CUSTOM_DATA_COUNT_"): elif msg.startswith("CUSTOM_DATA_COUNT_"):
@@ -349,14 +349,14 @@ class CarlaMiniW(ExternalUI, HostWindow):
elif msg.startswith("CUSTOM_DATA_"): elif msg.startswith("CUSTOM_DATA_"):
pluginId, customDataId = [int(i) for i in msg.replace("CUSTOM_DATA_", "").split(":")] pluginId, customDataId = [int(i) for i in msg.replace("CUSTOM_DATA_", "").split(":")]


type_ = self.readlineblock().replace("\r", "\n")
key = self.readlineblock().replace("\r", "\n")
value = self.readlineblock().replace("\r", "\n")
type_ = self.readlineblock()
key = self.readlineblock()
value = self.readlineblock()
self.host._set_customData(pluginId, customDataId, {'type': type_, 'key': key, 'value': value}) self.host._set_customData(pluginId, customDataId, {'type': type_, 'key': key, 'value': value})


elif msg == "osc-urls": elif msg == "osc-urls":
tcp = self.readlineblock().replace("\r", "\n")
udp = self.readlineblock().replace("\r", "\n")
tcp = self.readlineblock()
udp = self.readlineblock()
self.host.fOscTCP = tcp self.host.fOscTCP = tcp
self.host.fOscUDP = udp self.host.fOscUDP = udp


@@ -373,7 +373,7 @@ class CarlaMiniW(ExternalUI, HostWindow):
self.host.fSampleRate = srate self.host.fSampleRate = srate


elif msg == "error": elif msg == "error":
error = self.readlineblock().replace("\r", "\n")
error = self.readlineblock()
engineCallback(self.host, ENGINE_CALLBACK_ERROR, 0, 0, 0, 0, 0.0, error) engineCallback(self.host, ENGINE_CALLBACK_ERROR, 0, 0, 0, 0, 0.0, error)


elif msg == "show": elif msg == "show":
@@ -391,7 +391,7 @@ class CarlaMiniW(ExternalUI, HostWindow):
self.uiQuit() self.uiQuit()


elif msg == "uiTitle": elif msg == "uiTitle":
uiTitle = self.readlineblock().replace("\r", "\n")
uiTitle = self.readlineblock()
self.uiTitleChanged(uiTitle) self.uiTitleChanged(uiTitle)


else: else:


+ 3
- 3
source/frontend/externalui.py View File

@@ -139,8 +139,8 @@ class ExternalUI(object):
self.dspProgramChanged(channel, bank, program) self.dspProgramChanged(channel, bank, program)


elif msg == "configure": elif msg == "configure":
key = self.readlineblock() #.replace("\r", "\n")
value = self.readlineblock() #.replace("\r", "\n")
key = self.readlineblock()
value = self.readlineblock()
self.dspStateChanged(key, value) self.dspStateChanged(key, value)


elif msg == "note": elif msg == "note":
@@ -164,7 +164,7 @@ class ExternalUI(object):
self.uiQuit() self.uiQuit()


elif msg == "uiTitle": elif msg == "uiTitle":
uiTitle = self.readlineblock() #.replace("\r", "\n")
uiTitle = self.readlineblock()
self.uiTitleChanged(uiTitle) self.uiTitleChanged(uiTitle)


else: else:


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

@@ -180,15 +180,14 @@ protected:
const char* key; const char* key;
const char* value; const char* value;


CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(key, true), true);
CARLA_SAFE_ASSERT_RETURN(readNextLineAsString(value, false), true);


try { try {
uiCustomDataChanged(key, value); uiCustomDataChanged(key, value);
} CARLA_SAFE_EXCEPTION("uiCustomDataChanged"); } CARLA_SAFE_EXCEPTION("uiCustomDataChanged");


delete[] key; delete[] key;
delete[] value;


return true; return true;
} }


+ 90
- 75
source/utils/CarlaPipeUtils.cpp View File

@@ -596,7 +596,7 @@ struct CarlaPipeCommon::PrivateData {
CarlaMutex writeLock; CarlaMutex writeLock;


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


PrivateData() noexcept PrivateData() noexcept
@@ -625,7 +625,7 @@ struct CarlaPipeCommon::PrivateData {
ovSend = ::CreateEvent(nullptr, FALSE, FALSE, nullptr); ovSend = ::CreateEvent(nullptr, FALSE, FALSE, nullptr);
#endif #endif


carla_zeroChars(tmpBuf, 0xff+1);
carla_zeroChars(tmpBuf, 0xffff);
} }


CARLA_DECLARE_NON_COPY_STRUCT(PrivateData) CARLA_DECLARE_NON_COPY_STRUCT(PrivateData)
@@ -655,11 +655,13 @@ bool CarlaPipeCommon::isPipeRunning() const noexcept


void CarlaPipeCommon::idlePipe(const bool onlyOnce) noexcept void CarlaPipeCommon::idlePipe(const bool onlyOnce) noexcept
{ {
bool readSucess;

for (;;) for (;;)
{ {
const char* const msg(_readline());
const char* const msg = _readline(true, readSucess);


if (msg == nullptr)
if (msg == nullptr || ! readSucess)
break; break;


pData->isReading = true; pData->isReading = true;
@@ -712,10 +714,9 @@ bool CarlaPipeCommon::readNextLineAsBool(bool& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
value = (std::strcmp(msg, "true") == 0); value = (std::strcmp(msg, "true") == 0);
delete[] msg;
return true; return true;
} }


@@ -726,14 +727,13 @@ bool CarlaPipeCommon::readNextLineAsByte(uint8_t& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
int tmp = std::atoi(msg);
delete[] msg;
const int asint = std::atoi(msg);


if (tmp >= 0 && tmp <= 0xFF)
if (asint >= 0 && asint <= 0xFF)
{ {
value = static_cast<uint8_t>(tmp);
value = static_cast<uint8_t>(asint);
return true; return true;
} }
} }
@@ -745,10 +745,9 @@ bool CarlaPipeCommon::readNextLineAsInt(int32_t& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
value = std::atoi(msg); value = std::atoi(msg);
delete[] msg;
return true; return true;
} }


@@ -759,14 +758,13 @@ bool CarlaPipeCommon::readNextLineAsUInt(uint32_t& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
const long tmp = std::atol(msg);
delete[] msg;
const long aslong = std::atol(msg);


if (tmp >= 0)
if (aslong >= 0)
{ {
value = static_cast<uint32_t>(tmp);
value = static_cast<uint32_t>(aslong);
return true; return true;
} }
} }
@@ -778,10 +776,9 @@ bool CarlaPipeCommon::readNextLineAsLong(int64_t& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
value = std::atol(msg); value = std::atol(msg);
delete[] msg;
return true; return true;
} }


@@ -792,14 +789,13 @@ bool CarlaPipeCommon::readNextLineAsULong(uint64_t& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
const int64_t tmp = std::atol(msg);
delete[] msg;
const int64_t asint64 = std::atol(msg);


if (tmp >= 0)
if (asint64 >= 0)
{ {
value = static_cast<uint64_t>(tmp);
value = static_cast<uint64_t>(asint64);
return true; return true;
} }
} }
@@ -811,13 +807,12 @@ bool CarlaPipeCommon::readNextLineAsFloat(float& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
{ {
const CarlaScopedLocale csl; const CarlaScopedLocale csl;
value = static_cast<float>(std::atof(msg)); value = static_cast<float>(std::atof(msg));
} }
delete[] msg;
return true; return true;
} }


@@ -828,24 +823,23 @@ bool CarlaPipeCommon::readNextLineAsDouble(double& value) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(false))
{ {
{ {
const CarlaScopedLocale csl; const CarlaScopedLocale csl;
value = std::atof(msg); value = std::atof(msg);
} }
delete[] msg;
return true; return true;
} }


return false; return false;
} }


bool CarlaPipeCommon::readNextLineAsString(const char*& value) const noexcept
bool CarlaPipeCommon::readNextLineAsString(const char*& value, const bool allocateString) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->isReading, false); CARLA_SAFE_ASSERT_RETURN(pData->isReading, false);


if (const char* const msg = _readlineblock())
if (const char* const msg = _readlineblock(allocateString))
{ {
value = msg; value = msg;
return true; return true;
@@ -920,6 +914,8 @@ bool CarlaPipeCommon::writeAndFixMessage(const char* const msg) const noexcept
{ {
fixedMsg[0] = '\n'; fixedMsg[0] = '\n';
fixedMsg[1] = '\0'; fixedMsg[1] = '\0';

carla_stderr2("wrote empty message:'%s'", fixedMsg);
} }


return _writeMsgBuffer(fixedMsg, size+1); return _writeMsgBuffer(fixedMsg, size+1);
@@ -970,21 +966,21 @@ void CarlaPipeCommon::writeErrorMessage(const char* const error) const noexcept


void CarlaPipeCommon::writeControlMessage(const uint32_t index, const float value) const noexcept void CarlaPipeCommon::writeControlMessage(const uint32_t index, const float value) const noexcept
{ {
char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("control\n", 8)) if (! _writeMsgBuffer("control\n", 8))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", index);
std::snprintf(tmpBuf, 0xfe, "%i\n", index);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


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


if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
@@ -1012,15 +1008,15 @@ void CarlaPipeCommon::writeConfigureMessage(const char* const key, const char* c


void CarlaPipeCommon::writeProgramMessage(const uint32_t index) const noexcept void CarlaPipeCommon::writeProgramMessage(const uint32_t index) const noexcept
{ {
char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("program\n", 8)) if (! _writeMsgBuffer("program\n", 8))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", index);
std::snprintf(tmpBuf, 0xfe, "%i\n", index);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1029,23 +1025,23 @@ void CarlaPipeCommon::writeProgramMessage(const uint32_t index) const noexcept


void CarlaPipeCommon::writeProgramMessage(const uint8_t channel, const uint32_t bank, const uint32_t program) const noexcept void CarlaPipeCommon::writeProgramMessage(const uint8_t channel, const uint32_t bank, const uint32_t program) const noexcept
{ {
char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("program\n", 8)) if (! _writeMsgBuffer("program\n", 8))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", channel);
std::snprintf(tmpBuf, 0xfe, "%i\n", channel);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", bank);
std::snprintf(tmpBuf, 0xfe, "%i\n", bank);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", program);
std::snprintf(tmpBuf, 0xfe, "%i\n", program);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1054,19 +1050,19 @@ void CarlaPipeCommon::writeProgramMessage(const uint8_t channel, const uint32_t


void CarlaPipeCommon::writeMidiProgramMessage(const uint32_t bank, const uint32_t program) const noexcept void CarlaPipeCommon::writeMidiProgramMessage(const uint32_t bank, const uint32_t program) const noexcept
{ {
char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("midiprogram\n", 12)) if (! _writeMsgBuffer("midiprogram\n", 12))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", bank);
std::snprintf(tmpBuf, 0xfe, "%i\n", bank);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", program);
std::snprintf(tmpBuf, 0xfe, "%i\n", program);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1075,15 +1071,15 @@ void CarlaPipeCommon::writeMidiProgramMessage(const uint32_t bank, const uint32_


void CarlaPipeCommon::writeReloadProgramsMessage(const int32_t index) const noexcept void CarlaPipeCommon::writeReloadProgramsMessage(const int32_t index) const noexcept
{ {
char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("reloadprograms\n", 15)) if (! _writeMsgBuffer("reloadprograms\n", 15))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", index);
std::snprintf(tmpBuf, 0xfe, "%i\n", index);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1096,27 +1092,27 @@ void CarlaPipeCommon::writeMidiNoteMessage(const bool onOff, const uint8_t chann
CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE,); CARLA_SAFE_ASSERT_RETURN(note < MAX_MIDI_NOTE,);
CARLA_SAFE_ASSERT_RETURN(velocity < MAX_MIDI_VALUE,); CARLA_SAFE_ASSERT_RETURN(velocity < MAX_MIDI_VALUE,);


char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("note\n", 5)) if (! _writeMsgBuffer("note\n", 5))
return; return;


std::snprintf(tmpBuf, 0xff, "%s\n", bool2str(onOff));
std::snprintf(tmpBuf, 0xfe, "%s\n", bool2str(onOff));
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", channel);
std::snprintf(tmpBuf, 0xfe, "%i\n", channel);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", note);
std::snprintf(tmpBuf, 0xfe, "%i\n", note);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", velocity);
std::snprintf(tmpBuf, 0xfe, "%i\n", velocity);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1127,8 +1123,8 @@ void CarlaPipeCommon::writeLv2AtomMessage(const uint32_t index, const LV2_Atom*
{ {
CARLA_SAFE_ASSERT_RETURN(atom != nullptr,); CARLA_SAFE_ASSERT_RETURN(atom != nullptr,);


char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
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)); CarlaString base64atom(CarlaString::asBase64(atom, atomTotalSize));
@@ -1138,11 +1134,11 @@ void CarlaPipeCommon::writeLv2AtomMessage(const uint32_t index, const LV2_Atom*
if (! _writeMsgBuffer("atom\n", 5)) if (! _writeMsgBuffer("atom\n", 5))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", index);
std::snprintf(tmpBuf, 0xfe, "%i\n", index);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", atomTotalSize);
std::snprintf(tmpBuf, 0xfe, "%i\n", atomTotalSize);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1157,15 +1153,15 @@ void CarlaPipeCommon::writeLv2UridMessage(const uint32_t urid, const char* const
CARLA_SAFE_ASSERT_RETURN(urid != 0,); CARLA_SAFE_ASSERT_RETURN(urid != 0,);
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',); CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',);


char tmpBuf[0xff+1];
tmpBuf[0xff] = '\0';
char tmpBuf[0xff];
tmpBuf[0xfe] = '\0';


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


if (! _writeMsgBuffer("urid\n", 5)) if (! _writeMsgBuffer("urid\n", 5))
return; return;


std::snprintf(tmpBuf, 0xff, "%i\n", urid);
std::snprintf(tmpBuf, 0xfe, "%i\n", urid);
if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf))) if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return; return;


@@ -1178,17 +1174,18 @@ void CarlaPipeCommon::writeLv2UridMessage(const uint32_t urid, const char* const
// ------------------------------------------------------------------- // -------------------------------------------------------------------


// internal // internal
const char* CarlaPipeCommon::_readline() const noexcept
const char* CarlaPipeCommon::_readline(const bool allocReturn, bool& readSucess) const noexcept
{ {
CARLA_SAFE_ASSERT_RETURN(pData->pipeRecv != INVALID_PIPE_VALUE, nullptr); CARLA_SAFE_ASSERT_RETURN(pData->pipeRecv != INVALID_PIPE_VALUE, nullptr);


char c; char c;
char* ptr = pData->tmpBuf; char* ptr = pData->tmpBuf;
ssize_t ret = -1; ssize_t ret = -1;
bool tooBig = false;


pData->tmpStr.clear(); pData->tmpStr.clear();


for (int i=0; i<0xff; ++i)
for (int i=0; i<0xfffe; ++i)
{ {
try { try {
#ifdef CARLA_OS_WIN #ifdef CARLA_OS_WIN
@@ -1206,10 +1203,11 @@ const char* CarlaPipeCommon::_readline() const noexcept


*ptr++ = c; *ptr++ = c;


if (i+1 == 0xff)
if (i+1 == 0xfffe)
{ {
i = 0; i = 0;
*ptr = '\0'; *ptr = '\0';
tooBig = true;
pData->tmpStr += pData->tmpBuf; pData->tmpStr += pData->tmpBuf;
ptr = pData->tmpBuf; ptr = pData->tmpBuf;
} }
@@ -1218,26 +1216,39 @@ const char* CarlaPipeCommon::_readline() const noexcept
if (ptr != pData->tmpBuf) if (ptr != pData->tmpBuf)
{ {
*ptr = '\0'; *ptr = '\0';

if (! allocReturn && ! tooBig)
{
readSucess = true;
return pData->tmpBuf;
}

pData->tmpStr += pData->tmpBuf; pData->tmpStr += pData->tmpBuf;
} }
else if (pData->tmpStr.isEmpty() && ret != 1) else if (pData->tmpStr.isEmpty() && ret != 1)
{ {
// some error // some error
readSucess = false;
return nullptr; return nullptr;
} }


try {
return pData->tmpStr.dup();
} CARLA_SAFE_EXCEPTION_RETURN("CarlaPipeCommon::readline() - dup", nullptr);
if (! allocReturn && ! tooBig)
return pData->tmpBuf;

readSucess = true;
return allocReturn ? pData->tmpStr.releaseBufferPointer() : pData->tmpStr.buffer();
} }


const char* CarlaPipeCommon::_readlineblock(const uint32_t timeOutMilliseconds) const noexcept
const char* CarlaPipeCommon::_readlineblock(const bool allocReturn, const uint32_t timeOutMilliseconds) const noexcept
{ {
const uint32_t timeoutEnd(water::Time::getMillisecondCounter() + timeOutMilliseconds);
const uint32_t timeoutEnd = water::Time::getMillisecondCounter() + timeOutMilliseconds;
bool readSucess;


for (;;) for (;;)
{ {
if (const char* const msg = _readline())
const char* const msg = _readline(allocReturn, readSucess);

if (readSucess)
return msg; return msg;


if (water::Time::getMillisecondCounter() >= timeoutEnd) if (water::Time::getMillisecondCounter() >= timeoutEnd)
@@ -1246,13 +1257,17 @@ const char* CarlaPipeCommon::_readlineblock(const uint32_t timeOutMilliseconds)
carla_msleep(5); carla_msleep(5);
} }


if (std::getenv("CARLA_VALGRIND_TEST") != nullptr)
static const bool testingForValgrind = std::getenv("CARLA_VALGRIND_TEST") != nullptr;

if (testingForValgrind)
{ {
const uint32_t timeoutEnd2(water::Time::getMillisecondCounter() + 1000);
const uint32_t timeoutEnd2 = water::Time::getMillisecondCounter() + 1000;


for (;;) for (;;)
{ {
if (const char* const msg = _readline())
const char* const msg = _readline(allocReturn, readSucess);

if (readSucess)
return msg; return msg;


if (water::Time::getMillisecondCounter() >= timeoutEnd2) if (water::Time::getMillisecondCounter() >= timeoutEnd2)


+ 20
- 20
source/utils/CarlaPipeUtils.hpp View File

@@ -48,14 +48,14 @@ protected:
* If extra data is required, use any of the readNextLineAs* functions. * If extra data is required, use any of the readNextLineAs* functions.
* Returning true means the message has been handled and should not propagate to subclasses. * Returning true means the message has been handled and should not propagate to subclasses.
*/ */
virtual bool msgReceived(const char* const msg) noexcept = 0;
virtual bool msgReceived(const char* msg) noexcept = 0;


/*! /*!
* An error has occurred during the current requested operation. * An error has occurred during the current requested operation.
* Reimplementing this method allows to catch these errors as strings. * Reimplementing this method allows to catch these errors as strings.
* By default the error is simply printed to stderr. * By default the error is simply printed to stderr.
*/ */
virtual void fail(const char* const error) noexcept
virtual void fail(const char* error) noexcept
{ {
carla_stderr2(error); carla_stderr2(error);
} }
@@ -69,7 +69,7 @@ public:
/*! /*!
* Check the pipe for new messages and send them to msgReceived(). * Check the pipe for new messages and send them to msgReceived().
*/ */
void idlePipe(const bool onlyOnce = false) noexcept;
void idlePipe(bool onlyOnce = false) noexcept;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// write lock // write lock
@@ -142,7 +142,7 @@ public:
* Read the next line as a string. * Read the next line as a string.
* @note: @a value must be deleted if valid. * @note: @a value must be deleted if valid.
*/ */
bool readNextLineAsString(const char*& value) const noexcept;
bool readNextLineAsString(const char*& value, bool allocateString) const noexcept;


// ------------------------------------------------------------------- // -------------------------------------------------------------------
// write messages, must be locked before calling // write messages, must be locked before calling
@@ -151,18 +151,18 @@ public:
* Write a valid message with unknown size. * Write a valid message with unknown size.
* A valid message has only one '\n' character and it's at the end. * A valid message has only one '\n' character and it's at the end.
*/ */
bool writeMessage(const char* const msg) const noexcept;
bool writeMessage(const char* msg) const noexcept;


/*! /*!
* Write a valid message with known size. * Write a valid message with known size.
* A valid message has only one '\n' character and it's at the end. * A valid message has only one '\n' character and it's at the end.
*/ */
bool writeMessage(const char* const msg, std::size_t size) const noexcept;
bool writeMessage(const char* msg, std::size_t size) const noexcept;


/*! /*!
* Write and fix a message. * Write and fix a message.
*/ */
bool writeAndFixMessage(const char* const msg) const noexcept;
bool writeAndFixMessage(const char* msg) const noexcept;


/*! /*!
* Write an empty message, which means a single '\n'. * Write an empty message, which means a single '\n'.
@@ -180,52 +180,52 @@ public:
/*! /*!
* Write an "error" message. * Write an "error" message.
*/ */
void writeErrorMessage(const char* const error) const noexcept;
void writeErrorMessage(const char* error) const noexcept;


/*! /*!
* Write a "control" message used for parameter changes. * Write a "control" message used for parameter changes.
*/ */
void writeControlMessage(const uint32_t index, const float value) const noexcept;
void writeControlMessage(uint32_t index, float value) const noexcept;


/*! /*!
* Write a "configure" message used for state changes. * Write a "configure" message used for state changes.
*/ */
void writeConfigureMessage(const char* const key, const char* const value) const noexcept;
void writeConfigureMessage(const char* key, const char* value) const noexcept;


/*! /*!
* Write a "program" message (using index). * Write a "program" message (using index).
*/ */
void writeProgramMessage(const uint32_t index) const noexcept;
void writeProgramMessage(uint32_t index) const noexcept;


/*! /*!
* Write a "program" message (using channel, bank and program). * Write a "program" message (using channel, bank and program).
*/ */
void writeProgramMessage(const uint8_t channel, const uint32_t bank, const uint32_t program) const noexcept;
void writeProgramMessage(uint8_t channel, uint32_t bank, uint32_t program) const noexcept;


/*! /*!
* Write a "midiprogram" message (using bank and program). * Write a "midiprogram" message (using bank and program).
*/ */
void writeMidiProgramMessage(const uint32_t bank, const uint32_t program) const noexcept;
void writeMidiProgramMessage(uint32_t bank, uint32_t program) const noexcept;


/*! /*!
* Write a "reloadprograms" message. * Write a "reloadprograms" message.
*/ */
void writeReloadProgramsMessage(const int32_t index) const noexcept;
void writeReloadProgramsMessage(int32_t index) const noexcept;


/*! /*!
* Write a MIDI "note" message. * Write a MIDI "note" message.
*/ */
void writeMidiNoteMessage(const bool onOff, const uint8_t channel, const uint8_t note, const uint8_t velocity) const noexcept;
void writeMidiNoteMessage(bool onOff, uint8_t channel, uint8_t note, uint8_t velocity) const noexcept;


/*! /*!
* Write an lv2 "atom" message. * Write an lv2 "atom" message.
*/ */
void writeLv2AtomMessage(const uint32_t index, const LV2_Atom* const atom) const noexcept;
void writeLv2AtomMessage(uint32_t index, const LV2_Atom* atom) const noexcept;


/*! /*!
* Write an lv2 "urid" message. * Write an lv2 "urid" message.
*/ */
void writeLv2UridMessage(const uint32_t urid, const char* const uri) const noexcept;
void writeLv2UridMessage(uint32_t urid, const char* uri) const noexcept;


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


@@ -236,13 +236,13 @@ protected:
// ------------------------------------------------------------------- // -------------------------------------------------------------------


/*! @internal */ /*! @internal */
const char* _readline() const noexcept;
const char* _readline(bool allocReturn, bool& readSucess) const noexcept;


/*! @internal */ /*! @internal */
const char* _readlineblock(const uint32_t timeOutMilliseconds = 50) const noexcept;
const char* _readlineblock(bool allocReturn, uint32_t timeOutMilliseconds = 50) const noexcept;


/*! @internal */ /*! @internal */
bool _writeMsgBuffer(const char* const msg, const std::size_t size) const noexcept;
bool _writeMsgBuffer(const char* msg, std::size_t size) const noexcept;


CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeCommon) CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaPipeCommon)
}; };


Loading…
Cancel
Save