diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 390ebe92de..2f232d37c4 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1090,7 +1090,8 @@ RCOptionEditor::RCOptionEditor () ); sm->add (SoloInPlace, _("in place")); - sm->add (SoloBus, _("via bus")); + sm->add (SoloAFL, _("post-fader listen via monitor bus")); + sm->add (SoloPFL, _("pre-fader listen via monitor bus")); add_option (_("Audio"), sm); diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index 122927ff7d..f34c4d3d20 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -197,6 +197,7 @@ class Route : public SessionObject, public AutomatableControls boost::shared_ptr internal_send_for (boost::shared_ptr target) const; BufferSet* get_return_buffer () const; void release_return_buffer () const; + void put_control_outs_at (Placement); /** A record of the stream configuration at some point in the processor list. * Used to return where and why an processor list configuration request failed. diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index e970d6e9e4..b248698242 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -1465,6 +1465,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable void route_solo_changed (void *src, boost::weak_ptr); void catch_up_on_solo (); void catch_up_on_solo_mute_override (); + void solo_model_changed (); void update_route_solo_state (boost::shared_ptr r = boost::shared_ptr()); void modify_solo_mute (bool, bool); void strip_portname_for_solo (std::string& portname); diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index 874a3f7ca0..3067928161 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -332,7 +332,8 @@ namespace ARDOUR { enum SoloModel { SoloInPlace, - SoloBus + SoloAFL, + SoloPFL }; enum AutoConnectOption { diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 94878bc97e..7410d8ef8c 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -229,7 +229,8 @@ setup_enum_writer () REGISTER (_LayerModel); REGISTER_ENUM (SoloInPlace); - REGISTER_ENUM (SoloBus); + REGISTER_ENUM (SoloAFL); + REGISTER_ENUM (SoloPFL); REGISTER (_SoloModel); REGISTER_ENUM (AutoConnectPhysical); diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index c3e5862270..b2c3d27766 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -522,7 +522,8 @@ Route::mod_solo_level (int32_t delta) } break; - case SoloBus: + case SoloAFL: + case SoloPFL: /* control outs are used for soloing */ if (_control_outs) { _control_outs->set_solo_level (_solo_level); @@ -558,7 +559,8 @@ Route::set_solo_isolated (bool yn, void *src) _main_outs->set_solo_isolated (false); } break; - case SoloBus: + case SoloAFL: + case SoloPFL: if (_control_outs) { _control_outs->set_solo_level (_solo_level); _control_outs->set_solo_isolated (_solo_isolated); @@ -2287,6 +2289,38 @@ Route::set_meter_point (MeterPoint p, void *src) _session.set_dirty (); } } +void +Route::put_control_outs_at (Placement p) +{ + if (!_control_outs) { + return; + } + + // Move meter in the processors list + ProcessorList::iterator loc = find(_processors.begin(), _processors.end(), _control_outs); + _processors.erase(loc); + + switch (p) { + case PreFader: + loc = find(_processors.begin(), _processors.end(), _amp); + if (loc != _processors.begin()) { + --loc; + } + break; + case PostFader: + loc = find(_processors.begin(), _processors.end(), _amp); + assert (loc != _processors.end()); + loc++; + break; + } + + _processors.insert(loc, _control_outs); + + cerr << _name << " moved control outs to " << enum_2_string (p) << endl; + + processors_changed (); /* EMIT SIGNAL */ + _session.set_dirty (); +} nframes_t Route::update_total_latency () diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index e87f315a24..23c6ce89c1 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -4218,3 +4218,28 @@ Session::update_have_rec_enabled_diskstream () RecordStateChanged (); /* EMIT SIGNAL */ } } + +void +Session::solo_model_changed () +{ + Placement p; + + switch (Config->get_solo_model()) { + case SoloInPlace: + return; + + case SoloAFL: + p = PostFader; + break; + + case SoloPFL: + p = PreFader; + break; + } + + boost::shared_ptr r = routes.reader (); + + for (RouteList::iterator i = r->begin(); i != r->end(); ++i) { + (*i)->put_control_outs_at (p); + } +} diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index f11342a0fd..3893b0a98c 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -3211,6 +3211,8 @@ Session::config_changed (std::string p, bool ours) } } else if (p == "solo-mute-override") { // catch_up_on_solo_mute_override (); + } else if (p == "solo-model") { + solo_model_changed (); } set_dirty ();