Browse Source

Store port notifications in LV2_RDF struct

tags/v1.9.9
falkTX 7 years ago
parent
commit
cc3268a8be
2 changed files with 94 additions and 1 deletions
  1. +39
    -1
      source/includes/lv2_rdf.hpp
  2. +55
    -0
      source/utils/CarlaLv2Utils.hpp

+ 39
- 1
source/includes/lv2_rdf.hpp View File

@@ -206,6 +206,13 @@ typedef uint32_t LV2_Property;
#define LV2_IS_PORT_DESIGNATION_TIME_TICKS_PER_BEAT(x) ((x) == LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT) #define LV2_IS_PORT_DESIGNATION_TIME_TICKS_PER_BEAT(x) ((x) == LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT)
#define LV2_IS_PORT_DESIGNATION_TIME(x) ((x) >= LV2_PORT_DESIGNATION_TIME_BAR && (x) <= LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT) #define LV2_IS_PORT_DESIGNATION_TIME(x) ((x) >= LV2_PORT_DESIGNATION_TIME_BAR && (x) <= LV2_PORT_DESIGNATION_TIME_TICKS_PER_BEAT)


// UI Port Protocol
#define LV2_UI_PORT_PROTOCOL_FLOAT 1
#define LV2_UI_PORT_PROTOCOL_PEAK 2

#define LV2_IS_UI_PORT_PROTOCOL_FLOAT(x) ((x) == LV2_UI_PORT_PROTOCOL_FLOAT)
#define LV2_IS_UI_PORT_PROTOCOL_PEAK(x) ((x) == LV2_UI_PORT_PROTOCOL_PEAK)

// UI Types // UI Types
#define LV2_UI_GTK2 1 #define LV2_UI_GTK2 1
#define LV2_UI_GTK3 2 #define LV2_UI_GTK3 2
@@ -475,6 +482,27 @@ struct LV2_RDF_Feature {
CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Feature) CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_Feature)
}; };


// Port Notification
struct LV2_RDF_UI_PortNotification {
const char* Symbol;
LV2_Property Protocol;

LV2_RDF_UI_PortNotification() noexcept
: Symbol(nullptr),
Protocol(0) {}

~LV2_RDF_UI_PortNotification() noexcept
{
if (Symbol != nullptr)
{
delete[] Symbol;
Symbol = nullptr;
}
}

CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_UI_PortNotification)
};

// UI // UI
struct LV2_RDF_UI { struct LV2_RDF_UI {
LV2_Property Type; LV2_Property Type;
@@ -488,6 +516,9 @@ struct LV2_RDF_UI {
uint32_t ExtensionCount; uint32_t ExtensionCount;
LV2_URI* Extensions; LV2_URI* Extensions;


uint32_t PortNotificationCount;
LV2_RDF_UI_PortNotification* PortNotifications;

LV2_RDF_UI() noexcept LV2_RDF_UI() noexcept
: Type(0), : Type(0),
URI(nullptr), URI(nullptr),
@@ -496,7 +527,9 @@ struct LV2_RDF_UI {
FeatureCount(0), FeatureCount(0),
Features(nullptr), Features(nullptr),
ExtensionCount(0), ExtensionCount(0),
Extensions(nullptr) {}
Extensions(nullptr),
PortNotificationCount(0),
PortNotifications(nullptr) {}


~LV2_RDF_UI() noexcept ~LV2_RDF_UI() noexcept
{ {
@@ -533,6 +566,11 @@ struct LV2_RDF_UI {
delete[] Extensions; delete[] Extensions;
Extensions = nullptr; Extensions = nullptr;
} }
if (PortNotifications != nullptr)
{
delete[] PortNotifications;
PortNotifications = nullptr;
}
} }


CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_UI) CARLA_DECLARE_NON_COPY_STRUCT(LV2_RDF_UI)


+ 55
- 0
source/utils/CarlaLv2Utils.hpp View File

@@ -247,6 +247,9 @@ public:


Lilv::Node state_state; Lilv::Node state_state;


Lilv::Node ui_portNotif;
Lilv::Node ui_protocol;

Lilv::Node value_default; Lilv::Node value_default;
Lilv::Node value_minimum; Lilv::Node value_minimum;
Lilv::Node value_maximum; Lilv::Node value_maximum;
@@ -373,6 +376,9 @@ public:


state_state (new_uri(LV2_STATE__state)), state_state (new_uri(LV2_STATE__state)),


ui_portNotif (new_uri(LV2_UI__portNotification)),
ui_protocol (new_uri(LV2_UI__protocol)),

value_default (new_uri(LV2_CORE__default)), value_default (new_uri(LV2_CORE__default)),
value_minimum (new_uri(LV2_CORE__minimum)), value_minimum (new_uri(LV2_CORE__minimum)),
value_maximum (new_uri(LV2_CORE__maximum)), value_maximum (new_uri(LV2_CORE__maximum)),
@@ -2478,6 +2484,55 @@ const LV2_RDF_Descriptor* lv2_rdf_new(const LV2_URI uri, const bool loadPresets)


lilv_nodes_free(const_cast<LilvNodes*>(lilvExtensionDataNodes.me)); lilv_nodes_free(const_cast<LilvNodes*>(lilvExtensionDataNodes.me));
} }

