From c5218b13bac00fbd8c3ceb99b46063b98bc1fdd3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 8 Jan 2007 02:41:36 +0000 Subject: Fix destruction of nodes with connections to parent patch ports. git-svn-id: http://svn.drobilla.net/lad/ingen@241 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/ConnectionModel.h | 4 +-- src/libs/client/ObjectModel.h | 4 +-- src/libs/client/PatchModel.cpp | 28 ++++++++++++++++----- src/libs/engine/JackAudioDriver.cpp | 2 +- src/libs/engine/events/DestroyEvent.cpp | 36 +++++++++++++-------------- src/libs/engine/events/DisconnectionEvent.cpp | 5 ++-- 6 files changed, 47 insertions(+), 32 deletions(-) (limited to 'src/libs') diff --git a/src/libs/client/ConnectionModel.h b/src/libs/client/ConnectionModel.h index 6dc85405..f1112e33 100644 --- a/src/libs/client/ConnectionModel.h +++ b/src/libs/client/ConnectionModel.h @@ -62,8 +62,8 @@ private: void src_port_path(const string& s) { _src_port_path = s; } void dst_port_path(const string& s) { _dst_port_path = s; } - Path _src_port_path; ///< Only used if _src_port == NULL - Path _dst_port_path; ///< Only used if _dst_port == NULL + Path _src_port_path; ///< Only used if _src_port == NULL + Path _dst_port_path; ///< Only used if _dst_port == NULL SharedPtr _src_port; SharedPtr _dst_port; }; diff --git a/src/libs/client/ObjectModel.h b/src/libs/client/ObjectModel.h index 799399e9..12db367b 100644 --- a/src/libs/client/ObjectModel.h +++ b/src/libs/client/ObjectModel.h @@ -55,8 +55,8 @@ public: const Atom& get_metadata(const string& key) const; - const MetadataMap& metadata() const { return _metadata; } - inline const Path& path() const { return _path; } + const MetadataMap& metadata() const { return _metadata; } + inline const Path& path() const { return _path; } SharedPtr parent() const { return _parent; } // Signals diff --git a/src/libs/client/PatchModel.cpp b/src/libs/client/PatchModel.cpp index 22d39d42..1148ff61 100644 --- a/src/libs/client/PatchModel.cpp +++ b/src/libs/client/PatchModel.cpp @@ -124,14 +124,31 @@ PatchModel::remove_node(SharedPtr nm) NodeModelMap::iterator i = m_nodes.find(nm->path().name()); if (i != m_nodes.end()) { assert(i->second == nm); + + // Remove any connections which referred to this node, + // since they can't possibly exist anymore + for (list >::iterator i = m_connections.begin(); + i != m_connections.end() ; ) { + list >::iterator next = i; + ++next; + SharedPtr cm = (*i); + if (cm->src_port_path().parent() == nm->path() + || cm->dst_port_path().parent() == nm->path()) { + m_connections.erase(i); // cuts our reference + assert(!get_connection(cm->src_port_path(), cm->dst_port_path())); // no duplicates + removed_connection_sig.emit(cm->src_port_path(), cm->dst_port_path()); + } + i = next; + } + + // Remove the Node itself m_nodes.erase(i); removed_node_sig.emit(nm); - //i->second->parent().reset(); - return; + + } else { + cerr << "[PatchModel::remove_node] " << _path + << ": failed to find node " << nm->path().name() << endl; } - - cerr << "[PatchModel::remove_node] " << _path - << ": failed to find node " << nm->path().name() << endl; } #if 0 @@ -255,7 +272,6 @@ PatchModel::add_connection(SharedPtr cm) void PatchModel::remove_connection(const string& src_port_path, const string& dst_port_path) { - cerr << path() << " PatchModel::remove_connection: " << src_port_path << " -> " << dst_port_path << endl; for (list >::iterator i = m_connections.begin(); i != m_connections.end(); ++i) { SharedPtr cm = (*i); if (cm->src_port_path() == src_port_path && cm->dst_port_path() == dst_port_path) { diff --git a/src/libs/engine/JackAudioDriver.cpp b/src/libs/engine/JackAudioDriver.cpp index 00c7afe6..f4f0ed23 100644 --- a/src/libs/engine/JackAudioDriver.cpp +++ b/src/libs/engine/JackAudioDriver.cpp @@ -54,7 +54,6 @@ JackAudioPort::JackAudioPort(JackAudioDriver* driver, DuplexPort* patch_ _jack_buffer(NULL), _patch_port(patch_port) { - //assert(patch_port->tied_port() != NULL); assert(patch_port->poly() == 1); _jack_port = jack_port_register(_driver->jack_client(), @@ -62,6 +61,7 @@ JackAudioPort::JackAudioPort(JackAudioDriver* driver, DuplexPort* patch_ (patch_port->is_input()) ? JackPortIsInput : JackPortIsOutput, 0); + patch_port->buffer(0)->clear(); patch_port->fixed_buffers(true); } diff --git a/src/libs/engine/events/DestroyEvent.cpp b/src/libs/engine/events/DestroyEvent.cpp index 97a4f215..7928939e 100644 --- a/src/libs/engine/events/DestroyEvent.cpp +++ b/src/libs/engine/events/DestroyEvent.cpp @@ -95,17 +95,15 @@ DestroyEvent::pre_process() } if (_node != NULL && _path != "/") { - assert(_node->parent_patch() != NULL); + assert(_node->parent_patch()); _patch_node_listnode = _node->parent_patch()->remove_node(_path.name()); - if (_patch_node_listnode != NULL) { + if (_patch_node_listnode) { assert(_patch_node_listnode->elem() == _node); _node->remove_from_store(); - if (_node->providers()->size() != 0 || _node->dependants()->size() != 0) { - _disconnect_node_event = new DisconnectNodeEvent(_engine, _node); - _disconnect_node_event->pre_process(); - } + _disconnect_node_event = new DisconnectNodeEvent(_engine, _node); + _disconnect_node_event->pre_process(); if (_node->parent_patch()->enabled()) { // FIXME: is this called multiple times? @@ -124,9 +122,9 @@ DestroyEvent::pre_process() } } } else if (_port) { - assert(_port->parent_patch() != NULL); + assert(_port->parent_patch()); _patch_port_listnode = _port->parent_patch()->remove_port(_path.name()); - if (_patch_port_listnode != NULL) { + if (_patch_port_listnode) { assert(_patch_port_listnode->elem() == _port); _port->remove_from_store(); @@ -153,28 +151,28 @@ DestroyEvent::execute(SampleCount nframes, FrameTime start, FrameTime end) { QueuedEvent::execute(nframes, start, end); - if (_patch_node_listnode != NULL) { + if (_patch_node_listnode) { assert(_node); - if (_disconnect_node_event != NULL) + if (_disconnect_node_event) _disconnect_node_event->execute(nframes, start, end); - if (_node->parent_patch()->process_order() != NULL) + if (_node->parent_patch()->process_order()) _engine.maid()->push(_node->parent_patch()->process_order()); _node->parent_patch()->process_order(_process_order); - } else if (_patch_port_listnode != NULL) { + } else if (_patch_port_listnode) { assert(_port); - if (_disconnect_port_event != NULL) + if (_disconnect_port_event) _disconnect_port_event->execute(nframes, start, end); - if (_port->parent_patch()->process_order() != NULL) + if (_port->parent_patch()->process_order()) _engine.maid()->push(_port->parent_patch()->process_order()); _port->parent_patch()->process_order(_process_order); - if (_port->parent_patch()->external_ports() != NULL) + if (_port->parent_patch()->external_ports()) _engine.maid()->push(_port->parent_patch()->external_ports()); _port->parent_patch()->external_ports(_ports_array); @@ -199,19 +197,19 @@ DestroyEvent::post_process() _responder->respond_error("You can not destroy the root patch (/)"); else _responder->respond_error("Could not find object to destroy"); - } else if (_patch_node_listnode != NULL) { + } else if (_patch_node_listnode) { assert(_node); _node->deactivate(); _responder->respond_ok(); - if (_disconnect_node_event != NULL) + if (_disconnect_node_event) _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) { + } else if (_patch_port_listnode) { assert(_port); _responder->respond_ok(); - if (_disconnect_port_event != NULL) + if (_disconnect_port_event) _disconnect_port_event->post_process(); _engine.broadcaster()->send_destroyed(_path); _engine.maid()->push(_patch_port_listnode); diff --git a/src/libs/engine/events/DisconnectionEvent.cpp b/src/libs/engine/events/DisconnectionEvent.cpp index ef7046b8..8dc9e617 100644 --- a/src/libs/engine/events/DisconnectionEvent.cpp +++ b/src/libs/engine/events/DisconnectionEvent.cpp @@ -60,11 +60,12 @@ DisconnectionEvent::DisconnectionEvent(Engine& engine, SharedPtr resp m_typed_event(NULL), m_error(NO_ERROR) { - assert(src_port->is_output()); + // FIXME: These break for patch ports.. is that ok? + /*assert(src_port->is_output()); assert(dst_port->is_input()); assert(src_port->type() == dst_port->type()); assert(src_port->parent_node()->parent_patch() - == dst_port->parent_node()->parent_patch()); + == dst_port->parent_node()->parent_patch()); */ } DisconnectionEvent::~DisconnectionEvent() -- cgit v1.2.1