Browse Source

Stop trying to write to pipes when previous op fails, other fixes

tags/1.9.8
falkTX 7 years ago
parent
commit
c3097fb386
6 changed files with 547 additions and 333 deletions
  1. +369
    -216
      source/backend/engine/CarlaEngineNative.cpp
  2. +33
    -15
      source/backend/plugin/CarlaPluginLV2.cpp
  3. +31
    -25
      source/includes/CarlaNativeExtUI.hpp
  4. +8
    -4
      source/native-plugins/midi-pattern.cpp
  5. +1
    -3
      source/native-plugins/zynaddsubfx-synth.cpp
  6. +105
    -70
      source/utils/CarlaPipeUtils.cpp

+ 369
- 216
source/backend/engine/CarlaEngineNative.cpp View File

@@ -566,9 +566,9 @@ protected:
if (! ok)
{
const CarlaMutexLocker cml(getPipeLock());
writeMessage("error\n", 6);
writeAndFixMessage(fEngine->getLastError());
flushMessages();
if (writeMessage("error\n", 6) && writeAndFixMessage(fEngine->getLastError()))
flushMessages();
}

return true;
@@ -607,8 +607,6 @@ public:
{
carla_debug("CarlaEngineNative::CarlaEngineNative()");

carla_zeroChars(fTmpBuf, STR_MAX+1);

pData->bufferSize = pHost->get_buffer_size(pHost->handle);
pData->sampleRate = pHost->get_sample_rate(pHost->handle);
pData->initTime(nullptr);
@@ -755,10 +753,16 @@ protected:
{
const CarlaMutexLocker cml(fUiServer.getPipeLock());

fUiServer.writeAndFixMessage("buffer-size");
std::sprintf(fTmpBuf, "%i\n", newBufferSize);
fUiServer.writeMessage(fTmpBuf);
fUiServer.flushMessages();
if (fUiServer.writeAndFixMessage("buffer-size"))
{
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);

std::sprintf(tmpBuf, "%i\n", newBufferSize);

if (fUiServer.writeMessage(tmpBuf))
fUiServer.flushMessages();
}
}

pData->bufferSize = newBufferSize;
@@ -772,12 +776,20 @@ protected:

{
const CarlaMutexLocker cml(fUiServer.getPipeLock());
const ScopedLocale csl;

fUiServer.writeAndFixMessage("sample-rate");
std::sprintf(fTmpBuf, "%f\n", newSampleRate);
fUiServer.writeMessage(fTmpBuf);
fUiServer.flushMessages();
if (fUiServer.writeAndFixMessage("sample-rate"))
{
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);

{
const ScopedLocale csl;
std::sprintf(tmpBuf, "%f\n", newSampleRate);
}

if (fUiServer.writeMessage(tmpBuf))
fUiServer.flushMessages();
}
}

pData->sampleRate = newSampleRate;
@@ -788,63 +800,89 @@ protected:

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

const CarlaMutexLocker cml(fUiServer.getPipeLock());

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

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

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

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

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

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

