summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/bindings/Client.hpp1
-rwxr-xr-xsrc/bindings/test_ingen.py7
-rw-r--r--src/client/ClientStore.cpp35
-rw-r--r--src/client/ClientStore.hpp3
-rw-r--r--src/client/DeprecatedLoader.cpp60
-rw-r--r--src/client/HTTPClientReceiver.cpp1
-rw-r--r--src/client/HTTPEngineSender.cpp2
-rw-r--r--src/client/NodeModel.cpp7
-rw-r--r--src/client/ObjectModel.cpp4
-rw-r--r--src/client/PatchModel.cpp5
-rw-r--r--src/client/PatchModel.hpp2
-rw-r--r--src/client/PluginModel.cpp14
-rw-r--r--src/client/PluginUI.cpp2
-rw-r--r--src/client/PluginUI.hpp3
-rw-r--r--src/client/PortModel.cpp4
-rw-r--r--src/client/PortModel.hpp6
-rw-r--r--src/client/SigClientInterface.hpp6
-rw-r--r--src/client/ThreadedSigClientInterface.hpp8
-rw-r--r--src/common/interface/ClientInterface.hpp4
-rw-r--r--src/common/interface/EventType.hpp21
-rw-r--r--src/common/interface/MessageType.hpp120
-rw-r--r--src/common/interface/Plugin.hpp34
-rw-r--r--src/common/interface/PortType.hpp39
-rw-r--r--src/engine/ClientBroadcaster.hpp6
-rw-r--r--src/engine/ControlBindings.cpp106
-rw-r--r--src/engine/ControlBindings.hpp24
-rw-r--r--src/engine/Engine.cpp8
-rw-r--r--src/engine/Engine.hpp3
-rw-r--r--src/engine/HTTPClientSender.cpp11
-rw-r--r--src/engine/HTTPClientSender.hpp2
-rw-r--r--src/engine/InputPort.cpp9
-rw-r--r--src/engine/InternalPlugin.cpp3
-rw-r--r--src/engine/JackDriver.cpp1
-rw-r--r--src/engine/LADSPANode.cpp8
-rw-r--r--src/engine/LADSPAPlugin.cpp5
-rw-r--r--src/engine/LV2Node.cpp9
-rw-r--r--src/engine/LV2Plugin.cpp3
-rw-r--r--src/engine/NodeImpl.hpp1
-rw-r--r--src/engine/OSCClientSender.cpp20
-rw-r--r--src/engine/OSCClientSender.hpp2
-rw-r--r--src/engine/OSCEngineReceiver.cpp2
-rw-r--r--src/engine/ObjectSender.cpp3
-rw-r--r--src/engine/OutputPort.cpp5
-rw-r--r--src/engine/PortImpl.cpp7
-rw-r--r--src/engine/QueuedEngineInterface.hpp2
-rw-r--r--src/engine/events/AllNotesOff.cpp1
-rw-r--r--src/engine/events/CreateNode.cpp1
-rw-r--r--src/engine/events/CreatePort.cpp23
-rw-r--r--src/engine/events/SendBinding.cpp15
-rw-r--r--src/engine/events/SendBinding.hpp28
-rw-r--r--src/engine/events/SetMetadata.cpp17
-rw-r--r--src/engine/events/SetMetadata.hpp3
-rw-r--r--src/engine/events/SetPortValue.cpp2
-rw-r--r--src/engine/ingen_engine.cpp1
-rw-r--r--src/engine/internals/Controller.cpp10
-rw-r--r--src/engine/internals/Note.cpp10
-rw-r--r--src/engine/internals/Trigger.cpp16
-rw-r--r--src/gui/LoadPluginWindow.cpp12
-rw-r--r--src/gui/NodeModule.cpp5
-rw-r--r--src/gui/PatchCanvas.cpp20
-rw-r--r--src/gui/PatchWindow.cpp12
-rw-r--r--src/gui/Port.cpp10
-rw-r--r--src/gui/PropertiesWindow.cpp16
-rw-r--r--src/gui/RenameWindow.cpp10
-rw-r--r--src/gui/UploadPatchWindow.cpp12
-rw-r--r--src/ingen/main.cpp2
-rwxr-xr-xsrc/scripts/python/scripts/flatten.py4
-rw-r--r--src/scripts/python/scripts/sillysinepatch.py4
-rw-r--r--src/serialisation/Parser.cpp73
-rw-r--r--src/serialisation/Parser.hpp4
-rw-r--r--src/serialisation/Serialiser.cpp16
-rw-r--r--src/shared/Builder.cpp4
-rw-r--r--src/shared/LV2Object.cpp27
-rw-r--r--src/shared/LV2URIMap.cpp87
-rw-r--r--src/shared/LV2URIMap.hpp24
-rw-r--r--src/shared/ResourceImpl.cpp71
76 files changed, 619 insertions, 549 deletions
diff --git a/src/bindings/Client.hpp b/src/bindings/Client.hpp
index 956b51d4..fdb8d62c 100644
--- a/src/bindings/Client.hpp
+++ b/src/bindings/Client.hpp
@@ -26,5 +26,4 @@ public:
void set_property(const Raul::URI& subject, const Raul::URI& key, const Raul::Atom& value) {}
void set_voice_value(const Raul::Path& port_path, uint32_t voice, const Raul::Atom& value) {}
void activity(const Raul::Path& port_path) {}
- void binding(const Raul::Path& path, const MessageType& type) {}
};
diff --git a/src/bindings/test_ingen.py b/src/bindings/test_ingen.py
index c858e7df..921bdd1b 100755
--- a/src/bindings/test_ingen.py
+++ b/src/bindings/test_ingen.py
@@ -26,12 +26,7 @@ e.activate()
c.subscribe(e)
-e.create_port("/I", "ingen:midi", False)
-e.create_port("/made", "ingen:audio", False)
-e.create_port("/these", "ingen:audio", False)
-e.create_port("/in", "ingen:midi", True)
-e.create_port("/a", "ingen:audio", True)
-e.create_port("/script", "ingen:audio", True)
+e.create_port("/dynamic_port", "http://lv2plug.in/ns/ext/event#EventPort", False)
while True:
world.iteration()
diff --git a/src/client/ClientStore.cpp b/src/client/ClientStore.cpp
index eb42f6a9..e5fbab6a 100644
--- a/src/client/ClientStore.cpp
+++ b/src/client/ClientStore.cpp
@@ -17,7 +17,7 @@
#include "raul/log.hpp"
#include "raul/PathTable.hpp"
-#include "interface/MessageType.hpp"
+#include "shared/LV2URIMap.hpp"
#include "ClientStore.hpp"
#include "ObjectModel.hpp"
#include "PatchModel.hpp"
@@ -53,7 +53,6 @@ ClientStore::ClientStore(SharedPtr<EngineInterface> engine, SharedPtr<SigClientI
emitter->signal_property_change.connect(sigc::mem_fun(this, &ClientStore::set_property));
emitter->signal_voice_value.connect(sigc::mem_fun(this, &ClientStore::set_voice_value));
emitter->signal_activity.connect(sigc::mem_fun(this, &ClientStore::activity));
- emitter->signal_binding.connect(sigc::mem_fun(this, &ClientStore::binding));
}
@@ -258,12 +257,19 @@ ClientStore::put(const URI& uri, const Resource::Properties& properties)
bool is_path = Path::is_valid(uri.str());
bool is_meta = ResourceImpl::is_meta_uri(uri);
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
+
if (!(is_path || is_meta)) {
- const URI& type_uri = properties.find("rdf:type")->second.get_uri();
- if (Plugin::type_from_uri(type_uri.str()) != Plugin::NIL) {
- SharedPtr<PluginModel> p(new PluginModel(uri, type_uri, properties));
- add_plugin(p);
- return;
+ const Atom& type = properties.find(uris.rdf_type)->second;
+ if (type.type() == Atom::URI) {
+ const URI& type_uri = type.get_uri();
+ if (Plugin::type_from_uri(type_uri) != Plugin::NIL) {
+ SharedPtr<PluginModel> p(new PluginModel(uri, type_uri, properties));
+ add_plugin(p);
+ return;
+ }
+ } else {
+ LOG(error) << "Non-URI type " << type << endl;
}
}
@@ -287,20 +293,20 @@ ClientStore::put(const URI& uri, const Resource::Properties& properties)
if (is_patch) {
uint32_t poly = 1;
- iterator p = properties.find("ingen:polyphony");
+ iterator p = properties.find(uris.ingen_polyphony);
if (p != properties.end() && p->second.is_valid() && p->second.type() == Atom::INT)
poly = p->second.get_int32();
SharedPtr<PatchModel> model(new PatchModel(path, poly));
model->set_properties(properties);
add_object(model);
} else if (is_node) {
- const Resource::Properties::const_iterator p = properties.find("rdf:instanceOf");
+ const Resource::Properties::const_iterator p = properties.find(uris.rdf_instanceOf);
SharedPtr<PluginModel> plug;
if (p->second.is_valid() && p->second.type() == Atom::URI) {
if (!(plug = plugin(p->second.get_uri()))) {
LOG(warn) << "Unable to find plugin " << p->second.get_uri() << endl;
plug = SharedPtr<PluginModel>(
- new PluginModel(p->second.get_uri(), "ingen:nil", Resource::Properties()));
+ new PluginModel(p->second.get_uri(), uris.ingen_nil, Resource::Properties()));
add_plugin(plug);
}
@@ -313,7 +319,7 @@ ClientStore::put(const URI& uri, const Resource::Properties& properties)
} else if (is_port) {
if (data_type != PortType::UNKNOWN) {
PortModel::Direction pdir = is_output ? PortModel::OUTPUT : PortModel::INPUT;
- const Resource::Properties::const_iterator i = properties.find("lv2:index");
+ const Resource::Properties::const_iterator i = properties.find(uris.lv2_index);
if (i != properties.end() && i->second.type() == Atom::INT) {
SharedPtr<PortModel> p(new PortModel(path, i->second.get_int32(), data_type, pdir));
p->set_properties(properties);
@@ -378,13 +384,6 @@ ClientStore::activity(const Path& path)
}
-void
-ClientStore::binding(const Path& path, const Shared::MessageType& type)
-{
- LOG(info) << "Bind " << path << " : " << type << endl;
-}
-
-
SharedPtr<PatchModel>
ClientStore::connection_patch(const Path& src_port_path, const Path& dst_port_path)
{
diff --git a/src/client/ClientStore.hpp b/src/client/ClientStore.hpp
index 309e7795..38df414e 100644
--- a/src/client/ClientStore.hpp
+++ b/src/client/ClientStore.hpp
@@ -33,7 +33,7 @@ namespace Raul { class Atom; }
namespace Ingen {
-namespace Shared { class GraphObject; class MessageType; }
+namespace Shared { class GraphObject; }
namespace Client {
@@ -95,7 +95,6 @@ private:
// Slots for SigClientInterface signals
void object_moved(const Raul::Path& old_path, const Raul::Path& new_path);
void activity(const Raul::Path& path);
- void binding(const Raul::Path& path, const Shared::MessageType& type);
bool attempt_connection(const Raul::Path& src_port_path, const Raul::Path& dst_port_path);
diff --git a/src/client/DeprecatedLoader.cpp b/src/client/DeprecatedLoader.cpp
index ec603760..8d774e17 100644
--- a/src/client/DeprecatedLoader.cpp
+++ b/src/client/DeprecatedLoader.cpp
@@ -29,6 +29,7 @@
#include <libxml/xpath.h>
#include "raul/log.hpp"
#include "raul/Path.hpp"
+#include "shared/LV2URIMap.hpp"
#include "interface/EngineInterface.hpp"
#include "DeprecatedLoader.hpp"
@@ -224,13 +225,15 @@ DeprecatedLoader::load_patch(const Glib::ustring& filename,
size_t poly = 0;
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
+
/* Use parameter overridden polyphony, if given */
- GraphObject::Properties::iterator poly_param = initial_data.find("ingen:polyphony");
+ GraphObject::Properties::iterator poly_param = initial_data.find(uris.ingen_polyphony);
if (poly_param != initial_data.end() && poly_param->second.type() == Atom::INT)
poly = poly_param->second.get_int32();
- if (initial_data.find("filename") == initial_data.end())
- initial_data.insert(make_pair("filename", Atom(filename.c_str()))); // FIXME: URL?
+ if (initial_data.find(uris.ingen_document) == initial_data.end())
+ initial_data.insert(make_pair(uris.ingen_document, filename));
xmlDocPtr doc = xmlParseFile(filename.c_str());
@@ -294,8 +297,8 @@ DeprecatedLoader::load_patch(const Glib::ustring& filename,
// Create it, if we're not merging
if (!existing && !path.is_root()) {
Resource::Properties props;
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "ingen:Patch")));
- props.insert(make_pair("ingen:polyphony", Atom((int32_t)poly)));
+ props.insert(make_pair(uris.rdf_type, uris.ingen_Patch));
+ props.insert(make_pair(uris.ingen_polyphony, Atom((int32_t)poly)));
_engine->put(path, props);
for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
_engine->set_property(path, i->first, i->second);
@@ -340,7 +343,7 @@ DeprecatedLoader::load_patch(const Glib::ustring& filename,
for ( ; i != pm->controls().end(); ++i) {
const float value = i->value();
_engine->set_property(translate_load_path(i->port_path().str()),
- "ingen:value", Atom(value));
+ uris.ingen_value, Atom(value));
}
} else {
LOG(warn) << "Unknown preset `" << pm->name() << "'" << endl;
@@ -357,7 +360,7 @@ DeprecatedLoader::load_patch(const Glib::ustring& filename,
// _engine->set_property(subject, i->first, i->second);
if (!existing)
- _engine->set_property(path, "ingen:enabled", (bool)true);
+ _engine->set_property(path, uris.ingen_enabled, (bool)true);
_load_path_translations.clear();
@@ -451,38 +454,40 @@ DeprecatedLoader::load_node(const Path& parent, xmlDocPtr doc, const xmlNodePtr
return false;
}
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
+
// Compatibility hacks for old patches that represent patch ports as nodes
if (plugin_uri == "") {
bool is_port = false;
Resource::Properties props;
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "ingen:Patch")));
+ props.insert(make_pair(uris.rdf_type, uris.ingen_Patch));
if (plugin_type == "Internal") {
is_port = true;
if (plugin_label == "audio_input") {
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:AudioPort")));
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:InputPort")));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_AudioPort));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_InputPort));
_engine->put(path, props);
} else if (plugin_label == "audio_output") {
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:AudioPort")));
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:OutputPort")));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_AudioPort));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_OutputPort));
_engine->put(path, props);
} else if (plugin_label == "control_input") {
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:ControlPort")));
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:InputPort")));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_ControlPort));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_InputPort));
_engine->put(path, props);
} else if (plugin_label == "control_output" ) {
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:ControlPort")));
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:OutputPort")));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_ControlPort));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_OutputPort));
_engine->put(path, props);
} else if (plugin_label == "midi_input") {
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2ev:EventPort")));
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:InputPort")));
+ props.insert(make_pair(uris.rdf_type, uris.lv2ev_EventPort));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_InputPort));
_engine->put(path, props);
} else if (plugin_label == "midi_output" ) {
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2ev:EventPort")));
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "lv2:OutputPort")));
+ props.insert(make_pair(uris.rdf_type, uris.lv2ev_EventPort));
+ props.insert(make_pair(uris.rdf_type, uris.lv2_OutputPort));
_engine->put(path, props);
} else {
is_port = false;
@@ -528,11 +533,11 @@ DeprecatedLoader::load_node(const Path& parent, xmlDocPtr doc, const xmlNodePtr
plugin_uri = "om:" + plugin_type + ":" + library_name + ":" + plugin_label;
Resource::Properties props;
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "ingen:Node")));
- props.insert(make_pair("rdf:instanceOf", Atom(Atom::URI, plugin_uri)));
+ props.insert(make_pair(uris.rdf_type, uris.ingen_Node));
+ props.insert(make_pair(uris.rdf_instanceOf, Atom(Atom::URI, plugin_uri)));
_engine->put(path, props);
- _engine->set_property(path, "ingen:polyphonic", bool(polyphonic));
+ _engine->set_property(path, uris.ingen_polyphonic, bool(polyphonic));
for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
_engine->set_property(path, i->first, i->second);
@@ -543,10 +548,10 @@ DeprecatedLoader::load_node(const Path& parent, xmlDocPtr doc, const xmlNodePtr
// Not deprecated
} else {
Resource::Properties props;
- props.insert(make_pair("rdf:type", Atom(Atom::URI, "ingen:Node")));
- props.insert(make_pair("rdf:instanceOf", Atom(Atom::URI, plugin_uri)));
+ props.insert(make_pair(uris.rdf_type, uris.ingen_Node));
+ props.insert(make_pair(uris.rdf_instanceOf, Atom(Atom::URI, plugin_uri)));
_engine->put(path, props);
- _engine->set_property(path, "ingen:polyphonic", bool(polyphonic));
+ _engine->set_property(path, uris.ingen_polyphonic, bool(polyphonic));
for (GraphObject::Properties::const_iterator i = initial_data.begin(); i != initial_data.end(); ++i)
_engine->set_property(path, i->first, i->second);
return true;
@@ -567,6 +572,7 @@ DeprecatedLoader::load_subpatch(const string& base_filename, const Path& parent,
size_t poly = 0;
GraphObject::Properties initial_data;
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
while (cur != NULL) {
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
@@ -574,7 +580,7 @@ DeprecatedLoader::load_subpatch(const string& base_filename, const Path& parent,
if ((!xmlStrcmp(cur->name, (const xmlChar*)"name"))) {
name = (const char*)key;
} else if ((!xmlStrcmp(cur->name, (const xmlChar*)"polyphony"))) {
- initial_data.insert(make_pair("ingen::polyphony", (int)poly));
+ initial_data.insert(make_pair(uris.ingen_polyphony, (int)poly));
} else if ((!xmlStrcmp(cur->name, (const xmlChar*)"filename"))) {
filename = base_filename + "/" + (const char*)key;
} else { // Don't know what this tag is, add it as variable
diff --git a/src/client/HTTPClientReceiver.cpp b/src/client/HTTPClientReceiver.cpp
index c4eb2416..0eee23ca 100644
--- a/src/client/HTTPClientReceiver.cpp
+++ b/src/client/HTTPClientReceiver.cpp
@@ -24,6 +24,7 @@
#include "raul/log.hpp"
#include "raul/Atom.hpp"
#include "module/Module.hpp"
+#include "module/World.hpp"
#include "HTTPClientReceiver.hpp"
#define LOG(s) s << "[HTTPClientReceiver] "
diff --git a/src/client/HTTPEngineSender.cpp b/src/client/HTTPEngineSender.cpp
index 91c8d76c..0b544600 100644
--- a/src/client/HTTPEngineSender.cpp
+++ b/src/client/HTTPEngineSender.cpp
@@ -124,7 +124,7 @@ HTTPEngineSender::put(const URI& uri,
model.add_statement(
Redland::Resource(_world, path),
i->first.str(),
- AtomRDF::atom_to_node(_world, i->second));
+ AtomRDF::atom_to_node(model, i->second));
const string str = model.serialise_to_string();
SoupMessage* msg = soup_message_new(SOUP_METHOD_PUT, full_uri.c_str());
diff --git a/src/client/NodeModel.cpp b/src/client/NodeModel.cpp
index df72c9e2..bed43e7a 100644
--- a/src/client/NodeModel.cpp
+++ b/src/client/NodeModel.cpp
@@ -19,6 +19,8 @@
#include <cmath>
#include "ingen-config.h"
#include "interface/Port.hpp"
+#include "module/World.hpp"
+#include "shared/LV2URIMap.hpp"
#include "NodeModel.hpp"
using namespace std;
@@ -204,13 +206,14 @@ NodeModel::default_port_value_range(SharedPtr<PortModel> port, float& min, float
void
NodeModel::port_value_range(SharedPtr<PortModel> port, float& min, float& max) const
{
+ const Shared::LV2URIMap& uris = Shared::LV2URIMap::instance();
assert(port->parent().get() == this);
default_port_value_range(port, min, max);
// Possibly overriden
- const Atom& min_atom = port->get_property("lv2:minimum");
- const Atom& max_atom = port->get_property("lv2:maximum");
+ const Atom& min_atom = port->get_property(uris.lv2_minimum);
+ const Atom& max_atom = port->get_property(uris.lv2_maximum);
if (min_atom.type() == Atom::FLOAT)
min = min_atom.get_float();
if (max_atom.type() == Atom::FLOAT)
diff --git a/src/client/ObjectModel.cpp b/src/client/ObjectModel.cpp
index 69d79d1e..e121a868 100644
--- a/src/client/ObjectModel.cpp
+++ b/src/client/ObjectModel.cpp
@@ -17,8 +17,6 @@
#include "raul/TableImpl.hpp"
#include "interface/GraphObject.hpp"
-#include "module/ingen_module.hpp"
-#include "module/World.hpp"
#include "shared/LV2URIMap.hpp"
#include "ObjectModel.hpp"
@@ -78,7 +76,7 @@ ObjectModel::get_property(const Raul::URI& key) const
bool
ObjectModel::polyphonic() const
{
- const Raul::Atom& polyphonic = get_property(ingen_get_world()->uris->ingen_polyphonic);
+ const Raul::Atom& polyphonic = get_property(Shared::LV2URIMap::instance().ingen_polyphonic);
return (polyphonic.is_valid() && polyphonic.get_bool());
}
diff --git a/src/client/PatchModel.cpp b/src/client/PatchModel.cpp
index 7b29b3f6..7d44eb1c 100644
--- a/src/client/PatchModel.cpp
+++ b/src/client/PatchModel.cpp
@@ -17,7 +17,6 @@
#include <cassert>
#include "raul/log.hpp"
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "PatchModel.hpp"
#include "NodeModel.hpp"
@@ -165,7 +164,7 @@ PatchModel::remove_connection(const Path& src_port_path, const Path& dst_port_pa
bool
PatchModel::enabled() const
{
- const Raul::Atom& enabled = get_property(ingen_get_world()->uris->ingen_enabled);
+ const Raul::Atom& enabled = get_property(Shared::LV2URIMap::instance().ingen_enabled);
return (enabled.is_valid() && enabled.get_bool());
}
@@ -173,7 +172,7 @@ PatchModel::enabled() const
Raul::Atom&
PatchModel::set_meta_property(const Raul::URI& key, const Atom& value)
{
- if (key == ingen_get_world()->uris->ingen_polyphony)
+ if (key == Shared::LV2URIMap::instance().ingen_polyphony)
_poly = value.get_int32();
return NodeModel::set_meta_property(key, value);
diff --git a/src/client/PatchModel.hpp b/src/client/PatchModel.hpp
index 748c2704..d87c4ee8 100644
--- a/src/client/PatchModel.hpp
+++ b/src/client/PatchModel.hpp
@@ -75,7 +75,7 @@ private:
friend class ClientStore;
PatchModel(const Raul::Path& patch_path, size_t internal_poly)
- : NodeModel("ingen:Patch", patch_path)
+ : NodeModel("http://drobilla.net/ns/ingen#Patch", patch_path)
, _connections(new Connections())
, _poly(internal_poly)
, _editable(true)
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp
index d740a3c1..43571f08 100644
--- a/src/client/PluginModel.cpp
+++ b/src/client/PluginModel.cpp
@@ -21,7 +21,6 @@
#include "raul/Path.hpp"
#include "raul/Atom.hpp"
#include "ingen-config.h"
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "PluginModel.hpp"
#include "PatchModel.hpp"
@@ -49,14 +48,15 @@ PluginModel::PluginModel(const URI& uri, const URI& type_uri, const Resource::Pr
Glib::Mutex::Lock lock(_rdf_world->mutex());
assert(_rdf_world);
- add_property("rdf:type", Atom(Atom::URI, this->type_uri()));
+ add_property("http://www.w3.org/1999/02/22-rdf-syntax-ns#type", this->type_uri());
#ifdef HAVE_SLV2
SLV2Value plugin_uri = slv2_value_new_uri(_slv2_world, uri.c_str());
_slv2_plugin = slv2_plugins_get_by_uri(_slv2_plugins, plugin_uri);
slv2_value_free(plugin_uri);
#endif
if (_type == Internal)
- set_property("doap:name", Atom(uri.substr(uri.find_last_of('#') + 1).c_str()));
+ set_property("http://usefulinc.com/ns/doap#name",
+ Atom(uri.substr(uri.find_last_of('#') + 1).c_str()));
}
@@ -69,7 +69,7 @@ PluginModel::get_property(const URI& key) const
return val;
// No lv2:symbol from data or engine, invent one
- if (key == ingen_get_world()->uris->lv2_symbol) {
+ if (key == Shared::LV2URIMap::instance().lv2_symbol) {
const URI& uri = this->uri();
size_t last_slash = uri.find_last_of('/');
size_t last_hash = uri.find_last_of('#');
@@ -92,7 +92,7 @@ PluginModel::get_property(const URI& key) const
else
symbol = uri.str().substr(first_delim + 1, last_delim - first_delim - 1);
}
- set_property("lv2:symbol", symbol);
+ set_property("http://lv2plug.in/ns/lv2core#symbol", symbol);
return get_property(key);
}
@@ -153,7 +153,7 @@ PluginModel::set(SharedPtr<PluginModel> p)
Symbol
PluginModel::default_node_symbol()
{
- const Atom& name_atom = get_property("lv2:symbol");
+ const Atom& name_atom = get_property("http://lv2plug.in/ns/lv2core#symbol");
if (name_atom.is_valid() && name_atom.type() == Atom::STRING)
return Symbol::symbolify(name_atom.get_string());
else
@@ -164,7 +164,7 @@ PluginModel::default_node_symbol()
string
PluginModel::human_name()
{
- const Atom& name_atom = get_property("doap:name");
+ const Atom& name_atom = get_property("http://usefulinc.com/ns/doap#name");
if (name_atom.type() == Atom::STRING)
return name_atom.get_string();
else
diff --git a/src/client/PluginUI.cpp b/src/client/PluginUI.cpp
index 0df3b060..89adb8da 100644
--- a/src/client/PluginUI.cpp
+++ b/src/client/PluginUI.cpp
@@ -75,7 +75,7 @@ lv2_ui_write(LV2UI_Controller controller,
if (ev->type == map->midi_event.id) {
// FIXME: bundle multiple events by writing an entire buffer here
ui->world()->engine->set_property(port->path(), map->ingen_value,
- Atom("lv2midi:MidiEvent", ev->size, data));
+ Atom("http://lv2plug.in/ns/ext/midi#MidiEvent", ev->size, data));
} else {
warn << "Unable to send event type " << ev->type <<
" over OSC, ignoring event" << endl;
diff --git a/src/client/PluginUI.hpp b/src/client/PluginUI.hpp
index e33f149f..f0baba3c 100644
--- a/src/client/PluginUI.hpp
+++ b/src/client/PluginUI.hpp
@@ -20,11 +20,10 @@
#include "slv2/slv2.h"
#include "raul/SharedPtr.hpp"
-#include "module/World.hpp"
#include "LV2Features.hpp"
namespace Ingen {
-namespace Shared { class EngineInterface; }
+namespace Shared { class EngineInterface; class World; }
namespace Client {
class NodeModel;
diff --git a/src/client/PortModel.cpp b/src/client/PortModel.cpp
index 5eb578d7..5d4cb417 100644
--- a/src/client/PortModel.cpp
+++ b/src/client/PortModel.cpp
@@ -15,8 +15,6 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "module/ingen_module.hpp"
-#include "module/World.hpp"
#include "shared/LV2URIMap.hpp"
#include "PortModel.hpp"
#include "NodeModel.hpp"
@@ -30,7 +28,7 @@ PortModel::set_property(const Raul::URI& uri,
const Raul::Atom& value)
{
Raul::Atom& ret = ObjectModel::set_property(uri, value);
- if (uri == ingen_get_world()->uris->ingen_value)
+ if (uri == Shared::LV2URIMap::instance().ingen_value)
this->value(value);
return ret;
}
diff --git a/src/client/PortModel.hpp b/src/client/PortModel.hpp
index 5a944532..b199d05b 100644
--- a/src/client/PortModel.hpp
+++ b/src/client/PortModel.hpp
@@ -50,9 +50,9 @@ public:
bool has_hint(const std::string& qname) const;
- bool is_logarithmic() const { return has_hint("ingen:logarithmic"); }
- bool is_integer() const { return has_hint("lv2:integer"); }
- bool is_toggle() const { return has_hint("lv2:toggled"); }
+ bool is_logarithmic() const { return has_hint("http://drobilla.net/ns/ingen#logarithmic"); }
+ bool is_integer() const { return has_hint("http://lv2plug.in/ns/lv2core#integer"); }
+ bool is_toggle() const { return has_hint("http://lv2plug.in/ns/lv2core#toggled"); }
inline bool operator==(const PortModel& pm) const { return (path() == pm.path()); }
diff --git a/src/client/SigClientInterface.hpp b/src/client/SigClientInterface.hpp
index 382813d3..bc2ee3f9 100644
--- a/src/client/SigClientInterface.hpp
+++ b/src/client/SigClientInterface.hpp
@@ -41,7 +41,7 @@ class SigClientInterface : public Ingen::Shared::ClientInterface, public sigc::t
public:
SigClientInterface() {}
- Raul::URI uri() const { return "ingen:internal"; }
+ Raul::URI uri() const { return "http://drobilla.net/ns/ingen#internal"; }
sigc::signal<void, int32_t> signal_response_ok;
sigc::signal<void, int32_t, std::string> signal_response_error;
@@ -60,7 +60,6 @@ public:
sigc::signal<void, Raul::Path, Raul::Atom> signal_port_value;
sigc::signal<void, Raul::Path, uint32_t, Raul::Atom> signal_voice_value;
sigc::signal<void, Raul::Path> signal_activity;
- sigc::signal<void, Raul::Path, Shared::MessageType> signal_binding;
/** Fire pending signals. Only does anything on derived classes (that may queue) */
virtual bool emit_signals() { return false; }
@@ -112,9 +111,6 @@ protected:
void activity(const Raul::Path& port_path)
{ EMIT(activity, port_path); }
-
- void binding(const Raul::Path& path, const Shared::MessageType& type)
- { EMIT(binding, path, type); }
};
diff --git a/src/client/ThreadedSigClientInterface.hpp b/src/client/ThreadedSigClientInterface.hpp
index 16eb98c3..128f6d86 100644
--- a/src/client/ThreadedSigClientInterface.hpp
+++ b/src/client/ThreadedSigClientInterface.hpp
@@ -24,7 +24,6 @@
#include <glibmm/thread.h>
#include "raul/Atom.hpp"
#include "interface/ClientInterface.hpp"
-#include "interface/MessageType.hpp"
#include "SigClientInterface.hpp"
#include "raul/SRSWQueue.hpp"
@@ -61,11 +60,10 @@ public:
, property_change_slot(signal_property_change.make_slot())
, port_value_slot(signal_port_value.make_slot())
, activity_slot(signal_activity.make_slot())
- , binding_slot(signal_binding.make_slot())
{
}
- virtual Raul::URI uri() const { return "ingen:internal"; }
+ virtual Raul::URI uri() const { return "http://drobilla.net/ns/ingen#internal"; }
void bundle_begin()
{ push_sig(bundle_begin_slot); }
@@ -109,9 +107,6 @@ public:
void activity(const Raul::Path& port_path)
{ push_sig(sigc::bind(activity_slot, port_path)); }
- void binding(const Raul::Path& path, const Shared::MessageType& type)
- { push_sig(sigc::bind(binding_slot, path, type)); }
-
/** Process all queued events - Called from GTK thread to emit signals. */
bool emit_signals();
@@ -141,7 +136,6 @@ private:
sigc::slot<void, Raul::Path, Raul::Atom> port_value_slot;
sigc::slot<void, Raul::Path, uint32_t, Raul::Atom> voice_value_slot;
sigc::slot<void, Raul::Path> activity_slot;
- sigc::slot<void, Raul::Path, Shared::MessageType> binding_slot;
};
diff --git a/src/common/interface/ClientInterface.hpp b/src/common/interface/ClientInterface.hpp
index 676c7eb6..e12788f9 100644
--- a/src/common/interface/ClientInterface.hpp
+++ b/src/common/interface/ClientInterface.hpp
@@ -28,8 +28,6 @@ namespace Raul { class Path; class URI; }
namespace Ingen {
namespace Shared {
-class MessageType;
-
/** The (only) interface the engine uses to communicate with clients.
* Purely virtual (except for the destructor).
*
@@ -56,8 +54,6 @@ public:
virtual void error(const std::string& msg) = 0;
virtual void activity(const Raul::Path& path) = 0;
-
- virtual void binding(const Raul::Path& path, const MessageType& type) = 0;
};
diff --git a/src/common/interface/EventType.hpp b/src/common/interface/EventType.hpp
index 3f3def1d..1e9a1b16 100644
--- a/src/common/interface/EventType.hpp
+++ b/src/common/interface/EventType.hpp
@@ -18,6 +18,8 @@
#ifndef INGEN_INTERFACE_EVENTTYPE_HPP
#define INGEN_INTERFACE_EVENTTYPE_HPP
+#include "raul/URI.hpp"
+
namespace Ingen {
namespace Shared {
@@ -33,7 +35,7 @@ public:
OSC = 2
};
- EventType(const std::string& uri)
+ EventType(const Raul::URI& uri)
: _symbol(UNKNOWN)
{
if (uri == type_uri(MIDI)) {
@@ -47,7 +49,7 @@ public:
: _symbol(symbol)
{}
- inline const char* uri() const { return type_uri(_symbol); }
+ inline const Raul::URI& uri() const { return type_uri(_symbol); }
inline bool operator==(const Symbol& symbol) const { return (_symbol == symbol); }
inline bool operator!=(const Symbol& symbol) const { return (_symbol != symbol); }
@@ -58,13 +60,14 @@ public:
inline bool is_osc() { return _symbol == OSC; }
private:
-
- static inline const char* type_uri(unsigned symbol_num) {
- switch (symbol_num) {
- case 1: return "ingen:MidiEvent";
- case 2: return "ingen:OSCEvent";
- default: return "";
- }
+ static inline const Raul::URI& type_uri(unsigned symbol_num) {
+ assert(symbol_num <= OSC);
+ static const Raul::URI uris[] = {
+ "http://drobilla.net/ns/ingen#nil",
+ "http://drobilla.net/ns/ingen#MidiEvent",
+ "http://drobilla.net/ns/ingen#OSCEvent"
+ };
+ return uris[symbol_num];
}
Symbol _symbol;
diff --git a/src/common/interface/MessageType.hpp b/src/common/interface/MessageType.hpp
deleted file mode 100644
index 3f18aaac..00000000
--- a/src/common/interface/MessageType.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/* This file is part of Ingen.
- * Copyright (C) 2007-2009 Dave Robillard <http://drobilla.net>
- *
- * Ingen is free software; you can redistribute it and/or modify it under the
- * terms of the GNU General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option) any later
- * version.
- *
- * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef INGEN_INTERFACE_MESSAGETYPE_HPP
-#define INGEN_INTERFACE_MESSAGETYPE_HPP
-
-#include <cassert>
-#include <iostream>
-#include <string>
-
-namespace Ingen {
-namespace Shared {
-
-
-/** A type of control message that could be bound to a control port.
- *
- * \ingroup interface
- */
-class MessageType
-{
-public:
- enum Type {
- MIDI_PITCH,
- MIDI_CC,
- MIDI_RPN,
- MIDI_NRPN
- };
-
- MessageType(Type type, int16_t num)
- : _type(type)
- {
- switch (type) {
- case MIDI_PITCH:
- break;
- case MIDI_CC:
- assert(num >= 0 && num < 128);
- _id.midi_cc = num;
- break;
- case MIDI_RPN:
- assert(num >= 0 && num < 16384);
- _id.midi_pn = num;
- break;
- case MIDI_NRPN:
- assert(num >= 0 && num < 16384);
- _id.midi_pn = num;
- break;
- }
- }
-
- inline Type type() const { return _type; }
- inline int8_t midi_cc_num() const { assert(_type == MIDI_CC); return _id.midi_cc; }
- inline int8_t midi_rpn_num() const { assert(_type == MIDI_RPN); return _id.midi_pn; }
- inline int8_t midi_nrpn_num() const { assert(_type == MIDI_NRPN); return _id.midi_pn; }
-
- inline int num() const {
- switch (_type) {
- case MIDI_CC:
- return _id.midi_cc;
- case MIDI_RPN:
- case MIDI_NRPN:
- return _id.midi_pn;
- default:
- return -1;
- }
- }
-
- inline const char* type_uri() const {
- switch (_type) {
- case MIDI_PITCH:
- return "midi:PitchBend";
- case MIDI_CC:
- return "midi:Control";
- case MIDI_RPN:
- return "midi:RPN";
- case MIDI_NRPN:
- return "midi:NRPN";
- }
- }
-
-private:
- union {
- int8_t midi_cc; ///< Controller number [0..2^7)
- int16_t midi_pn; ///< RPN or NRPN number [0..2^14)
- } _id;
-
- Type _type;
-};
-
-
-} // namespace Shared
-} // namespace Ingen
-
-
-static inline std::ostream& operator<<(std::ostream& os, const Ingen::Shared::MessageType& type)
-{
- using namespace Ingen::Shared;
- switch (type.type()) {
- case MessageType::MIDI_PITCH: return os << "MIDI Pitch Bender";
- case MessageType::MIDI_CC: return os << "MIDI CC " << type.num();
- case MessageType::MIDI_RPN: return os << "MIDI RPN " << type.num();
- case MessageType::MIDI_NRPN: return os << "MIDI NRPN " << type.num();
- }
- return os;
-}
-
-#endif // INGEN_INTERFACE_MESSAGETYPE_HPP
diff --git a/src/common/interface/Plugin.hpp b/src/common/interface/Plugin.hpp
index d3d74970..22464e91 100644
--- a/src/common/interface/Plugin.hpp
+++ b/src/common/interface/Plugin.hpp
@@ -19,6 +19,7 @@
#define INGEN_INTERFACE_PLUGIN_HPP
#include <string>
+#include "raul/URI.hpp"
#include "interface/Resource.hpp"
namespace Ingen {
@@ -32,26 +33,31 @@ public:
virtual Type type() const = 0;
- inline const char* type_uri() const {
- switch (type()) {
- case LV2: return "lv2:Plugin";
- case LADSPA: return "ingen:LADSPAPlugin";
- case Internal: return "ingen:Internal";
- case Patch: return "ingen:Patch";
- default: return "";
- }
+ static inline const Raul::URI& type_uri(Type type) {
+ static const Raul::URI uris[] = {
+ "http://drobilla.net/ns/ingen#nil",
+ "http://lv2plug.in/ns/lv2core#Plugin",
+ "http://drobilla.net/ns/ingen#LADSPAPlugin",
+ "http://drobilla.net/ns/ingen#Internal",
+ "http://drobilla.net/ns/ingen#Patch"
+ };
+
+ return uris[type];
}
- static inline Type type_from_uri(const std::string& uri) {
- if (uri == "lv2:Plugin")
+ inline const Raul::URI& type_uri() const { return type_uri(type()); }
+
+ static inline Type type_from_uri(const Raul::URI& uri) {
+ if (uri == type_uri(LV2))
return LV2;
- else if (uri == "ingen:LADSPAPlugin")
+ else if (uri == type_uri(LADSPA))
return LADSPA;
- else if (uri == "ingen:Internal")
+ else if (uri == type_uri(Internal))
return Internal;
- else if (uri == "ingen:Patch")
+ else if (uri == type_uri(Patch))
return Patch;
- return NIL;
+ else
+ return NIL;
}
};
diff --git a/src/common/interface/PortType.hpp b/src/common/interface/PortType.hpp
index ca739cb8..e1d51e21 100644
--- a/src/common/interface/PortType.hpp
+++ b/src/common/interface/PortType.hpp
@@ -37,22 +37,22 @@ public:
AUDIO = 1,
CONTROL = 2,
EVENTS = 3,
- VALUE = 7,
- MESSAGE = 8,
+ VALUE = 4,
+ MESSAGE = 5,
};
PortType(const Raul::URI& uri)
: _symbol(UNKNOWN)
{
- if (uri.str() == type_uri(AUDIO)) {
+ if (uri == type_uri(AUDIO)) {
_symbol = AUDIO;
- } else if (uri.str() == type_uri(CONTROL)) {
+ } else if (uri == type_uri(CONTROL)) {
_symbol = CONTROL;
- } else if (uri.str() == type_uri(EVENTS)) {
+ } else if (uri == type_uri(EVENTS)) {
_symbol = EVENTS;
- } else if (uri.str() == type_uri(VALUE)) {
+ } else if (uri == type_uri(VALUE)) {
_symbol = VALUE;
- } else if (uri.str() == type_uri(MESSAGE)) {
+ } else if (uri == type_uri(MESSAGE)) {
_symbol = MESSAGE;
}
}
@@ -61,8 +61,8 @@ public:
: _symbol(symbol)
{}
- inline const char* uri() const { return type_uri(_symbol); }
- inline Symbol symbol() const { return _symbol; }
+ inline const Raul::URI& uri() const { return type_uri(_symbol); }
+ inline Symbol symbol() const { return _symbol; }
inline bool operator==(const Symbol& symbol) const { return (_symbol == symbol); }
inline bool operator!=(const Symbol& symbol) const { return (_symbol != symbol); }
@@ -76,16 +76,17 @@ public:
inline bool is_message() { return _symbol == MESSAGE; }
private:
-
- static inline const char* type_uri(unsigned symbol_num) {
- switch (symbol_num) {
- case 1: return "lv2:AudioPort";
- case 2: return "lv2:ControlPort";
- case 3: return "lv2ev:EventPort";
- case 7: return "obj:ValuePort";
- case 8: return "obj:MessagePort";
- default: return "";
- }
+ static inline const Raul::URI& type_uri(unsigned symbol_num) {
+ assert(symbol_num <= MESSAGE);
+ static const Raul::URI uris[] = {
+ "http://drobilla.net/ns/ingen#nil",
+ "http://lv2plug.in/ns/lv2core#AudioPort",
+ "http://lv2plug.in/ns/lv2core#ControlPort",
+ "http://lv2plug.in/ns/ext/event#EventPort",
+ "http://lv2plug.in/ns/dev/objects#ValuePort",
+ "http://lv2plug.in/ns/dev/objects#MessagePort"
+ };
+ return uris[symbol_num];
}
Symbol _symbol;
diff --git a/src/engine/ClientBroadcaster.hpp b/src/engine/ClientBroadcaster.hpp
index 808c861a..37593730 100644
--- a/src/engine/ClientBroadcaster.hpp
+++ b/src/engine/ClientBroadcaster.hpp
@@ -108,7 +108,7 @@ public:
// ClientInterface
- Raul::URI uri() const { return "ingen:broadcaster"; } ///< N/A
+ Raul::URI uri() const { return "http://drobilla.net/ns/ingen#broadcaster"; } ///< N/A
void response_ok(int32_t id) {} ///< N/A
void response_error(int32_t id, const std::string& msg) {} ///< N/A
@@ -118,10 +118,6 @@ public:
void error(const std::string& msg) { BROADCAST(error, msg); }
void activity(const Raul::Path& path) { BROADCAST(activity, path); }
- void binding(const Raul::Path& path, const Shared::MessageType& type) {
- BROADCAST(binding, path, type);
- }
-
private:
typedef std::map<Raul::URI, Shared::ClientInterface*> Clients;
Clients _clients;
diff --git a/src/engine/ControlBindings.cpp b/src/engine/ControlBindings.cpp
index 43e30338..2144aba7 100644
--- a/src/engine/ControlBindings.cpp
+++ b/src/engine/ControlBindings.cpp
@@ -20,6 +20,7 @@
#include "events/SendPortValue.hpp"
#include "events/SendBinding.hpp"
#include "ControlBindings.hpp"
+#include "Engine.hpp"
#include "EventBuffer.hpp"
#include "PortImpl.hpp"
#include "ProcessContext.hpp"
@@ -34,6 +35,29 @@ namespace Ingen {
void
+ControlBindings::update_port(ProcessContext& context, PortImpl* port)
+{
+ const Shared::LV2URIMap& uris = Shared::LV2URIMap::instance();
+ const Raul::Atom& binding = port->get_property(uris.ingen_controlBinding);
+ if (binding.type() == Atom::DICT) {
+ Atom::DictValue::const_iterator t = binding.get_dict().find(uris.rdf_type);
+ Atom::DictValue::const_iterator n = binding.get_dict().find(uris.midi_controllerNumber);
+ if (t != binding.get_dict().end() && n != binding.get_dict().end()) {
+ if (t->second == uris.midi_Controller) {
+ _bindings->insert(make_pair(Key(MIDI_CC, n->second.get_int32()), port));
+ } else if (t->second == uris.midi_Bender) {
+ _bindings->insert(make_pair(Key(MIDI_BENDER), port));
+ } else if (t->second == uris.midi_ChannelPressure) {
+ _bindings->insert(make_pair(Key(MIDI_CHANNEL_PRESSURE), port));
+ } else {
+ error << "Unknown binding type " << t->second << endl;
+ }
+ }
+ }
+}
+
+
+void
ControlBindings::learn(PortImpl* port)
{
ThreadManager::assert_thread(THREAD_PRE_PROCESS);
@@ -42,28 +66,40 @@ ControlBindings::learn(PortImpl* port)
void
-ControlBindings::set_port_value(ProcessContext& context, PortImpl* port, int8_t cc_value)
+ControlBindings::set_port_value(ProcessContext& context, PortImpl* port, Type type, int16_t value)
{
// TODO: cache these to avoid the lookup
- float min = port->get_property("lv2:minimum").get_float();
- float max = port->get_property("lv2:maximum").get_float();
+ float min = port->get_property(Shared::LV2URIMap::instance().lv2_minimum).get_float();
+ float max = port->get_property(Shared::LV2URIMap::instance().lv2_maximum).get_float();
+
+ float normal;
+ switch (type) {
+ case MIDI_CC:
+ case MIDI_CHANNEL_PRESSURE:
+ normal = (float)value / 127.0;
+ break;
+ case MIDI_BENDER:
+ normal = (float)value / 16383.0;
+ default:
+ break;
+ }
- Raul::Atom value(static_cast<float>(((float)cc_value / 127.0) * (max - min) + min));
- port->set_value(value);
+ Raul::Atom atom(static_cast<float>(normal * (max - min) + min));
+ port->set_value(atom);
const Events::SendPortValue ev(context.engine(), context.start(), port, true, 0,
- value.get_float());
+ atom.get_float());
context.event_sink().write(sizeof(ev), &ev);
}
void
-ControlBindings::bind(ProcessContext& context, int8_t cc_num)
+ControlBindings::bind(ProcessContext& context, Type type, int16_t num)
{
- _bindings->insert(make_pair(cc_num, _learn_port));
+ assert(_learn_port);
+ _bindings->insert(make_pair(Key(type, num), _learn_port));
- const Events::SendBinding ev(context.engine(), context.start(), _learn_port,
- MessageType(MessageType::MIDI_CC, cc_num));
+ const Events::SendBinding ev(context.engine(), context.start(), _learn_port, type, num);
context.event_sink().write(sizeof(ev), &ev);
_learn_port = NULL;
@@ -106,12 +142,26 @@ ControlBindings::process(ProcessContext& context, EventBuffer* buffer)
if (_learn_port) {
buffer->rewind();
+ int16_t num;
while (buffer->get_event(&frames, &subframes, &type, &size, &buf)) {
- if (type == _map->midi_event.id && (buf[0] & 0xF0) == MIDI_CMD_CONTROL) {
- const int8_t controller = static_cast<const int8_t>(buf[1]);
- bind(context, controller);
- break;
+ if (type == _map->midi_event.id) {
+ switch (buf[0] & 0xF0) {
+ case MIDI_CMD_CONTROL:
+ num = static_cast<const int8_t>(buf[1]);
+ bind(context, MIDI_CC, num);
+ break;
+ case MIDI_CMD_BENDER:
+ bind(context, MIDI_BENDER);
+ break;
+ case MIDI_CMD_CHANNEL_PRESSURE:
+ bind(context, MIDI_CHANNEL_PRESSURE);
+ break;
+ default:
+ break;
+ }
}
+ if (!_learn_port)
+ break;
buffer->increment();
}
}
@@ -119,12 +169,28 @@ ControlBindings::process(ProcessContext& context, EventBuffer* buffer)
if (!bindings->empty()) {
buffer->rewind();
while (buffer->get_event(&frames, &subframes, &type, &size, &buf)) {
- if (type == _map->midi_event.id && (buf[0] & 0xF0) == MIDI_CMD_CONTROL) {
- const int8_t controller = static_cast<const int8_t>(buf[1]);
- const int8_t value = static_cast<const int8_t>(buf[2]);
- Bindings::const_iterator i = bindings->find(controller);
- if (i != bindings->end()) {
- set_port_value(context, i->second, value);
+ if (type == _map->midi_event.id) {
+ if ((buf[0] & 0xF0) == MIDI_CMD_CONTROL) {
+ const int8_t controller = static_cast<const int8_t>(buf[1]);
+ Bindings::const_iterator i = bindings->find(Key(MIDI_CC, controller));
+ if (i != bindings->end()) {
+ const int8_t value = static_cast<const int8_t>(buf[2]);
+ set_port_value(context, i->second, MIDI_CC, value);
+ }
+ } else if ((buf[0] & 0xF0) == MIDI_CMD_BENDER) {
+ Bindings::const_iterator i = bindings->find(Key(MIDI_BENDER));
+ if (i != bindings->end()) {
+ const int8_t lsb = static_cast<const int8_t>(buf[1]);
+ const int8_t msb = static_cast<const int8_t>(buf[2]);
+ const int16_t value = (msb << 7) + lsb;
+ set_port_value(context, i->second, MIDI_BENDER, value);
+ }
+ } else if ((buf[0] & 0xF0) == MIDI_CMD_CHANNEL_PRESSURE) {
+ Bindings::const_iterator i = bindings->find(Key(MIDI_CHANNEL_PRESSURE));
+ if (i != bindings->end()) {
+ const int8_t value = static_cast<const int8_t>(buf[1]);
+ set_port_value(context, i->second, MIDI_CHANNEL_PRESSURE, value);
+ }
}
}
buffer->increment();
diff --git a/src/engine/ControlBindings.hpp b/src/engine/ControlBindings.hpp
index e9ab290f..bae3cc73 100644
--- a/src/engine/ControlBindings.hpp
+++ b/src/engine/ControlBindings.hpp
@@ -33,7 +33,24 @@ class PortImpl;
class ControlBindings {
public:
- typedef std::map<int8_t, PortImpl*> Bindings;
+ enum Type {
+ MIDI_BENDER,
+ MIDI_CC,
+ MIDI_RPN,
+ MIDI_NRPN,
+ MIDI_CHANNEL_PRESSURE
+ };
+
+ struct Key {
+ Key(Type t, int16_t n=0) : type(t), num(n) {}
+ inline bool operator<(const Key& other) const {
+ return (type == other.type) ? (num < other.num) : (type < other.type);
+ }
+ Type type;
+ int16_t num;
+ };
+
+ typedef std::map<Key, PortImpl*> Bindings;
ControlBindings(Engine& engine, SharedPtr<Shared::LV2URIMap> map)
: _engine(engine)
@@ -43,6 +60,7 @@ public:
{}
void learn(PortImpl* port);
+ void update_port(ProcessContext& context, PortImpl* port);
void process(ProcessContext& context, EventBuffer* buffer);
/** Remove all bindings for @a path or children of @a path.
@@ -56,8 +74,8 @@ private:
SharedPtr<Shared::LV2URIMap> _map;
PortImpl* _learn_port;
- void set_port_value(ProcessContext& context, PortImpl* port, int8_t cc_value);
- void bind(ProcessContext& context, int8_t cc_num);
+ void set_port_value(ProcessContext& context, PortImpl* port, Type type, int16_t value);
+ void bind(ProcessContext& context, Type type, int16_t num=0);
SharedPtr<Bindings> _bindings;
};
diff --git a/src/engine/Engine.cpp b/src/engine/Engine.cpp
index 26febf3b..e57c144f 100644
--- a/src/engine/Engine.cpp
+++ b/src/engine/Engine.cpp
@@ -170,9 +170,9 @@ Engine::activate()
if (!root_patch) {
root_patch = new PatchImpl(*this, "root", 1, NULL,
_driver->sample_rate(), _driver->buffer_size(), 1);
- root_patch->meta().set_property(uris.rdf_type, Raul::Atom(Raul::Atom::URI, "ingen:Patch"));
+ root_patch->meta().set_property(uris.rdf_type, uris.ingen_Patch);
root_patch->meta().set_property(uris.ingen_polyphony, Raul::Atom(int32_t(1)));
- root_patch->set_property(uris.rdf_type, Raul::Atom(Raul::Atom::URI, "ingen:Node"));
+ root_patch->set_property(uris.rdf_type, uris.ingen_Node);
root_patch->activate();
_world->store->add(root_patch);
root_patch->compiled_patch(root_patch->compile());
@@ -181,8 +181,10 @@ Engine::activate()
// Add control port
Shared::Resource::Properties properties;
properties.insert(make_pair(uris.lv2_name, "Control"));
+ properties.insert(make_pair(uris.rdf_type, uris.lv2ev_EventPort));
+ properties.insert(make_pair(uris.rdf_type, uris.lv2_InputPort));
Events::CreatePort* ev = new Events::CreatePort(*this, SharedPtr<Responder>(), 0,
- "/ingen_control", "lv2ev:EventPort", false, NULL, properties);
+ "/ingen_control", uris.lv2ev_EventPort, false, NULL, properties);
ev->pre_process();
ProcessContext context(*this);
ev->execute(context);
diff --git a/src/engine/Engine.hpp b/src/engine/Engine.hpp
index e7892f84..e575db50 100644
--- a/src/engine/Engine.hpp
+++ b/src/engine/Engine.hpp
@@ -23,7 +23,6 @@
#include <set>
#include <boost/utility.hpp>
#include "raul/SharedPtr.hpp"
-#include "module/World.hpp"
#include "interface/PortType.hpp"
#include "interface/EventType.hpp"
@@ -33,6 +32,8 @@ namespace Raul { class Maid; }
namespace Ingen {
+namespace Shared { class World; }
+
class BufferFactory;
class ClientBroadcaster;
class ControlBindings;
diff --git a/src/engine/HTTPClientSender.cpp b/src/engine/HTTPClientSender.cpp
index 77f4fbad..dcea6288 100644
--- a/src/engine/HTTPClientSender.cpp
+++ b/src/engine/HTTPClientSender.cpp
@@ -64,7 +64,7 @@ HTTPClientSender::put(const URI& uri,
model.add_statement(
Redland::Resource(*_engine.world()->rdf_world, path),
i->first.str(),
- AtomRDF::atom_to_node(*_engine.world()->rdf_world, i->second));
+ AtomRDF::atom_to_node(model, i->second));
const string str = model.serialise_to_string();
send_chunk(str);
@@ -102,6 +102,7 @@ HTTPClientSender::disconnect(const Path& src_path, const Path& dst_path)
void
HTTPClientSender::set_property(const URI& subject, const URI& key, const Atom& value)
{
+#if 0
Redland::Node node = AtomRDF::atom_to_node(*_engine.world()->rdf_world, value);
const string msg = string(
"@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .\n"
@@ -111,6 +112,7 @@ HTTPClientSender::set_property(const URI& subject, const URI& key, const Atom& v
"rdf:predicate ").append(key.str()).append(" ;\n"
"rdf:value ").append(node.to_string()).append("\n] .\n");
send_chunk(msg);
+#endif
}
@@ -132,13 +134,6 @@ HTTPClientSender::activity(const Path& path)
void
-HTTPClientSender::binding(const Path& path, const MessageType& type)
-{
- warn << "TODO: HTTP binding" << endl;
-}
-
-
-void
HTTPClientSender::move(const Path& old_path, const Path& new_path)
{
string msg = string(
diff --git a/src/engine/HTTPClientSender.hpp b/src/engine/HTTPClientSender.hpp
index 4c975304..cbfd17f0 100644
--- a/src/engine/HTTPClientSender.hpp
+++ b/src/engine/HTTPClientSender.hpp
@@ -90,8 +90,6 @@ public:
virtual void activity(const Raul::Path& path);
- virtual void binding(const Raul::Path& path, const Shared::MessageType& type);
-
private:
Engine& _engine;
std::string _url;
diff --git a/src/engine/InputPort.cpp b/src/engine/InputPort.cpp
index cc72a7c5..e1859b79 100644
--- a/src/engine/InputPort.cpp
+++ b/src/engine/InputPort.cpp
@@ -19,6 +19,7 @@
#include <cstdlib>
#include <cassert>
#include "interface/Patch.hpp"
+#include "shared/LV2URIMap.hpp"
#include "AudioBuffer.hpp"
#include "BufferFactory.hpp"
#include "ConnectionImpl.hpp"
@@ -47,13 +48,15 @@ InputPort::InputPort(BufferFactory& bufs,
size_t buffer_size)
: PortImpl(bufs, parent, name, index, poly, type, value, buffer_size)
{
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
+
if (!dynamic_cast<Patch*>(parent))
- add_property("rdf:type", Raul::Atom(Raul::Atom::URI, "lv2:InputPort"));
+ add_property(uris.rdf_type, uris.lv2_InputPort);
// Set default control range
if (type == PortType::CONTROL) {
- set_property("lv2:minimum", 0.0f);
- set_property("lv2:maximum", 1.0f);
+ set_property(uris.lv2_minimum, 0.0f);
+ set_property(uris.lv2_maximum, 1.0f);
}
}
diff --git a/src/engine/InternalPlugin.cpp b/src/engine/InternalPlugin.cpp
index 946ed956..b312a24b 100644
--- a/src/engine/InternalPlugin.cpp
+++ b/src/engine/InternalPlugin.cpp
@@ -16,7 +16,6 @@
*/
#include <cassert>
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "internals/Note.hpp"
#include "internals/Trigger.hpp"
@@ -36,7 +35,7 @@ InternalPlugin::InternalPlugin(const std::string& uri, const std::string& symbol
: PluginImpl(Plugin::Internal, uri)
, _symbol(symbol)
{
- const LV2URIMap& uris = *ingen_get_world()->uris.get();
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
set_property(uris.rdf_type, uris.ingen_Internal);
}
diff --git a/src/engine/JackDriver.cpp b/src/engine/JackDriver.cpp
index 24291fa9..feb8d802 100644
--- a/src/engine/JackDriver.cpp
+++ b/src/engine/JackDriver.cpp
@@ -19,6 +19,7 @@
#include <jack/midiport.h>
#include "raul/log.hpp"
#include "raul/List.hpp"
+#include "module/World.hpp"
#include "shared/LV2Features.hpp"
#include "shared/LV2URIMap.hpp"
#include "AudioBuffer.hpp"
diff --git a/src/engine/LADSPANode.cpp b/src/engine/LADSPANode.cpp
index d3db5a04..ecfb9d32 100644
--- a/src/engine/LADSPANode.cpp
+++ b/src/engine/LADSPANode.cpp
@@ -20,6 +20,7 @@
#include <map>
#include <stdint.h>
#include <boost/optional.hpp>
+#include "shared/LV2URIMap.hpp"
#include "raul/log.hpp"
#include "raul/Maid.hpp"
#include "LADSPANode.hpp"
@@ -144,6 +145,7 @@ nameify_if_invalid(const string& name)
bool
LADSPANode::instantiate(BufferFactory& bufs)
{
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
if (!_ports)
_ports = new Raul::Array<PortImpl*>(_descriptor->PortCount);
@@ -241,11 +243,11 @@ LADSPANode::instantiate(BufferFactory& bufs)
if (port->is_input() && port->buffer_size() == 1) {
if (min)
- port->set_meta_property("lv2:minimum", min.get());
+ port->set_meta_property(uris.lv2_minimum, min.get());
if (max)
- port->set_meta_property("lv2:maximum", max.get());
+ port->set_meta_property(uris.lv2_maximum, max.get());
if (default_val)
- port->set_meta_property("lv2:default", default_val.get());
+ port->set_meta_property(uris.lv2_default, default_val.get());
}
}
diff --git a/src/engine/LADSPAPlugin.cpp b/src/engine/LADSPAPlugin.cpp
index e1fdff40..9d8c3b63 100644
--- a/src/engine/LADSPAPlugin.cpp
+++ b/src/engine/LADSPAPlugin.cpp
@@ -18,7 +18,6 @@
#include <cassert>
#include <ladspa.h>
#include <raul/Symbol.hpp>
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "LADSPAPlugin.hpp"
#include "LADSPANode.hpp"
@@ -42,7 +41,7 @@ LADSPAPlugin::LADSPAPlugin(
, _label(label)
, _name(name)
{
- const LV2URIMap& uris = *ingen_get_world()->uris;
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
set_property(uris.rdf_type, uris.ingen_LADSPAPlugin);
set_property(uris.lv2_symbol, Symbol::symbolify(label));
set_property(uris.doap_name, name);
@@ -52,7 +51,7 @@ LADSPAPlugin::LADSPAPlugin(
const Raul::Atom&
LADSPAPlugin::get_property(const Raul::URI& uri) const
{
- if (uri == ingen_get_world()->uris->doap_name)
+ if (uri == Shared::LV2URIMap::instance().doap_name)
return _name;
else
return ResourceImpl::get_property(uri);
diff --git a/src/engine/LV2Node.cpp b/src/engine/LV2Node.cpp
index 574a4eeb..a0c7dd07 100644
--- a/src/engine/LV2Node.cpp
+++ b/src/engine/LV2Node.cpp
@@ -142,6 +142,7 @@ LV2Node::apply_poly(Raul::Maid& maid, uint32_t poly)
bool
LV2Node::instantiate(BufferFactory& bufs)
{
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
SharedPtr<LV2Info> info = _lv2_plugin->lv2_info();
SLV2Plugin plug = _lv2_plugin->slv2_plugin();
@@ -281,12 +282,12 @@ LV2Node::instantiate(BufferFactory& bufs)
if (direction == INPUT && data_type == PortType::CONTROL) {
((AudioBuffer*)port->buffer(0).get())->set_value(val.get_float(), 0, 0);
if (!isnan(min_values[j])) {
- port->meta().set_property("lv2:minimum", min_values[j]);
- port->set_property("lv2:minimum", min_values[j]);
+ port->meta().set_property(uris.lv2_minimum, min_values[j]);
+ port->set_property(uris.lv2_minimum, min_values[j]);
}
if (!isnan(max_values[j])) {
- port->meta().set_property("lv2:maximum", max_values[j]);
- port->set_property("lv2:maximum", max_values[j]);
+ port->meta().set_property(uris.lv2_maximum, max_values[j]);
+ port->set_property(uris.lv2_maximum, max_values[j]);
}
}
diff --git a/src/engine/LV2Plugin.cpp b/src/engine/LV2Plugin.cpp
index 5a0502d4..95cb93f0 100644
--- a/src/engine/LV2Plugin.cpp
+++ b/src/engine/LV2Plugin.cpp
@@ -18,7 +18,6 @@
#include <cassert>
#include <glibmm.h>
#include "redlandmm/World.hpp"
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "LV2Plugin.hpp"
#include "LV2Node.hpp"
@@ -37,7 +36,7 @@ LV2Plugin::LV2Plugin(SharedPtr<LV2Info> lv2_info, const std::string& uri)
, _slv2_plugin(NULL)
, _lv2_info(lv2_info)
{
- const LV2URIMap& uris = *ingen_get_world()->uris.get();
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
set_property(uris.rdf_type, uris.lv2_Plugin);
}
diff --git a/src/engine/NodeImpl.hpp b/src/engine/NodeImpl.hpp
index d6923ff3..ef7c3400 100644
--- a/src/engine/NodeImpl.hpp
+++ b/src/engine/NodeImpl.hpp
@@ -31,7 +31,6 @@ namespace Shared { class Plugin; class Node; class Port; }
class Buffer;
class BufferFactory;
-class Engine;
class MessageContext;
class PatchImpl;
class PluginImpl;
diff --git a/src/engine/OSCClientSender.cpp b/src/engine/OSCClientSender.cpp
index 6938b09a..115b22de 100644
--- a/src/engine/OSCClientSender.cpp
+++ b/src/engine/OSCClientSender.cpp
@@ -20,7 +20,6 @@
#include "raul/log.hpp"
#include "raul/AtomLiblo.hpp"
#include "interface/ClientInterface.hpp"
-#include "interface/MessageType.hpp"
#include "EngineStore.hpp"
#include "NodeImpl.hpp"
#include "OSCClientSender.hpp"
@@ -230,23 +229,4 @@ OSCClientSender::activity(const Path& path)
}
-/** \page client_osc_namespace
- * <h2>/ingen/binding</h2>
- * \arg \b path (string) - Path of object
- * \arg \b type (string) - Type of message (URI)
- * \arg \b id (int) - Controller number (if applicable)
- *
- * Notification of "activity" (e.g. port message blinkenlights).
- */
-void
-OSCClientSender::binding(const Path& path, const MessageType& type)
-{
- if (!_enabled)
- return;
-
- lo_send(_address, "/ingen/binding", "ssi",
- path.c_str(), type.type_uri(), type.num(), LO_ARGS_END);
-}
-
-
} // namespace Ingen
diff --git a/src/engine/OSCClientSender.hpp b/src/engine/OSCClientSender.hpp
index d7abfed0..2ca4aad3 100644
--- a/src/engine/OSCClientSender.hpp
+++ b/src/engine/OSCClientSender.hpp
@@ -90,8 +90,6 @@ public:
virtual void activity(const Raul::Path& path);
- virtual void binding(const Raul::Path& path, const Shared::MessageType& type);
-
private:
Raul::URI _url;
};
diff --git a/src/engine/OSCEngineReceiver.cpp b/src/engine/OSCEngineReceiver.cpp
index 404796fd..2ddfaa59 100644
--- a/src/engine/OSCEngineReceiver.cpp
+++ b/src/engine/OSCEngineReceiver.cpp
@@ -587,7 +587,7 @@ OSCEngineReceiver::_learn_cb(const char* path, const char* types, lo_arg** argv,
* <h2>/ingen/set_property</h2>
* \arg \b response-id (integer)
* \arg \b object-path (string) - Full path of object to associate property with
- * \arg \b key (string) - URI/QName for predicate of this property (e.g. "ingen:enabled")
+ * \arg \b key (string) - URI for predicate of this property (e.g. "http://drobilla.net/ns/ingen#enabled")
* \arg \b value (string) - Value of property
*
* Set a property on a graph object.
diff --git a/src/engine/ObjectSender.cpp b/src/engine/ObjectSender.cpp
index f4cd6664..2eadf1e9 100644
--- a/src/engine/ObjectSender.cpp
+++ b/src/engine/ObjectSender.cpp
@@ -17,7 +17,6 @@
#include "ObjectSender.hpp"
#include "interface/ClientInterface.hpp"
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "EngineStore.hpp"
#include "PatchImpl.hpp"
@@ -137,7 +136,7 @@ ObjectSender::send_port(ClientInterface* client, const PortImpl* port, bool bund
if (graph_parent)
client->put(port->meta_uri(), port->meta().properties());
- const Shared::LV2URIMap& map = *ingen_get_world()->uris.get();
+ const Shared::LV2URIMap& map = Shared::LV2URIMap::instance();
client->put(port->path(), port->properties());
diff --git a/src/engine/OutputPort.cpp b/src/engine/OutputPort.cpp
index 56e4bfdd..e0b8dc23 100644
--- a/src/engine/OutputPort.cpp
+++ b/src/engine/OutputPort.cpp
@@ -16,6 +16,7 @@
*/
#include "interface/Patch.hpp"
+#include "shared/LV2URIMap.hpp"
#include "Buffer.hpp"
#include "NodeImpl.hpp"
#include "OutputPort.hpp"
@@ -38,8 +39,10 @@ OutputPort::OutputPort(BufferFactory& bufs,
size_t buffer_size)
: PortImpl(bufs, parent, name, index, poly, type, value, buffer_size)
{
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
+
if (!dynamic_cast<Patch*>(parent))
- add_property("rdf:type", Raul::Atom(Raul::Atom::URI, "lv2:OutputPort"));
+ add_property(uris.rdf_type, uris.lv2_OutputPort);
if (type == PortType::CONTROL)
_broadcast = true;
diff --git a/src/engine/PortImpl.cpp b/src/engine/PortImpl.cpp
index e2c25dc7..e9dd4f7f 100644
--- a/src/engine/PortImpl.cpp
+++ b/src/engine/PortImpl.cpp
@@ -17,7 +17,6 @@
#include "raul/Array.hpp"
#include "raul/Maid.hpp"
-#include "module/ingen_module.hpp"
#include "shared/LV2URIMap.hpp"
#include "contexts.lv2/contexts.h"
#include "interface/PortType.hpp"
@@ -77,8 +76,8 @@ PortImpl::PortImpl(BufferFactory& bufs,
else
_polyphonic = true;
- add_property("rdf:type", Atom(Atom::URI, type.uri()));
- set_property("lv2:index", Atom((int32_t)index));
+ add_property("http://www.w3.org/1999/02/22-rdf-syntax-ns#type", type.uri());
+ set_property("http://lv2plug.in/ns/lv2core#index", Atom((int32_t)index));
set_context(_context);
if (type == PortType::EVENTS)
@@ -209,7 +208,7 @@ PortImpl::broadcast_value(Context& context, bool force)
void
PortImpl::set_context(Context::ID c)
{
- const LV2URIMap& uris = *ingen_get_world()->uris.get();
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
_context = c;
switch (c) {
case Context::AUDIO:
diff --git a/src/engine/QueuedEngineInterface.hpp b/src/engine/QueuedEngineInterface.hpp
index c1db2ba1..23ab608b 100644
--- a/src/engine/QueuedEngineInterface.hpp
+++ b/src/engine/QueuedEngineInterface.hpp
@@ -51,7 +51,7 @@ public:
QueuedEngineInterface(Engine& engine, size_t queue_size);
virtual ~QueuedEngineInterface() {}
- Raul::URI uri() const { return "ingen:internal"; }
+ Raul::URI uri() const { return "http://drobilla.net/ns/ingen#internal"; }
void set_next_response_id(int32_t id);
diff --git a/src/engine/events/AllNotesOff.cpp b/src/engine/events/AllNotesOff.cpp
index 2ddec32b..8ce27c87 100644
--- a/src/engine/events/AllNotesOff.cpp
+++ b/src/engine/events/AllNotesOff.cpp
@@ -19,7 +19,6 @@
#include "Responder.hpp"
#include "Engine.hpp"
#include "EngineStore.hpp"
-#include "module/World.hpp"
#include "shared/Store.hpp"
using namespace Raul;
diff --git a/src/engine/events/CreateNode.cpp b/src/engine/events/CreateNode.cpp
index 7dabd65d..4d3af4db 100644
--- a/src/engine/events/CreateNode.cpp
+++ b/src/engine/events/CreateNode.cpp
@@ -19,7 +19,6 @@
#include "raul/Path.hpp"
#include "raul/Path.hpp"
#include "redlandmm/World.hpp"
-#include "module/World.hpp"
#include "CreateNode.hpp"
#include "Responder.hpp"
#include "PatchImpl.hpp"
diff --git a/src/engine/events/CreatePort.cpp b/src/engine/events/CreatePort.cpp
index 44ffe90d..151181f4 100644
--- a/src/engine/events/CreatePort.cpp
+++ b/src/engine/events/CreatePort.cpp
@@ -20,18 +20,20 @@
#include "raul/List.hpp"
#include "raul/Maid.hpp"
#include "raul/Path.hpp"
-#include "Responder.hpp"
+#include "shared/LV2URIMap.hpp"
+#include "ClientBroadcaster.hpp"
+#include "ControlBindings.hpp"
#include "CreatePort.hpp"
-#include "PatchImpl.hpp"
-#include "PluginImpl.hpp"
+#include "Driver.hpp"
+#include "DuplexPort.hpp"
#include "Engine.hpp"
-#include "PatchImpl.hpp"
-#include "EventSource.hpp"
#include "EngineStore.hpp"
-#include "ClientBroadcaster.hpp"
+#include "EventSource.hpp"
+#include "PatchImpl.hpp"
+#include "PatchImpl.hpp"
+#include "PluginImpl.hpp"
#include "PortImpl.hpp"
-#include "Driver.hpp"
-#include "DuplexPort.hpp"
+#include "Responder.hpp"
using namespace std;
using namespace Raul;
@@ -85,6 +87,8 @@ CreatePort::pre_process()
_patch = _engine.engine_store()->find_patch(_path.parent());
+ const LV2URIMap& uris = *_engine.world()->uris.get();
+
if (_patch != NULL) {
assert(_patch->path() == _path.parent());
@@ -94,7 +98,7 @@ CreatePort::pre_process()
_patch_port = _patch->create_port(*_engine.buffer_factory(), _path.symbol(), _data_type, buffer_size, _is_output);
if (_patch->parent())
- _patch_port->set_property("rdf:instanceOf", _patch_port->meta_uri());
+ _patch_port->set_property(uris.rdf_instanceOf, _patch_port->meta_uri());
_patch_port->meta().properties().insert(_properties.begin(), _properties.end());
@@ -135,6 +139,7 @@ CreatePort::execute(ProcessContext& context)
if (_patch_port) {
_engine.maid()->push(_patch->external_ports());
_patch->external_ports(_ports_array);
+ _engine.control_bindings()->update_port(context, _patch_port);
}
if (_driver_port) {
diff --git a/src/engine/events/SendBinding.cpp b/src/engine/events/SendBinding.cpp
index 7168b142..8cc03c79 100644
--- a/src/engine/events/SendBinding.cpp
+++ b/src/engine/events/SendBinding.cpp
@@ -17,6 +17,7 @@
#include <sstream>
#include "events/SendBinding.hpp"
+#include "shared/LV2URIMap.hpp"
#include "Engine.hpp"
#include "PortImpl.hpp"
#include "ClientBroadcaster.hpp"
@@ -30,7 +31,19 @@ namespace Events {
void
SendBinding::post_process()
{
- _engine.broadcaster()->binding(_port->path(), _type);
+ const LV2URIMap& uris = *_engine.world()->uris.get();
+ Raul::Atom::DictValue dict;
+ if (_type == ControlBindings::MIDI_CC) {
+ dict[uris.rdf_type] = uris.midi_Controller;
+ dict[uris.midi_controllerNumber] = _num;
+ } else if (_type == ControlBindings::MIDI_BENDER) {
+ dict[uris.rdf_type] = uris.midi_Bender;
+ } else if (_type == ControlBindings::MIDI_CHANNEL_PRESSURE) {
+ dict[uris.rdf_type] = uris.midi_ChannelPressure;
+ }
+ // TODO: other event types
+ _port->set_property(uris.ingen_controlBinding, dict); // FIXME: thread unsafe
+ _engine.broadcaster()->set_property(_port->path(), uris.ingen_controlBinding, dict);
}
diff --git a/src/engine/events/SendBinding.hpp b/src/engine/events/SendBinding.hpp
index 7cce3767..7f69f777 100644
--- a/src/engine/events/SendBinding.hpp
+++ b/src/engine/events/SendBinding.hpp
@@ -19,8 +19,8 @@
#define INGEN_EVENTS_SENDBINDING_HPP
#include "raul/Atom.hpp"
-#include "interface/MessageType.hpp"
#include "engine/Event.hpp"
+#include "engine/ControlBindings.hpp"
#include "engine/types.hpp"
namespace Ingen {
@@ -43,22 +43,40 @@ public:
Engine& engine,
SampleCount timestamp,
PortImpl* port,
- const Shared::MessageType& type)
+ ControlBindings::Type type,
+ int16_t num)
: Event(engine, SharedPtr<Responder>(), timestamp)
, _port(port)
, _type(type)
- {}
+ , _num(num)
+ {
+ assert(_port);
+ switch (type) {
+ case ControlBindings::MIDI_CC:
+ assert(num >= 0 && num < 128);
+ break;
+ case ControlBindings::MIDI_RPN:
+ assert(num >= 0 && num < 16384);
+ break;
+ case ControlBindings::MIDI_NRPN:
+ assert(num >= 0 && num < 16384);
+ default:
+ break;
+ }
+ }
inline void operator=(const SendBinding& ev) {
_port = ev._port;
_type = ev._type;
+ _num = ev._num;
}
void post_process();
private:
- PortImpl* _port;
- Shared::MessageType _type;
+ PortImpl* _port;
+ ControlBindings::Type _type;
+ int16_t _num;
};
diff --git a/src/engine/events/SetMetadata.cpp b/src/engine/events/SetMetadata.cpp
index 85768b3d..30bf4907 100644
--- a/src/engine/events/SetMetadata.cpp
+++ b/src/engine/events/SetMetadata.cpp
@@ -21,16 +21,17 @@
#include "interface/PortType.hpp"
#include "shared/LV2URIMap.hpp"
#include "ClientBroadcaster.hpp"
+#include "ControlBindings.hpp"
#include "CreateNode.hpp"
#include "CreatePatch.hpp"
#include "CreatePort.hpp"
#include "Engine.hpp"
#include "EngineStore.hpp"
+#include "EventSource.hpp"
#include "GraphObjectImpl.hpp"
#include "PatchImpl.hpp"
#include "PluginImpl.hpp"
#include "PortImpl.hpp"
-#include "EventSource.hpp"
#include "Responder.hpp"
#include "SetMetadata.hpp"
#include "SetPortValue.hpp"
@@ -183,6 +184,17 @@ SetMetadata::pre_process()
} else {
warn << "Set value for non-port " << _object->uri() << endl;
}
+ } else if (key == uris.ingen_controlBinding) {
+ PortImpl* port = dynamic_cast<PortImpl*>(_object);
+ if (port) {
+ if (value.type() == Atom::DICT) {
+ op = CONTROL_BINDING;
+ } else {
+ _error = BAD_VALUE_TYPE;
+ }
+ } else {
+ warn << "Set binding for non-port " << _object->uri() << endl;
+ }
}
}
@@ -245,6 +257,9 @@ SetMetadata::execute(ProcessContext& context)
if (!_patch->apply_internal_poly(*_engine.maid(), value.get_int32()))
_error = INTERNAL;
break;
+ case CONTROL_BINDING:
+ if ((port = dynamic_cast<PortImpl*>(_object)))
+ _engine.control_bindings()->update_port(context, port);
default:
_success = true;
}
diff --git a/src/engine/events/SetMetadata.hpp b/src/engine/events/SetMetadata.hpp
index cf49efae..6376a1fe 100644
--- a/src/engine/events/SetMetadata.hpp
+++ b/src/engine/events/SetMetadata.hpp
@@ -94,7 +94,8 @@ private:
ENABLE,
ENABLE_BROADCAST,
POLYPHONY,
- POLYPHONIC
+ POLYPHONIC,
+ CONTROL_BINDING
};
typedef std::vector<SetPortValue*> SetEvents;
diff --git a/src/engine/events/SetPortValue.cpp b/src/engine/events/SetPortValue.cpp
index 0ec5d98b..33cf628c 100644
--- a/src/engine/events/SetPortValue.cpp
+++ b/src/engine/events/SetPortValue.cpp
@@ -194,7 +194,7 @@ SetPortValue::apply(Context& context)
_port->raise_set_by_user_flag();
return;
- } else if (!strcmp(_value.get_blob_type(), "lv2midi:MidiEvent")) {
+ } else if (!strcmp(_value.get_blob_type(), "http://lv2plug.in/ns/ext/midi#MidiEvent")) {
ebuf->prepare_write(context);
ebuf->append(frames, 0, uris->midi_event.id, _value.data_size(),
(const uint8_t*)_value.get_blob());
diff --git a/src/engine/ingen_engine.cpp b/src/engine/ingen_engine.cpp
index b5fe92a9..b2f626c7 100644
--- a/src/engine/ingen_engine.cpp
+++ b/src/engine/ingen_engine.cpp
@@ -16,6 +16,7 @@
*/
#include "module/Module.hpp"
+#include "module/World.hpp"
#include "Engine.hpp"
#include "QueuedEngineInterface.hpp"
#include "util.hpp"
diff --git a/src/engine/internals/Controller.cpp b/src/engine/internals/Controller.cpp
index 44b6a184..4d102bef 100644
--- a/src/engine/internals/Controller.cpp
+++ b/src/engine/internals/Controller.cpp
@@ -17,6 +17,7 @@
#include <math.h>
#include "raul/midi_events.h"
+#include "shared/LV2URIMap.hpp"
#include "internals/Controller.hpp"
#include "PostProcessor.hpp"
#include "events/Learn.hpp"
@@ -47,19 +48,20 @@ ControllerNode::ControllerNode(BufferFactory& bufs,
: NodeBase(&controller_plugin, path, false, parent, srate, buffer_size)
, _learning(false)
{
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
_ports = new Raul::Array<PortImpl*>(6);
_midi_in_port = new InputPort(bufs, this, "input", 0, 1, PortType::EVENTS, Raul::Atom(), _buffer_size);
_ports->at(0) = _midi_in_port;
_param_port = new InputPort(bufs, this, "controller", 1, 1, PortType::CONTROL, 0.0f, sizeof(Sample));
- _param_port->set_property("lv2:minimum", 0.0f);
- _param_port->set_property("lv2:maximum", 127.0f);
- _param_port->set_property("lv2:integer", true);
+ _param_port->set_property(uris.lv2_minimum, 0.0f);
+ _param_port->set_property(uris.lv2_maximum, 127.0f);
+ _param_port->set_property(uris.lv2_integer, true);
_ports->at(1) = _param_port;
_log_port = new InputPort(bufs, this, "logarithmic", 2, 1, PortType::CONTROL, 0.0f, sizeof(Sample));
- _log_port->set_property("lv2:toggled", true);
+ _log_port->set_property(uris.lv2_toggled, true);
_ports->at(2) = _log_port;
_min_port = new InputPort(bufs, this, "minimum", 3, 1, PortType::CONTROL, 0.0f, sizeof(Sample));
diff --git a/src/engine/internals/Note.cpp b/src/engine/internals/Note.cpp
index 9ed45c96..ecee587f 100644
--- a/src/engine/internals/Note.cpp
+++ b/src/engine/internals/Note.cpp
@@ -20,6 +20,7 @@
#include "raul/Array.hpp"
#include "raul/Maid.hpp"
#include "raul/midi_events.h"
+#include "shared/LV2URIMap.hpp"
#include "internals/Note.hpp"
#include "AudioBuffer.hpp"
#include "Driver.hpp"
@@ -50,6 +51,7 @@ NoteNode::NoteNode(BufferFactory& bufs, const string& path, bool polyphonic, Pat
, _prepared_voices(NULL)
, _sustain(false)
{
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
_ports = new Raul::Array<PortImpl*>(5);
_midi_in_port = new InputPort(bufs, this, "input", 0, 1, PortType::EVENTS, Raul::Atom(), _buffer_size);
@@ -59,16 +61,16 @@ NoteNode::NoteNode(BufferFactory& bufs, const string& path, bool polyphonic, Pat
_ports->at(1) = _freq_port;
_vel_port = new OutputPort(bufs, this, "velocity", 2, _polyphony, PortType::AUDIO, 0.0f, _buffer_size);
- _vel_port->set_property("lv2:minimum", 0.0f);
- _vel_port->set_property("lv2:maximum", 1.0f);
+ _vel_port->set_property(uris.lv2_minimum, 0.0f);
+ _vel_port->set_property(uris.lv2_maximum, 1.0f);
_ports->at(2) = _vel_port;
_gate_port = new OutputPort(bufs, this, "gate", 3, _polyphony, PortType::AUDIO, 0.0f, _buffer_size);
- _gate_port->set_property("lv2:toggled", true);
+ _gate_port->set_property(uris.lv2_toggled, true);
_ports->at(3) = _gate_port;
_trig_port = new OutputPort(bufs, this, "trigger", 4, _polyphony, PortType::AUDIO, 0.0f, _buffer_size);
- _trig_port->set_property("lv2:toggled", true);
+ _trig_port->set_property(uris.lv2_toggled, true);
_ports->at(4) = _trig_port;
}
diff --git a/src/engine/internals/Trigger.cpp b/src/engine/internals/Trigger.cpp
index 440e9a63..68d938c0 100644
--- a/src/engine/internals/Trigger.cpp
+++ b/src/engine/internals/Trigger.cpp
@@ -18,6 +18,7 @@
#include <cmath>
#include "raul/log.hpp"
#include "raul/midi_events.h"
+#include "shared/LV2URIMap.hpp"
#include "internals/Trigger.hpp"
#include "AudioBuffer.hpp"
#include "EventBuffer.hpp"
@@ -44,28 +45,29 @@ TriggerNode::TriggerNode(BufferFactory& bufs, const string& path, bool polyphoni
: NodeBase(&trigger_plugin, path, false, parent, srate, buffer_size)
, _learning(false)
{
+ const LV2URIMap& uris = LV2URIMap::instance();
_ports = new Raul::Array<PortImpl*>(5);
_midi_in_port = new InputPort(bufs, this, "input", 0, 1, PortType::EVENTS, Raul::Atom(), _buffer_size);
_ports->at(0) = _midi_in_port;
_note_port = new InputPort(bufs, this, "note", 1, 1, PortType::CONTROL, 60.0f, sizeof(Sample));
- _note_port->set_property("lv2:minimum", 0.0f);
- _note_port->set_property("lv2:maximum", 127.0f);
- _note_port->set_property("lv2:integer", true);
+ _note_port->set_property(uris.lv2_minimum, 0.0f);
+ _note_port->set_property(uris.lv2_maximum, 127.0f);
+ _note_port->set_property(uris.lv2_integer, true);
_ports->at(1) = _note_port;
_gate_port = new OutputPort(bufs, this, "gate", 2, 1, PortType::AUDIO, 0.0f, _buffer_size);
- _gate_port->set_property("lv2:toggled", true);
+ _gate_port->set_property(uris.lv2_toggled, true);
_ports->at(2) = _gate_port;
_trig_port = new OutputPort(bufs, this, "trigger", 3, 1, PortType::AUDIO, 0.0f, _buffer_size);
- _trig_port->set_property("lv2:toggled", true);
+ _trig_port->set_property(uris.lv2_toggled, true);
_ports->at(3) = _trig_port;
_vel_port = new OutputPort(bufs, this, "velocity", 4, 1, PortType::AUDIO, 0.0f, _buffer_size);
- _vel_port->set_property("lv2:minimum", 0.0f);
- _vel_port->set_property("lv2:maximum", 1.0f);
+ _vel_port->set_property(uris.lv2_minimum, 0.0f);
+ _vel_port->set_property(uris.lv2_maximum, 1.0f);
_ports->at(4) = _vel_port;
}
diff --git a/src/gui/LoadPluginWindow.cpp b/src/gui/LoadPluginWindow.cpp
index e6cc1b4e..cdf6cc1f 100644
--- a/src/gui/LoadPluginWindow.cpp
+++ b/src/gui/LoadPluginWindow.cpp
@@ -229,16 +229,17 @@ LoadPluginWindow::new_plugin(SharedPtr<PluginModel> pm)
void
LoadPluginWindow::add_plugin(SharedPtr<PluginModel> plugin)
{
+ const LV2URIMap& uris = App::instance().uris();
Gtk::TreeModel::iterator iter = _plugins_liststore->append();
Gtk::TreeModel::Row row = *iter;
_rows.insert(make_pair(plugin->uri(), iter));
- const Atom& name = plugin->get_property("doap:name");
+ const Atom& name = plugin->get_property(uris.doap_name);
if (name.is_valid()) {
if (name.type() == Atom::STRING)
row[_plugins_columns._col_name] = name.get_string();
} else if (plugin->type() == Plugin::LADSPA) {
- App::instance().engine()->request_property(plugin->uri(), "doap:name");
+ App::instance().engine()->request_property(plugin->uri(), uris.doap_name);
}
switch (plugin->type()) {
@@ -388,12 +389,13 @@ LoadPluginWindow::filter_changed()
Gtk::TreeModel::Row model_row;
Gtk::TreeModel::iterator model_iter;
size_t num_visible = 0;
+ const LV2URIMap& uris = App::instance().uris();
for (ClientStore::Plugins::const_iterator i = App::instance().store()->plugins()->begin();
i != App::instance().store()->plugins()->end(); ++i) {
const SharedPtr<PluginModel> plugin = (*i).second;
- const Atom& name = plugin->get_property("doap:name");
+ const Atom& name = plugin->get_property(uris.doap_name);
switch (criteria) {
case CriteriaColumns::NAME:
@@ -401,7 +403,7 @@ LoadPluginWindow::filter_changed()
field = name.get_string();
break;
case CriteriaColumns::TYPE:
- field = plugin->type_uri(); break;
+ field = plugin->type_uri().str(); break;
case CriteriaColumns::URI:
field = plugin->uri().str(); break;
default:
@@ -415,7 +417,7 @@ LoadPluginWindow::filter_changed()
model_row = *model_iter;
model_row[_plugins_columns._col_name] = name.is_valid() ? name.get_string() : "";
- model_row[_plugins_columns._col_type] = plugin->type_uri();
+ model_row[_plugins_columns._col_type] = plugin->type_uri().str();
model_row[_plugins_columns._col_uri] = plugin->uri().str();
model_row[_plugins_columns._col_plugin] = plugin;
diff --git a/src/gui/NodeModule.cpp b/src/gui/NodeModule.cpp
index 277a65ad..024e054d 100644
--- a/src/gui/NodeModule.cpp
+++ b/src/gui/NodeModule.cpp
@@ -185,6 +185,7 @@ NodeModule::plugin_changed()
void
NodeModule::embed_gui(bool embed)
{
+ const LV2URIMap& uris = App::instance().uris();
if (embed) {
if (_gui_window) {
@@ -217,7 +218,7 @@ NodeModule::embed_gui(bool embed)
for (NodeModel::Ports::const_iterator p = _node->ports().begin();
p != _node->ports().end(); ++p)
if ((*p)->type().is_control() && (*p)->is_output())
- App::instance().engine()->set_property((*p)->path(), "ingen:broadcast", true);
+ App::instance().engine()->set_property((*p)->path(), uris.ingen_broadcast, true);
}
} else { // un-embed
@@ -227,7 +228,7 @@ NodeModule::embed_gui(bool embed)
for (NodeModel::Ports::const_iterator p = _node->ports().begin(); p != _node->ports().end(); ++p)
if ((*p)->type().is_control() && (*p)->is_output())
- App::instance().engine()->set_property((*p)->path(), "ingen:broadcast", false);
+ App::instance().engine()->set_property((*p)->path(), uris.ingen_broadcast, false);
}
if (embed && _embed_item) {
diff --git a/src/gui/PatchCanvas.cpp b/src/gui/PatchCanvas.cpp
index 45e6ec66..cd2469d1 100644
--- a/src/gui/PatchCanvas.cpp
+++ b/src/gui/PatchCanvas.cpp
@@ -89,22 +89,22 @@ PatchCanvas::PatchCanvas(SharedPtr<PatchModel> patch, int width, int height)
// Add port menu items
_menu_add_audio_input->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
- "audio_in", "Audio In", "lv2:AudioPort", false));
+ "audio_in", "Audio In", "http://lv2plug.in/ns/lv2core#AudioPort", false));
_menu_add_audio_output->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
- "audio_out", "Audio Out", "lv2:AudioPort", true));
+ "audio_out", "Audio Out", "http://lv2plug.in/ns/lv2core#AudioPort", true));
_menu_add_control_input->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
- "control_in", "Control In", "lv2:ControlPort", false));
+ "control_in", "Control In", "http://lv2plug.in/ns/lv2core#ControlPort", false));
_menu_add_control_output->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
- "control_out", "Control Out", "lv2:ControlPort", true));
+ "control_out", "Control Out", "http://lv2plug.in/ns/lv2core#ControlPort", true));
_menu_add_event_input->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
- "event_in", "Event In", "lv2ev:EventPort", false));
+ "event_in", "Event In", "http://lv2plug.in/ns/ext/event#EventPort", false));
_menu_add_event_output->signal_activate().connect(
sigc::bind(sigc::mem_fun(this, &PatchCanvas::menu_add_port),
- "event_out", "Event Out", "lv2ev:EventPort", true));
+ "event_out", "Event Out", "http://lv2plug.in/ns/ext/event#EventPort", true));
// Connect to model signals to track state
_patch->signal_new_node.connect(sigc::mem_fun(this, &PatchCanvas::add_node));
@@ -750,8 +750,7 @@ PatchCanvas::menu_add_port(const string& sym_base, const string& name_base,
Resource::Properties props = get_initial_data();
props.insert(make_pair(uris.rdf_type, type));
- props.insert(make_pair(uris.rdf_type,
- Atom(Atom::URI, is_output ? "lv2:OutputPort" : "lv2:InputPort")));
+ props.insert(make_pair(uris.rdf_type, is_output ? uris.lv2_OutputPort : uris.lv2_InputPort));
props.insert(make_pair(uris.lv2_index, Atom(int32_t(_patch->num_ports()))));
props.insert(make_pair(uris.lv2_name, Atom(name.c_str())));
App::instance().engine()->put(path, props);
@@ -801,8 +800,9 @@ GraphObject::Properties
PatchCanvas::get_initial_data()
{
GraphObject::Properties result;
- result.insert(make_pair("ingenui:canvas-x", Atom((float)_last_click_x)));
- result.insert(make_pair("ingenui:canvas-y", Atom((float)_last_click_y)));
+ const LV2URIMap& uris = App::instance().uris();
+ result.insert(make_pair(uris.ingenui_canvas_x, Atom((float)_last_click_x)));
+ result.insert(make_pair(uris.ingenui_canvas_y, Atom((float)_last_click_y)));
return result;
}
diff --git a/src/gui/PatchWindow.cpp b/src/gui/PatchWindow.cpp
index 13c1f2ff..796837e3 100644
--- a/src/gui/PatchWindow.cpp
+++ b/src/gui/PatchWindow.cpp
@@ -22,6 +22,7 @@
#include <boost/format.hpp>
#include "raul/AtomRDF.hpp"
#include "interface/EngineInterface.hpp"
+#include "shared/LV2URIMap.hpp"
#include "client/PatchModel.hpp"
#include "client/ClientStore.hpp"
#include "App.hpp"
@@ -93,7 +94,7 @@ PatchWindow::PatchWindow(BaseObjectType* cobject, const Glib::RefPtr<Gnome::Glad
_menu_view_control_window->property_sensitive() = false;
string engine_name = App::instance().engine()->uri().str();
- if (engine_name == "ingen:internal")
+ if (engine_name == "http://drobilla.net/ns/ingen#internal")
engine_name = "internal engine";
_status_bar->push(string("Connected to ") + engine_name, STATUS_CONTEXT_ENGINE);
@@ -405,7 +406,7 @@ PatchWindow::event_import_location()
void
PatchWindow::event_save()
{
- const Raul::Atom& document = _patch->get_property("ingen:document");
+ const Raul::Atom& document = _patch->get_property(App::instance().uris().ingen_document);
if (!document.is_valid() || document.type() != Raul::Atom::URI) {
event_save_as();
} else {
@@ -420,6 +421,7 @@ PatchWindow::event_save()
void
PatchWindow::event_save_as()
{
+ const Shared::LV2URIMap& uris = App::instance().uris();
while (true) {
Gtk::FileChooserDialog dialog(*this, "Save Patch", Gtk::FILE_CHOOSER_ACTION_SAVE);
@@ -435,7 +437,7 @@ PatchWindow::event_save_as()
dialog.set_filter(filt);
// Set current folder to most sensible default
- const Raul::Atom& document = _patch->get_property("ingen:document");
+ const Raul::Atom& document = _patch->get_property(uris.ingen_document);
if (document.type() == Raul::Atom::URI)
dialog.set_uri(document.get_uri());
else if (App::instance().configuration()->patch_folder().length() > 0)
@@ -468,7 +470,7 @@ PatchWindow::event_save_as()
if (!is_bundle && !is_patch)
filename += ".ingen.ttl";
- _patch->set_property("lv2:symbol", Atom(base.c_str()));
+ _patch->set_property(uris.lv2_symbol, Atom(base.c_str()));
bool confirm = true;
std::fstream fin;
@@ -485,7 +487,7 @@ PatchWindow::event_save_as()
if (confirm) {
const Glib::ustring uri = Glib::filename_to_uri(filename);
App::instance().loader()->save_patch(_patch, uri);
- _patch->set_property("ingen:document", Atom(Atom::URI, uri.c_str()));
+ _patch->set_property(uris.ingen_document, Atom(Atom::URI, uri.c_str()));
_status_bar->push(
(boost::format("Wrote %1% to %2%") % _patch->path() % uri).str(),
STATUS_CONTEXT_PATCH);
diff --git a/src/gui/Port.cpp b/src/gui/Port.cpp
index 7367b453..d710f10d 100644
--- a/src/gui/Port.cpp
+++ b/src/gui/Port.cpp
@@ -50,7 +50,7 @@ Port::create(
{
Glib::ustring label(human_name ? "" : pm->path().symbol());
if (human_name) {
- const Raul::Atom& name = pm->get_property("lv2:name");
+ const Raul::Atom& name = pm->get_property(App::instance().uris().lv2_name);
if (name.type() == Raul::Atom::STRING) {
label = name.get_string();
} else {
@@ -205,7 +205,7 @@ Port::set_control(float value, bool signal)
} else if (model()->type() == PortType::EVENTS) {
app.engine()->set_property(model()->path(),
world->uris->ingen_value,
- Atom("<http://example.org/ev#BangEvent>", 0, NULL));
+ Atom("http://example.org/ev#BangEvent", 0, NULL));
}
}
@@ -238,13 +238,13 @@ Port::property_changed(const URI& key, const Atom& value)
ArtVpathDash*
Port::dash()
{
+ const LV2URIMap& uris = App::instance().uris();
SharedPtr<PortModel> pm = _port_model.lock();
if (!pm)
return NULL;
- const Raul::Atom& context = pm->get_property("ctx:context");
- if (!context.is_valid() || context.type() != Atom::URI
- || !strcmp(context.get_uri(), "ctx:AudioContext"))
+ const Raul::Atom& context = pm->get_property(uris.ctx_context);
+ if (!context.is_valid() || context.type() != Atom::URI || context == uris.ctx_AudioContext)
return NULL;
if (!_dash) {
diff --git a/src/gui/PropertiesWindow.cpp b/src/gui/PropertiesWindow.cpp
index 51ca4817..8890770a 100644
--- a/src/gui/PropertiesWindow.cpp
+++ b/src/gui/PropertiesWindow.cpp
@@ -18,6 +18,8 @@
#include <cassert>
#include <string>
#include "raul/log.hpp"
+#include "module/ingen_module.hpp"
+#include "module/World.hpp"
#include "client/NodeModel.hpp"
#include "client/PluginModel.hpp"
#include "App.hpp"
@@ -77,6 +79,8 @@ PropertiesWindow::set_object(SharedPtr<ObjectModel> model)
set_title(model->path().chop_scheme() + " Properties - Ingen");
+ Shared::World* world = ingen_get_world();
+
ostringstream ss;
unsigned n_rows = 0;
for (ObjectModel::Properties::const_iterator i = model->properties().begin();
@@ -86,7 +90,7 @@ PropertiesWindow::set_object(SharedPtr<ObjectModel> model)
const Raul::Atom& value = i->second;
// Column 0: Property
- Gtk::Label* lab = manage(new Gtk::Label(i->first.str(), 0.0, 0.5));
+ Gtk::Label* lab = manage(new Gtk::Label(world->rdf_world->qualify(i->first.str()), 0.0, 0.5));
_table->attach(*lab, 0, 1, n_rows, n_rows + 1, Gtk::FILL|Gtk::SHRINK, Gtk::SHRINK);
// Column 1: Type
@@ -102,7 +106,8 @@ PropertiesWindow::set_object(SharedPtr<ObjectModel> model)
// Column 2: Value
align = manage(new Gtk::Alignment(0.0, 0.5, 1.0, 0.0));
Gtk::Widget* value_widget = create_value_widget(i->first, value);
- align->add(*value_widget);
+ if (value_widget)
+ align->add(*value_widget);
_table->attach(*align, 2, 3, n_rows, n_rows + 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK);
_records.insert(make_pair(i->first, Record(value, combo, align, n_rows)));
}
@@ -161,6 +166,7 @@ PropertiesWindow::create_value_widget(const Raul::URI& uri, const Raul::Atom& va
return widget;
}
+ LOG(error) << "Unable to create widget for value " << value << endl;
return NULL;
}
@@ -206,9 +212,11 @@ PropertiesWindow::property_changed(const Raul::URI& predicate, const Raul::Atom&
Gtk::Widget* value_widget = create_value_widget(predicate, value);
record.value_widget->remove();
- record.value_widget->add(*value_widget);
+ if (value_widget) {
+ record.value_widget->add(*value_widget);
+ value_widget->show();
+ }
record.value = value;
- value_widget->show();
}
diff --git a/src/gui/RenameWindow.cpp b/src/gui/RenameWindow.cpp
index c50ec213..f7fa86a9 100644
--- a/src/gui/RenameWindow.cpp
+++ b/src/gui/RenameWindow.cpp
@@ -18,6 +18,7 @@
#include <cassert>
#include <string>
#include "interface/EngineInterface.hpp"
+#include "shared/LV2URIMap.hpp"
#include "client/ObjectModel.hpp"
#include "client/ClientStore.hpp"
#include "App.hpp"
@@ -56,7 +57,7 @@ RenameWindow::set_object(SharedPtr<ObjectModel> object)
{
_object = object;
_symbol_entry->set_text(object->path().symbol());
- const Atom& name_atom = object->get_property("lv2:name");
+ const Atom& name_atom = object->get_property("http://lv2plug.in/ns/lv2core#name");
_label_entry->set_text(
(name_atom.type() == Atom::STRING) ? name_atom.get_string() : "");
}
@@ -125,10 +126,12 @@ RenameWindow::cancel_clicked()
void
RenameWindow::ok_clicked()
{
+ const Shared::LV2URIMap& uris = App::instance().uris();
+
const string& symbol_str = _symbol_entry->get_text();
const string& label = _label_entry->get_text();
Path path = _object->path();
- const Atom& name_atom = _object->get_property("lv2:name");
+ const Atom& name_atom = _object->get_property(uris.lv2_name);
if (Symbol::is_valid(symbol_str)) {
const Symbol& symbol(symbol_str);
@@ -139,8 +142,7 @@ RenameWindow::ok_clicked()
}
if (label != "" && (!name_atom.is_valid() || label != name_atom.get_string())) {
- App::instance().engine()->set_property(path,
- "lv2:name", Atom(label));
+ App::instance().engine()->set_property(path, uris.lv2_name, Atom(label));
}
hide();
diff --git a/src/gui/UploadPatchWindow.cpp b/src/gui/UploadPatchWindow.cpp
index 300bcc71..1804ff06 100644
--- a/src/gui/UploadPatchWindow.cpp
+++ b/src/gui/UploadPatchWindow.cpp
@@ -23,6 +23,7 @@
#include <curl/curl.h>
#include "redlandmm/Query.hpp"
#include "module/World.hpp"
+#include "shared/LV2URIMap.hpp"
#include "client/ClientStore.hpp"
#include "interface/EngineInterface.hpp"
#include "serialisation/Serialiser.hpp"
@@ -72,13 +73,14 @@ UploadPatchWindow::present(SharedPtr<PatchModel> patch)
void
UploadPatchWindow::on_show()
{
+ const Shared::LV2URIMap& uris = App::instance().uris();
Gtk::Dialog::on_show();
- Raul::Atom atom = _patch->get_property("lv2:symbol");
+ Raul::Atom atom = _patch->get_property(uris.lv2_symbol);
if (atom.is_valid())
_symbol_entry->set_text(atom.get_string());
- atom = _patch->get_property("doap:name");
+ atom = _patch->get_property(uris.doap_name);
if (atom.is_valid())
_short_name_entry->set_text(atom.get_string());
}
@@ -234,12 +236,14 @@ UploadPatchWindow::upload_clicked()
{
assert(!_thread);
+ const Shared::LV2URIMap& uris = App::instance().uris();
+
Glib::ustring symbol = _symbol_entry->get_text();
Glib::ustring short_name = _short_name_entry->get_text();
GraphObject::Properties extra_rdf;
- extra_rdf.insert(make_pair("lv2:symbol", symbol));
- extra_rdf.insert(make_pair("doap:name", short_name));
+ extra_rdf.insert(make_pair(uris.lv2_symbol, symbol));
+ extra_rdf.insert(make_pair(uris.doap_name, short_name));
_response = 0;
_progress_pct = 0;
diff --git a/src/ingen/main.cpp b/src/ingen/main.cpp
index c50298b9..8052ccf2 100644
--- a/src/ingen/main.cpp
+++ b/src/ingen/main.cpp
@@ -129,7 +129,9 @@ main(int argc, char** argv)
world->rdf_world->add_prefix("ingenui", "http://drobilla.net/ns/ingenuity#");
world->rdf_world->add_prefix("lv2", "http://lv2plug.in/ns/lv2core#");
world->rdf_world->add_prefix("lv2ev", "http://lv2plug.in/ns/ext/event#");
+ world->rdf_world->add_prefix("ctx", "http://lv2plug.in/ns/dev/contexts#");
world->rdf_world->add_prefix("lv2midi", "http://lv2plug.in/ns/ext/midi#");
+ world->rdf_world->add_prefix("midi", "http://drobilla.net/ns/dev/midi#");
world->rdf_world->add_prefix("owl", "http://www.w3.org/2002/07/owl#");
world->rdf_world->add_prefix("rdfs", "http://www.w3.org/2000/01/rdf-schema#");
world->rdf_world->add_prefix("sp", "http://lv2plug.in/ns/dev/string-port#");
diff --git a/src/scripts/python/scripts/flatten.py b/src/scripts/python/scripts/flatten.py
index 7c311451..6b7ed6ec 100755
--- a/src/scripts/python/scripts/flatten.py
+++ b/src/scripts/python/scripts/flatten.py
@@ -77,7 +77,7 @@ def cloneNode(om, node, patch):
# copy port values
for port in node.getPorts():
path = '%s/%s/%s' % (patch.getPath(), name, port.getName())
- om.synth.set_property_slow.async(path, "ingen:value", port.value)
+ om.synth.set_property_slow.async(path, "http://drobilla.net/ns/ingen#value", port.value)
om.metadata.set.async(path, 'user-min', '%f' % port.minvalue)
om.metadata.set.async(path, 'user-max', '%f' % port.maxvalue)
return name
@@ -124,7 +124,7 @@ def flatten(om, patch):
conns = port4.getConnections().keys()
if len(conns) == 0:
portValue = port4.value
- om.synth.set_property_slow.async(dst, "ingen:value", portValue)
+ om.synth.set_property_slow.async(dst, "http://drobilla.net/ns/ingen#value", portValue)
else:
for port3 in port4.getConnections().keys():
src = port3.getPath()
diff --git a/src/scripts/python/scripts/sillysinepatch.py b/src/scripts/python/scripts/sillysinepatch.py
index f46c6d46..24bf68e8 100644
--- a/src/scripts/python/scripts/sillysinepatch.py
+++ b/src/scripts/python/scripts/sillysinepatch.py
@@ -29,8 +29,8 @@ def main(om):
om.synth.create_patch("/silly_sine", 1)
om.synth.create_node("/silly_sine/output", "Internal", "", "audio_output", 0)
om.synth.create_node("/silly_sine/sine", "LADSPA", "cmt.so", "sine_fcac", 0)
- om.synth.set_property("/silly_sine/sine/Frequency", "ingen:value", 440.0)
- om.synth.set_property("/silly_sine/sine/Amplitude", "ingen:value", 1.0)
+ om.synth.set_property("/silly_sine/sine/Frequency", "http://drobilla.net/ns/ingen#value", 440.0)
+ om.synth.set_property("/silly_sine/sine/Amplitude", "http://drobilla.net/ns/ingen#value", 1.0)
om.synth.connect("/silly_sine/sine/Output", "/silly_sine/output/out")
om.synth.enable_patch("/silly_sine")
om.engine.enable()
diff --git a/src/serialisation/Parser.cpp b/src/serialisation/Parser.cpp
index 835057bc..bcc45fd1 100644
--- a/src/serialisation/Parser.cpp
+++ b/src/serialisation/Parser.cpp
@@ -26,6 +26,7 @@
#include "raul/Atom.hpp"
#include "raul/AtomRDF.hpp"
#include "interface/EngineInterface.hpp"
+#include "module/World.hpp"
#include "shared/LV2URIMap.hpp"
#include "Parser.hpp"
@@ -112,7 +113,8 @@ Parser::parse_document(
= parse(world, target, model, document_uri, data_path, parent, symbol, data);
if (parsed_path) {
- target->set_property(*parsed_path, "ingen:document", Atom(Atom::URI, document_uri.c_str()));
+ target->set_property(*parsed_path, "http://drobilla.net/ns/ingen#document",
+ Atom(Atom::URI, document_uri.c_str()));
} else {
LOG(warn) << "Document URI lost" << endl;
}
@@ -181,9 +183,9 @@ Parser::parse_update(
for (Redland::Query::Results::iterator i = results.begin(); i != results.end(); ++i) {
Glib::Mutex::Lock lock(world->rdf_world->mutex());
string obj_uri((*i)["s"].to_string());
- const string key(world->rdf_world->qualify((*i)["p"].to_string()));
+ const string key((*i)["p"].to_string());
const Redland::Node& val_node((*i)["o"]);
- const Atom a(AtomRDF::node_to_atom(val_node));
+ const Atom a(AtomRDF::node_to_atom(model, val_node));
if (obj_uri.find(":") == string::npos)
obj_uri = Path(obj_uri).str();
obj_uri = relative_uri(base_uri, obj_uri, true);
@@ -208,7 +210,7 @@ Parser::parse_update(
Glib::Mutex::Lock lock(world->rdf_world->mutex());
const string obj_path = (*i)["path"].to_string();
const Redland::Node& val_node = (*i)["value"];
- const Atom a(AtomRDF::node_to_atom(val_node));
+ const Atom a(AtomRDF::node_to_atom(model, val_node));
target->set_property(obj_path, world->uris->ingen_value, a);
}
@@ -236,13 +238,16 @@ Parser::parse(
Redland::Query query(*world->rdf_world, query_str);
Redland::Query::Results results(query.run(*world->rdf_world, model, document_uri));
- const Redland::Node patch_class (*world->rdf_world, res, "ingen:Patch");
- const Redland::Node node_class (*world->rdf_world, res, "ingen:Node");
- const Redland::Node internal_class (*world->rdf_world, res, "ingen:Internal");
- const Redland::Node ladspa_class (*world->rdf_world, res, "ingen:LADSPAPlugin");
- const Redland::Node in_port_class (*world->rdf_world, res, "lv2:InputPort");
- const Redland::Node out_port_class (*world->rdf_world, res, "lv2:OutputPort");
- const Redland::Node lv2_class (*world->rdf_world, res, "lv2:Plugin");
+#define NS_INGEN "http://drobilla.net/ns/ingen#"
+#define NS_LV2 "http://lv2plug.in/ns/lv2core#"
+
+ const Redland::Node patch_class (*world->rdf_world, res, NS_INGEN "Patch");
+ const Redland::Node node_class (*world->rdf_world, res, NS_INGEN "Node");
+ const Redland::Node internal_class (*world->rdf_world, res, NS_INGEN "Internal");
+ const Redland::Node ladspa_class (*world->rdf_world, res, NS_INGEN "LADSPAPlugin");
+ const Redland::Node in_port_class (*world->rdf_world, res, NS_LV2 "InputPort");
+ const Redland::Node out_port_class (*world->rdf_world, res, NS_LV2 "OutputPort");
+ const Redland::Node lv2_class (*world->rdf_world, res, NS_LV2 "Plugin");
const Redland::Node subject_node = (data_path && !data_path->is_root())
? Redland::Node(*world->rdf_world, res, data_path->chop_start("/"))
@@ -329,13 +334,14 @@ Parser::parse_patch(
boost::optional<Raul::Symbol> a_symbol,
boost::optional<GraphObject::Properties> data)
{
+ const LV2URIMap& uris = *world->uris.get();
uint32_t patch_poly = 0;
typedef Redland::Query::Results Results;
/* Use parameter overridden polyphony, if given */
if (data) {
- GraphObject::Properties::iterator poly_param = data.get().find("ingen:polyphony");
+ GraphObject::Properties::iterator poly_param = data.get().find(uris.ingen_polyphony);
if (poly_param != data.get().end() && poly_param->second.type() == Atom::INT)
patch_poly = poly_param->second.get_int32();
}
@@ -383,8 +389,8 @@ Parser::parse_patch(
/* Create patch */
Path patch_path(patch_path_str);
Resource::Properties props;
- props.insert(make_pair("rdf:type", Raul::Atom(Raul::Atom::URI, "ingen:Patch")));
- props.insert(make_pair("ingen:polyphony", Raul::Atom(int32_t(patch_poly))));
+ props.insert(make_pair(uris.rdf_type, Raul::URI(uris.ingen_Patch)));
+ props.insert(make_pair(uris.ingen_polyphony, Raul::Atom(int32_t(patch_poly))));
target->put(patch_path, props);
@@ -451,11 +457,11 @@ Parser::parse_patch(
if (node.type() == Redland::Node::RESOURCE && type_i != types.end()) {
if (skip_property(predicate))
continue;
- const string key = world->rdf_world->qualify(predicate.to_string());
+ const string key = predicate.to_string();
if (patch_i != patch_nodes.end()) {
- patch_i->second.insert(make_pair(key, AtomRDF::node_to_atom(object)));
+ patch_i->second.insert(make_pair(key, AtomRDF::node_to_atom(model, object)));
} else if (plug_i != plugin_nodes.end()) {
- plug_i->second.insert(make_pair(key, AtomRDF::node_to_atom(object)));
+ plug_i->second.insert(make_pair(key, AtomRDF::node_to_atom(model, object)));
} else {
LOG(warn) << "Unrecognized node: " << node.to_string() << endl;
}
@@ -483,8 +489,8 @@ Parser::parse_patch(
continue;
const Path node_path(relative_uri(base_uri, i->first, true));
Resource::Properties props;
- props.insert(make_pair("rdf:type", Raul::Atom(Raul::Atom::URI, "ingen:Node")));
- props.insert(make_pair("rdf:instanceOf", Raul::Atom(Raul::Atom::URI, type_i->second)));
+ props.insert(make_pair(uris.rdf_type, Raul::URI(uris.ingen_Node)));
+ props.insert(make_pair(uris.rdf_instanceOf, Raul::URI(type_i->second)));
props.insert(i->second.begin(), i->second.end());
target->put(node_path, props);
}
@@ -515,8 +521,8 @@ Parser::parse_patch(
const Path node_path(relative_uri(base_uri, node_uri, true));
const Symbol port_sym = port_uri.substr(node_uri.length() + 1);
const Path port_path = node_path.child(port_sym);
- const string key = world->rdf_world->qualify((*i)["key"].to_string());
- p->second.insert(make_pair(key, AtomRDF::node_to_atom((*i)["val"])));
+ const string key = (*i)["key"].to_string();
+ p->second.insert(make_pair(key, AtomRDF::node_to_atom(model, (*i)["val"])));
}
for (Objects::iterator i = node_ports.begin(); i != node_ports.end(); ++i) {
@@ -537,8 +543,7 @@ Parser::parse_patch(
Redland::Node& port = (*i)["port"];
Redland::Node& type = (*i)["type"];
if (port.type() == Redland::Node::RESOURCE && type.type() == Redland::Node::RESOURCE) {
- types.insert(make_pair(port.to_string(),
- world->rdf_world->qualify(type.to_string())));
+ types.insert(make_pair(port.to_string(), type.to_string()));
patch_ports.insert(make_pair(port.to_string(), Properties()));
}
}
@@ -555,18 +560,18 @@ Parser::parse_patch(
Glib::Mutex::Lock lock(world->rdf_world->mutex());
const string port_uri = (*i)["port"].to_string();
const Path port_path(Path(relative_uri(base_uri, port_uri, true)));
- const string key = world->rdf_world->qualify((*i)["key"].to_string());
+ const string key = (*i)["key"].to_string();
Objects::iterator ports_i = patch_ports.find(port_uri);
if (ports_i == patch_ports.end())
ports_i = patch_ports.insert(make_pair(port_uri, Properties())).first;
- ports_i->second.insert(make_pair(key, AtomRDF::node_to_atom((*i)["val"])));
+ ports_i->second.insert(make_pair(key, AtomRDF::node_to_atom(model, (*i)["val"])));
}
for (Objects::iterator i = patch_ports.begin(); i != patch_ports.end(); ++i) {
Glib::Mutex::Lock lock(world->rdf_world->mutex());
const Path port_path(relative_uri(base_uri, i->first, true));
std::pair<Properties::iterator,Properties::iterator> types_range
- = i->second.equal_range("rdf:type");
+ = i->second.equal_range(uris.rdf_type);
if (types_range.first == i->second.end()) {
LOG(warn) << "Patch port has no types" << endl;
continue;
@@ -577,9 +582,9 @@ Parser::parse_patch(
for (Properties::iterator t = types_range.first; t != types_range.second; ++t) {
if (t->second.type() != Atom::URI) {
continue;
- } else if (!strcmp(t->second.get_uri(), "lv2:InputPort")) {
+ } else if (!strcmp(t->second.get_uri(), uris.lv2_InputPort.c_str())) {
is_input = true;
- } else if (!strcmp(t->second.get_uri(), "lv2:OutputPort")) {
+ } else if (!strcmp(t->second.get_uri(), uris.lv2_OutputPort.c_str())) {
is_output = true;
} else if (!type) {
type = &t->second;
@@ -611,7 +616,7 @@ Parser::parse_patch(
Glib::Mutex::Lock lock(world->rdf_world->mutex());
const Redland::Node& enabled_node = (*i)["enabled"];
if (enabled_node.is_bool() && enabled_node) {
- target->set_property(patch_path, "ingen:enabled", (bool)true);
+ target->set_property(patch_path, uris.ingen_enabled, (bool)true);
break;
} else {
LOG(warn) << "Unknown type for ingen:enabled" << endl;
@@ -631,6 +636,8 @@ Parser::parse_node(
const Raul::Path& path,
boost::optional<GraphObject::Properties> data)
{
+ const LV2URIMap& uris = *world->uris.get();
+
/* Get plugin */
Redland::Query query(*world->rdf_world, Glib::ustring(
"SELECT DISTINCT ?plug WHERE {\n")
@@ -652,8 +659,8 @@ Parser::parse_node(
const string plugin_uri = world->rdf_world->expand_uri(plugin_node.to_c_string());
Resource::Properties props;
- props.insert(make_pair("rdf:type", Raul::Atom(Raul::Atom::URI, "ingen:Node")));
- props.insert(make_pair("rdf:instanceOf", Raul::Atom(Raul::Atom::URI, plugin_uri)));
+ props.insert(make_pair(uris.rdf_type, Raul::URI(uris.ingen_Node)));
+ props.insert(make_pair(uris.rdf_instanceOf, Raul::Atom(Raul::Atom::URI, plugin_uri)));
target->put(path, props);
parse_properties(world, target, model, subject, path, data);
@@ -715,12 +722,12 @@ Parser::parse_properties(
Redland::Query::Results results = query.run(*world->rdf_world, model);
for (Redland::Query::Results::iterator i = results.begin(); i != results.end(); ++i) {
Glib::Mutex::Lock lock(world->rdf_world->mutex());
- const string key = world->rdf_world->qualify(string((*i)["key"]));
+ const string key = string((*i)["key"]);
const Redland::Node& val = (*i)["val"];
if (skip_property((*i)["key"]))
continue;
if (key != "" && val.type() != Redland::Node::BLANK)
- properties.insert(make_pair(key, AtomRDF::node_to_atom(val)));
+ properties.insert(make_pair(key, AtomRDF::node_to_atom(model, val)));
}
target->put(uri, properties);
diff --git a/src/serialisation/Parser.hpp b/src/serialisation/Parser.hpp
index 0ce81e37..cd96bd0b 100644
--- a/src/serialisation/Parser.hpp
+++ b/src/serialisation/Parser.hpp
@@ -22,13 +22,15 @@
#include <glibmm/ustring.h>
#include <boost/optional.hpp>
#include "interface/GraphObject.hpp"
-#include "module/World.hpp"
namespace Raul { class Path; }
namespace Redland { class World; class Model; class Node; }
namespace Ingen { namespace Shared { class CommonInterface; } }
namespace Ingen {
+
+namespace Shared { class World; }
+
namespace Serialisation {
diff --git a/src/serialisation/Serialiser.cpp b/src/serialisation/Serialiser.cpp
index 86264900..331cf9f2 100644
--- a/src/serialisation/Serialiser.cpp
+++ b/src/serialisation/Serialiser.cpp
@@ -153,7 +153,7 @@ Serialiser::to_string(SharedPtr<GraphObject> object,
for (GraphObject::Properties::const_iterator v = extra_rdf.begin(); v != extra_rdf.end(); ++v) {
if (v->first.find(":") != string::npos) {
_model->add_statement(base_rdf_node, v->first.str(),
- AtomRDF::atom_to_node(_model->world(), v->second));
+ AtomRDF::atom_to_node(*_model, v->second));
} else {
LOG(warn) << "Not serialising extra RDF with key '" << v->first << "'" << endl;
}
@@ -378,7 +378,7 @@ Serialiser::serialise_plugin(const Shared::Plugin& plugin)
const Redland::Node plugin_id = Redland::Resource(_model->world(), plugin.uri().str());
_model->add_statement(plugin_id, "rdf:type",
- Redland::Resource(_model->world(), plugin.type_uri()));
+ Redland::Resource(_model->world(), plugin.type_uri().str()));
}
@@ -416,7 +416,7 @@ Serialiser::serialise_port(const Port* port, const Redland::Node& port_id)
Redland::Resource(_model->world(), "lv2:OutputPort"));
_model->add_statement(port_id, "rdf:type",
- Redland::Resource(_model->world(), port->type().uri()));
+ Redland::Resource(_model->world(), port->type().uri().str()));
if (dynamic_cast<Patch*>(port->graph_parent()))
_model->add_statement(port_id, "rdf:instanceOf",
@@ -424,7 +424,7 @@ Serialiser::serialise_port(const Port* port, const Redland::Node& port_id)
if (port->is_input() && port->type() == PortType::CONTROL)
_model->add_statement(port_id, "ingen:value",
- AtomRDF::atom_to_node(_model->world(), port->value()));
+ AtomRDF::atom_to_node(*_model, port->value()));
serialise_properties(port_id, &port->meta(), port->properties());
}
@@ -442,16 +442,16 @@ Serialiser::serialise_port_meta(const Port* port, const Redland::Node& port_id)
Redland::Resource(_model->world(), "lv2:OutputPort"));
_model->add_statement(port_id, "rdf:type",
- Redland::Resource(_model->world(), port->type().uri()));
+ Redland::Resource(_model->world(), port->type().uri().str()));
_model->add_statement(port_id, "lv2:index",
- AtomRDF::atom_to_node(_model->world(), Atom((int)port->index())));
+ AtomRDF::atom_to_node(*_model, Atom((int)port->index())));
if (!port->get_property("lv2:default").is_valid()) {
if (port->is_input()) {
if (port->value().is_valid()) {
_model->add_statement(port_id, "lv2:default",
- AtomRDF::atom_to_node(_model->world(), Atom(port->value())));
+ AtomRDF::atom_to_node(*_model, Atom(port->value())));
} else if (port->type() == PortType::CONTROL) {
LOG(warn) << "Port " << port->path() << " has no lv2:default" << endl;
}
@@ -500,7 +500,7 @@ Serialiser::serialise_properties(
if (v->second.is_valid()) {
if (!meta || !meta->has_property(v->first.str(), v->second)) {
const Redland::Resource key(_model->world(), v->first.str());
- const Redland::Node value(AtomRDF::atom_to_node(_model->world(), v->second));
+ const Redland::Node value(AtomRDF::atom_to_node(*_model, v->second));
if (value.is_valid()) {
_model->add_statement(subject, key, value);
} else {
diff --git a/src/shared/Builder.cpp b/src/shared/Builder.cpp
index fd94ddd0..542176d0 100644
--- a/src/shared/Builder.cpp
+++ b/src/shared/Builder.cpp
@@ -22,8 +22,6 @@
#include "common/interface/Port.hpp"
#include "common/interface/Connection.hpp"
#include "common/interface/Plugin.hpp"
-#include "module/ingen_module.hpp"
-#include "module/World.hpp"
#include "shared/LV2URIMap.hpp"
#include "Builder.hpp"
@@ -43,7 +41,7 @@ Builder::Builder(CommonInterface& interface)
void
Builder::build(SharedPtr<const GraphObject> object)
{
- const LV2URIMap& uris = *ingen_get_world()->uris.get();
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
SharedPtr<const Patch> patch = PtrCast<const Patch>(object);
if (patch) {
if (!object->path().is_root()) {
diff --git a/src/shared/LV2Object.cpp b/src/shared/LV2Object.cpp
index 193e2c1d..252972ff 100644
--- a/src/shared/LV2Object.cpp
+++ b/src/shared/LV2Object.cpp
@@ -17,7 +17,6 @@
#include "raul/log.hpp"
#include "raul/Atom.hpp"
-#include "module/World.hpp"
#include "uri-map.lv2/uri-map.h"
#include "object.lv2/object.h"
#include "LV2Features.hpp"
@@ -33,20 +32,20 @@ namespace LV2Object {
bool
-to_atom(World* world, const LV2_Object* object, Raul::Atom& atom)
+to_atom(const LV2_Object* object, Raul::Atom& atom)
{
- SharedPtr<LV2URIMap> uris = world->uris;
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
- if (object->type == uris->object_class_string.id) {
+ if (object->type == uris.object_class_string.id) {
atom = Raul::Atom((char*)(object + 1));
return true;
- } else if (object->type == uris->object_class_bool.id) {
+ } else if (object->type == uris.object_class_bool.id) {
atom = Raul::Atom((bool)(int32_t*)(object + 1));
return true;
- } else if (object->type == uris->object_class_int32.id) {
+ } else if (object->type == uris.object_class_int32.id) {
atom = Raul::Atom((int32_t*)(object + 1));
return true;
- } else if (object->type == uris->object_class_float32.id) {
+ } else if (object->type == uris.object_class_float32.id) {
atom = Raul::Atom((float*)(object + 1));
return true;
}
@@ -58,24 +57,24 @@ to_atom(World* world, const LV2_Object* object, Raul::Atom& atom)
* object->size should be the capacity of the object (not including header)
*/
bool
-from_atom(World* world, const Raul::Atom& atom, LV2_Object* object)
+from_atom(const Raul::Atom& atom, LV2_Object* object)
{
- SharedPtr<LV2URIMap> uris = world->uris;
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
char* str;
switch (atom.type()) {
case Raul::Atom::FLOAT:
- object->type = uris->object_class_float32.id;
+ object->type = uris.object_class_float32.id;
object->size = sizeof(float);
*(float*)(object + 1) = atom.get_float();
break;
case Raul::Atom::INT:
- object->type = uris->object_class_int32.id;
+ object->type = uris.object_class_int32.id;
object->size = sizeof(int32_t);
*(int32_t*)(object + 1) = atom.get_int32();
break;
case Raul::Atom::STRING:
- object->type = uris->object_class_string.id;
+ object->type = uris.object_class_string.id;
object->size = std::min((uint16_t)object->size, (uint16_t)(strlen(atom.get_string()) + 1));
str = ((char*)(object + 1));
str[object->size - 1] = '\0';
@@ -83,8 +82,8 @@ from_atom(World* world, const Raul::Atom& atom, LV2_Object* object)
break;
case Raul::Atom::BLOB:
error << "TODO: Blob support" << endl;
- /*object->type = uris->object_class_string;
- *(uint16_t*)(object + 1) = uris->uri_to_id(NULL, atom.get_blob_type());
+ /*object->type = uris.object_class_string;
+ *(uint16_t*)(object + 1) = uris.uri_to_id(NULL, atom.get_blob_type());
memcpy(((char*)(object + 1) + sizeof(uint32_t)), atom.get_blob(),
std::min(atom.data_size(), (size_t)object->size));*/
default:
diff --git a/src/shared/LV2URIMap.cpp b/src/shared/LV2URIMap.cpp
index 37856fe6..70ca954f 100644
--- a/src/shared/LV2URIMap.cpp
+++ b/src/shared/LV2URIMap.cpp
@@ -22,6 +22,8 @@
#include "raul/log.hpp"
#include "object.lv2/object.h"
#include "LV2URIMap.hpp"
+#include "module/ingen_module.hpp"
+#include "module/World.hpp"
using namespace std;
using namespace Raul;
@@ -36,41 +38,67 @@ LV2URIMap::Quark::Quark(const char* c_str)
{
}
+#define NS_CTX "http://lv2plug.in/ns/dev/contexts#"
+#define NS_INGEN "http://drobilla.net/ns/ingen#"
+#define NS_INGENUI "http://drobilla.net/ns/ingenuity#"
+#define NS_LV2 "http://lv2plug.in/ns/lv2core#"
+#define NS_MIDI "http://drobilla.net/ns/dev/midi#"
+#define NS_MIDI "http://drobilla.net/ns/dev/midi#"
+#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+#define NS_RDFS "http://www.w3.org/2000/01/rdf-schema#"
LV2URIMap::LV2URIMap()
- : ctx_context("ctx:context")
- , ctx_AudioContext("ctx:AudioContext")
- , ctx_MessageContext("ctx:MessageContext")
- , doap_name("doap:name")
- , ingen_LADSPAPlugin("ingen:LADSPAPlugin")
- , ingen_Internal("ingen:Internal")
- , ingen_Node("ingen:Node")
- , ingen_Patch("ingen:Patch")
- , ingen_Port("ingen:Port")
- , ingen_broadcast("ingen:broadcast")
- , ingen_enabled("ingen:enabled")
- , ingen_polyphonic("ingen:polyphonic")
- , ingen_polyphony("ingen:polyphony")
- , ingen_selected("ingen:selected")
- , ingen_value("ingen:value")
- , ingenui_canvas_x("ingenui:canvas-x")
- , ingenui_canvas_y("ingenui:canvas-y")
- , lv2_Plugin("lv2:Plugin")
- , lv2_index("lv2:index")
- , lv2_maximum("lv2:maximum")
- , lv2_minimum("lv2:minimum")
- , lv2_name("lv2:name")
- , lv2_symbol("lv2:symbol")
- , lv2_toggled("lv2:toggled")
+ : ctx_AudioContext(NS_CTX "AudioContext")
+ , ctx_MessageContext(NS_CTX "MessageContext")
+ , ctx_context(NS_CTX "context")
+ , doap_name("http://usefulinc.com/ns/doap#name")
+ , ingen_Internal(NS_INGEN "Internal")
+ , ingen_LADSPAPlugin(NS_INGEN "LADSPAPlugin")
+ , ingen_Node(NS_INGEN "Node")
+ , ingen_Patch(NS_INGEN "Patch")
+ , ingen_Port(NS_INGEN "Port")
+ , ingen_broadcast(NS_INGEN "broadcast")
+ , ingen_controlBinding(NS_INGEN "controlBinding")
+ , ingen_document(NS_INGEN "document")
+ , ingen_enabled(NS_INGEN "enabled")
+ , ingen_nil(NS_INGEN "nil")
+ , ingen_node(NS_INGEN "node")
+ , ingen_polyphonic(NS_INGEN "polyphonic")
+ , ingen_polyphony(NS_INGEN "polyphony")
+ , ingen_selected(NS_INGEN "selected")
+ , ingen_value(NS_INGEN "value")
+ , ingenui_canvas_x(NS_INGENUI "canvas-x")
+ , ingenui_canvas_y(NS_INGENUI "canvas-y")
+ , lv2_AudioPort(NS_LV2 "AudioPort")
+ , lv2_ControlPort(NS_LV2 "ControlPort")
+ , lv2_InputPort(NS_LV2 "InputPort")
+ , lv2_OutputPort(NS_LV2 "OutputPort")
+ , lv2_Plugin(NS_LV2 "Plugin")
+ , lv2_default(NS_LV2 "default")
+ , lv2_index(NS_LV2 "index")
+ , lv2_integer(NS_LV2 "integer")
+ , lv2_maximum(NS_LV2 "maximum")
+ , lv2_minimum(NS_LV2 "minimum")
+ , lv2_name(NS_LV2 "name")
+ , lv2_symbol(NS_LV2 "symbol")
+ , lv2_toggled(NS_LV2 "toggled")
+ , lv2ev_EventPort("http://lv2plug.in/ns/ext/event#EventPort")
+ , midi_Bender(NS_MIDI "Bender")
+ , midi_ChannelPressure(NS_MIDI "ChannelPressure")
+ , midi_Controller(NS_MIDI "Controller")
+ , midi_controllerNumber(NS_MIDI "controllerNumber")
, midi_event("http://lv2plug.in/ns/ext/midi#MidiEvent")
+ , obj_MessagePort("http://lv2plug.in/ns/dev/objects#MessagePort")
+ , obj_ValuePort("http://lv2plug.in/ns/dev/objects#ValuePort")
, object_class_bool(LV2_OBJECT_URI "#Bool")
, object_class_float32(LV2_OBJECT_URI "#Float32")
, object_class_int32(LV2_OBJECT_URI "#Int32")
, object_class_string(LV2_OBJECT_URI "#String")
, object_class_vector(LV2_OBJECT_URI "#Vector")
, object_transfer(LV2_OBJECT_URI "#ObjectTransfer")
- , rdf_instanceOf("rdf:instanceOf")
- , rdf_type("rdf:type")
+ , rdf_instanceOf(NS_RDF "instanceOf")
+ , rdf_type(NS_RDF "type")
+ , rdfs_seeAlso(NS_RDFS "seeAlso")
, string_transfer("http://lv2plug.in/ns/dev/string-port#StringTransfer")
, ui_format_events("http://lv2plug.in/ns/extensions/ui#Events")
{
@@ -81,6 +109,13 @@ LV2URIMap::LV2URIMap()
}
+const LV2URIMap&
+LV2URIMap::instance()
+{
+ return *ingen_get_world()->uris;
+}
+
+
uint32_t
LV2URIMap::uri_to_id(const char* map,
const char* uri)
diff --git a/src/shared/LV2URIMap.hpp b/src/shared/LV2URIMap.hpp
index df9a1358..d773591f 100644
--- a/src/shared/LV2URIMap.hpp
+++ b/src/shared/LV2URIMap.hpp
@@ -40,6 +40,8 @@ public:
uint32_t uri_to_id(const char* map, const char* uri);
+ static const LV2URIMap& instance();
+
private:
static uint32_t uri_map_uri_to_id(LV2_URI_Map_Callback_Data callback_data,
const char* map,
@@ -54,31 +56,48 @@ public:
uint32_t id;
};
- const Quark ctx_context;
const Quark ctx_AudioContext;
const Quark ctx_MessageContext;
+ const Quark ctx_context;
const Quark doap_name;
- const Quark ingen_LADSPAPlugin;
const Quark ingen_Internal;
+ const Quark ingen_LADSPAPlugin;
const Quark ingen_Node;
const Quark ingen_Patch;
const Quark ingen_Port;
const Quark ingen_broadcast;
+ const Quark ingen_controlBinding;
+ const Quark ingen_document;
const Quark ingen_enabled;
+ const Quark ingen_nil;
+ const Quark ingen_node;
const Quark ingen_polyphonic;
const Quark ingen_polyphony;
const Quark ingen_selected;
const Quark ingen_value;
const Quark ingenui_canvas_x;
const Quark ingenui_canvas_y;
+ const Quark lv2_AudioPort;
+ const Quark lv2_ControlPort;
+ const Quark lv2_InputPort;
+ const Quark lv2_OutputPort;
const Quark lv2_Plugin;
+ const Quark lv2_default;
const Quark lv2_index;
+ const Quark lv2_integer;
const Quark lv2_maximum;
const Quark lv2_minimum;
const Quark lv2_name;
const Quark lv2_symbol;
const Quark lv2_toggled;
+ const Quark lv2ev_EventPort;
+ const Quark midi_Bender;
+ const Quark midi_ChannelPressure;
+ const Quark midi_Controller;
+ const Quark midi_controllerNumber;
const Quark midi_event;
+ const Quark obj_MessagePort;
+ const Quark obj_ValuePort;
const Quark object_class_bool;
const Quark object_class_float32;
const Quark object_class_int32;
@@ -87,6 +106,7 @@ public:
const Quark object_transfer;
const Quark rdf_instanceOf;
const Quark rdf_type;
+ const Quark rdfs_seeAlso;
const Quark string_transfer;
const Quark ui_format_events;
};
diff --git a/src/shared/ResourceImpl.cpp b/src/shared/ResourceImpl.cpp
index 625e8c17..ea64a5d7 100644
--- a/src/shared/ResourceImpl.cpp
+++ b/src/shared/ResourceImpl.cpp
@@ -15,7 +15,9 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "raul/log.hpp"
#include "raul/Atom.hpp"
+#include "shared/LV2URIMap.hpp"
#include "ResourceImpl.hpp"
using namespace std;
@@ -99,46 +101,45 @@ ResourceImpl::type(
bool& port, bool& is_output, PortType& data_type)
{
typedef Resource::Properties::const_iterator iterator;
- const std::pair<iterator,iterator> types_range = properties.equal_range("rdf:type");
+ const LV2URIMap& uris = Shared::LV2URIMap::instance();
+ const std::pair<iterator,iterator> types_range = properties.equal_range(uris.rdf_type);
patch = node = port = is_output = false;
data_type = PortType::UNKNOWN;
for (iterator i = types_range.first; i != types_range.second; ++i) {
const Atom& atom = i->second;
- if (atom.type() == Atom::URI) {
- if (!strncmp(atom.get_uri(), "ingen:", 6)) {
- const char* suffix = atom.get_uri() + 6;
- if (!strcmp(suffix, "Patch")) {
- patch = true;
- } else if (!strcmp(suffix, "Node")) {
- node = true;
- }
- } else if (!strncmp(atom.get_uri(), "lv2:", 4)) {
- const char* suffix = atom.get_uri() + 4;
- port = true;
- if (!strcmp(suffix, "InputPort")) {
- is_output = false;
- port = true;
- } else if (!strcmp(suffix, "OutputPort")) {
- is_output = true;
- port = true;
- } else if (!strcmp(suffix, "AudioPort")) {
- data_type = PortType::AUDIO;
- port = true;
- } else if (!strcmp(suffix, "ControlPort")) {
- data_type = PortType::CONTROL;
- port = true;
- }
- } else if (!strcmp(atom.get_uri(), "lv2ev:EventPort")) {
- data_type = PortType::EVENTS;
- port = true;
- } else if (!strcmp(atom.get_uri(), "obj:ValuePort")) {
- data_type = PortType::VALUE;
- port = true;
- } else if (!strcmp(atom.get_uri(), "obj:MessagePort")) {
- data_type = PortType::MESSAGE;
- port = true;
- }
+ if (atom.type() != Atom::URI) {
+ warn << "[ResourceImpl] Non-URI type " << atom << endl;
+ continue;
+ }
+
+ if (atom == uris.ingen_Patch) {
+ patch = true;
+ } else if (atom == uris.ingen_Node) {
+ node = true;
+ } else if (atom == uris.lv2_InputPort) {
+ port = true;
+ is_output = false;
+ } else if (atom == uris.lv2_OutputPort) {
+ port = true;
+ is_output = true;
+ } else if (atom == uris.lv2_AudioPort) {
+ port = true;
+ data_type = PortType::AUDIO;
+ } else if (atom == uris.lv2_ControlPort) {
+ port = true;
+ data_type = PortType::CONTROL;
+ } else if (atom == uris.lv2ev_EventPort) {
+ data_type = PortType::EVENTS;
+ port = true;
+ } else if (atom == uris.obj_ValuePort) {
+ data_type = PortType::VALUE;
+ port = true;
+ } else if (atom == uris.obj_MessagePort) {
+ data_type = PortType::MESSAGE;
+ port = true;
+ } else {
+ warn << "[ResourceImpl] Unrecognized type " << atom << endl;
}
}