Browse Source

Decouple LV2 worker responses from UI stuff

Signed-off-by: falkTX <falktx@gmail.com>
tags/v2.1-alpha1-winvst
falkTX 6 years ago
parent
commit
cbde990d35
1 changed files with 61 additions and 39 deletions
  1. +61
    -39
      source/backend/plugin/CarlaPluginLV2.cpp

+ 61
- 39
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -522,10 +522,12 @@ public:
fNeedsUiClose(false), fNeedsUiClose(false),
fLatencyIndex(-1), fLatencyIndex(-1),
fStrictBounds(-1), fStrictBounds(-1),
fAtomBufferIn(),
fAtomBufferOut(),
fAtomBufferUiIn(),
fAtomBufferUiOut(),
fAtomBufferWorker(),
fAtomForge(), fAtomForge(),
fTmpAtomBuffer(nullptr),
fAtomBufferUiOutTmpData(nullptr),
fAtomBufferWorkerTmpData(nullptr),
fEventsIn(), fEventsIn(),
fEventsOut(), fEventsOut(),
fLv2Options(), fLv2Options(),
@@ -703,10 +705,16 @@ public:
fLastStateChunk = nullptr; fLastStateChunk = nullptr;
} }


if (fTmpAtomBuffer != nullptr)
if (fAtomBufferUiOutTmpData != nullptr)
{ {
delete[] fTmpAtomBuffer;
fTmpAtomBuffer = nullptr;
delete[] fAtomBufferUiOutTmpData;
fAtomBufferUiOutTmpData = nullptr;
}

if (fAtomBufferWorkerTmpData != nullptr)
{
delete[] fAtomBufferWorkerTmpData;
fAtomBufferWorkerTmpData = nullptr;
} }


clearBuffers(); clearBuffers();
@@ -1559,11 +1567,30 @@ public:
} }
} }


void idle() override
{
if (! fAtomBufferWorker.isDataAvailableForReading())
return;

Lv2AtomRingBuffer tmpRingBuffer(fAtomBufferWorker, fAtomBufferWorkerTmpData);
CARLA_SAFE_ASSERT_RETURN(tmpRingBuffer.isDataAvailableForReading(),);
CARLA_SAFE_ASSERT_RETURN(fExt.worker != nullptr && fExt.worker->work != nullptr,);

uint32_t portIndex;
const LV2_Atom* atom;

for (; tmpRingBuffer.get(atom, portIndex);)
{
CARLA_SAFE_ASSERT_CONTINUE(atom->type == kUridCarlaAtomWorker);
fExt.worker->work(fHandle, carla_lv2_worker_respond, this, atom->size, LV2_ATOM_BODY_CONST(atom));
}
}

