From 6acabf15ceeda04dc1bdfc79c4b2d95072dce22c Mon Sep 17 00:00:00 2001 From: GZharun Date: Mon, 4 Aug 2014 14:35:13 +0300 Subject: [PATCH] [Summary] Implemented master bus use cases for inspector track view [Details] 1. Made master bus shownable in inspector when no track selected in StereoOut, StereoOut mode has just been enabled, or there is no tracks at all in StereoOut. 2. Made master bus hidden in MultiOut mode in any case. --- gtk2_ardour/editor.cc | 38 ++++++++++++++++++++++++++++--- gtk2_ardour/editor.h | 1 + gtk2_ardour/editor_mixer.cc | 23 ++++++++++++++----- gtk2_ardour/editor_selection.cc | 40 +++++++++++++++++++++++++++------ 4 files changed, 86 insertions(+), 16 deletions(-) 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);