mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-05 21:25:46 +01:00
add alt-i as a binding in both the editor and mixer windows to toggle the state of MIDI input on the selected track(s); in the mixer this will also operate on the strip under the mouse. fixes #4838
git-svn-id: svn://localhost/ardour2/branches/3.0@13475 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
cf55921aea
commit
3fa84d0caa
14 changed files with 125 additions and 50 deletions
|
|
@ -251,7 +251,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
|
|||
boost::shared_ptr<Route> route_by_id (PBD::ID);
|
||||
boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
|
||||
boost::shared_ptr<Track> track_by_diskstream_id (PBD::ID);
|
||||
void routes_using_input_from (const std::string& str, RouteList& rl);
|
||||
void routes_using_input_from (const std::string& str, RouteList& rl);
|
||||
|
||||
bool route_name_unique (std::string) const;
|
||||
bool route_name_internal (std::string) const;
|
||||
|
|
@ -616,8 +616,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
|
|||
void set_listen (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
|
||||
void set_record_enabled (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
|
||||
void set_solo_isolated (boost::shared_ptr<RouteList>, bool, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
|
||||
void set_exclusive_input_active (boost::shared_ptr<Route> rt, bool others_on);
|
||||
void set_monitoring (boost::shared_ptr<RouteList>, MonitorChoice, SessionEvent::RTeventCallback after = rt_cleanup, bool group_override = false);
|
||||
void set_exclusive_input_active (boost::shared_ptr<RouteList> rt, bool onoff, bool flip_others=false);
|
||||
|
||||
PBD::Signal1<void,bool> SoloActive;
|
||||
PBD::Signal0<void> SoloChanged;
|
||||
|
|
|
|||
|
|
@ -2686,44 +2686,68 @@ Session::io_name_is_legal (const std::string& name)
|
|||
}
|
||||
|
||||
void
|
||||
Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_on*/)
|
||||
Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
|
||||
{
|
||||
RouteList rl;
|
||||
RouteList rl2;
|
||||
vector<string> connections;
|
||||
|
||||
PortSet& ps (rt->input()->ports());
|
||||
/* if we are passed only a single route and we're not told to turn
|
||||
* others off, then just do the simple thing.
|
||||
*/
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (flip_others == false && rl->size() == 1) {
|
||||
boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
|
||||
if (mt) {
|
||||
mt->set_input_active (onoff);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* globally reverse other routes */
|
||||
for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
|
||||
|
||||
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, rl2);
|
||||
}
|
||||
|
||||
/* scan all relevant routes to see if others are on or off */
|
||||
|
||||
bool others_are_already_on = false;
|
||||
|
||||
for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
|
||||
|
||||
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);
|
||||
|
||||
if (!mt) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((*r) != (*rt)) {
|
||||
if (mt->input_active()) {
|
||||
others_are_already_on = true;
|
||||
}
|
||||
} else {
|
||||
/* this one needs changing */
|
||||
mt->set_input_active (onoff);
|
||||
}
|
||||
}
|
||||
|
||||
if (flip_others) {
|
||||
|
||||
/* globally reverse other routes */
|
||||
|
||||
for (RouteList::iterator r = rl2.begin(); r != rl2.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2732,7 +2756,7 @@ Session::set_exclusive_input_active (boost::shared_ptr<Route> rt, bool /*others_
|
|||
void
|
||||
Session::routes_using_input_from (const string& str, RouteList& rl)
|
||||
{
|
||||
boost::shared_ptr<RouteList> r = routes.reader ();
|
||||
boost::shared_ptr<RouteList> r = routes.reader();
|
||||
|
||||
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
|
||||
if ((*i)->input()->connected_to (str)) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue