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 "juce_core/juce_core.h"


#include <string>
#include <vector>

using juce::File; using juce::File;


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


carla_zeroPointers(fFeatures, kFeatureCountAll+1); carla_zeroPointers(fFeatures, kFeatureCountAll+1);


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

#if defined(__clang__) #if defined(__clang__)
# pragma clang diagnostic push # pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wdeprecated-declarations" # 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) if (fLastStateChunk != nullptr)
{ {
std::free(fLastStateChunk); std::free(fLastStateChunk);
@@ -1272,13 +1263,18 @@ public:
const ScopedLocale csl; const ScopedLocale csl;


// write URI mappings // 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("urid\n", 5);
fPipeServer.writeMessage(tmpBuf); fPipeServer.writeMessage(tmpBuf);
fPipeServer.writeAndFixMessage(fCustomURIDs.getAt(i, nullptr));
fPipeServer.writeAndFixMessage(uri.c_str());
} }


// write UI options // write UI options
@@ -4297,31 +4293,30 @@ public:
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0', CARLA_URI_MAP_ID_NULL); CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0', CARLA_URI_MAP_ID_NULL);
carla_debug("CarlaPluginLV2::getCustomURID(\"%s\")", uri); 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()) 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 const char* getCustomURIDString(const LV2_URID urid) const noexcept
{ {
static const char* const sFallback = "urn:null"; static const char* const sFallback = "urn:null";
CARLA_SAFE_ASSERT_RETURN(urid != CARLA_URI_MAP_ID_NULL, sFallback); 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); 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(urid != CARLA_URI_MAP_ID_NULL,);
CARLA_SAFE_ASSERT_RETURN(uri != nullptr && uri[0] != '\0',); 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)); const char* const ourURI(carla_lv2_urid_unmap(this, urid));
CARLA_SAFE_ASSERT_RETURN(ourURI != nullptr,); CARLA_SAFE_ASSERT_RETURN(ourURI != nullptr,);
@@ -5543,8 +5540,8 @@ public:
} }
else 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; CarlaPluginLV2Options fLv2Options;
CarlaPipeServerLV2 fPipeServer; CarlaPipeServerLV2 fPipeServer;


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


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


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

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


#include "juce_core/juce_core.h" #include "juce_core/juce_core.h"


#include <string>
#include <vector>

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


using juce::File; using juce::File;
@@ -224,13 +227,12 @@ public:
fRdfUiDescriptor(nullptr), fRdfUiDescriptor(nullptr),
fLv2Options(), fLv2Options(),
fUiOptions(), fUiOptions(),
fCustomURIDs(),
fCustomURIDs(CARLA_URI_MAP_ID_COUNT, std::string("urn:null")),
fExt() 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 // initialize options
@@ -376,16 +378,6 @@ public:
fFeatures[i] = nullptr; 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) 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',); 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 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; 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()) if (isPipeRunning())
@@ -682,10 +672,10 @@ public:
{ {
static const char* const sFallback = "urn:null"; static const char* const sFallback = "urn:null";
CARLA_SAFE_ASSERT_RETURN(urid != CARLA_URI_MAP_ID_NULL, sFallback); 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); carla_debug("CarlaLv2Client::getCustomURIDString(%i)", urid);


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


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


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


struct Extensions { struct Extensions {
const LV2_Options_Interface* options; const LV2_Options_Interface* options;


Loading…
Cancel
Save