plugin->getRealName(fTmpBuf);
fUiServer.writeAndFixMessage(fTmpBuf);
plugin->getRealName(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;

plugin->getLabel(fTmpBuf);
fUiServer.writeAndFixMessage(fTmpBuf);
plugin->getLabel(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;

plugin->getMaker(fTmpBuf);
fUiServer.writeAndFixMessage(fTmpBuf);
plugin->getMaker(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;

plugin->getCopyright(fTmpBuf);
fUiServer.writeAndFixMessage(fTmpBuf);
plugin->getCopyright(tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;

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

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

fUiServer.flushMessages();
}

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

const CarlaMutexLocker cml(fUiServer.getPipeLock());
const ScopedLocale csl;

@@ -852,42 +890,61 @@ protected:

for (int32_t i=PARAMETER_ACTIVE; i>PARAMETER_MAX; --i)
{
std::sprintf(fTmpBuf, "PARAMVAL_%i:%i\n", pluginId, i);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%f\n", plugin->getInternalParameterValue(i));
fUiServer.writeMessage(fTmpBuf);
std::sprintf(tmpBuf, "PARAMVAL_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;

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

fUiServer.flushMessages();
}

uint32_t ins, outs, count;
plugin->getParameterCountInfo(ins, outs);
count = plugin->getParameterCount();
std::sprintf(fTmpBuf, "PARAMETER_COUNT_%i:%i:%i:%i\n", pluginId, ins, outs, count);
fUiServer.writeMessage(fTmpBuf);

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

for (uint32_t i=0; i<count; ++i)
{
const ParameterData& paramData(plugin->getParameterData(i));
const ParameterRanges& paramRanges(plugin->getParameterRanges(i));

std::sprintf(fTmpBuf, "PARAMETER_DATA_%i:%i\n", pluginId, i);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%i:%i:%i:%i\n", paramData.type, paramData.hints, paramData.midiChannel, paramData.midiCC);
fUiServer.writeMessage(fTmpBuf);
plugin->getParameterName(i, fTmpBuf);
fUiServer.writeAndFixMessage(fTmpBuf);
plugin->getParameterUnit(i, fTmpBuf);
fUiServer.writeAndFixMessage(fTmpBuf);
std::sprintf(tmpBuf, "PARAMETER_DATA_%i:%i\n", pluginId, i);
if (! fUiServer.writeMessage(tmpBuf))
return;

std::sprintf(fTmpBuf, "PARAMETER_RANGES_%i:%i\n", pluginId, i);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%f:%f:%f:%f:%f:%f\n", paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(tmpBuf, "%i:%i:%i:%i\n", paramData.type, paramData.hints, paramData.midiChannel, paramData.midiCC);
if (! fUiServer.writeMessage(tmpBuf))
return;

std::sprintf(fTmpBuf, "PARAMVAL_%i:%i\n", pluginId, i);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%f\n", plugin->getParameterValue(i));
fUiServer.writeMessage(fTmpBuf);
plugin->getParameterName(i, tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;

plugin->getParameterUnit(i, tmpBuf);
if (! fUiServer.writeAndFixMessage(tmpBuf))
return;

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

std::sprintf(tmpBuf, "%f:%f:%f:%f:%f:%f\n", paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge);
if (! fUiServer.writeMessage(tmpBuf))
return;

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

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

fUiServer.flushMessages();
@@ -895,38 +952,51 @@ protected:

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

const CarlaMutexLocker cml(fUiServer.getPipeLock());

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

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

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

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

fUiServer.flushMessages();

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

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

const MidiProgramData& mpData(plugin->getMidiProgramData(i));
std::sprintf(fTmpBuf, "%i:%i\n", mpData.bank, mpData.program);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%s", mpData.name);
fUiServer.writeAndFixMessage(fTmpBuf);

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

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

fUiServer.flushMessages();
@@ -934,13 +1004,17 @@ protected:

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

const CarlaMutexLocker cml(fUiServer.getPipeLock());

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

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

for (uint32_t i=0; i<count; ++i)
{
@@ -950,12 +1024,16 @@ protected:
if (std::strcmp(customData.type, CUSTOM_DATA_TYPE_PROPERTY) != 0)
continue;

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

fUiServer.writeAndFixMessage(customData.type);
fUiServer.writeAndFixMessage(customData.key);
fUiServer.writeAndFixMessage(customData.value);
if (! fUiServer.writeAndFixMessage(customData.type))
return;
if (! fUiServer.writeAndFixMessage(customData.key))
return;
if (! fUiServer.writeAndFixMessage(customData.value))
return;
}

fUiServer.flushMessages();
@@ -1030,25 +1108,31 @@ protected:
break;
}

const CarlaMutexLocker cml(fUiServer.getPipeLock());
const ScopedLocale csl;

std::sprintf(fTmpBuf, "ENGINE_CALLBACK_%i\n", int(action));
fUiServer.writeMessage(fTmpBuf);

std::sprintf(fTmpBuf, "%u\n", pluginId);
fUiServer.writeMessage(fTmpBuf);

std::sprintf(fTmpBuf, "%i\n", value1);
fUiServer.writeMessage(fTmpBuf);

std::sprintf(fTmpBuf, "%i\n", value2);
fUiServer.writeMessage(fTmpBuf);
char tmpBuf[STR_MAX];
carla_zeroChars(tmpBuf, STR_MAX);

std::sprintf(fTmpBuf, "%f\n", value3);
fUiServer.writeMessage(fTmpBuf);
const CarlaMutexLocker cml(fUiServer.getPipeLock());

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

fUiServer.flushMessages();
}
@@ -1058,27 +1142,40 @@ protected:
CARLA_SAFE_ASSERT_RETURN(fIsRunning,);
CARLA_SAFE_ASSERT_RETURN(fUiServer.isPipeRunning(),);

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

const CarlaMutexLocker cml(fUiServer.getPipeLock());

#ifdef HAVE_LIBLO
fUiServer.writeAndFixMessage("osc-urls");
fUiServer.writeAndFixMessage(pData->osc.getServerPathTCP());
fUiServer.writeAndFixMessage(pData->osc.getServerPathUDP());
if (! fUiServer.writeAndFixMessage("osc-urls"))
return;
if (! fUiServer.writeAndFixMessage(pData->osc.getServerPathTCP()))
return;
if (! fUiServer.writeAndFixMessage(pData->osc.getServerPathUDP()))
return;
#endif

fUiServer.writeAndFixMessage("max-plugin-number");
std::sprintf(fTmpBuf, "%i\n", pData->maxPluginNumber);
fUiServer.writeMessage(fTmpBuf);

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

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

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

fUiServer.flushMessages();
}
@@ -1088,76 +1185,109 @@ protected:
CARLA_SAFE_ASSERT_RETURN(fIsRunning,);
CARLA_SAFE_ASSERT_RETURN(fUiServer.isPipeRunning(),);

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

const EngineOptions& options(pData->options);
const CarlaMutexLocker cml(fUiServer.getPipeLock());

const char* const optionsForcedStr(fOptionsForced ? "true\n" : "false\n");
const std::size_t optionsForcedStrSize(fOptionsForced ? 5 : 6);

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

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

std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_FORCE_STEREO);
fUiServer.writeMessage(fTmpBuf);
fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize);
fUiServer.writeMessage(options.forceStereo ? "true\n" : "false\n");
std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_FORCE_STEREO);
if (! fUiServer.writeMessage(tmpBuf))
return;
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.forceStereo ? "true\n" : "false\n"))
return;
fUiServer.flushMessages();

