Browse Source

Optimize LV2 URID mapping (EXPERIMENTAL)

tags/1.9.7
falkTX 9 years ago
parent
commit
0a2f80f39f
2 changed files with 52 additions and 65 deletions
  1. +31
    -34
      source/backend/plugin/CarlaPluginLV2.cpp
  2. +21
    -31
      source/bridges-ui/CarlaBridgeUI-LV2.cpp

+ 31
- 34
source/backend/plugin/CarlaPluginLV2.cpp View File

@@ -39,6 +39,9 @@ extern "C" {

#include "juce_core/juce_core.h"

#include <string>
#include <vector>

using juce::File;

#define URI_CARLA_ATOM_WORKER "http://kxstudio.sf.net/ns/carla/atomWorker"
@@ -508,7 +511,7 @@ public:
fEventsOut(),
fLv2Options(),
fPipeServer(engine, this),
fCustomURIDs(),
fCustomURIDs(CARLA_URI_MAP_ID_COUNT, std::string("urn:null")),
fFirstActive(true),
fLastStateChunk(nullptr),
fLastTimeInfo(),
@@ -516,12 +519,10 @@ public:
fUI()
{
carla_debug("CarlaPluginLV2::CarlaPluginLV2(%p, %i)", engine, id);
CARLA_SAFE_ASSERT(fCustomURIDs.size() == CARLA_URI_MAP_ID_COUNT);

carla_zeroPointers(fFeatures, kFeatureCountAll+1);

for (uint32_t i=0; i < CARLA_URI_MAP_ID_COUNT; ++i)
fCustomURIDs.append(nullptr);

#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
@@ -674,16 +675,6 @@ public:
}
}

for (LinkedList<const char*>::Itenerator it = fCustomURIDs.begin2(); it.valid(); it.next())
{
const char* const uri(it.getValue(nullptr));

if (uri != nullptr)
delete[] uri;
}

fCustomURIDs.clear();

if (fLastStateChunk != nullptr)
{
std::free(fLastStateChunk);
@@ -1272,13 +1263,18 @@ public:
const ScopedLocale csl;

// write URI mappings
for (std::size_t i=CARLA_URI_MAP_ID_COUNT, count=fCustomURIDs.count(); i < count; ++i)
uint32_t i = 0;
for (auto it=fCustomURIDs.begin(), end=fCustomURIDs.end(); it != end; ++it, ++i)
{
std::snprintf(tmpBuf, 0xff, P_SIZE "\n", i);
if (i < CARLA_URI_MAP_ID_COUNT)
continue;
const std::string& uri(*it);

std::snprintf(tmpBuf, 0xff, "%u\n", i);

fPipeServer.writeMessage("urid\n", 5);
fPipeServer.writeMessage(tmpBuf);
fPipeServer.writeAndFixMessage(fCustomURIDs.getAt(i, nullptr));
fPipeServer.writeAndFixMessage(uri.c_str());
}

// write UI options
@@ -4297,31 +4293,30 @@ public:
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0', CARLA_URI_MAP_ID_NULL);
carla_debug("CarlaPluginLV2::getCustomURID(\"%s\")", uri);

for (size_t i=0; i < fCustomURIDs.count(); ++i)
{
const char* const thisUri(fCustomURIDs.getAt(i, nullptr));
if (thisUri != nullptr && std::strcmp(thisUri, uri) == 0)
return static_cast<LV2_URID>(i);
}
const std::size_t uriCount(fCustomURIDs.size());

const std::string s_uri(uri);
const std::size_t s_pos(std::find(fCustomURIDs.begin(), fCustomURIDs.end(), s_uri) - fCustomURIDs.begin());

const LV2_URID urid(static_cast<LV2_URID>(fCustomURIDs.count()));
if (s_pos < uriCount)
return static_cast<LV2_URID>(s_pos);

fCustomURIDs.append(carla_strdup(uri));
fCustomURIDs.push_back(uri);

if (fUI.type == UI::TYPE_BRIDGE && fPipeServer.isPipeRunning())
fPipeServer.writeLv2UridMessage(urid, uri);
fPipeServer.writeLv2UridMessage(uriCount, uri);

return urid;
return uriCount;
}

const char* getCustomURIDString(const LV2_URID urid) const noexcept
{
static const char* const sFallback = "urn:null";
CARLA_SAFE_ASSERT_RETURN(urid != CARLA_URI_MAP_ID_NULL, sFallback);
CARLA_SAFE_ASSERT_RETURN(urid < fCustomURIDs.count(), sFallback);
CARLA_SAFE_ASSERT_RETURN(urid < fCustomURIDs.size(), sFallback);
carla_debug("CarlaPluginLV2::getCustomURIString(%i)", urid);

return fCustomURIDs.getAt(urid, sFallback);
return fCustomURIDs[urid].c_str();
}

