X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fgraphnode.cc;h=c8923a043df84f441d2d0f1e316bebb36d84665d;hb=39becbeb70aa4ab82b963669d87995a32141981c;hp=c8f3e630d1282538b50e9f5176f9f879b3af857c;hpb=357cf39470e485415aeee8270fe3a786cb0b6ec6;p=ardour.git diff --git a/libs/ardour/graphnode.cc b/libs/ardour/graphnode.cc index c8f3e630d1..c8923a043d 100644 --- a/libs/ardour/graphnode.cc +++ b/libs/ardour/graphnode.cc @@ -1,3 +1,22 @@ +/* + Copyright (C) 2010 Paul Davis + Author: Torben Hohn + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ #include "ardour/graph.h" #include "ardour/graphnode.h" @@ -5,44 +24,57 @@ using namespace ARDOUR; -// ========================================== GraphNode +GraphNode::GraphNode (boost::shared_ptr graph) + : _graph(graph) +{ +} -GraphNode::GraphNode( graph_ptr_t graph ) - : _graph(graph) -{ } +GraphNode::~GraphNode() +{ +} void -GraphNode::prep( int chain ) +GraphNode::prep (int chain) { - _refcount = _init_refcount[chain]; + /* This is the number of nodes that directly feed us */ + _refcount = _init_refcount[chain]; } +/** Called by another node to tell us that one of the nodes that feed us + * has been processed. + */ void GraphNode::dec_ref() { - if (g_atomic_int_dec_and_test( &_refcount )) - _graph->trigger( this ); + if (g_atomic_int_dec_and_test (&_refcount)) { + /* All the nodes that feed us are done, so we can queue this node + for processing. + */ + _graph->trigger (this); + } } void -GraphNode::finish( int chain ) +GraphNode::finish (int chain) { - node_set_t::iterator i; - bool feeds_somebody = false; - for (i=_activation_set[chain].begin(); i!=_activation_set[chain].end(); i++) - { - (*i)->dec_ref(); - feeds_somebody = true; - } - if (!feeds_somebody) - { - _graph->dec_ref(); - } + node_set_t::iterator i; + bool feeds_somebody = false; + + /* Tell the nodes that we feed that we've finished */ + for (i=_activation_set[chain].begin(); i!=_activation_set[chain].end(); i++) { + (*i)->dec_ref(); + feeds_somebody = true; + } + + if (!feeds_somebody) { + /* This node does not feed anybody, so decrement the graph's finished count */ + _graph->dec_ref(); + } } void GraphNode::process() { - _graph->process_one_route( dynamic_cast(this) ); + _graph->process_one_route (dynamic_cast(this)); }