std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_PLUGIN_BRIDGES);
fUiServer.writeMessage(fTmpBuf);
fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize);
fUiServer.writeMessage(options.preferPluginBridges ? "true\n" : "false\n");
std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_PLUGIN_BRIDGES);
if (! fUiServer.writeMessage(tmpBuf))
return;
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.preferPluginBridges ? "true\n" : "false\n"))
return;
fUiServer.flushMessages();

std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_UI_BRIDGES);
fUiServer.writeMessage(fTmpBuf);
fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize);
fUiServer.writeMessage(options.preferUiBridges ? "true\n" : "false\n");
std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_PREFER_UI_BRIDGES);
if (! fUiServer.writeMessage(tmpBuf))
return;
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.preferUiBridges ? "true\n" : "false\n"))
return;
fUiServer.flushMessages();

std::sprintf(fTmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UIS_ALWAYS_ON_TOP);
fUiServer.writeMessage(fTmpBuf);
fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize);
fUiServer.writeMessage(options.uisAlwaysOnTop ? "true\n" : "false\n");
std::sprintf(tmpBuf, "ENGINE_OPTION_%i\n", ENGINE_OPTION_UIS_ALWAYS_ON_TOP);
if (! fUiServer.writeMessage(tmpBuf))
return;
if (! fUiServer.writeMessage(optionsForcedStr, optionsForcedStrSize))
return;
if (! fUiServer.writeMessage(options.uisAlwaysOnTop ? "true\n" : "false\n"))
return;
fUiServer.flushMessages();

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

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

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

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

