summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/events/DisconnectionEvent.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-04-08 06:04:32 +0000
committerDavid Robillard <d@drobilla.net>2007-04-08 06:04:32 +0000
commite96c36c1a7abb062e36efc0ac95c35fedcef922e (patch)
tree826d5caa0392201472d12c02a1c3df4cf7b275be /src/libs/engine/events/DisconnectionEvent.cpp
parent7d69e89f22304e37fa325ce4f39a374a02072a69 (diff)
downloadingen-e96c36c1a7abb062e36efc0ac95c35fedcef922e.tar.gz
ingen-e96c36c1a7abb062e36efc0ac95c35fedcef922e.tar.bz2
ingen-e96c36c1a7abb062e36efc0ac95c35fedcef922e.zip
De-template-ification of port types (req. for LV2 MIDI, but nice code size reduction).
LV2 MIDI patching support (LV2 style MIDI throughout, inc. internal plugins). git-svn-id: http://svn.drobilla.net/lad/ingen@415 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/events/DisconnectionEvent.cpp')
-rw-r--r--src/libs/engine/events/DisconnectionEvent.cpp123
1 files changed, 22 insertions, 101 deletions
diff --git a/src/libs/engine/events/DisconnectionEvent.cpp b/src/libs/engine/events/DisconnectionEvent.cpp
index d5e788ef..aef271f4 100644
--- a/src/libs/engine/events/DisconnectionEvent.cpp
+++ b/src/libs/engine/events/DisconnectionEvent.cpp
@@ -21,7 +21,7 @@
#include <raul/Path.h>
#include "Responder.h"
#include "Engine.h"
-#include "TypedConnection.h"
+#include "Connection.h"
#include "InputPort.h"
#include "OutputPort.h"
#include "Patch.h"
@@ -44,7 +44,7 @@ DisconnectionEvent::DisconnectionEvent(Engine& engine, SharedPtr<Responder> resp
_src_port(NULL),
_dst_port(NULL),
_lookup(true),
- _typed_event(NULL),
+ _process_order(NULL),
_error(NO_ERROR)
{
}
@@ -58,7 +58,7 @@ DisconnectionEvent::DisconnectionEvent(Engine& engine, SharedPtr<Responder> resp
_src_port(src_port),
_dst_port(dst_port),
_lookup(false),
- _typed_event(NULL),
+ _process_order(NULL),
_error(NO_ERROR)
{
// FIXME: These break for patch ports.. is that ok?
@@ -69,11 +69,6 @@ DisconnectionEvent::DisconnectionEvent(Engine& engine, SharedPtr<Responder> resp
== dst_port->parent_node()->parent_patch()); */
}
-DisconnectionEvent::~DisconnectionEvent()
-{
- delete _typed_event;
-}
-
void
DisconnectionEvent::pre_process()
@@ -87,14 +82,6 @@ DisconnectionEvent::pre_process()
return;
}
- /*_patch = _engine.object_store()->find_patch(_src_port_path.parent().parent());
-
- if (_patch == NULL) {
- _error = PORT_NOT_FOUND;
- QueuedEvent::pre_process();
- return;
- }*/
-
_src_port = _engine.object_store()->find_port(_src_port_path);
_dst_port = _engine.object_store()->find_port(_dst_port_path);
}
@@ -111,76 +98,13 @@ DisconnectionEvent::pre_process()
return;
}
- // Create the typed event to actually do the work
- const DataType type = _src_port->type();
- if (type == DataType::FLOAT) {
- _typed_event = new TypedDisconnectionEvent<Sample>(_engine, _responder, _time,
- dynamic_cast<OutputPort<Sample>*>(_src_port), dynamic_cast<InputPort<Sample>*>(_dst_port));
- } else if (type == DataType::MIDI) {
- _typed_event = new TypedDisconnectionEvent<MidiMessage>(_engine, _responder, _time,
- dynamic_cast<OutputPort<MidiMessage>*>(_src_port), dynamic_cast<InputPort<MidiMessage>*>(_dst_port));
- } else {
- _error = TYPE_MISMATCH;
- QueuedEvent::pre_process();
- return;
- }
-
- assert(_typed_event);
- _typed_event->pre_process();
- assert(_typed_event->is_prepared());
-
- QueuedEvent::pre_process();
-}
-
-
-void
-DisconnectionEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
-{
- QueuedEvent::execute(nframes, start, end);
-
- if (_error == NO_ERROR)
- _typed_event->execute(nframes, start, end);
-}
-
-
-void
-DisconnectionEvent::post_process()
-{
- if (_error == NO_ERROR) {
- _typed_event->post_process();
- } else {
- // FIXME: better error messages
- string msg = "Unable to disconnect ";
- msg.append(_src_port_path + " -> " + _dst_port_path);
- _responder->respond_error(msg);
- }
-}
-
-
-
-//// TypedDisconnectionEvent ////
-
-
-template <typename T>
-TypedDisconnectionEvent<T>::TypedDisconnectionEvent(Engine& engine, SharedPtr<Responder> responder, SampleCount timestamp, OutputPort<T>* src_port, InputPort<T>* dst_port)
-: QueuedEvent(engine, responder, timestamp),
- _src_port(src_port),
- _dst_port(dst_port),
- _patch(NULL),
- _process_order(NULL),
- _succeeded(true)
-{
- assert(src_port != NULL);
- assert(dst_port != NULL);
-}
-
+ _dst_input_port = dynamic_cast<InputPort*>(_dst_port);
+ _src_output_port = dynamic_cast<OutputPort*>(_src_port);
+ assert(_src_output_port);
+ assert(_dst_input_port);
-template <typename T>
-void
-TypedDisconnectionEvent<T>::pre_process()
-{
- if (!_dst_port->is_connected_to(_src_port)) {
- _succeeded = false;
+ if (!_dst_input_port->is_connected_to(_src_output_port)) {
+ _error = NOT_CONNECTED;
QueuedEvent::pre_process();
return;
}
@@ -209,7 +133,7 @@ TypedDisconnectionEvent<T>::pre_process()
assert(_patch);
if (src_node == NULL || dst_node == NULL) {
- _succeeded = false;
+ _error = PARENTS_NOT_FOUND;
QueuedEvent::pre_process();
return;
}
@@ -229,21 +153,18 @@ TypedDisconnectionEvent<T>::pre_process()
if (_patch->enabled())
_process_order = _patch->build_process_order();
- _succeeded = true;
- QueuedEvent::pre_process();
+ QueuedEvent::pre_process();
}
-template <typename T>
void
-TypedDisconnectionEvent<T>::execute(SampleCount nframes, FrameTime start, FrameTime end)
+DisconnectionEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
{
QueuedEvent::execute(nframes, start, end);
- if (_succeeded) {
-
- Raul::ListNode<TypedConnection<T>*>* const port_connection
- = _dst_port->remove_connection(_src_port);
+ if (_error == NO_ERROR) {
+ Raul::ListNode<Connection*>* const port_connection
+ = _dst_input_port->remove_connection(_src_output_port);
if (port_connection != NULL) {
Raul::ListNode<Connection*>* const patch_connection
@@ -261,23 +182,23 @@ TypedDisconnectionEvent<T>::execute(SampleCount nframes, FrameTime start, FrameT
_engine.maid()->push(_patch->process_order());
_patch->process_order(_process_order);
} else {
- _succeeded = false; // Ports weren't connected
+ _error = CONNECTION_NOT_FOUND;
}
}
}
-template <typename T>
void
-TypedDisconnectionEvent<T>::post_process()
+DisconnectionEvent::post_process()
{
- if (_succeeded) {
-
+ if (_error == NO_ERROR) {
_responder->respond_ok();
-
_engine.broadcaster()->send_disconnection(_src_port->path(), _dst_port->path());
} else {
- _responder->respond_error("Unable to disconnect ports.");
+ // FIXME: better error messages
+ string msg = "Unable to disconnect ";
+ msg.append(_src_port_path + " -> " + _dst_port_path);
+ _responder->respond_error(msg);
}
}