Browse Source

More of the same, bridges now run but without any info

tags/1.9.6
falkTX 10 years ago
parent
commit
1d74a7dca2
6 changed files with 181 additions and 117 deletions
  1. +162
    -45
      source/backend/engine/CarlaEngineBridge.cpp
  2. +11
    -17
      source/backend/plugin/CarlaPluginBridge.cpp
  3. +0
    -1
      source/backend/plugin/CarlaPluginInternal.hpp
  4. +0
    -1
      source/backend/plugin/Makefile
  5. +8
    -51
      source/bridges-plugin/CarlaBridgePlugin.cpp
  6. +0
    -2
      source/bridges-plugin/Makefile

+ 162
- 45
source/backend/engine/CarlaEngineBridge.cpp View File

@@ -121,13 +121,11 @@ struct BridgeRtClientControl : public CarlaRingBufferControl<SmallStackBuffer> {
{
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<SmallStackBuffer> {
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<BigStackBuffer>
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<BigStackBuffer>
return false;
}

void unmapData() noexcept
{
data = nullptr;
setRingBuffer(nullptr, false);
}

PluginBridgeNonRtClientOpcode readOpcode() noexcept
{
return static_cast<PluginBridgeNonRtClientOpcode>(readUInt());
@@ -271,29 +285,33 @@ struct BridgeNonRtServerControl : public CarlaRingBufferControl<HugeStackBuffer>
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<HugeStackBuffer>
return false;
}

void unmapData() noexcept
{
data = nullptr;
setRingBuffer(nullptr, false);
}

void writeOpcode(const PluginBridgeNonRtServerOpcode opcode) noexcept
{
writeUInt(static_cast<uint32_t>(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(); i<count; ++i)
for (uint32_t i=0, count=plugin->getCustomDataCount(); i<count; ++i)
{
//const CustomData& cdata(plugin->getCustomData(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<uint32_t>(std::strlen(cdata.type)));
const uint32_t keyLen(static_cast<uint32_t>(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<uint32_t>(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<uint32_t>(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)
};


+ 11
- 17
source/backend/plugin/CarlaPluginBridge.cpp View File

@@ -210,10 +210,7 @@ struct BridgeRtClientControl : public CarlaRingBufferControl<SmallStackBuffer> {
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<BigStackBuffer>
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<HugeStackBuffer>
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;


+ 0
- 1
source/backend/plugin/CarlaPluginInternal.hpp View File

@@ -19,7 +19,6 @@
#define CARLA_PLUGIN_INTERNAL_HPP_INCLUDED

#include "CarlaPlugin.hpp"
#include "CarlaPluginThread.hpp"

#include "CarlaLibUtils.hpp"
#include "CarlaOscUtils.hpp"


+ 0
- 1
source/backend/plugin/Makefile View File

@@ -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 \


+ 8
- 51
source/bridges-plugin/CarlaBridgePlugin.cpp View File

@@ -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);



+ 0
- 2
source/bridges-plugin/Makefile View File

@@ -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 \


Loading…
Cancel
Save