@@ -1579,62 +1709,7 @@ protected:
}
}

if (fUiServer.isPipeRunning())
{
fUiServer.idlePipe();

const CarlaMutexLocker cml(fUiServer.getPipeLock());
#ifndef CARLA_OS_WIN
const EngineTimeInfo& timeInfo(pData->timeInfo);
const ScopedLocale csl;

// send transport
fUiServer.writeAndFixMessage("transport");
fUiServer.writeMessage(timeInfo.playing ? "true\n" : "false\n");

if (timeInfo.valid & EngineTimeInfo::kValidBBT)
{
std::sprintf(fTmpBuf, P_UINT64 ":%i:%i:%i\n", timeInfo.frame, timeInfo.bbt.bar, timeInfo.bbt.beat, timeInfo.bbt.tick);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%f\n", timeInfo.bbt.beatsPerMinute);
fUiServer.writeMessage(fTmpBuf);
}
else
{
std::sprintf(fTmpBuf, P_UINT64 ":0:0:0\n", timeInfo.frame);
fUiServer.writeMessage(fTmpBuf);
fUiServer.writeMessage("0.0\n");
}

fUiServer.flushMessages();
#endif

// send peaks and param outputs for all plugins
for (uint i=0; i < pData->curPluginCount; ++i)
{
const EnginePluginData& plugData(pData->plugins[i]);
const CarlaPlugin* const plugin(pData->plugins[i].plugin);

std::sprintf(fTmpBuf, "PEAKS_%i\n", i);
fUiServer.writeMessage(fTmpBuf);

std::sprintf(fTmpBuf, "%f:%f:%f:%f\n", plugData.insPeak[0], plugData.insPeak[1], plugData.outsPeak[0], plugData.outsPeak[1]);
fUiServer.writeMessage(fTmpBuf);
fUiServer.flushMessages();

for (uint32_t j=0, count=plugin->getParameterCount(); j < count; ++j)
{
if (! plugin->isParameterOutput(j))
continue;

std::sprintf(fTmpBuf, "PARAMVAL_%i:%i\n", i, j);
fUiServer.writeMessage(fTmpBuf);
std::sprintf(fTmpBuf, "%f\n", plugin->getParameterValue(j));
fUiServer.writeMessage(fTmpBuf);
fUiServer.flushMessages();
}
}
}
idlePipe();

switch (fUiServer.getAndResetUiState())
{
@@ -1651,6 +1726,85 @@ protected:
}
}

