From 1d74a7dca265823a16f620a892c266a8862ed93a Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 28 Dec 2014 03:45:14 +0000 Subject: [PATCH] More of the same, bridges now run but without any info --- source/backend/engine/CarlaEngineBridge.cpp | 207 ++++++++++++++---- source/backend/plugin/CarlaPluginBridge.cpp | 28 +-- source/backend/plugin/CarlaPluginInternal.hpp | 1 - source/backend/plugin/Makefile | 1 - source/bridges-plugin/CarlaBridgePlugin.cpp | 59 +---- source/bridges-plugin/Makefile | 2 - 6 files changed, 181 insertions(+), 117 deletions(-) diff --git a/source/backend/engine/CarlaEngineBridge.cpp b/source/backend/engine/CarlaEngineBridge.cpp index 5d66107a4..d4b6b24c1 100644 --- a/source/backend/engine/CarlaEngineBridge.cpp +++ b/source/backend/engine/CarlaEngineBridge.cpp @@ -121,13 +121,11 @@ struct BridgeRtClientControl : public CarlaRingBufferControl { { filename.clear(); + if (data != nullptr) + unmapData(); + if (! jackbridge_shm_is_valid(shm)) - { - CARLA_SAFE_ASSERT(data == nullptr); return; - } - - data = nullptr; jackbridge_shm_close(shm); jackbridge_shm_init(shm); @@ -157,6 +155,12 @@ struct BridgeRtClientControl : public CarlaRingBufferControl { return false; } + void unmapData() noexcept + { + data = nullptr; + setRingBuffer(nullptr, false); + } + bool postClient() noexcept { CARLA_SAFE_ASSERT_RETURN(data != nullptr, false); @@ -202,29 +206,33 @@ struct BridgeNonRtClientControl : public CarlaRingBufferControl clear(); } - bool attach() noexcept - { - jackbridge_shm_attach(shm, filename); - - return jackbridge_shm_is_valid(shm); - } - void clear() noexcept { filename.clear(); + if (data != nullptr) + unmapData(); + if (! jackbridge_shm_is_valid(shm)) { CARLA_SAFE_ASSERT(data == nullptr); return; } - data = nullptr; - jackbridge_shm_close(shm); jackbridge_shm_init(shm); } + bool attach() noexcept + { + // must be invalid right now + CARLA_SAFE_ASSERT_RETURN(! jackbridge_shm_is_valid(shm), false); + + jackbridge_shm_attach(shm, filename); + + return jackbridge_shm_is_valid(shm); + } + bool mapData() noexcept { CARLA_SAFE_ASSERT(data == nullptr); @@ -238,6 +246,12 @@ struct BridgeNonRtClientControl : public CarlaRingBufferControl return false; } + void unmapData() noexcept + { + data = nullptr; + setRingBuffer(nullptr, false); + } + PluginBridgeNonRtClientOpcode readOpcode() noexcept { return static_cast(readUInt()); @@ -271,29 +285,33 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl clear(); } - bool attach() noexcept - { - jackbridge_shm_attach(shm, filename); - - return jackbridge_shm_is_valid(shm); - } - void clear() noexcept { filename.clear(); + if (data != nullptr) + unmapData(); + if (! jackbridge_shm_is_valid(shm)) { CARLA_SAFE_ASSERT(data == nullptr); return; } - data = nullptr; - jackbridge_shm_close(shm); jackbridge_shm_init(shm); } + bool attach() noexcept + { + // must be invalid right now + CARLA_SAFE_ASSERT_RETURN(! jackbridge_shm_is_valid(shm), false); + + jackbridge_shm_attach(shm, filename); + + return jackbridge_shm_is_valid(shm); + } + bool mapData() noexcept { CARLA_SAFE_ASSERT(data == nullptr); @@ -307,6 +325,12 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl return false; } + void unmapData() noexcept + { + data = nullptr; + setRingBuffer(nullptr, false); + } + void writeOpcode(const PluginBridgeNonRtServerOpcode opcode) noexcept { writeUInt(static_cast(opcode)); @@ -330,6 +354,8 @@ public: fShmNonRtServerControl(), fIsRunning(false), fIsOffline(false), + fFirstIdle(true), + fLastPingCounter(-1), leakDetector_CarlaEngineBridge() { carla_stdout("CarlaEngineBridge::CarlaEngineBridge(\"%s\", \"%s\", \"%s\", \"%s\")", audioPoolBaseName, rtClientBaseName, nonRtClientBaseName, nonRtServerBaseName); @@ -374,28 +400,42 @@ public: if (! fShmRtClientControl.attach()) { clear(); - carla_stdout("Failed to attach to rt control shared memory"); + carla_stdout("Failed to attach to rt client control shared memory"); return false; } if (! fShmRtClientControl.mapData()) { clear(); - carla_stdout("Failed to map rt control shared memory"); + carla_stdout("Failed to map rt client control shared memory"); return false; } if (! fShmNonRtClientControl.attach()) { clear(); - carla_stdout("Failed to attach to non-rt control shared memory"); + carla_stdout("Failed to attach to non-rt client control shared memory"); return false; } if (! fShmNonRtClientControl.mapData()) { clear(); - carla_stdout("Failed to map non-rt control shared memory"); + carla_stdout("Failed to map non-rt control client shared memory"); + return false; + } + + if (! fShmNonRtServerControl.attach()) + { + clear(); + carla_stdout("Failed to attach to non-rt server control shared memory"); + return false; + } + + if (! fShmNonRtServerControl.mapData()) + { + clear(); + carla_stdout("Failed to map non-rt control server shared memory"); return false; } @@ -404,11 +444,14 @@ public: opcode = fShmNonRtClientControl.readOpcode(); CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientNull, opcode); - const uint32_t shmRtDataSize = fShmNonRtClientControl.readUInt(); - CARLA_SAFE_ASSERT_INT2(shmRtDataSize == sizeof(BridgeRtClientData), shmRtDataSize, sizeof(BridgeRtClientData)); + const uint32_t shmRtClientDataSize = fShmNonRtClientControl.readUInt(); + CARLA_SAFE_ASSERT_INT2(shmRtClientDataSize == sizeof(BridgeRtClientData), shmRtClientDataSize, sizeof(BridgeRtClientData)); + + const uint32_t shmNonRtClientDataSize = fShmNonRtClientControl.readUInt(); + CARLA_SAFE_ASSERT_INT2(shmNonRtClientDataSize == sizeof(BridgeNonRtClientData), shmNonRtClientDataSize, sizeof(BridgeNonRtClientData)); - const uint32_t shmNonRtDataSize = fShmNonRtClientControl.readUInt(); - CARLA_SAFE_ASSERT_INT2(shmNonRtDataSize == sizeof(BridgeNonRtClientData), shmNonRtDataSize, sizeof(BridgeNonRtClientData)); + const uint32_t shmNonRtServerDataSize = fShmNonRtClientControl.readUInt(); + CARLA_SAFE_ASSERT_INT2(shmNonRtServerDataSize == sizeof(BridgeNonRtServerData), shmNonRtServerDataSize, sizeof(BridgeNonRtServerData)); opcode = fShmNonRtClientControl.readOpcode(); CARLA_SAFE_ASSERT_INT(opcode == kPluginBridgeNonRtClientSetBufferSize, opcode); @@ -421,10 +464,11 @@ public: carla_stdout("Carla Client Info:"); carla_stdout(" BufferSize: %i", pData->bufferSize); carla_stdout(" SampleRate: %g", pData->sampleRate); - carla_stdout(" sizeof(BridgeRtData): %i/" P_SIZE, shmRtDataSize, sizeof(BridgeRtClientData)); - carla_stdout(" sizeof(BridgeNonRtData): %i/" P_SIZE, shmNonRtDataSize, sizeof(BridgeNonRtClientData)); + carla_stdout(" sizeof(BridgeRtClientData): %i/" P_SIZE, shmRtClientDataSize, sizeof(BridgeRtClientData)); + carla_stdout(" sizeof(BridgeNonRtClientData): %i/" P_SIZE, shmNonRtClientDataSize, sizeof(BridgeNonRtClientData)); + carla_stdout(" sizeof(BridgeNonRtServerData): %i/" P_SIZE, shmNonRtServerDataSize, sizeof(BridgeNonRtServerData)); - if (shmRtDataSize != sizeof(BridgeRtClientData) || shmNonRtDataSize != sizeof(BridgeNonRtClientData)) + if (shmRtClientDataSize != sizeof(BridgeRtClientData) || shmNonRtClientDataSize != sizeof(BridgeNonRtClientData) || shmNonRtServerDataSize != sizeof(BridgeNonRtServerData)) return false; startThread(); @@ -435,6 +479,8 @@ public: bool close() override { carla_debug("CarlaEnginePlugin::close()"); + fLastPingCounter = -1; + CarlaEngine::close(); stopThread(5000); @@ -465,13 +511,34 @@ public: void idle() noexcept override { - CarlaEngine::idle(); + if (fFirstIdle) + { + fFirstIdle = false; + fLastPingCounter = 0; + + const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex); + + // TODO - send plugin data + + fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerReady); + fShmNonRtServerControl.commitWrite(); + + carla_stdout("Carla Client Ready!"); + } // TODO - send output parameters to server + CarlaEngine::idle(); + try { handleNonRtData(); } CARLA_SAFE_EXCEPTION("handleNonRtData"); + + if (fLastPingCounter >= 0 && ++fLastPingCounter == 500) + { + carla_stderr("Did not receive ping message from server for a long time, closing..."); + callback(ENGINE_CALLBACK_QUIT, 0, 0, 0, 0.0f, nullptr); + } } // ------------------------------------------------------------------- @@ -481,6 +548,7 @@ public: fShmAudioPool.clear(); fShmRtClientControl.clear(); fShmNonRtClientControl.clear(); + fShmNonRtServerControl.clear(); } void handleNonRtData() @@ -501,9 +569,15 @@ public: case kPluginBridgeNonRtClientNull: break; - case kPluginBridgeNonRtClientPing: - //oscSend_bridge_pong(); - break; + case kPluginBridgeNonRtClientPing: { + if (fLastPingCounter > 0) + fLastPingCounter = 0; + + const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex); + + fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerPong); + fShmNonRtServerControl.commitWrite(); + } break; case kPluginBridgeNonRtClientActivate: if (plugin != nullptr && plugin->isEnabled()) @@ -660,15 +734,43 @@ public: plugin->prepareForSave(); - //for (uint32_t i=0, count=plugin->getCustomDataCount(); igetCustomDataCount(); igetCustomData(i)); - //oscSend_bridge_set_custom_data(cdata.type, cdata.key, cdata.value); + using namespace juce; + + const CustomData& cdata(plugin->getCustomData(i)); + + const uint32_t typeLen(static_cast(std::strlen(cdata.type))); + const uint32_t keyLen(static_cast(std::strlen(cdata.key))); + + MemoryOutputStream valueMemStream; + GZIPCompressorOutputStream compressedValueStream(&valueMemStream, 9, false); + compressedValueStream.write(cdata.value, std::strlen(cdata.value)); + + const CarlaString valueBase64(CarlaString::asBase64(valueMemStream.getData(), valueMemStream.getDataSize())); + const uint32_t valueBase64Len(static_cast(valueBase64.length())); + CARLA_SAFE_ASSERT_CONTINUE(valueBase64.length() > 0); + + { + const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex); + + fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSetCustomData); + + fShmNonRtServerControl.writeUInt(typeLen); + fShmNonRtServerControl.writeCustomData(cdata.type, typeLen); + + fShmNonRtServerControl.writeUInt(keyLen); + fShmNonRtServerControl.writeCustomData(cdata.key, keyLen); + + fShmNonRtServerControl.writeUInt(valueBase64Len); + fShmNonRtServerControl.writeCustomData(valueBase64.buffer(), valueBase64Len); + + fShmNonRtServerControl.commitWrite(); + } } if (plugin->getOptionsEnabled() & PLUGIN_OPTION_USE_CHUNKS) { - /* void* data = nullptr; if (const std::size_t dataSize = plugin->getChunkData(&data)) { @@ -684,12 +786,25 @@ public: filePath += fShmNonRtClientControl.filename.buffer() + 24; if (File(filePath).replaceWithText(dataBase64.buffer())) - oscSend_bridge_set_chunk_data_file(filePath.toRawUTF8()); + { + const uint32_t ulength(static_cast(filePath.length())); + + const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex); + + fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSetChunkDataFile); + fShmNonRtServerControl.writeUInt(ulength); + fShmNonRtServerControl.writeCustomData(filePath.toRawUTF8(), ulength); + fShmNonRtServerControl.commitWrite(); + } } - */ } - //oscSend_bridge_configure(CARLA_BRIDGE_MSG_SAVED, ""); + { + const CarlaMutexLocker _cml(fShmNonRtServerControl.mutex); + + fShmNonRtServerControl.writeOpcode(kPluginBridgeNonRtServerSaved); + fShmNonRtServerControl.commitWrite(); + } break; } @@ -1016,6 +1131,8 @@ private: bool fIsRunning; bool fIsOffline; + bool fFirstIdle; + int32_t fLastPingCounter; CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaEngineBridge) }; diff --git a/source/backend/plugin/CarlaPluginBridge.cpp b/source/backend/plugin/CarlaPluginBridge.cpp index 8b16e1494..3ad2bfe13 100644 --- a/source/backend/plugin/CarlaPluginBridge.cpp +++ b/source/backend/plugin/CarlaPluginBridge.cpp @@ -210,10 +210,7 @@ struct BridgeRtClientControl : public CarlaRingBufferControl { unmapData(); if (! carla_is_shm_valid(shm)) - { - CARLA_SAFE_ASSERT(data == nullptr); return; - } carla_shm_close(shm); carla_shm_init(shm); @@ -322,10 +319,7 @@ struct BridgeNonRtClientControl : public CarlaRingBufferControl unmapData(); if (! carla_is_shm_valid(shm)) - { - CARLA_SAFE_ASSERT(data == nullptr); return; - } carla_shm_close(shm); carla_shm_init(shm); @@ -420,10 +414,7 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl unmapData(); if (! carla_is_shm_valid(shm)) - { - CARLA_SAFE_ASSERT(data == nullptr); return; - } carla_shm_close(shm); carla_shm_init(shm); @@ -498,7 +489,7 @@ public: CARLA_SAFE_ASSERT(! isThreadRunning()); fBinary = binary; - fLabel = binary; + fLabel = label; fShmIds = shmIds; if (fLabel.isEmpty()) @@ -538,7 +529,7 @@ protected: arguments.add(fBinary); // plugin type - arguments.add(PluginType2Str(kPlugin->getType())); + arguments.add(getPluginTypeAsString(kPlugin->getType())); // filename arguments.add(filename); @@ -639,7 +630,9 @@ protected: carla_setenv("ENGINE_BRIDGE_SHM_IDS", fShmIds.toRawUTF8()); carla_setenv("WINEDEBUG", "-all"); - carla_stdout("starting plugin bridge.."); + carla_stdout("starting plugin bridge, command is:\n%s \"%s\" \"%s\" \"%s\" " P_INT64, + fBinary.toRawUTF8(), getPluginTypeAsString(kPlugin->getType()), filename.toRawUTF8(), fLabel.toRawUTF8(), kPlugin->getUniqueId()); + started = fProcess->start(arguments); #ifdef CARLA_OS_LINUX @@ -1123,7 +1116,7 @@ public: { if (fBridgeThread.isThreadRunning()) { - if (fTimedOut && pData->active) + if (fInitiated && fTimedOut && pData->active) setActive(false, true, true); { @@ -1854,9 +1847,9 @@ public: for (; fShmNonRtServerControl.isDataAvailableForReading();) { const PluginBridgeNonRtServerOpcode opcode(fShmNonRtServerControl.readOpcode()); -#ifdef DEBUG +#if 1//def DEBUG if (opcode != kPluginBridgeNonRtServerPong) { - carla_debug("CarlaPluginBridge::handleNonRtData() - got opcode: %s", PluginBridgeNonRtServerOpcode2str(opcode)); + carla_stdout("CarlaPluginBridge::handleNonRtData() - got opcode: %s", PluginBridgeNonRtServerOpcode2str(opcode)); } #endif switch (opcode) @@ -2372,9 +2365,10 @@ public: { if (fInitiated || ! fBridgeThread.isThreadRunning()) break; - carla_msleep(25); + carla_msleep(20); pData->engine->callback(ENGINE_CALLBACK_IDLE, 0, 0, 0, 0.0f, nullptr); pData->engine->idle(); + idle(); } fLastPongCounter = -1; @@ -2422,7 +2416,7 @@ private: bool fSaved; bool fTimedOut; - volatile int32_t fLastPongCounter; + int32_t fLastPongCounter; CarlaString fBridgeBinary; CarlaPluginBridgeThread fBridgeThread; diff --git a/source/backend/plugin/CarlaPluginInternal.hpp b/source/backend/plugin/CarlaPluginInternal.hpp index b748cca1c..b7c6e5897 100644 --- a/source/backend/plugin/CarlaPluginInternal.hpp +++ b/source/backend/plugin/CarlaPluginInternal.hpp @@ -19,7 +19,6 @@ #define CARLA_PLUGIN_INTERNAL_HPP_INCLUDED #include "CarlaPlugin.hpp" -#include "CarlaPluginThread.hpp" #include "CarlaLibUtils.hpp" #include "CarlaOscUtils.hpp" diff --git a/source/backend/plugin/Makefile b/source/backend/plugin/Makefile index a7c3ac2cd..ccd666c51 100644 --- a/source/backend/plugin/Makefile +++ b/source/backend/plugin/Makefile @@ -12,7 +12,6 @@ include ../Makefile.mk OBJS = \ $(OBJDIR)/CarlaPlugin.cpp.o \ $(OBJDIR)/CarlaPluginInternal.cpp.o \ - $(OBJDIR)/CarlaPluginThread.cpp.o \ $(OBJDIR)/CarlaPluginNative.cpp.o \ $(OBJDIR)/CarlaPluginBridge.cpp.o \ $(OBJDIR)/CarlaPluginLADSPA.cpp.o \ diff --git a/source/bridges-plugin/CarlaBridgePlugin.cpp b/source/bridges-plugin/CarlaBridgePlugin.cpp index 02574c90e..e303d9005 100644 --- a/source/bridges-plugin/CarlaBridgePlugin.cpp +++ b/source/bridges-plugin/CarlaBridgePlugin.cpp @@ -19,7 +19,6 @@ #include "CarlaHost.h" #include "CarlaBackendUtils.hpp" -#include "CarlaOscUtils.hpp" #include "CarlaMIDI.h" #ifdef CARLA_OS_UNIX @@ -173,9 +172,7 @@ public: const char* const rtClientBaseName, const char* const nonRtClientBaseName, const char* const nonRtServerBaseName) : fEngine(nullptr), fProjFilename(), - fOscControlData(), - fOscServerPath(), - fOscServerThread(nullptr), + fUsingBridge(false), leakDetector_CarlaBridgePlugin() { CARLA_ASSERT(clientName != nullptr && clientName[0] != '\0'); @@ -205,31 +202,11 @@ public: // --------------------------------------------------------------------- - /* - void sendOscUpdate() const noexcept + void exec(const bool useBridge, int argc, char* argv[]) { - if (fOscControlData.target != nullptr) - osc_send_update(fOscControlData, fOscServerPath); - } - - void sendOscBridgeUpdate() const noexcept - { - if (fOscControlData.target != nullptr) - osc_send_bridge_ready(fOscControlData, fOscControlData.path); - } - - void sendOscBridgeError(const char* const error) const noexcept - { - if (fOscControlData.target != nullptr) - osc_send_bridge_error(fOscControlData, error); - } - */ + fUsingBridge = useBridge; - // --------------------------------------------------------------------- - - void exec(const bool useOsc, int argc, char* argv[]) - { - if (! useOsc) + if (! useBridge) { const CarlaPluginInfo* const pInfo(carla_get_plugin_info(0)); CARLA_SAFE_ASSERT_RETURN(pInfo != nullptr,); @@ -267,12 +244,10 @@ public: // --------------------------------------------------------------------- protected: - void handleCallback(const EngineCallbackOpcode action, const int value1, const int value2, const float value3, const char* const valueStr) + void handleCallback(const EngineCallbackOpcode action, const int value1, const int, const float, const char* const) { CARLA_BACKEND_USE_NAMESPACE; - // TODO - switch (action) { case ENGINE_CALLBACK_ENGINE_STOPPED: @@ -282,27 +257,19 @@ protected: break; case ENGINE_CALLBACK_UI_STATE_CHANGED: - if (gIsInitiated && value1 != 1 && fOscControlData.target == nullptr) + if (gIsInitiated && value1 != 1 && ! fUsingBridge) gCloseNow = true; break; default: break; } - - return; - (void)value2; - (void)value3; - (void)valueStr; } private: const CarlaEngine* fEngine; String fProjFilename; - - CarlaOscData fOscControlData; - CarlaString fOscServerPath; - lo_server_thread fOscServerThread; + bool fUsingBridge; static void callback(void* ptr, EngineCallbackOpcode action, unsigned int pluginId, int value1, int value2, float value3, const char* valueStr) { @@ -313,11 +280,6 @@ private: return ((CarlaBridgePlugin*)ptr)->handleCallback(action, value1, value2, value3, valueStr); } - static void osc_error_handler(int num, const char* msg, const char* path) - { - carla_stderr("CarlaBridgePlugin::osc_error_handler(%i, \"%s\", \"%s\")", num, msg, path); - } - CARLA_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(CarlaBridgePlugin) }; @@ -443,12 +405,7 @@ int main(int argc, char* argv[]) { ret = 0; - if (useBridge) - { - //bridge.sendOscUpdate(); - //bridge.sendOscBridgeUpdate(); - } - else + if (! useBridge) { carla_set_active(0, true); diff --git a/source/bridges-plugin/Makefile b/source/bridges-plugin/Makefile index 2f907ee6c..52ffdf603 100644 --- a/source/bridges-plugin/Makefile +++ b/source/bridges-plugin/Makefile @@ -168,7 +168,6 @@ OBJS_native = \ $(OBJDIR)/CarlaEngineBridge.cpp.o \ $(OBJDIR)/CarlaPlugin.cpp.o \ $(OBJDIR)/CarlaPluginInternal.cpp.o \ - $(OBJDIR)/CarlaPluginThread.cpp.o \ $(OBJDIR)/CarlaPluginNative.cpp.o \ $(OBJDIR)/CarlaPluginLADSPA.cpp.o \ $(OBJDIR)/CarlaPluginDSSI.cpp.o \ @@ -195,7 +194,6 @@ OBJS_arch = \ $(OBJDIR)/CarlaEngineBridge.cpp.arch.o \ $(OBJDIR)/CarlaPlugin.cpp.arch.o \ $(OBJDIR)/CarlaPluginInternal.cpp.arch.o \ - $(OBJDIR)/CarlaPluginThread.cpp.arch.o \ $(OBJDIR)/CarlaPluginLADSPA.cpp.arch.o \ $(OBJDIR)/CarlaPluginDSSI.cpp.arch.o \ $(OBJDIR)/CarlaPluginLV2.cpp.arch.o \