summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/events
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-01-06 04:16:26 +0000
committerDavid Robillard <d@drobilla.net>2007-01-06 04:16:26 +0000
commit2122a857662203936a04a39df7d0e1ad1db82853 (patch)
treeb31070a9d01ab20da1a03bf8d029dc3ce6ab66bc /src/libs/engine/events
parent9c5f7e9dc2029f97d0baf622165701e7c124b25e (diff)
downloadingen-2122a857662203936a04a39df7d0e1ad1db82853.tar.gz
ingen-2122a857662203936a04a39df7d0e1ad1db82853.tar.bz2
ingen-2122a857662203936a04a39df7d0e1ad1db82853.zip
Work on Port destruction (still broken).
git-svn-id: http://svn.drobilla.net/lad/ingen@233 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/events')
-rw-r--r--src/libs/engine/events/AddNodeEvent.cpp4
-rw-r--r--src/libs/engine/events/ClearPatchEvent.cpp5
-rw-r--r--src/libs/engine/events/CreatePatchEvent.cpp2
-rw-r--r--src/libs/engine/events/DestroyEvent.cpp157
-rw-r--r--src/libs/engine/events/DestroyEvent.h17
-rw-r--r--src/libs/engine/events/DisconnectPortEvent.cpp8
6 files changed, 129 insertions, 64 deletions
diff --git a/src/libs/engine/events/AddNodeEvent.cpp b/src/libs/engine/events/AddNodeEvent.cpp
index 74a08b00..92214009 100644
--- a/src/libs/engine/events/AddNodeEvent.cpp
+++ b/src/libs/engine/events/AddNodeEvent.cpp
@@ -96,6 +96,8 @@ AddNodeEvent::pre_process()
m_patch->add_node(new ListNode<Node*>(m_node));
m_node->add_to_store(_engine.object_store());
+ // FIXME: not really necessary to build process order since it's not connected,
+ // just append to the list
if (m_patch->enabled())
m_process_order = m_patch->build_process_order();
}
@@ -110,8 +112,6 @@ AddNodeEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
QueuedEvent::execute(nframes, start, end);
if (m_node != NULL) {
- m_node->add_to_patch();
-
if (m_patch->process_order() != NULL)
_engine.maid()->push(m_patch->process_order());
m_patch->process_order(m_process_order);
diff --git a/src/libs/engine/events/ClearPatchEvent.cpp b/src/libs/engine/events/ClearPatchEvent.cpp
index 52366139..db2ea54b 100644
--- a/src/libs/engine/events/ClearPatchEvent.cpp
+++ b/src/libs/engine/events/ClearPatchEvent.cpp
@@ -64,8 +64,9 @@ ClearPatchEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
if (m_patch != NULL) {
m_patch->disable();
- for (List<Node*>::const_iterator i = m_patch->nodes().begin(); i != m_patch->nodes().end(); ++i)
- (*i)->remove_from_patch();
+ cerr << "FIXME: CLEAR PATCH\n";
+ //for (List<Node*>::const_iterator i = m_patch->nodes().begin(); i != m_patch->nodes().end(); ++i)
+ // (*i)->remove_from_patch();
if (m_patch->process_order() != NULL) {
_engine.maid()->push(m_patch->process_order());
diff --git a/src/libs/engine/events/CreatePatchEvent.cpp b/src/libs/engine/events/CreatePatchEvent.cpp
index f5baf53e..9124f280 100644
--- a/src/libs/engine/events/CreatePatchEvent.cpp
+++ b/src/libs/engine/events/CreatePatchEvent.cpp
@@ -102,8 +102,6 @@ CreatePatchEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
assert(m_parent != NULL);
assert(m_path != "/");
- m_patch->add_to_patch();
-
if (m_parent->process_order() != NULL)
_engine.maid()->push(m_parent->process_order());
m_parent->process_order(m_process_order);
diff --git a/src/libs/engine/events/DestroyEvent.cpp b/src/libs/engine/events/DestroyEvent.cpp
index 10b870a2..9801f0fe 100644
--- a/src/libs/engine/events/DestroyEvent.cpp
+++ b/src/libs/engine/events/DestroyEvent.cpp
@@ -36,12 +36,16 @@ namespace Ingen {
DestroyEvent::DestroyEvent(Engine& engine, SharedPtr<Responder> responder, FrameTime time, QueuedEventSource* source, const string& path, bool block)
: QueuedEvent(engine, responder, time, source, source),
- m_path(path),
- m_node(NULL),
- m_patch_listnode(NULL),
- m_store_treenode(NULL),
- m_process_order(NULL),
- m_disconnect_event(NULL)
+ _path(path),
+ _object(NULL),
+ _node(NULL),
+ _port(NULL),
+ _patch_node_listnode(NULL),
+ _patch_port_listnode(NULL),
+ _store_treenode(NULL),
+ _process_order(NULL),
+ _disconnect_node_event(NULL),
+ _disconnect_port_event(NULL)
{
assert(_source);
}
@@ -49,56 +53,92 @@ DestroyEvent::DestroyEvent(Engine& engine, SharedPtr<Responder> responder, Frame
DestroyEvent::DestroyEvent(Engine& engine, SharedPtr<Responder> responder, FrameTime time, QueuedEventSource* source, Node* node, bool block)
: QueuedEvent(engine, responder, block, source),
- m_path(node->path()),
- m_node(node),
- m_patch_listnode(NULL),
- m_store_treenode(NULL),
- m_process_order(NULL),
- m_disconnect_event(NULL)
+ _path(node->path()),
+ _object(node),
+ _node(node),
+ _port(NULL),
+ _patch_node_listnode(NULL),
+ _patch_port_listnode(NULL),
+ _store_treenode(NULL),
+ _process_order(NULL),
+ _disconnect_node_event(NULL),
+ _disconnect_port_event(NULL)
{
}
DestroyEvent::~DestroyEvent()
{
- delete m_disconnect_event;
+ delete _disconnect_node_event;
+ delete _disconnect_port_event;
}
void
DestroyEvent::pre_process()
{
- if (m_node == NULL)
- m_node = _engine.object_store()->find_node(m_path);
-
- if (m_node != NULL && m_path != "/") {
- assert(m_node->parent_patch() != NULL);
- m_patch_listnode = m_node->parent_patch()->remove_node(m_path.name());
- if (m_patch_listnode != NULL) {
- assert(m_patch_listnode->elem() == m_node);
+ if (_object == NULL) {
+ _object = _engine.object_store()->find(_path);
+
+ if (_object) {
+ _node = dynamic_cast<Node*>(_object);
+
+ if (!_node)
+ _port = dynamic_cast<Port*>(_object);
+ }
+ }
+
+ if (_node != NULL && _path != "/") {
+ assert(_node->parent_patch() != NULL);
+ _patch_node_listnode = _node->parent_patch()->remove_node(_path.name());
+ if (_patch_node_listnode != NULL) {
+ assert(_patch_node_listnode->elem() == _node);
- m_node->remove_from_store();
+ _node->remove_from_store();
- if (m_node->providers()->size() != 0 || m_node->dependants()->size() != 0) {
- m_disconnect_event = new DisconnectNodeEvent(_engine, m_node);
- m_disconnect_event->pre_process();
+ if (_node->providers()->size() != 0 || _node->dependants()->size() != 0) {
+ _disconnect_node_event = new DisconnectNodeEvent(_engine, _node);
+ _disconnect_node_event->pre_process();
}
- if (m_node->parent_patch()->enabled()) {
- m_process_order = m_node->parent_patch()->build_process_order();
+ if (_node->parent_patch()->enabled()) {
+ // FIXME: is this called multiple times?
+ _process_order = _node->parent_patch()->build_process_order();
// Remove node to be removed from the process order so it isn't executed by
// Patch::run and can safely be destroyed
- //for (size_t i=0; i < m_process_order->size(); ++i)
- // if (m_process_order->at(i) == m_node)
- // m_process_order->at(i) = NULL; // ew, gap
+ //for (size_t i=0; i < _process_order->size(); ++i)
+ // if (_process_order->at(i) == _node)
+ // _process_order->at(i) = NULL; // ew, gap
#ifdef DEBUG
// Be sure node is removed from process order, so it can be destroyed
- for (size_t i=0; i < m_process_order->size(); ++i)
- assert(m_process_order->at(i) != m_node);
+ for (size_t i=0; i < _process_order->size(); ++i)
+ assert(_process_order->at(i) != _node);
#endif
}
}
+ } else if (_port) {
+ assert(_port->parent_patch() != NULL);
+ _patch_port_listnode = _port->parent_patch()->remove_port(_path.name());
+ if (_patch_port_listnode != NULL) {
+ assert(_patch_port_listnode->elem() == _port);
+
+ _port->remove_from_store();
+
+ _disconnect_port_event = new DisconnectPortEvent(_engine, _port);
+ _disconnect_port_event->pre_process();
+
+ if (_port->parent_patch()->enabled()) {
+ // FIXME: is this called multiple times?
+ _process_order = _port->parent_patch()->build_process_order();
+ // Remove port to be removed from the process order so it isn't executed by
+ // Patch::run and can safely be destroyed
+ //for (size_t i=0; i < _process_order->size(); ++i)
+ // if (_process_order->at(i) == _port)
+ // _process_order->at(i) = NULL; // ew, gap
+ }
+ }
+
}
QueuedEvent::pre_process();
@@ -110,15 +150,25 @@ DestroyEvent::execute(SampleCount nframes, FrameTime start, FrameTime end)
{
QueuedEvent::execute(nframes, start, end);
- if (m_patch_listnode != NULL) {
- m_node->remove_from_patch();
+ if (_patch_node_listnode != NULL) {
+ assert(_node);
+
+ if (_disconnect_node_event != NULL)
+ _disconnect_node_event->execute(nframes, start, end);
- if (m_disconnect_event != NULL)
- m_disconnect_event->execute(nframes, start, end);
+ if (_node->parent_patch()->process_order() != NULL)
+ _engine.maid()->push(_node->parent_patch()->process_order());
+ _node->parent_patch()->process_order(_process_order);
+
+ } else if (_patch_port_listnode != NULL) {
+ assert(_port);
+
+ if (_disconnect_port_event != NULL)
+ _disconnect_port_event->execute(nframes, start, end);
- if (m_node->parent_patch()->process_order() != NULL)
- _engine.maid()->push(m_node->parent_patch()->process_order());
- m_node->parent_patch()->process_order(m_process_order);
+ if (_port->parent_patch()->process_order() != NULL)
+ _engine.maid()->push(_port->parent_patch()->process_order());
+ _port->parent_patch()->process_order(_process_order);
}
}
@@ -129,19 +179,28 @@ DestroyEvent::post_process()
if (_source)
_source->unblock();
- if (m_node == NULL) {
- if (m_path == "/")
+ if (_object == NULL) {
+ if (_path == "/")
_responder->respond_error("You can not destroy the root patch (/)");
else
- _responder->respond_error("Could not find node to destroy");
- } else if (m_patch_listnode != NULL) {
- m_node->deactivate();
+ _responder->respond_error("Could not find object to destroy");
+ } else if (_patch_node_listnode != NULL) {
+ assert(_node);
+ _node->deactivate();
+ _responder->respond_ok();
+ if (_disconnect_node_event != NULL)
+ _disconnect_node_event->post_process();
+ _engine.broadcaster()->send_destroyed(_path);
+ _engine.maid()->push(_patch_node_listnode);
+ _engine.maid()->push(_node);
+ } else if (_patch_port_listnode != NULL) {
+ assert(_port);
_responder->respond_ok();
- if (m_disconnect_event != NULL)
- m_disconnect_event->post_process();
- _engine.broadcaster()->send_destroyed(m_path);
- _engine.maid()->push(m_patch_listnode);
- _engine.maid()->push(m_node);
+ if (_disconnect_port_event != NULL)
+ _disconnect_port_event->post_process();
+ _engine.broadcaster()->send_destroyed(_path);
+ _engine.maid()->push(_patch_port_listnode);
+ _engine.maid()->push(_port);
} else {
_responder->respond_error("Unable to destroy object");
}
diff --git a/src/libs/engine/events/DestroyEvent.h b/src/libs/engine/events/DestroyEvent.h
index 23d0ba90..ad67bbca 100644
--- a/src/libs/engine/events/DestroyEvent.h
+++ b/src/libs/engine/events/DestroyEvent.h
@@ -32,6 +32,7 @@ namespace Ingen {
class GraphObject;
class Patch;
class Node;
+class Port;
class Plugin;
class DisconnectNodeEvent;
class DisconnectPortEvent;
@@ -53,12 +54,16 @@ public:
void post_process();
private:
- Path m_path;
- Node* m_node;
- ListNode<Node*>* m_patch_listnode;
- TreeNode<GraphObject*>* m_store_treenode;
- Array<Node*>* m_process_order; // Patch's new process order
- DisconnectNodeEvent* m_disconnect_event;
+ Path _path;
+ GraphObject* _object;
+ Node* _node; ///< Same as _object if it is a Node, otherwise NULL
+ Port* _port; ///< Same as _object if it is a Port, otherwise NULL
+ ListNode<Node*>* _patch_node_listnode;
+ ListNode<Port*>* _patch_port_listnode;
+ TreeNode<GraphObject*>* _store_treenode;
+ Array<Node*>* _process_order; ///< Patch's new process order
+ DisconnectNodeEvent* _disconnect_node_event;
+ DisconnectPortEvent* _disconnect_port_event;
};
diff --git a/src/libs/engine/events/DisconnectPortEvent.cpp b/src/libs/engine/events/DisconnectPortEvent.cpp
index 782b4cf4..cfd523e0 100644
--- a/src/libs/engine/events/DisconnectPortEvent.cpp
+++ b/src/libs/engine/events/DisconnectPortEvent.cpp
@@ -52,7 +52,7 @@ DisconnectPortEvent::DisconnectPortEvent(Engine& engine, SharedPtr<Responder> re
DisconnectPortEvent::DisconnectPortEvent(Engine& engine, Port* port)
: QueuedEvent(engine),
- m_port_path(""),
+ m_port_path(port->path()),
m_patch((port->parent_node() == NULL) ? NULL : port->parent_node()->parent_patch()),
m_port(port),
m_process_order(NULL),
@@ -132,11 +132,13 @@ void
DisconnectPortEvent::post_process()
{
if (m_succeeded) {
- _responder->respond_ok();
+ if (_responder)
+ _responder->respond_ok();
for (List<DisconnectionEvent*>::iterator i = m_disconnection_events.begin(); i != m_disconnection_events.end(); ++i)
(*i)->post_process();
} else {
- _responder->respond_error("Unable to disconnect port.");
+ if (_responder)
+ _responder->respond_error("Unable to disconnect port.");
}
}