diff options
-rw-r--r-- | gtk2_ardour/ardour_ui.cc | 157 | ||||
-rw-r--r-- | gtk2_ardour/engine_dialog.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/engine_dialog.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/startup.cc | 190 | ||||
-rw-r--r-- | gtk2_ardour/startup.h | 9 |
5 files changed, 195 insertions, 185 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); + 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 { + return ret; } + } - /* this shouldn't happen, but we catch it just in case it does */ + /* 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 { - if (session_name.empty()) { + 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 (_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 <gtkmm/stock.h> #include <gtkmm2ext/utils.h> +#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 () @@ -580,12 +590,20 @@ EngineControl::build_command_line (vector<string>& cmd) } bool +EngineControl::need_setup () +{ + return !engine_running(); +} + +bool EngineControl::engine_running () { EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa (); boost::scoped_ptr<EnvironmentalProtectionAgency> 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<std::string>&); 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; - - engine_dialog = 0; - config_modified = false; - default_dir_chooser = 0; - - 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<Glib::RefPtr<Gdk::Pixbuf> > window_icons; - Glib::RefPtr<Gdk::Pixbuf> 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); + 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); - bool need_audio_setup = !EngineControl::engine_running(); - - // setup_prerelease_page (); + _provided_session_name = session_name; + _provided_session_path = session_path; + + if (need_audio_setup || need_session_info || new_user) { - 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(); } - - ic_new_session_button.set_active (true); // always create new session on first run - - } else { - - if (need_audio_setup) { - setup_audio_page (); + + list<Glib::RefPtr<Gdk::Pixbuf> > window_icons; + Glib::RefPtr<Gdk::Pixbuf> 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 (); } - setup_initial_choice_page (); - } + setup_session_page (); + setup_more_options_page (); + + if (new_user) { + setup_final_page (); + } - setup_session_page (); - setup_more_options_page (); + if (new_only) { + ic_vbox.hide (); + } else { + ic_vbox.show (); + } - 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; |