void idlePipe()
{
if (! fUiServer.isPipeRunning())
return;

fUiServer.idlePipe();

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

const CarlaMutexLocker cml(fUiServer.getPipeLock());
const ScopedLocale csl;

#ifndef CARLA_OS_WIN
const EngineTimeInfo& timeInfo(pData->timeInfo);

// send transport
if (! fUiServer.writeAndFixMessage("transport"))
return;
if (! fUiServer.writeMessage(timeInfo.playing ? "true\n" : "false\n"))
return;

if (timeInfo.valid & EngineTimeInfo::kValidBBT)
{
std::sprintf(tmpBuf, P_UINT64 ":%i:%i:%i\n", timeInfo.frame, timeInfo.bbt.bar, timeInfo.bbt.beat, timeInfo.bbt.tick);
if (! fUiServer.writeMessage(tmpBuf))
return;

std::sprintf(tmpBuf, "%f\n", timeInfo.bbt.beatsPerMinute);
if (! fUiServer.writeMessage(tmpBuf))
return;
}
else
{
std::sprintf(tmpBuf, P_UINT64 ":0:0:0\n", timeInfo.frame);
if (! fUiServer.writeMessage(tmpBuf))
return;

if (! fUiServer.writeMessage("0.0\n"))
return;
}

fUiServer.flushMessages();
#endif

// send peaks and param outputs for all plugins
for (uint i=0; i < pData->curPluginCount; ++i)
{
const EnginePluginData& plugData(pData->plugins[i]);
const CarlaPlugin* const plugin(pData->plugins[i].plugin);

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

std::sprintf(tmpBuf, "%f:%f:%f:%f\n", plugData.insPeak[0], plugData.insPeak[1], plugData.outsPeak[0], plugData.outsPeak[1]);
if (! fUiServer.writeMessage(tmpBuf))
return;

fUiServer.flushMessages();

for (uint32_t j=0, count=plugin->getParameterCount(); j < count; ++j)
{
if (! plugin->isParameterOutput(j))
continue;

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

std::sprintf(tmpBuf, "%f\n", plugin->getParameterValue(j));
if (! fUiServer.writeMessage(tmpBuf))
return;

fUiServer.flushMessages();
}
}
}

// -------------------------------------------------------------------
// Plugin state calls

@@ -1847,7 +2001,6 @@ private:

bool fOptionsForced;
bool fWaitForReadyMsg;
char fTmpBuf[STR_MAX+1];

CarlaPlugin* _getFirstPlugin() const noexcept
{


+ 33
- 15
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -477,8 +477,11 @@ public:

const CarlaMutexLocker cml(getPipeLock());

_writeMsgBuffer("uiTitle\n", 8);
writeAndFixMessage(title);
if (! _writeMsgBuffer("uiTitle\n", 8))
return;
if (! writeAndFixMessage(title))
return;

flushMessages();
}

@@ -1317,43 +1320,58 @@ public:
const std::string& uri(*it);

std::snprintf(tmpBuf, 0xff, "%u\n", u);
if (! fPipeServer.writeMessage("urid\n", 5))
return;

fPipeServer.writeMessage("urid\n", 5);
fPipeServer.writeMessage(tmpBuf);
fPipeServer.writeAndFixMessage(uri.c_str());
if (! fPipeServer.writeMessage(tmpBuf))
return;
if (! fPipeServer.writeAndFixMessage(uri.c_str()))
return;
}

// write UI options
fPipeServer.writeMessage("uiOptions\n", 10);
if (! fPipeServer.writeMessage("uiOptions\n", 10))
return;

std::snprintf(tmpBuf, 0xff, "%g\n", pData->engine->getSampleRate());
fPipeServer.writeMessage(tmpBuf);
if (! fPipeServer.writeMessage(tmpBuf))
return;

std::snprintf(tmpBuf, 0xff, "%s\n", bool2str(true)); // useTheme
fPipeServer.writeMessage(tmpBuf);
if (! fPipeServer.writeMessage(tmpBuf))
return;

std::snprintf(tmpBuf, 0xff, "%s\n", bool2str(true)); // useThemeColors
fPipeServer.writeMessage(tmpBuf);
if (! fPipeServer.writeMessage(tmpBuf))
return;

fPipeServer.writeAndFixMessage(fLv2Options.windowTitle != nullptr ? fLv2Options.windowTitle : "");
if (! fPipeServer.writeAndFixMessage(fLv2Options.windowTitle != nullptr
? fLv2Options.windowTitle
: ""))
return;

std::snprintf(tmpBuf, 0xff, P_INTPTR "\n", frontendWinId);
fPipeServer.writeMessage(tmpBuf);
if (! fPipeServer.writeMessage(tmpBuf))
return;

