summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/delivery.h4
-rw-r--r--libs/ardour/delivery.cc80
-rw-r--r--libs/ardour/enums.cc1
-rw-r--r--libs/ardour/route.cc18
-rw-r--r--libs/ardour/send.cc6
-rw-r--r--libs/ardour/session.cc36
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 */