summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/route_graph.h
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-11-09 17:44:39 +0000
committerCarl Hetherington <carl@carlh.net>2011-11-09 17:44:39 +0000
commit69c88d165dfd3bf373a708d19bfedaa7672acec5 (patch)
tree4920d214837cc388d34b53e3b2ae2ca78905ca7d /libs/ardour/ardour/route_graph.h
parent0ed06420c2364a038f9909255bda93d2d134d5cc (diff)
Alert the user if a connection is made which causes
feedback, and preserve the route graph in the state that it was in before the feedback was introduced. The intent being to simplify the code, reduce the number of areas of code which must consider feedback, and fix a few bugs. git-svn-id: svn://localhost/ardour2/branches/3.0@10510 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/ardour/route_graph.h')
-rw-r--r--libs/ardour/ardour/route_graph.h78
1 files changed, 78 insertions, 0 deletions
diff --git a/libs/ardour/ardour/route_graph.h b/libs/ardour/ardour/route_graph.h
new file mode 100644
index 0000000000..0b0af6c7dd
--- /dev/null
+++ b/libs/ardour/ardour/route_graph.h
@@ -0,0 +1,78 @@
+/*
+ Copyright (C) 2011 Paul Davis
+ Author: Carl Hetherington <cth@carlh.net>
+
+ 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.
+
+*/
+
+#ifndef __ardour_route_graph_h__
+#define __ardour_route_graph_h__
+
+#include <map>
+#include <set>
+
+namespace ARDOUR {
+
+typedef boost::shared_ptr<Route> GraphVertex;
+
+/** A list of edges for a directed graph for routes.
+ *
+ * It keeps the same data in a few different ways, with add() adding edges
+ * to all different representations, remove() removing similarly, and the
+ * lookup method using whichever representation is most efficient for
+ * that particular lookup.
+ *
+ * This may be a premature optimisation...
+ */
+class GraphEdges
+{
+public:
+ typedef std::map<GraphVertex, std::set<GraphVertex> > EdgeMap;
+
+ void add (GraphVertex from, GraphVertex to, bool via_sends_only);
+ bool has (GraphVertex from, GraphVertex to, bool* via_sends_only);
+ std::set<GraphVertex> from (GraphVertex r) const;
+ void remove (GraphVertex from, GraphVertex to);
+ bool has_none_to (GraphVertex to) const;
+ bool empty () const;
+ void dump () const;
+
+private:
+ void insert (EdgeMap& e, GraphVertex a, GraphVertex b);
+
+ typedef std::multimap<GraphVertex, std::pair<GraphVertex, bool> > EdgeMapWithSends;
+
+ EdgeMapWithSends::iterator find_in_from_to_with_sends (GraphVertex, GraphVertex);
+
+ /** map of edges with from as `first' and to as `second' */
+ EdgeMap _from_to;
+ /** map of the same edges with to as `first' and from as `second' */
+ EdgeMap _to_from;
+ /** map of edges with via-sends information; first part of the map is
+ the `from' vertex, second is the `to' vertex and a flag which is
+ true if the edge is via a send only.
+ */
+ EdgeMapWithSends _from_to_with_sends;
+};
+
+boost::shared_ptr<RouteList> topological_sort (
+ boost::shared_ptr<RouteList>,
+ GraphEdges
+ );
+
+}
+
+#endif