// write parameter values
for (uint32_t i=0; i < pData->param.count; ++i)
{
fPipeServer.writeMessage("control\n", 8);
if (! fPipeServer.writeMessage("control\n", 8))
return;

std::snprintf(tmpBuf, 0xff, "%i\n", pData->param.data[i].rindex);
fPipeServer.writeMessage(tmpBuf);
if (! fPipeServer.writeMessage(tmpBuf))
return;

std::snprintf(tmpBuf, 0xff, "%f\n", getParameterValue(i));
fPipeServer.writeMessage(tmpBuf);
if (! fPipeServer.writeMessage(tmpBuf))
return;
}

// ready to show
fPipeServer.writeMessage("show\n", 5);
if (! fPipeServer.writeMessage("show\n", 5))
return;

fPipeServer.flushMessages();
}


+ 31
- 25
source/includes/CarlaNativeExtUI.hpp View File

@@ -60,9 +60,7 @@ protected:
{
if (isPipeRunning())
{
const CarlaMutexLocker cml(getPipeLock());
writeMessage("focus\n", 6);
flushMessages();
writeFocusMessage();
return;
}

@@ -114,15 +112,16 @@ protected:
const CarlaMutexLocker cml(getPipeLock());
const ScopedLocale csl;

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

{
std::snprintf(tmpBuf, 0xff, "%i\n", index);
writeMessage(tmpBuf);
std::snprintf(tmpBuf, 0xff, "%i\n", index);
if (! writeMessage(tmpBuf))
return;

std::snprintf(tmpBuf, 0xff, "%f\n", value);
writeMessage(tmpBuf);
}
std::snprintf(tmpBuf, 0xff, "%f\n", value);
if (! writeMessage(tmpBuf))
return;

flushMessages();
}
@@ -136,18 +135,20 @@ protected:

const CarlaMutexLocker cml(getPipeLock());

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

{
std::snprintf(tmpBuf, 0xff, "%i\n", channel);
writeMessage(tmpBuf);
std::snprintf(tmpBuf, 0xff, "%i\n", channel);
if (! writeMessage(tmpBuf))
return;

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

std::snprintf(tmpBuf, 0xff, "%i\n", program);
writeMessage(tmpBuf);
}
std::snprintf(tmpBuf, 0xff, "%i\n", program);
if (! writeMessage(tmpBuf))
return;

flushMessages();
}
@@ -159,10 +160,12 @@ protected:

const CarlaMutexLocker cml(getPipeLock());

writeMessage("configure\n", 10);

writeAndFixMessage(key);
writeAndFixMessage(value);
if (! writeMessage("configure\n", 10))
return;
if (! writeAndFixMessage(key))
return;
if (! writeAndFixMessage(value))
return;

flushMessages();
}
@@ -173,8 +176,11 @@ protected:

const CarlaMutexLocker cml(getPipeLock());

writeMessage("uiTitle\n", 8);
writeAndFixMessage(uiName);
if (! writeMessage("uiTitle\n", 8))
return;
if (! writeAndFixMessage(uiName))
return;

flushMessages();
}



+ 8
- 4
source/native-plugins/midi-pattern.cpp View File

@@ -306,14 +306,18 @@ protected:
const CarlaMutexLocker cml(getPipeLock());
const ScopedLocale csl;

writeAndFixMessage("transport");
writeMessage(fTimeInfo.playing ? "true\n" : "false\n");
if (! writeAndFixMessage("transport"))
return;
if (! writeMessage(fTimeInfo.playing ? "true\n" : "false\n"))
return;

std::sprintf(strBuf, P_UINT64 ":%i:%i:%i\n", fTimeInfo.frame, bar, beat, tick);
writeMessage(strBuf);
if (! writeMessage(strBuf))
return;

std::sprintf(strBuf, "%f:%f:%f\n", beatsPerMinute, beatsPerBar, beatType);
writeMessage(strBuf);
if (! writeMessage(strBuf))
return;

flushMessages();
}


+ 1
- 3
source/native-plugins/zynaddsubfx-synth.cpp View File

