diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-07-03 15:01:21 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-07-03 15:01:21 +0000 |
commit | a3583c89b20160de154d05ff4c3e2f2bd0ff44df (patch) | |
tree | 7e0e4661f3a6cbd17292687f1bee3d9c5317f7e1 /libs/ardour/session.cc | |
parent | 8f3f86b8a815da24179b893cfc6825e034c1b81b (diff) |
ctrl-alt-click now toggles input active status of other MIDI tracks using (any of) the same input(s) as the clicked track
git-svn-id: svn://localhost/ardour2/branches/3.0@9789 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/session.cc')
-rw-r--r-- | libs/ardour/session.cc | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index ecdd9bca8d..d4af9b6766 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -2466,6 +2466,62 @@ Session::io_name_is_legal (const std::string& name) return true; } +void +Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool others_on) +{ + RouteList rl; + vector<string> connections; + + PortSet& ps (rt->input()->ports()); + + for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) { + p->get_connections (connections); + } + + for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) { + routes_using_input_from (*s, rl); + } + + /* scan all relevant routes to see if others are on or off */ + + bool others_are_already_on = false; + + for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) { + if ((*r) != rt) { + boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r); + if (mt) { + if (mt->input_active()) { + others_are_already_on = true; + break; + } + } + } + } + + /* globally reverse other routes */ + + for (RouteList::iterator r = rl.begin(); r != rl.end(); ++r) { + if ((*r) != rt) { + boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r); + if (mt) { + mt->set_input_active (!others_are_already_on); + } + } + } +} + +void +Session::routes_using_input_from (const string& str, RouteList& rl) +{ + boost::shared_ptr<RouteList> r = routes.reader (); + + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { + if ((*i)->input()->connected_to (str)) { + rl.push_back (*i); + } + } +} + boost::shared_ptr<Route> Session::route_by_name (string name) { |