reinstate solo button for master out ; make solo button show state even if in listen mode ; wire up control outs "better" and add an option to name the bundle to connect it to (not controllable in GUI yet) ; fix up a couple of other solo/listen issues

git-svn-id: svn://localhost/ardour2/branches/3.0@5301 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2009-07-01 23:14:27 +00:00
parent 86db1ebc5f
commit 236868761c
6 changed files with 74 additions and 31 deletions

View File

@ -809,7 +809,7 @@ RouteTimeAxisView::set_height (uint32_t h)
gm.get_gain_slider().show();
mute_button->show();
if (!_route || _route->is_master()) {
if (!_route || _route->is_control()) {
solo_button->hide();
} else {
solo_button->show();
@ -835,7 +835,7 @@ RouteTimeAxisView::set_height (uint32_t h)
gm.get_gain_slider().hide();
mute_button->show();
if (!_route || _route->is_master()) {
if (!_route || _route->is_control()) {
solo_button->hide();
} else {
solo_button->show();

View File

@ -209,7 +209,7 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
mute_button->show();
if (_route->is_master()) {
if (_route->is_control()) {
solo_button->hide ();
} else {
solo_button->show();
@ -646,17 +646,24 @@ RouteUI::update_solo_display ()
ignore_toggle = false;
}
if (x) {
solo_button->set_visual_state (1);
} else {
solo_button->set_visual_state (0);
}
} else {
if (solo_button->get_active() != (x = _route->soloed())){
ignore_toggle = true;
solo_button->set_active(x);
solo_button->set_active (x);
ignore_toggle = false;
}
if (_route->solo_isolated()) {
solo_button->set_visual_state (2);
} else if (_route->soloed()) {
} else if (x) {
solo_button->set_visual_state (1);
} else {
solo_button->set_visual_state (0);

View File

@ -87,6 +87,7 @@ CONFIG_VARIABLE (bool, show_solo_mutes, "show-solo-mutes", false)
CONFIG_VARIABLE (bool, solo_mute_override, "solo-mute-override", false)
CONFIG_VARIABLE (bool, tape_machine_mode, "tape-machine-mode", false)
CONFIG_VARIABLE (gain_t, solo_mute_gain, "solo-mute-gain", 0.0)
CONFIG_VARIABLE (std::string, monitor_bus_preferred_bundle, "monitor-bus-preferred-bundle", "")
/* click */

View File

@ -1255,6 +1255,18 @@ IO::set_name_in_state (XMLNode& node, const string& new_name)
bool
IO::connected_to (boost::shared_ptr<const IO> other) const
{
if (!other) {
/* do we have any connections at all? */
for (PortSet::const_iterator p = _ports.begin(); p != _ports.end(); ++p) {
if (p->connected()) {
return true;
}
}
return false;
}
assert (_direction != other->direction());
uint32_t i, j;

View File

@ -1282,7 +1282,6 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
list< pair<ChanCount,ChanCount> >::iterator c = configuration.begin();
for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p, ++c) {
(*p)->configure_io(c->first, c->second);
(*p)->activate();
processor_max_streams = ChanCount::max(processor_max_streams, c->first);
processor_max_streams = ChanCount::max(processor_max_streams, c->second);
out = c->second;
@ -1928,7 +1927,7 @@ Route::listen_via (boost::shared_ptr<Route> route, bool active)
_control_outs = listener;
}
add_processor (listener, PreFader);
add_processor (listener, (Config->get_listen_position() == AfterFaderListen ? PostFader : PreFader));
return 0;
}

View File

@ -655,10 +655,14 @@ Session::when_engine_running ()
add_bundle (c);
}
}
BootMessage (_("Setup signal flow and plugins"));
if (Config->get_auto_connect_standard_busses() && !no_auto_connect()) {
hookup_io ();
if (_master_out) {
if (!no_auto_connect()) {
if (_master_out && Config->get_auto_connect_standard_busses()) {
/* if requested auto-connect the outputs to the first N physical ports.
*/
@ -707,36 +711,52 @@ Session::when_engine_running ()
}
}
/* connect control out to physical outs, but use ones after the master
if possible
/* if control out is not connected,
connect control out to physical outs, but use ones after the master if possible
*/
/* XXX this logic is wrong for mixed port types */
if (!_control_out->output()->connected_to (boost::shared_ptr<IO>())) {
uint32_t shift = _master_out->n_outputs().n_audio();
uint32_t mod = _master_out->n_outputs().n_audio();
limit = _control_out->n_outputs().n_audio();
if (!Config->get_monitor_bus_preferred_bundle().empty()) {
for (uint32_t n = 0; n < limit; ++n) {
boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
Port* p = _control_out->output()->nth (n);
string connect_to = _engine.get_nth_physical_output (DataType (p->type()), (n+shift) % mod);
if (!connect_to.empty()) {
if (_control_out->output()->connect (p, connect_to, this)) {
error << string_compose (_("cannot connect control output %1 to %2"), n, connect_to)
<< endmsg;
break;
if (b) {
_control_out->output()->connect_ports_to_bundle (b, this);
} else {
warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
Config->get_monitor_bus_preferred_bundle())
<< endmsg;
}
} else {
/* XXX this logic is wrong for mixed port types */
uint32_t shift = _master_out->n_outputs().n_audio();
uint32_t mod = _engine.n_physical_outputs (DataType::AUDIO);
limit = _control_out->n_outputs().n_audio();
cerr << "Connecting " << limit << " control out ports, shift is " << shift << " mod is " << mod << endl;
for (uint32_t n = 0; n < limit; ++n) {
Port* p = _control_out->output()->nth (n);
string connect_to = _engine.get_nth_physical_output (DataType (p->type()), (n+shift) % mod);
if (!connect_to.empty()) {
if (_control_out->output()->connect (p, connect_to, this)) {
error << string_compose (_("cannot connect control output %1 to %2"), n, connect_to)
<< endmsg;
break;
}
}
}
}
}
}
}
BootMessage (_("Setup signal flow and plugins"));
hookup_io ();
/* catch up on send+insert cnts */
_state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
@ -2336,10 +2356,14 @@ Session::route_solo_changed (void* src, boost::weak_ptr<Route> wpr)
delta = -1;
}
/* now mod the solo level of all other routes except master & control outs
so that they will be silent if appropriate.
*/
solo_update_disabled = true;
for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
if ((*i)->feeds (route)) {
if ((*i)->feeds (route) && !(*i)->is_hidden() && !(*i)->is_master() && !(*i)->is_control()) {
/* do it */
(*i)->mod_solo_level (delta);
}
@ -2347,13 +2371,13 @@ Session::route_solo_changed (void* src, boost::weak_ptr<Route> wpr)
/* make sure master is never muted by solo */
if (_master_out->solo_level() == 0) {
if (route != _master_out && _master_out->solo_level() == 0 && !_master_out->soloed()) {
_master_out->mod_solo_level (1);
}
/* ditto for control outs make sure master is never muted by solo */
if (_control_out && _control_out->solo_level() == 0) {
if (route != _control_out && _control_out && _control_out->solo_level() == 0) {
_control_out->mod_solo_level (1);
}