);
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);
boost::shared_ptr<Send> internal_send_for (boost::shared_ptr<const Route> 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.
void route_solo_changed (void *src, boost::weak_ptr<Route>);
void catch_up_on_solo ();
void catch_up_on_solo_mute_override ();
+ void solo_model_changed ();
void update_route_solo_state (boost::shared_ptr<RouteList> r = boost::shared_ptr<RouteList>());
void modify_solo_mute (bool, bool);
void strip_portname_for_solo (std::string& portname);
enum SoloModel {
SoloInPlace,
- SoloBus
+ SoloAFL,
+ SoloPFL
};
enum AutoConnectOption {
REGISTER (_LayerModel);
REGISTER_ENUM (SoloInPlace);
- REGISTER_ENUM (SoloBus);
+ REGISTER_ENUM (SoloAFL);
+ REGISTER_ENUM (SoloPFL);
REGISTER (_SoloModel);
REGISTER_ENUM (AutoConnectPhysical);
}
break;
- case SoloBus:
+ case SoloAFL:
+ case SoloPFL:
/* control outs are used for soloing */
if (_control_outs) {
_control_outs->set_solo_level (_solo_level);
_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);
_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 ()
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<RouteList> r = routes.reader ();
+
+ for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
+ (*i)->put_control_outs_at (p);
+ }
+}
}
} else if (p == "solo-mute-override") {
// catch_up_on_solo_mute_override ();
+ } else if (p == "solo-model") {
+ solo_model_changed ();
}
set_dirty ();