// ----------------------------------------------------------------------------------------------------
// Set UI Port Notifications
{
Lilv::Nodes portNotifNodes(lv2World.find_nodes(lilvUI.get_uri(), lv2World.ui_portNotif.me, nullptr));

if (portNotifNodes.size() > 0)
{
rdfUI->PortNotificationCount = portNotifNodes.size();
rdfUI->PortNotifications = new LV2_RDF_UI_PortNotification[rdfUI->PortNotificationCount];

carla_stdout("got port notifications!! %u", rdfUI->PortNotificationCount);

uint32_t h2 = 0;
LILV_FOREACH(nodes, it2, portNotifNodes)
{
CARLA_SAFE_ASSERT_BREAK(h2 < rdfUI->PortNotificationCount);

Lilv::Node portNotifNode(portNotifNodes.get(it2));
LV2_RDF_UI_PortNotification* const rdfPortNotif(&rdfUI->PortNotifications[h2++]);

LilvNode* const symbolNode = lilv_world_get(lv2World.me, portNotifNode,
lv2World.symbol.me, nullptr);
CARLA_SAFE_ASSERT_CONTINUE(symbolNode != nullptr);

LilvNode* const protocolNode = lilv_world_get(lv2World.me, portNotifNode,
lv2World.ui_protocol.me, nullptr);
CARLA_SAFE_ASSERT_CONTINUE(protocolNode != nullptr);

CARLA_SAFE_ASSERT_CONTINUE(lilv_node_is_string(symbolNode));
CARLA_SAFE_ASSERT_CONTINUE(lilv_node_is_uri(protocolNode));

const char* const symbol = lilv_node_as_string(symbolNode);
CARLA_SAFE_ASSERT_CONTINUE(symbol != nullptr && symbol[0] != '\0');

const char* const protocol = lilv_node_as_uri(protocolNode);
CARLA_SAFE_ASSERT_CONTINUE(protocol != nullptr && protocol[0] != '\0');

/**/ if (std::strcmp(protocol, LV2_UI__floatProtocol) == 0)
rdfPortNotif->Protocol = LV2_UI_PORT_PROTOCOL_FLOAT;
else if (std::strcmp(protocol, LV2_UI__peakProtocol) == 0)
rdfPortNotif->Protocol = LV2_UI_PORT_PROTOCOL_PEAK;

rdfPortNotif->Symbol = carla_strdup_safe(symbol);
}
}

lilv_nodes_free(const_cast<LilvNodes*>(portNotifNodes.me));
}
} }
} }




Loading…
Cancel
Save