| @@ -1525,7 +1525,14 @@ void CarlaEngine::saveProjectInternal(juce::MemoryOutputStream& outStream) const | |||||
| CarlaPlugin* const plugin(pData->plugins[i].plugin); | CarlaPlugin* const plugin(pData->plugins[i].plugin); | ||||
| if (plugin != nullptr && plugin->isEnabled()) | if (plugin != nullptr && plugin->isEnabled()) | ||||
| { | |||||
| #ifndef BUILD_BRIDGE | |||||
| // deactivate bridge client-side ping check, since some plugins block during save | |||||
| if (plugin->getHints() & PLUGIN_IS_BRIDGE) | |||||
| plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "false", false); | |||||
| #endif | |||||
| plugin->prepareForSave(); | plugin->prepareForSave(); | ||||
| } | |||||
| } | } | ||||
| outStream << "<?xml version='1.0' encoding='UTF-8'?>\n"; | outStream << "<?xml version='1.0' encoding='UTF-8'?>\n"; | ||||
| @@ -1599,7 +1606,7 @@ void CarlaEngine::saveProjectInternal(juce::MemoryOutputStream& outStream) const | |||||
| CarlaPlugin* const plugin(pData->plugins[i].plugin); | CarlaPlugin* const plugin(pData->plugins[i].plugin); | ||||
| if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | ||||
| plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "SavedComplete", "", false); | |||||
| plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "true", false); | |||||
| } | } | ||||
| bool saveConnections = true; | bool saveConnections = true; | ||||
| @@ -1817,7 +1824,15 @@ bool CarlaEngine::loadProjectInternal(juce::XmlDocument& xmlDoc) | |||||
| if (addPlugin(btype, ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) | if (addPlugin(btype, ptype, stateSave.binary, stateSave.name, stateSave.label, stateSave.uniqueId, extraStuff)) | ||||
| { | { | ||||
| if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) | if (CarlaPlugin* const plugin = getPlugin(pData->curPluginCount-1)) | ||||
| { | |||||
| #ifndef BUILD_BRIDGE | |||||
| // deactivate bridge client-side ping check, since some plugins block during load | |||||
| if ((plugin->getHints() & PLUGIN_IS_BRIDGE) != 0 && ! isPreset) | |||||
| plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "false", false); | |||||
| #endif | |||||
| plugin->loadStateSave(stateSave); | plugin->loadStateSave(stateSave); | ||||
| } | |||||
| } | } | ||||
| else | else | ||||
| carla_stderr2("Failed to load a plugin, error was:\n%s", getLastError()); | carla_stderr2("Failed to load a plugin, error was:\n%s", getLastError()); | ||||
| @@ -1828,6 +1843,15 @@ bool CarlaEngine::loadProjectInternal(juce::XmlDocument& xmlDoc) | |||||
| } | } | ||||
| #ifndef BUILD_BRIDGE | #ifndef BUILD_BRIDGE | ||||
| // tell bridges we're done loading | |||||
| for (uint i=0; i < pData->curPluginCount; ++i) | |||||
| { | |||||
| CarlaPlugin* const plugin(pData->plugins[i].plugin); | |||||
| if (plugin != nullptr && plugin->isEnabled() && (plugin->getHints() & PLUGIN_IS_BRIDGE) != 0) | |||||
| plugin->setCustomData(CUSTOM_DATA_TYPE_STRING, "__CarlaPingOnOff__", "true", false); | |||||
| } | |||||
| callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); | callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); | ||||
| // if we're running inside some session-manager, let them handle the connections | // if we're running inside some session-manager, let them handle the connections | ||||
| @@ -904,6 +904,8 @@ public: | |||||
| const uint32_t onOff(fShmNonRtClientControl.readBool()); | const uint32_t onOff(fShmNonRtClientControl.readBool()); | ||||
| fLastPingTime = onOff ? Time::currentTimeMillis() : -1; | fLastPingTime = onOff ? Time::currentTimeMillis() : -1; | ||||
| carla_stdout("Carla bridge client side, OnOff ping checks => %s", bool2str(onOff)); | |||||
| } break; | } break; | ||||
| case kPluginBridgeNonRtClientActivate: | case kPluginBridgeNonRtClientActivate: | ||||
| @@ -1018,6 +1020,8 @@ public: | |||||
| CARLA_SAFE_ASSERT_BREAK(chunkFilePathTry[0] != '\0'); | CARLA_SAFE_ASSERT_BREAK(chunkFilePathTry[0] != '\0'); | ||||
| if (plugin == nullptr || ! plugin->isEnabled()) break; | if (plugin == nullptr || ! plugin->isEnabled()) break; | ||||
| carla_stdout("Carla bridge client side setChunkData 001"); | |||||
| String chunkFilePath(chunkFilePathTry); | String chunkFilePath(chunkFilePathTry); | ||||
| #ifdef CARLA_OS_WIN | #ifdef CARLA_OS_WIN | ||||
| @@ -1034,7 +1038,10 @@ public: | |||||
| CARLA_SAFE_ASSERT_BREAK(chunkDataBase64.isNotEmpty()); | CARLA_SAFE_ASSERT_BREAK(chunkDataBase64.isNotEmpty()); | ||||
| std::vector<uint8_t> chunk(carla_getChunkFromBase64String(chunkDataBase64.toRawUTF8())); | std::vector<uint8_t> chunk(carla_getChunkFromBase64String(chunkDataBase64.toRawUTF8())); | ||||
| carla_stdout("Carla bridge client side setChunkData 002"); | |||||
| plugin->setChunkData(chunk.data(), chunk.size()); | plugin->setChunkData(chunk.data(), chunk.size()); | ||||
| carla_stdout("Carla bridge client side setChunkData done"); | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -923,10 +923,6 @@ public: | |||||
| { | { | ||||
| const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | ||||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientPingOnOff); | |||||
| fShmNonRtClientControl.writeBool(false); | |||||
| fShmNonRtClientControl.commitWrite(); | |||||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientPrepareForSave); | fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientPrepareForSave); | ||||
| fShmNonRtClientControl.commitWrite(); | fShmNonRtClientControl.commitWrite(); | ||||
| } | } | ||||
| @@ -1089,13 +1085,15 @@ public: | |||||
| CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | CARLA_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); | ||||
| CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | CARLA_SAFE_ASSERT_RETURN(value != nullptr,); | ||||
| if (std::strcmp(type, CUSTOM_DATA_TYPE_STRING) == 0 && std::strcmp(key, "SavedComplete") == 0) | |||||
| if (std::strcmp(type, CUSTOM_DATA_TYPE_STRING) == 0 && std::strcmp(key, "__CarlaPingOnOff__") == 0) | |||||
| { | { | ||||
| const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | ||||
| fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientPingOnOff); | fShmNonRtClientControl.writeOpcode(kPluginBridgeNonRtClientPingOnOff); | ||||
| fShmNonRtClientControl.writeBool(true); | |||||
| fShmNonRtClientControl.writeBool(std::strcmp(value, "true") == 0); | |||||
| fShmNonRtClientControl.commitWrite(); | fShmNonRtClientControl.commitWrite(); | ||||
| carla_stdout("Carla bridge server side, OnOff ping checks => %s", value); | |||||
| return; | return; | ||||
| } | } | ||||
| @@ -1129,6 +1127,8 @@ public: | |||||
| CARLA_SAFE_ASSERT_RETURN(data != nullptr,); | CARLA_SAFE_ASSERT_RETURN(data != nullptr,); | ||||
| CARLA_SAFE_ASSERT_RETURN(dataSize > 0,); | CARLA_SAFE_ASSERT_RETURN(dataSize > 0,); | ||||
| carla_stdout("Carla bridge server side, setChunkData 001"); | |||||
| CarlaString dataBase64(CarlaString::asBase64(data, dataSize)); | CarlaString dataBase64(CarlaString::asBase64(data, dataSize)); | ||||
| CARLA_SAFE_ASSERT_RETURN(dataBase64.length() > 0,); | CARLA_SAFE_ASSERT_RETURN(dataBase64.length() > 0,); | ||||
| @@ -1139,6 +1139,8 @@ public: | |||||
| if (File(filePath).replaceWithText(dataBase64.buffer())) | if (File(filePath).replaceWithText(dataBase64.buffer())) | ||||
| { | { | ||||
| carla_stdout("Carla bridge server side, setChunkData 002"); | |||||
| const uint32_t ulength(static_cast<uint32_t>(filePath.length())); | const uint32_t ulength(static_cast<uint32_t>(filePath.length())); | ||||
| const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | const CarlaMutexLocker _cml(fShmNonRtClientControl.mutex); | ||||
| @@ -1147,11 +1149,15 @@ public: | |||||
| fShmNonRtClientControl.writeUInt(ulength); | fShmNonRtClientControl.writeUInt(ulength); | ||||
| fShmNonRtClientControl.writeCustomData(filePath.toRawUTF8(), ulength); | fShmNonRtClientControl.writeCustomData(filePath.toRawUTF8(), ulength); | ||||
| fShmNonRtClientControl.commitWrite(); | fShmNonRtClientControl.commitWrite(); | ||||
| carla_stdout("Carla bridge server side, setChunkData sent"); | |||||
| } | } | ||||
| // save data internally as well | // save data internally as well | ||||
| fInfo.chunk.resize(dataSize); | fInfo.chunk.resize(dataSize); | ||||
| std::memcpy(fInfo.chunk.data(), data, dataSize); | std::memcpy(fInfo.chunk.data(), data, dataSize); | ||||
| carla_stdout("Carla bridge server side, setChunkData saved locally too"); | |||||
| } | } | ||||
| // ------------------------------------------------------------------- | // ------------------------------------------------------------------- | ||||