diff options
-rw-r--r-- | libs/ardour/ardour/delivery.h | 4 | ||||
-rw-r--r-- | libs/ardour/delivery.cc | 80 | ||||
-rw-r--r-- | libs/ardour/enums.cc | 1 | ||||
-rw-r--r-- | libs/ardour/route.cc | 18 | ||||
-rw-r--r-- | libs/ardour/send.cc | 6 | ||||
-rw-r--r-- | libs/ardour/session.cc | 36 |
6 files changed, 99 insertions, 46 deletions
diff --git a/libs/ardour/ardour/delivery.h b/libs/ardour/ardour/delivery.h index b2bd283ef8..9bcf050eb4 100644 --- a/libs/ardour/ardour/delivery.h +++ b/libs/ardour/ardour/delivery.h @@ -45,7 +45,9 @@ public: /* listen - internal send used only to deliver to control/monitor bus */ Listen = 0x8, /* aux - internal send used to deliver to any bus, by user request */ - Aux = 0x10 + Aux = 0x10, + /* main listen - internal send used only to deliver from master to control/monitor bus */ + MainListen = 0x20 }; static bool role_requires_output_ports (Role r) { return r == Main || r == Send || r == Insert; } diff --git a/libs/ardour/delivery.cc b/libs/ardour/delivery.cc index 5777269416..5d786597a9 100644 --- a/libs/ardour/delivery.cc +++ b/libs/ardour/delivery.cc @@ -163,6 +163,7 @@ Delivery::display_name () const return _("main outs"); break; case Listen: + case MainListen: return _("listen"); break; case Send: @@ -369,6 +370,8 @@ Delivery::state (bool full_state) node.add_property("type", "main-outs"); } else if (_role & Listen) { node.add_property("type", "listen"); + } else if (_role & MainListen) { + node.add_property("type", "main-listen"); } else { node.add_property("type", "delivery"); } @@ -538,39 +541,58 @@ Delivery::target_gain () return 0.0; } - gain_t desired_gain; + gain_t desired_gain = -1.0f; + if (_role == MainListen) { + + /* silent if anyone else soloing; unity gain otherwise */ + + desired_gain = (_session.soloing() ? 0.0 : 1.0); - if (_solo_level) { - desired_gain = 1.0; - } else { + } else if (_solo_level) { - MuteMaster::MutePoint mp; - - switch (_role) { - case Main: - mp = MuteMaster::Main; - break; - case Listen: - mp = MuteMaster::Listen; - break; - case Send: - case Insert: - case Aux: - /* XXX FIX ME this is wrong, we need per-delivery muting */ - mp = MuteMaster::PreFader; - break; - } - - if (!_solo_isolated && _session.soloing()) { - desired_gain = min (Config->get_solo_mute_gain(), _mute_master->mute_gain_at (mp)); - - } else { - - desired_gain = _mute_master->mute_gain_at (mp); - } + desired_gain = 1.0; - } + } else { + + if (_role == Listen && _session.control_out() && !_session.soloing()) { + + /* nobody is soloed, so control/monitor/listen bus gets its + signal from master out, we should be silent + */ + desired_gain = 0.0; + + } else { + + MuteMaster::MutePoint mp; + + switch (_role) { + case Main: + mp = MuteMaster::Main; + break; + case Listen: + mp = MuteMaster::Listen; + break; + case Send: + case Insert: + case Aux: + /* XXX FIX ME this is wrong, we need per-delivery muting */ + mp = MuteMaster::PreFader; + break; + case MainListen: + /* we can't get here, see if() above */ + break; + } + + if (!_solo_isolated && _session.soloing()) { + desired_gain = min (Config->get_solo_mute_gain(), _mute_master->mute_gain_at (mp)); + + } else { + + desired_gain = _mute_master->mute_gain_at (mp); + } + } + } return desired_gain; } diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index baf8f7326d..8a2ccfe79c 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -514,6 +514,7 @@ setup_enum_writer () REGISTER_CLASS_ENUM (Delivery, Listen); REGISTER_CLASS_ENUM (Delivery, Main); REGISTER_CLASS_ENUM (Delivery, Aux); + REGISTER_CLASS_ENUM (Delivery, MainListen); REGISTER_BITS (_Delivery_Role); REGISTER_CLASS_ENUM (MuteMaster, PreFader); diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index aef23d4894..4a80197dc6 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -2361,7 +2361,20 @@ Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*a boost::shared_ptr<InternalSend> listener; try { - listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen))); + + if (is_master()) { + + if (route == _session.control_out()) { + listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::MainListen))); + } else { + listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen))); + } + + } else { + listener.reset (new InternalSend (_session, _mute_master, route, (aux ? Delivery::Aux : Delivery::Listen))); + if (route == _session.control_out()) { + } + } } catch (failed_constructor& err) { return -1; @@ -2369,8 +2382,11 @@ Route::listen_via (boost::shared_ptr<Route> route, Placement placement, bool /*a if (route == _session.control_out()) { _control_outs = listener; + /* send to control/listen/monitor bus is active by default */ + listener->activate (); } + add_processor (listener, placement); return 0; diff --git a/libs/ardour/send.cc b/libs/ardour/send.cc index e4fbf3efba..89a66afa46 100644 --- a/libs/ardour/send.cc +++ b/libs/ardour/send.cc @@ -260,9 +260,9 @@ Send::display_to_user () const { /* we ignore Deliver::_display_to_user */ - if (_role == Listen) { - return false; - } +// if (_role == Listen || _role == MainListen) { +// return false; +// } return true; } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 31fd036890..9b65fcf208 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -806,13 +806,20 @@ Session::hookup_io () for (RouteList::iterator x = r->begin(); x != r->end(); ++x) { - if ((*x)->is_control() || (*x)->is_master()) { - continue; - } + if ((*x)->is_control()) { + + /* relax */ + + } else if ((*x)->is_master()) { + + (*x)->listen_via (_control_out, PostFader, false, false); - (*x)->listen_via (_control_out, - (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader), - false, false); + } else { + + (*x)->listen_via (_control_out, + (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader), + false, false); + } } } @@ -2068,12 +2075,15 @@ Session::add_routes (RouteList& new_routes, bool save) if (_control_out && IO::connecting_legal) { for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) { - if ((*x)->is_control() || (*x)->is_master()) { - continue; - } - (*x)->listen_via (_control_out, - (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader), - false, false); + if ((*x)->is_control()) { + /* relax */ + } else if ((*x)->is_master()) { + (*x)->listen_via (_control_out, PostFader, false, false); + } else { + (*x)->listen_via (_control_out, + (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader), + false, false); + } } resort_routes (); @@ -2399,6 +2409,8 @@ Session::update_route_solo_state (boost::shared_ptr<RouteList> r) } } + cerr << "something soloed ? " << something_soloed << endl; + if (something_soloed != _non_soloed_outs_muted) { _non_soloed_outs_muted = something_soloed; SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */ |