diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index f8f8386a25..aaf71e437f 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -64,6 +64,7 @@ #include "ardour/audio_track.h" #include "ardour/audioengine.h" +#include "ardour/engine_state_controller.h" #include "ardour/audioregion.h" #include "ardour/location.h" #include "ardour/profile.h" @@ -501,7 +502,9 @@ Editor::Editor () selection->TimeChanged.connect (sigc::mem_fun(*this, &Editor::time_selection_changed)); selection->TracksChanged.connect (sigc::mem_fun(*this, &Editor::track_selection_changed)); - + + EngineStateController::instance()->OutputConnectionModeChanged.connect (*this, invalidator (*this), boost::bind (&Editor::output_connection_mode_changed, this), gui_context() ); + editor_regions_selection_changed_connection = selection->RegionsChanged.connect (sigc::mem_fun(*this, &Editor::region_selection_changed)); selection->PointsChanged.connect (sigc::mem_fun(*this, &Editor::point_selection_changed)); @@ -1385,6 +1388,7 @@ Editor::set_session (Session *t) ActionManager::ui_manager->signal_pre_activate().connect (sigc::mem_fun (*this, &Editor::action_pre_activated)); start_updating_meters (); + } void @@ -5089,8 +5093,11 @@ Editor::add_routes (RouteList& routes) for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) { boost::shared_ptr route = (*x); + bool is_master_visible = (Config->get_output_auto_connect() & AutoConnectMaster); + if (route->is_auditioner() || route->is_monitor() || - !boost::dynamic_pointer_cast (route)) { + (!boost::dynamic_pointer_cast (route) && + (route->is_master() && !is_master_visible ) ) ) { continue; } @@ -5187,7 +5194,7 @@ Editor::timeaxisview_deleted (TimeAxisView *tv) } - if (next_tv) { + if (next_tv ) { set_selected_mixer_strip (*next_tv); } else { /* make the editor mixer strip go away setting the @@ -5763,3 +5770,28 @@ Editor::zoom_vertical_modifier_released() { _stepping_axis_view = 0; } + +void +Editor::output_connection_mode_changed () +{ + if (!_session) { + return; + } + + if (Config->get_output_auto_connect() & AutoConnectMaster) { + + if (_session->master_out() && !axis_view_from_route(_session->master_out() ) ) { + RouteList list; + list.push_back(_session->master_out() ); + add_routes(list); + } + } else { + TimeAxisView* tv = 0; + if (_session->master_out() && (tv = axis_view_from_route(_session->master_out() ) ) ) { + delete tv; + } + } + + track_selection_changed (); +} + diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index ac70eb3715..85a32eda43 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1694,6 +1694,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void time_selection_changed (); void update_time_selection_display (); void track_selection_changed (); + void output_connection_mode_changed (); void region_selection_changed (); sigc::connection editor_regions_selection_changed_connection; void sensitize_all_region_actions (bool); diff --git a/gtk2_ardour/editor_mixer.cc b/gtk2_ardour/editor_mixer.cc index fcc3d019d7..05b827a031 100644 --- a/gtk2_ardour/editor_mixer.cc +++ b/gtk2_ardour/editor_mixer.cc @@ -49,6 +49,7 @@ using namespace std; using namespace Gtkmm2ext; using namespace PBD; +using namespace ARDOUR; void Editor::editor_mixer_button_toggled () @@ -108,14 +109,24 @@ Editor::show_editor_mixer (bool yn) return; } - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - RouteTimeAxisView* atv; - - if ((atv = dynamic_cast (*i)) != 0) { + // check if master is available: try to find it's view + TimeAxisView* tv; + if ( tv = axis_view_from_route (_session->master_out() ) ) { + RouteTimeAxisView* atv = dynamic_cast (tv); + if ( atv != 0 ) { r = atv->route(); - break; } - } + + } else { + // set the first track visible in inspector + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + RouteTimeAxisView* atv; + if ( atv = dynamic_cast (*i) ) { + r = atv->route(); + break; + } + } + } } else { sort_track_selection (selection->tracks); diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index 2ed854365e..5ef4436146 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -941,13 +941,39 @@ Editor::set_selected_regionview_from_map_event (GdkEventAny* /*ev*/, StreamView* void Editor::track_selection_changed () { - switch (selection->tracks.size()) { - case 0: - break; - default: - set_selected_mixer_strip (*(selection->tracks.front())); - break; - } + if (!selection->tracks.empty() ) { + set_selected_mixer_strip (*(selection->tracks.front())); + } else { + // set master bus visible if it's available + RouteTimeAxisView* rtv = 0; + bool set_master_bus = false; + + if (_session ) { + TimeAxisView* tv = axis_view_from_route (_session->master_out() ); + rtv = dynamic_cast (tv); + + if (rtv) { + set_master_bus = true; + } + } + + // if master bus is not available (Multi Out mode) + if (!set_master_bus && !track_views.empty() ) { + + TrackViewList::const_iterator iter = track_views.begin(); + for (; iter != track_views.end() ; ++iter) { + + if ( ( rtv = dynamic_cast (*iter ) ) && + !(rtv->route()->is_master() )) { + break; + } + } + } + + if (rtv) { + set_selected_mixer_strip (*rtv ); + } + } RouteNotificationListPtr routes (new RouteNotificationList);