diff --git a/source/backend/engine/CarlaEngineNative.cpp b/source/backend/engine/CarlaEngineNative.cpp index 376314fcd..e7548f8c2 100644 --- a/source/backend/engine/CarlaEngineNative.cpp +++ b/source/backend/engine/CarlaEngineNative.cpp @@ -518,6 +518,8 @@ public: { carla_debug("CarlaEngineNative::CarlaEngineNative()"); + fTmpBuf[STR_MAX] = '\0'; + // set-up engine if (fIsPatchbay) { @@ -592,6 +594,19 @@ protected: // ------------------------------------------------------------------- + const char* renamePlugin(const unsigned int id, const char* const newName) override + { + if (const char* const retName = CarlaEngine::renamePlugin(id, newName)) + { + uiServerCallback(ENGINE_CALLBACK_PLUGIN_RENAMED, id, 0, 0, 0.0f, retName); + return retName; + } + + return nullptr; + } + + // ------------------------------------------------------------------- + void bufferSizeChanged(const uint32_t newBufferSize) { pData->bufferSize = newBufferSize; @@ -606,117 +621,200 @@ protected: // ------------------------------------------------------------------- + void uiServerSendPluginInfo(CarlaPlugin* const plugin) + { + const uint pluginId(plugin->getId()); + + std::sprintf(fTmpBuf, "PLUGIN_INFO_%i\n", pluginId); + fUiServer.writeMsg(fTmpBuf); + + std::sprintf(fTmpBuf, "%i:%i:%i:%li:%i:%i\n", plugin->getType(), plugin->getCategory(), plugin->getHints(), plugin->getUniqueId(), plugin->getOptionsAvailable(), plugin->getOptionsEnabled()); + fUiServer.writeMsg(fTmpBuf); + + if (const char* const filename = plugin->getFilename()) + { + std::sprintf(fTmpBuf, "%s", filename); + fUiServer.writeAndFixMsg(fTmpBuf); + } + else + fUiServer.writeMsg("\n"); + + if (const char* const name = plugin->getName()) + { + std::sprintf(fTmpBuf, "%s", name); + fUiServer.writeAndFixMsg(fTmpBuf); + } + else + fUiServer.writeMsg("\n"); + + if (const char* const iconName = plugin->getIconName()) + { + std::sprintf(fTmpBuf, "%s", iconName); + fUiServer.writeAndFixMsg(fTmpBuf); + } + else + fUiServer.writeMsg("\n"); + + plugin->getRealName(fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + + plugin->getLabel(fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + + plugin->getMaker(fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + + plugin->getCopyright(fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + + std::sprintf(fTmpBuf, "AUDIO_COUNT_%i:%i:%i\n", pluginId, plugin->getAudioInCount(), plugin->getAudioOutCount()); + fUiServer.writeMsg(fTmpBuf); + + std::sprintf(fTmpBuf, "MIDI_COUNT_%i:%i:%i\n", pluginId, plugin->getMidiInCount(), plugin->getMidiOutCount()); + fUiServer.writeMsg(fTmpBuf); + } + + void uiServerSendPluginParameters(CarlaPlugin* const plugin) + { + const uint pluginId(plugin->getId()); + + 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.writeMsg(fTmpBuf); + + for (uint32_t i=0; igetParameterData(i)); + const ParameterRanges& paramRanges(plugin->getParameterRanges(i)); + + std::sprintf(fTmpBuf, "PARAMETER_DATA_%i:%i\n", pluginId, i); + fUiServer.writeMsg(fTmpBuf); + std::sprintf(fTmpBuf, "%i:%i:%i:%i\n", paramData.type, paramData.hints, paramData.midiChannel, paramData.midiCC); + fUiServer.writeMsg(fTmpBuf); + plugin->getParameterName(i, fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + plugin->getParameterUnit(i, fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + + std::sprintf(fTmpBuf, "PARAMETER_RANGES_%i:%i\n", pluginId, i); + fUiServer.writeMsg(fTmpBuf); + std::sprintf(fTmpBuf, "%f:%f:%f:%f:%f:%f\n", paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); + fUiServer.writeMsg(fTmpBuf); + + std::sprintf(fTmpBuf, "PARAMVAL_%i:%i\n", pluginId, i); + fUiServer.writeMsg(fTmpBuf); + std::sprintf(fTmpBuf, "%f\n", plugin->getParameterValue(i)); + fUiServer.writeMsg(fTmpBuf); + } + } + + void uiServerSendPluginPrograms(CarlaPlugin* const plugin) + { + const uint pluginId(plugin->getId()); + + uint32_t count = plugin->getProgramCount(); + std::sprintf(fTmpBuf, "PROGRAM_COUNT_%i:%i:%i\n", pluginId, count, plugin->getCurrentProgram()); + fUiServer.writeMsg(fTmpBuf); + + for (uint32_t i=0; igetProgramName(i, fTmpBuf); + fUiServer.writeAndFixMsg(fTmpBuf); + } + + count = plugin->getMidiProgramCount(); + std::sprintf(fTmpBuf, "MIDI_PROGRAM_COUNT_%i:%i:%i\n", pluginId, count, plugin->getCurrentMidiProgram()); + fUiServer.writeMsg(fTmpBuf); + + for (uint32_t i=0; igetMidiProgramData(i)); + std::sprintf(fTmpBuf, "%i:%i\n", mpData.bank, mpData.program); + fUiServer.writeMsg(fTmpBuf); + std::sprintf(fTmpBuf, "%s", mpData.name); + fUiServer.writeAndFixMsg(fTmpBuf); + } + } + void uiServerCallback(const EngineCallbackOpcode action, const uint pluginId, const int value1, const int value2, const float value3, const char* const valueStr) { if (! fIsRunning) return; + if (! fUiServer.isOk()) + return; - char strBuf[STR_MAX+1]; + CarlaPlugin* plugin; switch (action) { - case ENGINE_CALLBACK_PLUGIN_ADDED: - if (CarlaPlugin* const plugin = getPlugin(pluginId)) + case ENGINE_CALLBACK_RELOAD_INFO: + plugin = getPlugin(pluginId); + + if (plugin != nullptr && plugin->isEnabled()) { CARLA_SAFE_ASSERT_BREAK(plugin->getId() == pluginId); + uiServerSendPluginInfo(plugin); + } + break; - std::sprintf(strBuf, "PLUGIN_INFO_%i\n", pluginId); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%i:%i:%i:%li\n", plugin->getType(), plugin->getCategory(), plugin->getHints(), plugin->getUniqueId()); - fUiServer.writeMsg(strBuf); - plugin->getRealName(strBuf); - fUiServer.writeAndFixMsg(strBuf); - std::sprintf(strBuf, "%s", plugin->getName()); - fUiServer.writeAndFixMsg(strBuf); - plugin->getLabel(strBuf); - fUiServer.writeAndFixMsg(strBuf); - plugin->getMaker(strBuf); - fUiServer.writeAndFixMsg(strBuf); - plugin->getCopyright(strBuf); - fUiServer.writeAndFixMsg(strBuf); - - std::sprintf(strBuf, "AUDIO_COUNT_%i\n", pluginId); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%i:%i\n", plugin->getAudioInCount(), plugin->getAudioOutCount()); - fUiServer.writeMsg(strBuf); - - std::sprintf(strBuf, "MIDI_COUNT_%i\n", pluginId); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%i:%i\n", plugin->getMidiInCount(), plugin->getMidiOutCount()); - fUiServer.writeMsg(strBuf); - - uint32_t ins, outs, count; - std::sprintf(strBuf, "PARAMETER_COUNT_%i\n", pluginId); - fUiServer.writeMsg(strBuf); - plugin->getParameterCountInfo(ins, outs); - count = plugin->getParameterCount(); - std::sprintf(strBuf, "%i:%i:%i\n", ins, outs, count); - fUiServer.writeMsg(strBuf); - - for (uint32_t i=0; igetParameterData(i)); - const ParameterRanges& paramRanges(plugin->getParameterRanges(i)); - - std::sprintf(strBuf, "PARAMETER_DATA_%i:%i\n", pluginId, i); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%i:%i\n", paramData.type, paramData.hints); - fUiServer.writeMsg(strBuf); - plugin->getParameterName(i, strBuf); - fUiServer.writeAndFixMsg(strBuf); - plugin->getParameterUnit(i, strBuf); - fUiServer.writeAndFixMsg(strBuf); - - std::sprintf(strBuf, "PARAMETER_MIDI_STUFF_%i:%i\n", pluginId, i); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%i:%i\n", paramData.midiChannel, paramData.midiCC); - fUiServer.writeMsg(strBuf); - - std::sprintf(strBuf, "PARAMETER_RANGES_%i:%i\n", pluginId, i); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%f:%f:%f:%f:%f:%f\n", paramRanges.def, paramRanges.min, paramRanges.max, paramRanges.step, paramRanges.stepSmall, paramRanges.stepLarge); - fUiServer.writeMsg(strBuf); - - std::sprintf(strBuf, "PARAMETER_VALUE_%i:%i\n", pluginId, i); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%f\n", plugin->getParameterValue(i)); - fUiServer.writeMsg(strBuf); - } + case ENGINE_CALLBACK_RELOAD_PARAMETERS: + plugin = getPlugin(pluginId); + + if (plugin != nullptr && plugin->isEnabled()) + { + CARLA_SAFE_ASSERT_BREAK(plugin->getId() == pluginId); + uiServerSendPluginParameters(plugin); } break; - case ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED: - std::sprintf(strBuf, "PARAMETER_VALUE_%i:%i\n", pluginId, value1); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%f\n", value3); - fUiServer.writeMsg(strBuf); + case ENGINE_CALLBACK_RELOAD_PROGRAMS: + plugin = getPlugin(pluginId); + + if (plugin != nullptr && plugin->isEnabled()) + { + CARLA_SAFE_ASSERT_BREAK(plugin->getId() == pluginId); + uiServerSendPluginPrograms(plugin); + } break; - case ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED: - std::sprintf(strBuf, "PARAMETER_DEFAULT_%i:%i\n", pluginId, value1); - fUiServer.writeMsg(strBuf); - std::sprintf(strBuf, "%f\n", value3); - fUiServer.writeMsg(strBuf); + case ENGINE_CALLBACK_RELOAD_ALL: + case ENGINE_CALLBACK_PLUGIN_ADDED: + plugin = getPlugin(pluginId); + + if (plugin != nullptr && plugin->isEnabled()) + { + CARLA_SAFE_ASSERT_BREAK(plugin->getId() == pluginId); + uiServerSendPluginInfo(plugin); + uiServerSendPluginParameters(plugin); + uiServerSendPluginPrograms(plugin); + } break; default: break; } - std::sprintf(strBuf, "ENGINE_CALLBACK_%i\n", int(action)); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "ENGINE_CALLBACK_%i\n", int(action)); + fUiServer.writeMsg(fTmpBuf); - std::sprintf(strBuf, "%u\n", pluginId); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "%u\n", pluginId); + fUiServer.writeMsg(fTmpBuf); - std::sprintf(strBuf, "%i\n", value1); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "%i\n", value1); + fUiServer.writeMsg(fTmpBuf); - std::sprintf(strBuf, "%i\n", value2); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "%i\n", value2); + fUiServer.writeMsg(fTmpBuf); - std::sprintf(strBuf, "%f\n", value3); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "%f\n", value3); + fUiServer.writeMsg(fTmpBuf); fUiServer.writeAndFixMsg(valueStr); } @@ -1057,6 +1155,16 @@ protected: { fUiServer.setData("/home/falktx/FOSS/GIT-mine/Carla/source/carla-plugin", pData->sampleRate, pHost->uiName); fUiServer.start(); + + for (uint i=0; i < pData->curPluginCount; ++i) + { + CarlaPlugin* const plugin(pData->plugins[i].plugin); + + if (plugin != nullptr && plugin->isEnabled()) + { + uiServerCallback(ENGINE_CALLBACK_PLUGIN_ADDED, i, 0, 0, 0.0f, plugin->getName()); + } + } } else { @@ -1069,17 +1177,30 @@ protected: CarlaEngine::idle(); fUiServer.idle(); - char strBuf[STR_MAX+1]; + if (! fUiServer.isOk()) + return; for (uint i=0; i < pData->curPluginCount; ++i) { const EnginePluginData& plugData(pData->plugins[i]); + const CarlaPlugin* const plugin(pData->plugins[i].plugin); - std::sprintf(strBuf, "PEAKS_%i\n", i); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "PEAKS_%i\n", i); + fUiServer.writeMsg(fTmpBuf); - std::sprintf(strBuf, "%f:%f:%f:%f\n", plugData.insPeak[0], plugData.insPeak[1], plugData.outsPeak[0], plugData.outsPeak[1]); - fUiServer.writeMsg(strBuf); + std::sprintf(fTmpBuf, "%f:%f:%f:%f\n", plugData.insPeak[0], plugData.insPeak[1], plugData.outsPeak[0], plugData.outsPeak[1]); + fUiServer.writeMsg(fTmpBuf); + + 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.writeMsg(fTmpBuf); + std::sprintf(fTmpBuf, "%f\n", plugin->getParameterValue(j)); + fUiServer.writeMsg(fTmpBuf); + } } switch (fUiServer.getAndResetUiState()) @@ -1155,7 +1276,7 @@ protected: return; } - bool pluginsAdded = false; + //bool pluginsAdded = false; for (QDomNode node = xmlNode.firstChild(); ! node.isNull(); node = node.nextSibling()) { @@ -1185,12 +1306,12 @@ protected: plugin->loadSaveState(saveState); } - pluginsAdded = true; + //pluginsAdded = true; } } - if (pluginsAdded) - pHost->dispatcher(pHost->handle, HOST_OPCODE_RELOAD_ALL, 0, 0, nullptr, 0.0f); + //if (pluginsAdded) + // pHost->dispatcher(pHost->handle, HOST_OPCODE_RELOAD_ALL, 0, 0, nullptr, 0.0f); } // ------------------------------------------------------------------- @@ -1336,7 +1457,7 @@ private: bool fIsActive, fIsRunning; CarlaEngineNativeUI fUiServer; - CarlaMutex fWriteLock; + char fTmpBuf[STR_MAX+1]; CarlaPlugin* _getFirstPlugin() const noexcept { diff --git a/source/carla-plugin b/source/carla-plugin index 4cbe6ae37..707f3dc95 100755 --- a/source/carla-plugin +++ b/source/carla-plugin @@ -93,6 +93,9 @@ class PluginHost(object): def _set_pluginInfo(self, pluginId, info): self.fPluginsInfo[pluginId].pluginInfo = info + def _set_pluginName(self, pluginId, name): + self.fPluginsInfo[pluginId].pluginInfo['name'] = name + def _set_pluginRealName(self, pluginId, realName): self.fPluginsInfo[pluginId].pluginRealName = realName @@ -155,7 +158,7 @@ class PluginHost(object): if paramIndex < self.fPluginsInfo[pluginId].parameterCount: self.fPluginsInfo[pluginId].parameterValueS[paramIndex] = value - def _set_parameterDefaultValue(self, pluginId, paramIndex, value): + def _set_parameterDefault(self, pluginId, paramIndex, value): if paramIndex < self.fPluginsInfo[pluginId].parameterCount: self.fPluginsInfo[pluginId].parameterRangeS[paramIndex]['def'] = value @@ -555,6 +558,11 @@ class CarlaMiniW(HostWindow, ExternalUI): in1, in2, out1, out2 = [float(i) for i in self.fPipeRecv.readline().strip().split(":")] Carla.host._set_peaks(pluginId, in1, in2, out1, out2) + elif msg.startswith("PARAMVAL_"): + pluginId, paramId = [int(i) for i in msg.replace("PARAMVAL_", "").split(":")] + paramValue = float(self.fPipeRecv.readline().strip()) + Carla.host._set_parameterValueS(pluginId, paramId, paramValue) + elif msg.startswith("ENGINE_CALLBACK_"): action = int(msg.replace("ENGINE_CALLBACK_", "")) pluginId = int(self.fPipeRecv.readline().strip()) @@ -562,15 +570,33 @@ class CarlaMiniW(HostWindow, ExternalUI): value2 = int(self.fPipeRecv.readline().strip()) value3 = float(self.fPipeRecv.readline().strip()) valueStr = self.fPipeRecv.readline().strip().replace("\r", "\n") + + if action == ENGINE_CALLBACK_PLUGIN_RENAMED: + Carla.host._set_pluginName(pluginId, valueStr) + elif action == ENGINE_CALLBACK_PARAMETER_VALUE_CHANGED: + Carla.host._set_parameterValueS(pluginId, value1, value3) + elif action == ENGINE_CALLBACK_PARAMETER_DEFAULT_CHANGED: + Carla.host._set_parameterDefault(pluginId, value1, value3) + elif action == ENGINE_CALLBACK_PARAMETER_MIDI_CC_CHANGED: + Carla.host._set_parameterMidiCC(pluginId, value1, value2) + elif action == ENGINE_CALLBACK_PARAMETER_MIDI_CHANNEL_CHANGED: + Carla.host._set_parameterMidiChannel(pluginId, value1, value2) + elif action == ENGINE_CALLBACK_PROGRAM_CHANGED: + Carla.host._set_currentProgram(pluginId, value1) + elif action == ENGINE_CALLBACK_MIDI_PROGRAM_CHANGED: + Carla.host._set_currentMidiProgram(pluginId, value1) + engineCallback(None, action, pluginId, value1, value2, value3, valueStr) elif msg.startswith("PLUGIN_INFO_"): pluginId = int(msg.replace("PLUGIN_INFO_", "")) Carla.host._add(pluginId) - type_, category, hints, uniqueId = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] - realName = self.fPipeRecv.readline().strip().replace("\r", "\n") + type_, category, hints, uniqueId, optsAvail, optsEnabled = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] + filename = self.fPipeRecv.readline().strip().replace("\r", "\n") name = self.fPipeRecv.readline().strip().replace("\r", "\n") + iconName = self.fPipeRecv.readline().strip().replace("\r", "\n") + realName = self.fPipeRecv.readline().strip().replace("\r", "\n") label = self.fPipeRecv.readline().strip().replace("\r", "\n") maker = self.fPipeRecv.readline().strip().replace("\r", "\n") copyright = self.fPipeRecv.readline().strip().replace("\r", "\n") @@ -579,39 +605,35 @@ class CarlaMiniW(HostWindow, ExternalUI): 'type': type_, 'category': category, 'hints': hints, - 'optionsAvailable': 0x0, # TODO - 'optionsEnabled': 0x0, # TODO - 'filename': "", # TODO + 'optionsAvailable': optsAvail, + 'optionsEnabled': optsEnabled, + 'filename': filename, 'name': name, 'label': label, 'maker': maker, 'copyright': copyright, - 'iconName': None, # TODO + 'iconName': iconName, 'patchbayClientId': 0, 'uniqueId': uniqueId } - Carla.host._set_pluginInfo(pluginId, pinfo) Carla.host._set_pluginRealName(pluginId, realName) elif msg.startswith("AUDIO_COUNT_"): - pluginId = int(msg.replace("AUDIO_COUNT_", "")) - ins, outs = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] + pluginId, ins, outs = [int(i) for i in msg.replace("AUDIO_COUNT_", "").split(":")] Carla.host._set_audioCountInfo(pluginId, {'ins': ins, 'outs': outs}) elif msg.startswith("MIDI_COUNT_"): - pluginId = int(msg.replace("MIDI_COUNT_", "")) - ins, outs = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] + pluginId, ins, outs = [int(i) for i in msg.replace("MIDI_COUNT_", "").split(":")] Carla.host._set_midiCountInfo(pluginId, {'ins': ins, 'outs': outs}) elif msg.startswith("PARAMETER_COUNT_"): - pluginId = int(msg.replace("PARAMETER_COUNT_", "")) - ins, outs, count = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] + pluginId, ins, outs, count = [int(i) for i in msg.replace("PARAMETER_COUNT_", "").split(":")] Carla.host._set_parameterCountInfo(pluginId, count, {'ins': ins, 'outs': outs}) elif msg.startswith("PARAMETER_DATA_"): pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_DATA_", "").split(":")] - paramType, paramHints = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] + paramType, paramHints, midiChannel, midiCC = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] paramName = self.fPipeRecv.readline().strip().replace("\r", "\n") paramUnit = self.fPipeRecv.readline().strip().replace("\r", "\n") @@ -628,17 +650,11 @@ class CarlaMiniW(HostWindow, ExternalUI): 'hints': paramHints, 'index': paramId, 'rindex': -1, - 'midiCC': -1, - 'midiChannel': 0 + 'midiCC': midiCC, + 'midiChannel': midiChannel } Carla.host._set_parameterDataS(pluginId, paramId, paramData) - elif msg.startswith("PARAMETER_MIDI_STUFF_"): - pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_MIDI_STUFF_", "").split(":")] - midiChannel, midiCC = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] - Carla.host._set_parameterMidiChannel(pluginId, paramId, midiChannel) - Carla.host._set_parameterMidiCC(pluginId, paramId, midiCC) - elif msg.startswith("PARAMETER_RANGES_"): pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_RANGES_", "").split(":")] def_, min_, max_, step, stepSmall, stepLarge = [float(i) for i in self.fPipeRecv.readline().strip().split(":")] @@ -653,10 +669,26 @@ class CarlaMiniW(HostWindow, ExternalUI): } Carla.host._set_parameterRangeS(pluginId, paramId, paramRanges) - elif msg.startswith("PARAMETER_VALUE_"): - pluginId, paramId = [int(i) for i in msg.replace("PARAMETER_VALUE_", "").split(":")] - paramValue = float(self.fPipeRecv.readline().strip()) - Carla.host._set_parameterValueS(pluginId, paramId, paramValue) + elif msg.startswith("PROGRAM_COUNT_"): + pluginId, count, current = [int(i) for i in msg.replace("PROGRAM_COUNT_", "").split(":")] + Carla.host._set_programCount(pluginId, count) + Carla.host._set_currentProgram(pluginId, current) + + elif msg.startswith("PROGRAM_NAME_"): + pluginId, progId = [int(i) for i in msg.replace("PROGRAM_NAME_", "").split(":")] + progName = self.fPipeRecv.readline().strip().replace("\r", "\n") + Carla.host._set_programNameS(pluginId, progId, progName) + + elif msg.startswith("MIDI_PROGRAM_COUNT_"): + pluginId, count, current = [int(i) for i in msg.replace("MIDI_PROGRAM_COUNT_", "").split(":")] + Carla.host._set_midiProgramCount(pluginId, count) + Carla.host._set_currentMidiProgram(pluginId, current) + + elif msg.startswith("MIDI_PROGRAM_DATA_"): + pluginId, midiProgId = [int(i) for i in msg.replace("MIDI_PROGRAM_DATA_", "").split(":")] + bank, program = [int(i) for i in self.fPipeRecv.readline().strip().split(":")] + name = self.fPipeRecv.readline().strip().replace("\r", "\n") + Carla.host._set_midiProgramDataS(pluginId, midiProgId, {'bank': bank, 'program': program, 'name': name}) elif msg == "show": self.d_uiShow() diff --git a/source/utils/CarlaPipeUtils.hpp b/source/utils/CarlaPipeUtils.hpp index 9c11a4e5c..0824cd37b 100644 --- a/source/utils/CarlaPipeUtils.hpp +++ b/source/utils/CarlaPipeUtils.hpp @@ -58,6 +58,11 @@ public: stop(); } + bool isOk() const noexcept + { + return (fPipeRecv != -1 && fPipeSend != -1 && fPid != -1); + } + bool start(const char* const filename, const char* const arg1, const char* const arg2) { CARLA_SAFE_ASSERT_RETURN(filename != nullptr && filename[0] != '\0', false);