// -------------------------------------------------------------------
@@ -5529,9 +5524,11 @@ public:
{
CARLA_SAFE_ASSERT_RETURN(urid != CARLA_URI_MAP_ID_NULL,);
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',);
carla_debug("CarlaPluginLV2::handleUridMap(%i v " P_SIZE ", \"%s\")", urid, fCustomURIDs.count()-1, uri);
carla_debug("CarlaPluginLV2::handleUridMap(%i v " P_SIZE ", \"%s\")", urid, fCustomURIDs.size()-1, uri);

const std::size_t uriCount(fCustomURIDs.size());

if (urid < fCustomURIDs.count())
if (urid < uriCount)
{
const char* const ourURI(carla_lv2_urid_unmap(this, urid));
CARLA_SAFE_ASSERT_RETURN(ourURI != nullptr,);
@@ -5543,8 +5540,8 @@ public:
}
else
{
CARLA_SAFE_ASSERT_RETURN(urid == fCustomURIDs.count(),);
fCustomURIDs.append(carla_strdup(uri));
CARLA_SAFE_ASSERT_RETURN(urid == uriCount,);
fCustomURIDs.push_back(uri);
}
}

@@ -5578,7 +5575,7 @@ private:
CarlaPluginLV2Options fLv2Options;
CarlaPipeServerLV2 fPipeServer;

LinkedList<const char*> fCustomURIDs;
std::vector<std::string> fCustomURIDs;

bool fFirstActive; // first process() call after activate()
void* fLastStateChunk;


+ 21
- 31
source/bridges-ui/CarlaBridgeUI-LV2.cpp View File

@@ -23,6 +23,9 @@

#include "juce_core/juce_core.h"

#include <string>
#include <vector>

#define URI_CARLA_ATOM_WORKER "http://kxstudio.sf.net/ns/carla/atomWorker"

using juce::File;
@@ -224,13 +227,12 @@ public:
fRdfUiDescriptor(nullptr),
fLv2Options(),
fUiOptions(),
fCustomURIDs(),
fCustomURIDs(CARLA_URI_MAP_ID_COUNT, std::string("urn:null")),
fExt()
{
carla_zeroPointers(fFeatures, kFeatureCount+1);
CARLA_SAFE_ASSERT(fCustomURIDs.size() == CARLA_URI_MAP_ID_COUNT);

for (uint32_t i=0; i < CARLA_URI_MAP_ID_COUNT; ++i)
fCustomURIDs.append(nullptr);
carla_zeroPointers(fFeatures, kFeatureCount+1);

// ---------------------------------------------------------------
// initialize options
@@ -376,16 +378,6 @@ public:
fFeatures[i] = nullptr;
}
}

for (LinkedList<const char*>::Itenerator it = fCustomURIDs.begin2(); it.valid(); it.next())
{
const char* const uri(it.getValue(nullptr));

if (uri != nullptr)
delete[] uri;
}

fCustomURIDs.clear();
}

// ---------------------------------------------------------------------
@@ -622,10 +614,10 @@ public:

void dspURIDReceived(const LV2_URID urid, const char* const uri)
{
CARLA_SAFE_ASSERT_RETURN(urid == fCustomURIDs.count(),);
CARLA_SAFE_ASSERT_RETURN(urid == fCustomURIDs.size(),);
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',);

fCustomURIDs.append(carla_strdup(uri));
fCustomURIDs.push_back(uri);
}

void uiOptionsChanged(const double sampleRate, const bool useTheme, const bool useThemeColors, const char* const windowTitle, uintptr_t transientWindowId) override
@@ -655,21 +647,19 @@ public:

LV2_URID urid = CARLA_URI_MAP_ID_NULL;

for (uint32_t i=0, count=static_cast<uint32_t>(fCustomURIDs.count()); i<count; ++i)
{
const char* const thisUri(fCustomURIDs.getAt(i, nullptr));
const std::size_t uriCount(fCustomURIDs.size());

if (thisUri != nullptr && std::strcmp(thisUri, uri) == 0)
{
urid = i;
break;
}
}
const std::string s_uri(uri);
const std::size_t s_pos(std::find(fCustomURIDs.begin(), fCustomURIDs.end(), s_uri) - fCustomURIDs.begin());

if (urid == CARLA_URI_MAP_ID_NULL)
if (s_pos < uriCount)
{
urid = static_cast<LV2_URID>(s_pos);
}
else
{
urid = static_cast<LV2_URID>(fCustomURIDs.count());
fCustomURIDs.append(carla_strdup(uri));
urid = static_cast<LV2_URID>(uriCount);
fCustomURIDs.push_back(uri);
}

if (isPipeRunning())
@@ -682,10 +672,10 @@ public:
{
static const char* const sFallback = "urn:null";
CARLA_SAFE_ASSERT_RETURN(urid != CARLA_URI_MAP_ID_NULL, sFallback);
CARLA_SAFE_ASSERT_RETURN(urid < fCustomURIDs.count(), sFallback);
CARLA_SAFE_ASSERT_RETURN(urid < fCustomURIDs.size(), sFallback);
carla_debug("CarlaLv2Client::getCustomURIDString(%i)", urid);

return fCustomURIDs.getAt(urid, sFallback);
return fCustomURIDs[urid].c_str();
}

// ---------------------------------------------------------------------
@@ -765,7 +755,7 @@ private:
Lv2PluginOptions fLv2Options;

Options fUiOptions;
LinkedList<const char*> fCustomURIDs;
std::vector<std::string> fCustomURIDs;

struct Extensions {
const LV2_Options_Interface* options;


Loading…
Cancel
Save