@@ -751,9 +751,7 @@ protected:
{
if (isPipeRunning())
{
const CarlaMutexLocker cml(getPipeLock());
writeMessage("focus\n", 6);
flushMessages();
writeFocusMessage();
return;
}



+ 105
- 70
source/utils/CarlaPipeUtils.cpp View File

@@ -697,6 +697,9 @@ bool CarlaPipeCommon::writeMessage(const char* const msg) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(msg != nullptr && msg[0] != '\0', false);

if (pData->pipeClosed)
return false;

const std::size_t size(std::strlen(msg));
CARLA_SAFE_ASSERT_RETURN(size > 0, false);
CARLA_SAFE_ASSERT_RETURN(msg[size-1] == '\n', false);
@@ -710,6 +713,9 @@ bool CarlaPipeCommon::writeMessage(const char* const msg, std::size_t size) cons
CARLA_SAFE_ASSERT_RETURN(size > 0, false);
CARLA_SAFE_ASSERT_RETURN(msg[size-1] == '\n', false);

if (pData->pipeClosed)
return false;

return _writeMsgBuffer(msg, size);
}

@@ -717,6 +723,9 @@ bool CarlaPipeCommon::writeAndFixMessage(const char* const msg) const noexcept
{
CARLA_SAFE_ASSERT_RETURN(msg != nullptr, false);

if (pData->pipeClosed)
return false;

const std::size_t size(std::strlen(msg));

char fixedMsg[size+2];
@@ -754,12 +763,9 @@ bool CarlaPipeCommon::writeAndFixMessage(const char* const msg) const noexcept

bool CarlaPipeCommon::flushMessages() const noexcept
{
#ifdef CARLA_OS_WIN
// TESTING remove later
const CarlaMutexTryLocker cmtl(pData->writeLock);
CARLA_SAFE_ASSERT_RETURN(cmtl.wasNotLocked(), false);
CARLA_SAFE_ASSERT_RETURN(pData->pipeSend != INVALID_PIPE_VALUE, false);

#ifdef CARLA_OS_WIN
try {
return (::FlushFileBuffers(pData->pipeSend) != FALSE);
} CARLA_SAFE_EXCEPTION_RETURN("CarlaPipeCommon::writeMsgBuffer", false);
@@ -776,8 +782,12 @@ void CarlaPipeCommon::writeErrorMessage(const char* const error) const noexcept
CARLA_SAFE_ASSERT_RETURN(error != nullptr && error[0] != '\0',);

const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("error\n", 6);
writeAndFixMessage(error);

if (! _writeMsgBuffer("error\n", 6))
return;
if (! writeAndFixMessage(error))
return;

flushMessages();
}

@@ -787,18 +797,22 @@ void CarlaPipeCommon::writeControlMessage(const uint32_t index, const float valu
tmpBuf[0xff] = '\0';

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

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

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

{
const ScopedLocale csl;
std::snprintf(tmpBuf, 0xff, "%f\n", value);
_writeMsgBuffer(tmpBuf, std::strlen(tmpBuf));
}

if (! _writeMsgBuffer(tmpBuf, std::strlen(tmpBuf)))
return;

flushMessages();
}

@@ -809,12 +823,12 @@ void CarlaPipeCommon::writeConfigureMessage(const char* const key, const char* c

const CarlaMutexLocker cml(pData->writeLock);

_writeMsgBuffer("configure\n", 10);
{
writeAndFixMessage(key);
writeAndFixMessage(value);
}
if (! _writeMsgBuffer("configure\n", 10))
return;
if (! writeAndFixMessage(key))
return;
if (! writeAndFixMessage(value))
return;

flushMessages();
}
@@ -826,12 +840,12 @@ void CarlaPipeCommon::writeProgramMessage(const uint32_t index) const noexcept

const CarlaMutexLocker cml(pData->writeLock);

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

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

flushMessages();
}
@@ -843,15 +857,16 @@ void CarlaPipeCommon::writeMidiProgramMessage(const uint32_t bank, const uint32_

const CarlaMutexLocker cml(pData->writeLock);

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

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

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

flushMessages();
}
@@ -867,21 +882,24 @@ void CarlaPipeCommon::writeMidiNoteMessage(const bool onOff, const uint8_t chann

const CarlaMutexLocker cml(pData->writeLock);

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

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

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

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

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

flushMessages();
}
@@ -898,17 +916,19 @@ void CarlaPipeCommon::writeLv2AtomMessage(const uint32_t index, const LV2_Atom*

const CarlaMutexLocker cml(pData->writeLock);

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

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

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

writeAndFixMessage(base64atom.buffer());
}
if (! writeAndFixMessage(base64atom.buffer()))
return;

