summaryrefslogtreecommitdiffstats
path: root/src/engine/PatchImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/PatchImpl.cpp')
-rw-r--r--src/engine/PatchImpl.cpp51
1 files changed, 24 insertions, 27 deletions
diff --git a/src/engine/PatchImpl.cpp b/src/engine/PatchImpl.cpp
index 7ee82803..309ac3f8 100644
--- a/src/engine/PatchImpl.cpp
+++ b/src/engine/PatchImpl.cpp
@@ -112,7 +112,7 @@ PatchImpl::prepare_internal_poly(BufferFactory& bufs, uint32_t poly)
(*i)->prepare_poly(bufs, poly);
for (Connections::iterator i = _connections.begin(); i != _connections.end(); ++i)
- ((ConnectionImpl*)i->get())->prepare_poly(bufs, poly);
+ ((ConnectionImpl*)i->second.get())->prepare_poly(bufs, poly);
return true;
}
@@ -129,7 +129,7 @@ PatchImpl::apply_internal_poly(ProcessContext& context, BufferFactory& bufs, Rau
(*i)->apply_poly(maid, poly);
for (Connections::iterator i = _connections.begin(); i != _connections.end(); ++i)
- ((ConnectionImpl*)i->get())->apply_poly(maid, poly);
+ ((ConnectionImpl*)i->second.get())->apply_poly(maid, poly);
for (List<NodeImpl*>::iterator i = _nodes.begin(); i != _nodes.end(); ++i) {
for (uint32_t j = 0; j < (*i)->num_ports(); ++j) {
@@ -301,42 +301,39 @@ PatchImpl::remove_node(const Raul::Symbol& symbol)
}
+void
+PatchImpl::add_connection(SharedPtr<ConnectionImpl> c)
+{
+ ThreadManager::assert_thread(THREAD_PRE_PROCESS);
+ _connections.insert(make_pair(make_pair(c->src_port(), c->dst_port()), c));
+}
+
+
/** Remove a connection.
* Preprocessing thread only.
*/
-PatchImpl::Connections::Node*
+SharedPtr<ConnectionImpl>
PatchImpl::remove_connection(const PortImpl* src_port, const PortImpl* dst_port)
{
ThreadManager::assert_thread(THREAD_PRE_PROCESS);
- bool found = false;
- Connections::Node* connection = NULL;
- for (Connections::iterator i = _connections.begin(); i != _connections.end(); ++i) {
- ConnectionImpl* const c = (ConnectionImpl*)i->get();
- if (c->src_port() == src_port && c->dst_port() == dst_port) {
- connection = _connections.erase(i);
- found = true;
- break;
- }
- }
-
- if ( ! found)
+ Connections::iterator i = _connections.find(make_pair(src_port, dst_port));
+ if (i != _connections.end()) {
+ SharedPtr<ConnectionImpl> c = PtrCast<ConnectionImpl>(i->second);
+ _connections.erase(i);
+ return c;
+ } else {
error << "[PatchImpl::remove_connection] Connection not found" << endl;
-
- return connection;
+ return SharedPtr<ConnectionImpl>();
+ }
}
bool
PatchImpl::has_connection(const PortImpl* src_port, const PortImpl* dst_port) const
{
- // FIXME: Doesn't scale
- for (Connections::const_iterator i = _connections.begin(); i != _connections.end(); ++i) {
- ConnectionImpl* const c = (ConnectionImpl*)i->get();
- if (c->src_port() == src_port && c->dst_port() == dst_port)
- return true;
- }
-
- return false;
+ ThreadManager::assert_thread(THREAD_PRE_PROCESS);
+ Connections::const_iterator i = _connections.find(make_pair(src_port, dst_port));
+ return (i != _connections.end());
}
@@ -479,10 +476,10 @@ PatchImpl::compile() const
// Add any queued connections that must be run after a cycle
for (Connections::const_iterator i = _connections.begin(); i != _connections.end(); ++i) {
- ConnectionImpl* const c = (ConnectionImpl*)i->get();
+ SharedPtr<ConnectionImpl> c = PtrCast<ConnectionImpl>(i->second);
if (c->src_port()->context() == Context::AUDIO &&
c->dst_port()->context() == Context::MESSAGE) {
- compiled_patch->queued_connections.push_back(c);
+ compiled_patch->queued_connections.push_back(c.get());
}
}