summaryrefslogtreecommitdiffstats
path: root/src/serialisation
diff options
context:
space:
mode:
Diffstat (limited to 'src/serialisation')
-rw-r--r--src/serialisation/Parser.cpp47
-rw-r--r--src/serialisation/Serialiser.cpp21
2 files changed, 43 insertions, 25 deletions
diff --git a/src/serialisation/Parser.cpp b/src/serialisation/Parser.cpp
index 3d8ba96d..d49ac9a6 100644
--- a/src/serialisation/Parser.cpp
+++ b/src/serialisation/Parser.cpp
@@ -140,31 +140,47 @@ get_port(Ingen::World* world,
Sord::Model& model,
const Sord::Node& subject,
const Raul::Path& parent,
- uint32_t& index)
+ uint32_t* index)
{
const URIs& uris = world->uris();
// Get all properties
Resource::Properties props = get_properties(world, model, subject);
- // Get index
- Resource::Properties::const_iterator i = props.find(uris.lv2_index);
- if (i == props.end()
- || i->second.type() != world->forge().Int
- || i->second.get<int32_t>() < 0) {
- world->log().warn(fmt("Port %1% has no valid index\n") % subject);
- return boost::optional<PortRecord>();
+ // Get index if requested (for Graphs)
+ if (index) {
+ Resource::Properties::const_iterator i = props.find(uris.lv2_index);
+ if (i == props.end()
+ || i->second.type() != world->forge().Int
+ || i->second.get<int32_t>() < 0) {
+ world->log().error(fmt("Port %1% has no valid index\n") % subject);
+ return boost::optional<PortRecord>();
+ }
+ *index = i->second.get<int32_t>();
}
- index = i->second.get<int32_t>();
// Get symbol
Resource::Properties::const_iterator s = props.find(uris.lv2_symbol);
- if (s == props.end()) {
- world->log().warn(fmt("Port %1% has no symbol\n") % subject);
+ std::string sym;
+ if (s != props.end()) {
+ sym = s->second.ptr<char>();
+ } else {
+ const std::string subject_str = subject.to_string();
+ const size_t last_slash = subject_str.find_last_of("/");
+
+ sym = ((last_slash == string::npos)
+ ? subject_str
+ : subject_str.substr(last_slash + 1));
+ }
+
+ if (!Raul::Symbol::is_valid(sym)) {
+ world->log().error(fmt("Port %1% has invalid symbol `%2%'\n")
+ % subject % sym);
return boost::optional<PortRecord>();
}
- const Raul::Symbol port_sym(s->second.ptr<char>());
- const Raul::Path port_path = parent.child(port_sym);
+
+ const Raul::Symbol port_sym(sym);
+ const Raul::Path port_path(parent.child(port_sym));
return make_pair(port_path, props);
}
@@ -341,9 +357,8 @@ parse_graph(Ingen::World* world,
Sord::Node port = p.get_object();
// Get all properties
- uint32_t index = 0;
boost::optional<PortRecord> port_record = get_port(
- world, model, port, block_path, index);
+ world, model, port, block_path, NULL);
if (!port_record) {
world->log().error(fmt("Invalid port %1%\n") % port);
return boost::optional<Raul::Path>();
@@ -364,7 +379,7 @@ parse_graph(Ingen::World* world,
// Get all properties
uint32_t index = 0;
boost::optional<PortRecord> port_record = get_port(
- world, model, port, graph_path, index);
+ world, model, port, graph_path, &index);
if (!port_record) {
world->log().error(fmt("Invalid port %1%\n") % port);
return boost::optional<Raul::Path>();
diff --git a/src/serialisation/Serialiser.cpp b/src/serialisation/Serialiser.cpp
index 425ac00f..dd1be2b4 100644
--- a/src/serialisation/Serialiser.cpp
+++ b/src/serialisation/Serialiser.cpp
@@ -433,9 +433,6 @@ Serialiser::Impl::serialise_block(SPtr<const Node> block,
_model->add_statement(block_id,
Sord::URI(_model->world(), uris.ingen_prototype),
class_id);
- _model->add_statement(block_id,
- Sord::URI(_model->world(), uris.lv2_symbol),
- Sord::Literal(_model->world(), block->path().symbol()));
const Node::Properties props = block->properties(Resource::Graph::EXTERNAL);
serialise_properties(block_id, props);
@@ -455,14 +452,20 @@ Serialiser::Impl::serialise_port(const Node* port,
Resource::Graph context,
const Sord::Node& port_id)
{
- URIs& uris = _world.uris();
- Sord::World& world = _model->world();
+ URIs& uris = _world.uris();
+ Sord::World& world = _model->world();
+ Node::Properties props = port->properties(context);
- _model->add_statement(port_id,
- Sord::URI(world, uris.lv2_symbol),
- Sord::Literal(world, port->path().symbol()));
+ if (context == Resource::Graph::INTERNAL) {
+ // Always write lv2:symbol for Graph ports (required for lv2:Plugin)
+ _model->add_statement(port_id,
+ Sord::URI(world, uris.lv2_symbol),
+ Sord::Literal(world, port->path().symbol()));
+ } else {
+ // Never write lv2:index for plugin instances (not persistent/stable)
+ props.erase(uris.lv2_index);
+ }
- Node::Properties props = port->properties(context);
if (context == Resource::Graph::INTERNAL &&
port->has_property(uris.rdf_type, uris.lv2_ControlPort) &&
port->has_property(uris.rdf_type, uris.lv2_InputPort))