From 44e88a2d54e04d29e462246d1988280e03ce7304 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 8 Nov 2012 15:54:16 +0000 Subject: [PATCH] notably modify the design and logic of the startup dialog, so that we can handle the requirements in the 3.0-SG branch reasonably. the two major changes concern the idea that we may need to run the audio setup tab at all times, and that the startup dialog could potentially be "ready" without actually needing to be displayed on-screen. this allows us to ALWAYS use a startup dialog, even if we don't actually need any information from the user. as usual with this kind of change, expect a few logic/workflow glitches git-svn-id: svn://localhost/ardour2/branches/3.0@13397 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui.cc | 161 +++++++++++++---------------- gtk2_ardour/engine_dialog.cc | 20 +++- gtk2_ardour/engine_dialog.h | 4 +- gtk2_ardour/startup.cc | 190 ++++++++++++++++++----------------- gtk2_ardour/startup.h | 9 +- 5 files changed, 197 insertions(+), 187 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 37343c1e18..143d621987 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -329,37 +329,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) DPIReset.connect (sigc::mem_fun (*this, &ARDOUR_UI::resize_text_widgets)); } -/** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */ -bool -ARDOUR_UI::run_startup (bool should_be_new, std::string load_template) -{ - delete _startup; - _startup = new ArdourStartup (); - - XMLNode* audio_setup = Config->extra_xml ("AudioSetup"); - - if (audio_setup && _startup->engine_control()) { - _startup->engine_control()->set_state (*audio_setup); - } - - _startup->set_new_only (should_be_new); - if (!load_template.empty()) { - _startup->set_load_template (load_template); - } - _startup->present (); - - main().run(); - - _startup->hide (); - - switch (_startup->response()) { - case RESPONSE_OK: - return true; - default: - return false; - } -} - int ARDOUR_UI::create_engine () { @@ -2458,7 +2427,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri while (ret != 0) { - if (!should_be_new && !ARDOUR_COMMAND_LINE::session_name.empty()) { + if (!ARDOUR_COMMAND_LINE::session_name.empty()) { /* if they named a specific statefile, use it, otherwise they are just giving a session folder, and we want to use it as is @@ -2475,71 +2444,79 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri session_path = ARDOUR_COMMAND_LINE::session_name; session_name = Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name); } + } - } else { - - bool const apply = run_startup (should_be_new, load_template); - - if (!apply) { - if (quit_on_cancel) { - exit (1); - } else { - return ret; - } - } - - /* if we run the startup dialog again, offer more than just "new session" */ - - should_be_new = false; - - session_name = _startup->session_name (likely_new); - - string::size_type suffix = session_name.find (statefile_suffix); - - if (suffix != string::npos) { - session_name = session_name.substr (0, suffix); - } - - /* this shouldn't happen, but we catch it just in case it does */ - - if (session_name.empty()) { - continue; - } - - if (_startup->use_session_template()) { - template_name = _startup->session_template_name(); - _session_is_new = true; - } - - if (session_name[0] == G_DIR_SEPARATOR || - (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) || - (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) { - - /* absolute path or cwd-relative path specified for session name: infer session folder - from what was given. - */ - - session_path = Glib::path_get_dirname (session_name); - session_name = Glib::path_get_basename (session_name); - + delete _startup; + _startup = new ArdourStartup (should_be_new, session_name, session_path, load_template); + + if (!_startup->ready_without_display()) { + _startup->present (); + main().run(); + _startup->hide (); + } + + switch (_startup->response()) { + case RESPONSE_OK: + break; + default: + if (quit_on_cancel) { + exit (1); } else { - - session_path = _startup->session_folder(); - - char illegal = Session::session_name_is_legal (session_name); - - if (illegal) { - MessageDialog msg (*_startup, - string_compose (_("To ensure compatibility with various systems\n" - "session names may not contain a '%1' character"), - illegal)); - msg.run (); - ARDOUR_COMMAND_LINE::session_name = ""; // cancel that - continue; - } + return ret; } } + /* if we run the startup dialog again, offer more than just "new session" */ + + should_be_new = false; + + session_name = _startup->session_name (likely_new); + + string::size_type suffix = session_name.find (statefile_suffix); + + if (suffix != string::npos) { + session_name = session_name.substr (0, suffix); + } + + /* this shouldn't happen, but we catch it just in case it does */ + + if (session_name.empty()) { + continue; + } + + if (_startup->use_session_template()) { + template_name = _startup->session_template_name(); + _session_is_new = true; + } + + if (session_name[0] == G_DIR_SEPARATOR || + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) { + + /* absolute path or cwd-relative path specified for session name: infer session folder + from what was given. + */ + + session_path = Glib::path_get_dirname (session_name); + session_name = Glib::path_get_basename (session_name); + + } else { + + session_path = _startup->session_folder(); + + char illegal = Session::session_name_is_legal (session_name); + + if (illegal) { + MessageDialog msg (*_startup, + string_compose (_("To ensure compatibility with various systems\n" + "session names may not contain a '%1' character"), + illegal)); + msg.run (); + ARDOUR_COMMAND_LINE::session_name = ""; // cancel that + continue; + } + } + if (create_engine ()) { break; } diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index 615e79e184..f0121f5f42 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -44,6 +44,8 @@ #include #include +#include "ardour/rc_configuration.h" + #include "pbd/convert.h" #include "pbd/error.h" #include "pbd/pathscanner.h" @@ -364,6 +366,14 @@ EngineControl::EngineControl () set_border_width (12); pack_start (notebook); + + /* Pick up any existing audio setup configuration, if appropriate */ + + XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioSetup"); + + if (audio_setup) { + set_state (*audio_setup); + } } EngineControl::~EngineControl () @@ -579,13 +589,21 @@ EngineControl::build_command_line (vector& cmd) } } +bool +EngineControl::need_setup () +{ + return !engine_running(); +} + bool EngineControl::engine_running () { EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa (); boost::scoped_ptr current_epa; - /* revert all environment settings back to whatever they were when ardour started + /* revert all environment settings back to whatever they were when + * ardour started, because ardour's startup script may have reset + * something in ways that interfere with finding/starting JACK. */ if (global_epa) { diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index da132cfb46..0d7ce29b46 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -39,7 +39,7 @@ class EngineControl : public Gtk::VBox { EngineControl (); ~EngineControl (); - static bool engine_running (); + static bool need_setup (); int setup_engine (); bool was_used() const { return _used; } @@ -95,6 +95,8 @@ class EngineControl : public Gtk::VBox { bool _used; + static bool engine_running (); + void driver_changed (); void build_command_line (std::vector&); diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index cab8f6b83c..6fc68ea1e4 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -63,97 +63,112 @@ static string poor_mans_glob (string path) } -ArdourStartup::ArdourStartup () +ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name) : _response (RESPONSE_OK) + , config_modified (false) + , new_only (require_new) + , default_dir_chooser (0) , ic_new_session_button (_("Create a new session")) , ic_existing_session_button (_("Open an existing session")) , monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\ Ardour will play NO role in monitoring")) , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME)) + , engine_dialog (0) , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER) , more_new_session_options_button (_("I'd like more options for this session")) , _output_limit_count_adj (1, 0, 100, 1, 10, 0) , _input_limit_count_adj (1, 0, 100, 1, 10, 0) , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0) + , audio_page_index (-1) + , new_user_page_index (-1) + , default_folder_page_index (-1) + , monitoring_page_index (-1) + , session_page_index (-1) + , initial_choice_index (-1) + , final_page_index (-1) + , session_options_page_index (-1) , _existing_session_chooser_used (false) { - audio_page_index = -1; - initial_choice_index = -1; - new_user_page_index = -1; - default_folder_page_index = -1; - monitoring_page_index = -1; - session_page_index = -1; - final_page_index = -1; - session_options_page_index = -1; - new_only = false; + new_user = !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS); + need_audio_setup = EngineControl::need_setup (); + need_session_info = (session_name.empty() || require_new); - engine_dialog = 0; - config_modified = false; - default_dir_chooser = 0; + _provided_session_name = session_name; + _provided_session_path = session_path; + + if (need_audio_setup || need_session_info || new_user) { - use_template_button.set_group (session_template_group); - use_session_as_template_button.set_group (session_template_group); - - set_keep_above (true); - set_position (WIN_POS_CENTER); - set_border_width (12); - - if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) { - throw failed_constructor(); - } - - list > window_icons; - Glib::RefPtr icon; - - if ((icon = ::get_icon ("ardour_icon_16px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_22px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_32px")) != 0) { - window_icons.push_back (icon); - } - if ((icon = ::get_icon ("ardour_icon_48px")) != 0) { - window_icons.push_back (icon); - } - if (!window_icons.empty ()) { - set_default_icon_list (window_icons); - } - - new_user = !Glib::file_test(been_here_before_path(), Glib::FILE_TEST_EXISTS); - - bool need_audio_setup = !EngineControl::engine_running(); - - // setup_prerelease_page (); - - if (new_user) { + use_template_button.set_group (session_template_group); + use_session_as_template_button.set_group (session_template_group); - setup_new_user_page (); - setup_first_time_config_page (); - setup_monitoring_choice_page (); - setup_monitor_section_choice_page (); - - if (need_audio_setup) { - setup_audio_page (); + set_keep_above (true); + set_position (WIN_POS_CENTER); + set_border_width (12); + + if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) { + throw failed_constructor(); + } + + list > window_icons; + Glib::RefPtr icon; + + if ((icon = ::get_icon ("ardour_icon_16px")) != 0) { + window_icons.push_back (icon); + } + if ((icon = ::get_icon ("ardour_icon_22px")) != 0) { + window_icons.push_back (icon); + } + if ((icon = ::get_icon ("ardour_icon_32px")) != 0) { + window_icons.push_back (icon); + } + if ((icon = ::get_icon ("ardour_icon_48px")) != 0) { + window_icons.push_back (icon); + } + if (!window_icons.empty ()) { + set_default_icon_list (window_icons); + } + + // setup_prerelease_page (); + + if (new_user) { + + setup_new_user_page (); + setup_first_time_config_page (); + setup_monitoring_choice_page (); + setup_monitor_section_choice_page (); + + if (need_audio_setup) { + setup_audio_page (); + } + + ic_new_session_button.set_active (true); // always create new session on first run + + } else { + + if (need_audio_setup) { + setup_audio_page (); + } + + setup_initial_choice_page (); } - ic_new_session_button.set_active (true); // always create new session on first run - - } else { - - if (need_audio_setup) { - setup_audio_page (); + setup_session_page (); + setup_more_options_page (); + + if (new_user) { + setup_final_page (); } - setup_initial_choice_page (); - } + if (new_only) { + ic_vbox.hide (); + } else { + ic_vbox.show (); + } - setup_session_page (); - setup_more_options_page (); - - if (new_user) { - setup_final_page (); + if (!template_name.empty()) { + use_template_button.set_active (false); + load_template_override = template_name; + } } the_startup = this; @@ -163,6 +178,12 @@ ArdourStartup::~ArdourStartup () { } +bool +ArdourStartup::ready_without_display () const +{ + return !new_user && !need_audio_setup && !need_session_info; +} + void ArdourStartup::setup_prerelease_page () { @@ -198,25 +219,6 @@ Full information on all the above can be found on the support page at\n\ set_page_complete (*vbox, true); } -void -ArdourStartup::set_new_only (bool yn) -{ - new_only = yn; - - if (new_only) { - ic_vbox.hide (); - } else { - ic_vbox.show (); - } -} - -void -ArdourStartup::set_load_template (string load_template) -{ - use_template_button.set_active (false); - load_template_override = load_template; -} - bool ArdourStartup::use_session_template () { @@ -235,7 +237,7 @@ std::string ArdourStartup::session_template_name () { if (!load_template_override.empty()) { - string the_path(ARDOUR::user_template_directory()); + string the_path (ARDOUR::user_template_directory()); return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix); } @@ -257,6 +259,10 @@ ArdourStartup::session_template_name () std::string ArdourStartup::session_name (bool& should_be_new) { + if (ready_without_display()) { + return _provided_session_name; + } + if (ic_new_session_button.get_active()) { should_be_new = true; string val = new_name_entry.get_text (); @@ -283,6 +289,10 @@ ArdourStartup::session_name (bool& should_be_new) std::string ArdourStartup::session_folder () { + if (ready_without_display()) { + return _provided_session_path; + } + if (ic_new_session_button.get_active()) { std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text()); return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name); diff --git a/gtk2_ardour/startup.h b/gtk2_ardour/startup.h index c2de96c55f..00c0a90d39 100644 --- a/gtk2_ardour/startup.h +++ b/gtk2_ardour/startup.h @@ -45,11 +45,10 @@ class EngineControl; class ArdourStartup : public Gtk::Assistant { public: - ArdourStartup (); + ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name); ~ArdourStartup (); - void set_new_only (bool); - void set_load_template( std::string load_template ); + bool ready_without_display () const; std::string session_name (bool& should_be_new); std::string session_folder (); @@ -83,7 +82,11 @@ class ArdourStartup : public Gtk::Assistant { gint _response; bool config_modified; bool new_user; + bool need_audio_setup; + bool need_session_info; bool new_only; + std::string _provided_session_name; + std::string _provided_session_path; std::string been_here_before_path () const;