summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-04-06 02:00:17 +0200
committerRobin Gareus <robin@gareus.org>2016-04-06 02:00:17 +0200
commit45019517d7d01d4af974bf0c9ab0a11dec233abb (patch)
tree10b9093bbadf8e848f13161aa100486aba96d7be /libs/ardour
parentaa2f94647633004dbcf5d7edc41397289a4ee5ff (diff)
Add an API to traverse the process graph downstream
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/route_graph.h2
-rw-r--r--libs/ardour/route_graph.cc28
2 files changed, 30 insertions, 0 deletions
diff --git a/libs/ardour/ardour/route_graph.h b/libs/ardour/ardour/route_graph.h
index e1e1049cd6..aae2ba019d 100644
--- a/libs/ardour/ardour/route_graph.h
+++ b/libs/ardour/ardour/route_graph.h
@@ -44,6 +44,7 @@ public:
void add (GraphVertex from, GraphVertex to, bool via_sends_only);
bool has (GraphVertex from, GraphVertex to, bool* via_sends_only);
+ bool feeds (GraphVertex from, GraphVertex to);
std::set<GraphVertex> from (GraphVertex r) const;
void remove (GraphVertex from, GraphVertex to);
bool has_none_to (GraphVertex to) const;
@@ -56,6 +57,7 @@ private:
typedef std::multimap<GraphVertex, std::pair<GraphVertex, bool> > EdgeMapWithSends;
EdgeMapWithSends::iterator find_in_from_to_with_sends (GraphVertex, GraphVertex);
+ EdgeMapWithSends::iterator find_recursively_in_from_to_with_sends (GraphVertex, GraphVertex);
/** map of edges with from as `first' and to as `second' */
EdgeMap _from_to;
diff --git a/libs/ardour/route_graph.cc b/libs/ardour/route_graph.cc
index ab88a0d839..910141a440 100644
--- a/libs/ardour/route_graph.cc
+++ b/libs/ardour/route_graph.cc
@@ -59,6 +59,24 @@ GraphEdges::find_in_from_to_with_sends (GraphVertex from, GraphVertex to)
return _from_to_with_sends.end ();
}
+GraphEdges::EdgeMapWithSends::iterator
+GraphEdges::find_recursively_in_from_to_with_sends (GraphVertex from, GraphVertex to)
+{
+ typedef EdgeMapWithSends::iterator Iter;
+ pair<Iter, Iter> r = _from_to_with_sends.equal_range (from);
+ for (Iter i = r.first; i != r.second; ++i) {
+ if (i->second.first == to) {
+ return i;
+ }
+ GraphEdges::EdgeMapWithSends::iterator t = find_recursively_in_from_to_with_sends (i->second.first, to);
+ if (t != _from_to_with_sends.end ()) {
+ return t;
+ }
+ }
+
+ return _from_to_with_sends.end ();
+}
+
/** @param via_sends_only if non-0, filled in with true if the edge is a
* path via a send only.
* @return true if the given edge is present.
@@ -78,6 +96,16 @@ GraphEdges::has (GraphVertex from, GraphVertex to, bool* via_sends_only)
return true;
}
+bool
+GraphEdges::feeds (GraphVertex from, GraphVertex to)
+{
+ EdgeMapWithSends::iterator i = find_recursively_in_from_to_with_sends (from, to);
+ if (i == _from_to_with_sends.end ()) {
+ return false;
+ }
+ return true;
+}
+
/** @return the vertices that are fed from `r' */
set<GraphVertex>
GraphEdges::from (GraphVertex r) const