summaryrefslogtreecommitdiffstats
path: root/src/engine/events
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/events')
-rw-r--r--src/engine/events/ClearPatch.cpp2
-rw-r--r--src/engine/events/Delete.cpp2
-rw-r--r--src/engine/events/Move.cpp2
-rw-r--r--src/engine/events/RequestMetadata.cpp19
-rw-r--r--src/engine/events/SetPortValue.cpp49
-rw-r--r--src/engine/events/SetPortValue.hpp2
6 files changed, 36 insertions, 40 deletions
diff --git a/src/engine/events/ClearPatch.cpp b/src/engine/events/ClearPatch.cpp
index 3957294e..92c0156c 100644
--- a/src/engine/events/ClearPatch.cpp
+++ b/src/engine/events/ClearPatch.cpp
@@ -117,7 +117,7 @@ ClearPatch::execute(ProcessContext& context)
if (port && port->type() == DataType::AUDIO) {
_driver_ports->push_back(
_engine.audio_driver()->remove_port(port->path()));
- } else if (port && port->type() == DataType::EVENT) {
+ } else if (port && port->type() == DataType::EVENTS) {
_driver_ports->push_back(
_engine.midi_driver()->remove_port(port->path()));
}
diff --git a/src/engine/events/Delete.cpp b/src/engine/events/Delete.cpp
index d8a8bef9..aa773176 100644
--- a/src/engine/events/Delete.cpp
+++ b/src/engine/events/Delete.cpp
@@ -155,7 +155,7 @@ Delete::execute(ProcessContext& context)
if ( ! _port->parent_patch()->parent()) {
if (_port->type() == DataType::AUDIO)
_driver_port = _engine.audio_driver()->remove_port(_port->path());
- else if (_port->type() == DataType::EVENT)
+ else if (_port->type() == DataType::EVENTS)
_driver_port = _engine.midi_driver()->remove_port(_port->path());
// Apparently this needs to be called in post_process??
diff --git a/src/engine/events/Move.cpp b/src/engine/events/Move.cpp
index 1b12819e..9782e0d6 100644
--- a/src/engine/events/Move.cpp
+++ b/src/engine/events/Move.cpp
@@ -108,7 +108,7 @@ Move::execute(ProcessContext& context)
if (port->type() == DataType::AUDIO)
driver_port = _engine.audio_driver()->driver_port(_new_path);
- else if (port->type() == DataType::EVENT)
+ else if (port->type() == DataType::EVENTS)
driver_port = _engine.midi_driver()->driver_port(_new_path);
if (driver_port)
diff --git a/src/engine/events/RequestMetadata.cpp b/src/engine/events/RequestMetadata.cpp
index e633ca10..06069f74 100644
--- a/src/engine/events/RequestMetadata.cpp
+++ b/src/engine/events/RequestMetadata.cpp
@@ -17,15 +17,17 @@
#include "interface/ClientInterface.hpp"
#include "events/RequestMetadata.hpp"
-#include "Responder.hpp"
+#include "shared/LV2Object.hpp"
+#include "AudioBuffer.hpp"
+#include "ClientBroadcaster.hpp"
#include "Engine.hpp"
-#include "GraphObjectImpl.hpp"
#include "EngineStore.hpp"
-#include "ClientBroadcaster.hpp"
-#include "PortImpl.hpp"
+#include "GraphObjectImpl.hpp"
+#include "ObjectBuffer.hpp"
#include "PluginImpl.hpp"
-#include "AudioBuffer.hpp"
-#include "StringBuffer.hpp"
+#include "PortImpl.hpp"
+#include "ProcessContext.hpp"
+#include "Responder.hpp"
using namespace std;
using namespace Raul;
@@ -94,8 +96,9 @@ RequestMetadata::execute(ProcessContext& context)
if (port) {
if (port->type() == DataType::CONTROL || port->type() == DataType::AUDIO)
_value = ((AudioBuffer*)port->buffer(0))->value_at(0); // TODO: offset
- else if (port->type() == DataType::STRING)
- _value = (char*)((StringBuffer*)port->buffer(0))->data();
+ else if (port->type() == DataType::OBJECT)
+ LV2Object::to_atom(context.engine().world(),
+ ((ObjectBuffer*)port->buffer(0))->data(), _value);
} else {
_resource = 0;
}
diff --git a/src/engine/events/SetPortValue.cpp b/src/engine/events/SetPortValue.cpp
index 1964880d..6b9d8d9e 100644
--- a/src/engine/events/SetPortValue.cpp
+++ b/src/engine/events/SetPortValue.cpp
@@ -19,6 +19,7 @@
#include "event.lv2/event.h"
#include "shared/LV2URIMap.hpp"
#include "shared/LV2Features.hpp"
+#include "shared/LV2Object.hpp"
#include "module/World.hpp"
#include "AudioBuffer.hpp"
#include "ClientBroadcaster.hpp"
@@ -27,11 +28,11 @@
#include "EventBuffer.hpp"
#include "MessageContext.hpp"
#include "NodeImpl.hpp"
+#include "ObjectBuffer.hpp"
#include "PortImpl.hpp"
#include "ProcessContext.hpp"
#include "Responder.hpp"
#include "SetPortValue.hpp"
-#include "StringBuffer.hpp"
using namespace std;
using namespace Raul;
@@ -115,7 +116,8 @@ SetPortValue::pre_process()
// Port is a message context port, set its value and
// call the plugin's message run function once
if (_port && _port->context() == Context::MESSAGE) {
- apply(0, 0);
+ apply(*_engine.message_context());
+ _port->parent_node()->set_port_valid(_port->index());
_engine.message_context()->run(_port->parent_node());
}
@@ -132,13 +134,14 @@ SetPortValue::execute(ProcessContext& context)
if (_port && _port->context() == Context::MESSAGE)
return;
- apply(context.start(), context.nframes());
+ apply(context);
}
void
-SetPortValue::apply(uint32_t start, uint32_t nframes)
+SetPortValue::apply(Context& context)
{
+ uint32_t start = context.start();
if (_error == NO_ERROR && !_port)
_port = _engine.engine_store()->find_port(_port_path);
@@ -170,15 +173,12 @@ SetPortValue::apply(uint32_t start, uint32_t nframes)
return;
}
- const LV2Features::Feature* f = _engine.world()->lv2_features->feature(LV2_URI_MAP_URI);
- LV2URIMap* map = (LV2URIMap*)f->controller;
+ SharedPtr<LV2URIMap> map = PtrCast<LV2URIMap>(
+ _engine.world()->lv2_features->feature(LV2_URI_MAP_URI));
- // TODO: eliminate lookups
EventBuffer* const ebuf = dynamic_cast<EventBuffer*>(buf);
if (ebuf) {
- const uint32_t frames = std::max(
- uint32_t(_time - start),
- ebuf->latest_frames());
+ const uint32_t frames = std::max(uint32_t(_time - start), ebuf->latest_frames());
// Size 0 event, pass it along to the plugin as a typed but empty event
if (_value.data_size() == 0) {
@@ -188,34 +188,27 @@ SetPortValue::apply(uint32_t start, uint32_t nframes)
return;
} else if (!strcmp(_value.get_blob_type(), "lv2midi:MidiEvent")) {
- const uint32_t type_id = map->uri_to_id(NULL,
- "http://lv2plug.in/ns/ext/midi#MidiEvent");
-
- ebuf->prepare_write(start, nframes);
- // FIXME: use OSC midi type? avoid MIDI over OSC entirely?
- ebuf->append(frames, 0, type_id, _value.data_size(),
+ ebuf->prepare_write(context);
+ ebuf->append(frames, 0, map->midi_event, _value.data_size(),
(const uint8_t*)_value.get_blob());
_port->raise_set_by_user_flag();
return;
}
}
- StringBuffer* const sbuf = dynamic_cast<StringBuffer*>(buf);
- if (sbuf) {
- if (_value.type() != Atom::STRING) {
- _error = TYPE_MISMATCH;
+ ObjectBuffer* const obuf = dynamic_cast<ObjectBuffer*>(buf);
+ if (obuf) {
+ obuf->data()->size = obuf->size() - sizeof(LV2_Object);
+ if (LV2Object::from_atom(_engine.world(), _value, obuf->data())) {
+ cout << "Converted atom " << _value << " :: " << obuf->data()->type
+ << " * " << obuf->data()->size << " @ " << obuf->data() << endl;
return;
+ } else {
+ cerr << "WARNING: Failed to convert atom to LV2 object" << endl;
}
- strncpy(sbuf->data(), _value.get_string(),
- std::min(sbuf->size(), strlen(_value.get_string())));
- return;
}
-
- if (_value.type() == Atom::BLOB)
- cerr << "WARNING: Unknown value blob type " << _value.get_blob_type() << endl;
- else
- cerr << "WARNING: Unknown value type " << (int)_value.type() << endl;
+ cerr << "WARNING: Unknown value type " << (int)_value.type() << endl;
}
}
diff --git a/src/engine/events/SetPortValue.hpp b/src/engine/events/SetPortValue.hpp
index 87f4f6f6..aab59811 100644
--- a/src/engine/events/SetPortValue.hpp
+++ b/src/engine/events/SetPortValue.hpp
@@ -77,7 +77,7 @@ private:
TYPE_MISMATCH
};
- void apply(uint32_t start, uint32_t nframes);
+ void apply(Context& context);
bool _queued;
bool _omni;