flushMessages();
}
@@ -923,14 +943,15 @@ void CarlaPipeCommon::writeLv2UridMessage(const uint32_t urid, const char* const

const CarlaMutexLocker cml(pData->writeLock);

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

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

writeAndFixMessage(uri);
}
if (! writeAndFixMessage(uri))
return;

flushMessages();
}
@@ -1012,10 +1033,14 @@ const char* CarlaPipeCommon::_readlineblock(const uint32_t timeOutMilliseconds)

bool CarlaPipeCommon::_writeMsgBuffer(const char* const msg, const std::size_t size) const noexcept
{
// TESTING remove later
const CarlaMutexTryLocker cmtl(pData->writeLock);
CARLA_SAFE_ASSERT_RETURN(cmtl.wasNotLocked(), false);
CARLA_SAFE_ASSERT_RETURN(pData->pipeSend != INVALID_PIPE_VALUE, false);
if (pData->pipeClosed)
return false;

if (pData->pipeSend == INVALID_PIPE_VALUE)
{
carla_stderr2("CarlaPipe write error, isServer:%s, message was:\n%s", bool2str(pData->isServer), msg);
return false;
}

ssize_t ret;

@@ -1350,8 +1375,8 @@ void CarlaPipeServer::stopPipeServer(const uint32_t timeOutMilliseconds) noexcep

if (pData->pipeSend != INVALID_PIPE_VALUE)
{
_writeMsgBuffer("__carla-quit__\n", 15);
flushMessages();
if (_writeMsgBuffer("__carla-quit__\n", 15))
flushMessages();
}

waitForProcessToStopOrKillIt(pData->processInfo, timeOutMilliseconds);
@@ -1368,8 +1393,8 @@ void CarlaPipeServer::stopPipeServer(const uint32_t timeOutMilliseconds) noexcep

if (pData->pipeSend != INVALID_PIPE_VALUE)
{
_writeMsgBuffer("__carla-quit__\n", 15);
flushMessages();
if (_writeMsgBuffer("__carla-quit__\n", 15))
flushMessages();
}

waitForChildToStopOrKillIt(pData->pid, timeOutMilliseconds);
@@ -1416,21 +1441,30 @@ void CarlaPipeServer::closePipeServer() noexcept
void CarlaPipeServer::writeShowMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("show\n", 5);

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

flushMessages();
}

void CarlaPipeServer::writeFocusMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("focus\n", 6);

if (! _writeMsgBuffer("focus\n", 6))
return;

flushMessages();
}

void CarlaPipeServer::writeHideMessage() const noexcept
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("show\n", 5);

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

flushMessages();
}

@@ -1504,8 +1538,8 @@ bool CarlaPipeClient::initPipeClient(const char* argv[]) noexcept
pData->pipeClosed = false;
pData->clientClosingDown = false;

writeMessage("\n", 1);
flushMessages();
if (writeMessage("\n", 1))
flushMessages();

return true;
}
@@ -1543,8 +1577,9 @@ void CarlaPipeClient::writeExitingMessageAndWait() noexcept
{
{
const CarlaMutexLocker cml(pData->writeLock);
_writeMsgBuffer("exiting\n", 8);
flushMessages();

if (_writeMsgBuffer("exiting\n", 8))
flushMessages();
}

// NOTE: no more messages are handled after this point


Loading…
Cancel
Save