From 73ab706865d3b9ff5a720430429e32a3faa2cc22 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 20 Dec 2008 21:00:29 +0000 Subject: Fix clear patch when patch contains driver ports (fix ticket #288). git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1879 a436a847-0d15-0410-975c-d299462d15a1 --- src/engine/events/ClearPatchEvent.cpp | 47 ++++++++++++++++++++++++----------- src/engine/events/ClearPatchEvent.hpp | 3 +++ 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/engine/events/ClearPatchEvent.cpp b/src/engine/events/ClearPatchEvent.cpp index 51e83154..c37d1910 100644 --- a/src/engine/events/ClearPatchEvent.cpp +++ b/src/engine/events/ClearPatchEvent.cpp @@ -39,6 +39,7 @@ ClearPatchEvent::ClearPatchEvent(Engine& engine, SharedPtr responder, , _process(false) , _ports_array(NULL) , _compiled_patch(NULL) + , _driver_ports(NULL) { } @@ -59,6 +60,19 @@ ClearPatchEvent::pre_process() _ports_array = _patch->build_ports_array(); if (_patch->enabled()) _compiled_patch = _patch->compile(); + + // Remove driver ports + if (_patch->parent() == NULL) { + size_t port_count = 0; + for (EngineStore::Objects::iterator i = _removed_table->begin(); + i != _removed_table->end(); ++i) { + SharedPtr port = PtrCast(i->second); + if (port) + ++port_count; + } + + _driver_ports = new DriverPorts(port_count, NULL); + } } } @@ -84,26 +98,18 @@ ClearPatchEvent::execute(ProcessContext& context) Raul::Array* old_ports = _patch->external_ports(); _patch->external_ports(_ports_array); _ports_array = old_ports; - - // Remove driver ports, if necessary + + // Remove driver ports if (_patch->parent() == NULL) { for (EngineStore::Objects::iterator i = _removed_table->begin(); i != _removed_table->end(); ++i) { SharedPtr port = PtrCast(i->second); if (port && port->type() == DataType::AUDIO) { - List::Node* ln - = _engine.audio_driver()->remove_port(port->path()); - assert(ln); - ln->elem()->unregister(); - _engine.maid()->push(ln->elem()); - _engine.maid()->push(ln); + _driver_ports->push_back( + _engine.audio_driver()->remove_port(port->path())); } else if (port && port->type() == DataType::EVENT) { - List::Node* ln - = _engine.midi_driver()->remove_port(port->path()); - assert(ln); - ln->elem()->unregister(); - _engine.maid()->push(ln->elem()); - _engine.maid()->push(ln); + _driver_ports->push_back( + _engine.midi_driver()->remove_port(port->path())); } } } @@ -131,6 +137,19 @@ ClearPatchEvent::post_process() // Reply _responder->respond_ok(); _engine.broadcaster()->send_patch_cleared(_patch_path); + + // Unregister and destroy driver ports + if (_driver_ports) { + for (size_t i = 0; i < _driver_ports->size(); ++i) { + Raul::List::Node* ln = _driver_ports->at(i); + if (ln) { + ln->elem()->unregister(); + _engine.maid()->push(ln); + } + } + delete _driver_ports; + } + } else { _responder->respond_error(string("Patch ") + _patch_path + " not found"); } diff --git a/src/engine/events/ClearPatchEvent.hpp b/src/engine/events/ClearPatchEvent.hpp index ed91208f..75226dd9 100644 --- a/src/engine/events/ClearPatchEvent.hpp +++ b/src/engine/events/ClearPatchEvent.hpp @@ -54,6 +54,9 @@ private: Raul::Array* _ports_array; ///< New (external) ports for Patch CompiledPatch* _compiled_patch; ///< Patch's new process order + typedef Raul::Array::Node*> DriverPorts; + DriverPorts* _driver_ports; + SharedPtr< Table > > _removed_table; }; -- cgit v1.2.1