void uiIdle() override void uiIdle() override
{ {
if (fAtomBufferOut.isDataAvailableForReading())
if (fAtomBufferUiOut.isDataAvailableForReading())
{ {
Lv2AtomRingBuffer tmpRingBuffer(fAtomBufferOut, fTmpAtomBuffer);
Lv2AtomRingBuffer tmpRingBuffer(fAtomBufferUiOut, fAtomBufferUiOutTmpData);
CARLA_SAFE_ASSERT(tmpRingBuffer.isDataAvailableForReading()); CARLA_SAFE_ASSERT(tmpRingBuffer.isDataAvailableForReading());


uint32_t portIndex; uint32_t portIndex;
@@ -1573,12 +1600,7 @@ public:


for (; tmpRingBuffer.get(atom, portIndex);) for (; tmpRingBuffer.get(atom, portIndex);)
{ {
if (atom->type == kUridCarlaAtomWorker)
{
CARLA_SAFE_ASSERT_CONTINUE(fExt.worker != nullptr && fExt.worker->work != nullptr);
fExt.worker->work(fHandle, carla_lv2_worker_respond, this, atom->size, LV2_ATOM_BODY_CONST(atom));
}
else if (fUI.type == UI::TYPE_BRIDGE)
if (fUI.type == UI::TYPE_BRIDGE)
{ {
if (fPipeServer.isPipeRunning()) if (fPipeServer.isPipeRunning())
fPipeServer.writeLv2AtomMessage(portIndex, atom); fPipeServer.writeLv2AtomMessage(portIndex, atom);
@@ -2508,13 +2530,16 @@ public:
pData->event.portOut = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, false, 0); pData->event.portOut = (CarlaEngineEventPort*)pData->client->addPort(kEnginePortTypeEvent, portName, false, 0);
} }


if (fExt.worker != nullptr || (fUI.type != UI::TYPE_NULL && fEventsIn.count > 0 && (fEventsIn.data[0].type & CARLA_EVENT_DATA_ATOM) != 0))
fAtomBufferIn.createBuffer(eventBufferSize);
if (fExt.worker != nullptr)
fAtomBufferWorker.createBuffer(eventBufferSize);

if (fUI.type != UI::TYPE_NULL && fEventsIn.count > 0 && (fEventsIn.data[0].type & CARLA_EVENT_DATA_ATOM) != 0)
fAtomBufferUiIn.createBuffer(eventBufferSize);


if (fExt.worker != nullptr || (fUI.type != UI::TYPE_NULL && fEventsOut.count > 0 && (fEventsOut.data[0].type & CARLA_EVENT_DATA_ATOM) != 0))
if (fUI.type != UI::TYPE_NULL && fEventsOut.count > 0 && (fEventsOut.data[0].type & CARLA_EVENT_DATA_ATOM) != 0)
{ {
fAtomBufferOut.createBuffer(std::min(eventBufferSize*32, 1638400U));
fTmpAtomBuffer = new uint8_t[fAtomBufferOut.getSize()];
fAtomBufferUiOut.createBuffer(std::min(eventBufferSize*32, 1638400U));
fAtomBufferUiOutTmpData = new uint8_t[fAtomBufferUiOut.getSize()];
} }


if (fEventsIn.ctrl != nullptr && fEventsIn.ctrl->port == nullptr) if (fEventsIn.ctrl != nullptr && fEventsIn.ctrl->port == nullptr)
@@ -3096,23 +3121,18 @@ public:
// ---------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------
// Message Input // Message Input


if (fAtomBufferIn.tryLock())
if (fAtomBufferUiIn.tryLock())
{ {
if (fAtomBufferIn.isDataAvailableForReading())
if (fAtomBufferUiIn.isDataAvailableForReading())
{ {
const LV2_Atom* atom; const LV2_Atom* atom;
uint32_t j, portIndex; uint32_t j, portIndex;


for (; fAtomBufferIn.get(atom, portIndex);)
for (; fAtomBufferUiIn.get(atom, portIndex);)
{ {
j = (portIndex < fEventsIn.count) ? portIndex : fEventsIn.ctrlIndex; j = (portIndex < fEventsIn.count) ? portIndex : fEventsIn.ctrlIndex;


if (atom->type == kUridCarlaAtomWorker)
{
CARLA_SAFE_ASSERT_CONTINUE(fExt.worker != nullptr && fExt.worker->work_response != nullptr);
fExt.worker->work_response(fHandle, atom->size, LV2_ATOM_BODY_CONST(atom));
}
else if (! lv2_atom_buffer_write(&evInAtomIters[j], 0, 0, atom->type, atom->size, LV2_ATOM_BODY_CONST(atom)))
if (! lv2_atom_buffer_write(&evInAtomIters[j], 0, 0, atom->type, atom->size, LV2_ATOM_BODY_CONST(atom)))
{ {
carla_stderr2("Event input buffer full, at least 1 message lost"); carla_stderr2("Event input buffer full, at least 1 message lost");
continue; continue;
@@ -3120,7 +3140,7 @@ public:
} }
} }


fAtomBufferIn.unlock();
fAtomBufferUiIn.unlock();
} }


// ---------------------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------------------
@@ -3583,7 +3603,7 @@ public:
else //if (ev->body.type == kUridAtomBLANK) else //if (ev->body.type == kUridAtomBLANK)
{ {
//carla_stdout("Got out event, %s", carla_lv2_urid_unmap(this, ev->body.type)); //carla_stdout("Got out event, %s", carla_lv2_urid_unmap(this, ev->body.type));
fAtomBufferOut.put(&ev->body, evData.rindex);
fAtomBufferUiOut.put(&ev->body, evData.rindex);
} }


lv2_atom_buffer_increment(&iter); lv2_atom_buffer_increment(&iter);
@@ -4752,7 +4772,7 @@ public:
{ {
CARLA_SAFE_ASSERT_RETURN(fExt.worker != nullptr && fExt.worker->work != nullptr, LV2_WORKER_ERR_UNKNOWN); CARLA_SAFE_ASSERT_RETURN(fExt.worker != nullptr && fExt.worker->work != nullptr, LV2_WORKER_ERR_UNKNOWN);
CARLA_SAFE_ASSERT_RETURN(fEventsIn.ctrl != nullptr, LV2_WORKER_ERR_UNKNOWN); CARLA_SAFE_ASSERT_RETURN(fEventsIn.ctrl != nullptr, LV2_WORKER_ERR_UNKNOWN);
carla_debug("CarlaPluginLV2::handleWorkerSchedule(%i, %p)", size, data);
carla_stdout("CarlaPluginLV2::handleWorkerSchedule(%i, %p)", size, data);


if (pData->engine->isOffline()) if (pData->engine->isOffline())
{ {
@@ -4764,18 +4784,18 @@ public:
atom.size = size; atom.size = size;
atom.type = kUridCarlaAtomWorker; atom.type = kUridCarlaAtomWorker;


return fAtomBufferOut.putChunk(&atom, data, fEventsOut.ctrlIndex) ? LV2_WORKER_SUCCESS : LV2_WORKER_ERR_NO_SPACE;
return fAtomBufferWorker.putChunk(&atom, data, fEventsOut.ctrlIndex) ? LV2_WORKER_SUCCESS : LV2_WORKER_ERR_NO_SPACE;
} }


LV2_Worker_Status handleWorkerRespond(const uint32_t size, const void* const data) LV2_Worker_Status handleWorkerRespond(const uint32_t size, const void* const data)
{ {
carla_debug("CarlaPluginLV2::handleWorkerRespond(%i, %p)", size, data);
carla_stdout("CarlaPluginLV2::handleWorkerRespond(%i, %p)", size, data);


LV2_Atom atom; LV2_Atom atom;
atom.size = size; atom.size = size;
atom.type = kUridCarlaAtomWorker; atom.type = kUridCarlaAtomWorker;


return fAtomBufferIn.putChunk(&atom, data, fEventsIn.ctrlIndex) ? LV2_WORKER_SUCCESS : LV2_WORKER_ERR_NO_SPACE;
return fAtomBufferWorker.putChunk(&atom, data, fEventsIn.ctrlIndex) ? LV2_WORKER_SUCCESS : LV2_WORKER_ERR_NO_SPACE;
} }


// ------------------------------------------------------------------- // -------------------------------------------------------------------
@@ -4937,7 +4957,7 @@ public:
index = fEventsIn.ctrlIndex; index = fEventsIn.ctrlIndex;
} }


fAtomBufferIn.put(atom, index);
fAtomBufferUiIn.put(atom, index);
} break; } break;


default: default:
@@ -5856,7 +5876,7 @@ public:
CARLA_SAFE_ASSERT_RETURN(atom != nullptr,); CARLA_SAFE_ASSERT_RETURN(atom != nullptr,);
carla_debug("CarlaPluginLV2::handleTransferAtom(%i, %p)", portIndex, atom); carla_debug("CarlaPluginLV2::handleTransferAtom(%i, %p)", portIndex, atom);


fAtomBufferIn.put(atom, portIndex);
fAtomBufferUiIn.put(atom, portIndex);
} }


void handleUridMap(const LV2_URID urid, const char* const uri) void handleUridMap(const LV2_URID urid, const char* const uri)
@@ -5904,10 +5924,12 @@ private:
int32_t fLatencyIndex; // -1 if invalid int32_t fLatencyIndex; // -1 if invalid
int fStrictBounds; // -1 unsupported, 0 optional, 1 required int fStrictBounds; // -1 unsupported, 0 optional, 1 required


Lv2AtomRingBuffer fAtomBufferIn;
Lv2AtomRingBuffer fAtomBufferOut;
Lv2AtomRingBuffer fAtomBufferUiIn;
Lv2AtomRingBuffer fAtomBufferUiOut;
Lv2AtomRingBuffer fAtomBufferWorker;
LV2_Atom_Forge fAtomForge; LV2_Atom_Forge fAtomForge;
uint8_t* fTmpAtomBuffer;
uint8_t* fAtomBufferUiOutTmpData;
uint8_t* fAtomBufferWorkerTmpData;


CarlaPluginLV2EventData fEventsIn; CarlaPluginLV2EventData fEventsIn;
CarlaPluginLV2EventData fEventsOut; CarlaPluginLV2EventData fEventsOut;


Loading…
Cancel
Save