diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2019-10-09 20:50:34 -0600 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2019-10-10 16:52:00 -0600 |
commit | 18b4a4213f39f1cc6c87b667d065d25597f82686 (patch) | |
tree | 4a2e1f01440e6fe662d072b4fc715a528e644a90 /gtk2_ardour/ardour_ui_startup.cc | |
parent | dd29e9b0e99f4fbde2087b96adc0a13216f5eb9e (diff) |
add initial version of StartupFSM along with its owners/users
Diffstat (limited to 'gtk2_ardour/ardour_ui_startup.cc')
-rw-r--r-- | gtk2_ardour/ardour_ui_startup.cc | 122 |
1 files changed, 56 insertions, 66 deletions
diff --git a/gtk2_ardour/ardour_ui_startup.cc b/gtk2_ardour/ardour_ui_startup.cc index 732252c242..e89e5a2f11 100644 --- a/gtk2_ardour/ardour_ui_startup.cc +++ b/gtk2_ardour/ardour_ui_startup.cc @@ -57,7 +57,6 @@ #include "ardour/filename_extensions.h" #include "ardour/filesystem_paths.h" #include "ardour/profile.h" -#include "ardour/recent_sessions.h" #include "gtkmm2ext/application.h" @@ -480,27 +479,37 @@ ARDOUR_UI::nsm_init () return 0; } +void +ARDOUR_UI::sfsm_response (StartupFSM::Result r) +{ + switch (r) { + case StartupFSM::ExitProgram: + queue_finish (); + break; + case StartupFSM::LoadSession: + _initial_verbose_plugin_scan = false; + load_session_from_startup_fsm (); + break; + case StartupFSM::DoNothing: + break; + } +} + int ARDOUR_UI::starting () { - Application* app = Application::instance (); - bool brand_new_user = ArdourStartup::required (); - - app->ShouldQuit.connect (sigc::mem_fun (*this, &ARDOUR_UI::queue_finish)); - app->ShouldLoad.connect (sigc::mem_fun (*this, &ARDOUR_UI::load_from_application_api)); - if (ARDOUR_COMMAND_LINE::check_announcements) { check_announcements (); } - app->ready (); - /* we need to create this early because it may need to set the * audio backend end up. */ + EngineControl* amd; + try { - audio_midi_setup.get (true); + amd = dynamic_cast<EngineControl*> (audio_midi_setup.get (true)); } catch (...) { std::cerr << "audio-midi engine setup failed."<< std::endl; return -1; @@ -510,68 +519,53 @@ ARDOUR_UI::starting () return -1; } else { - if (brand_new_user) { + + startup_fsm = new StartupFSM (*amd); + startup_fsm->start (); + startup_fsm->signal_response().connect (sigc::mem_fun (*this, &ARDOUR_UI::sfsm_response)); + + if (startup_fsm->brand_new_user()) { _initial_verbose_plugin_scan = true; - ArdourStartup s; - s.present (); - main().run(); - s.hide (); - _initial_verbose_plugin_scan = false; - switch (s.response ()) { - case Gtk::RESPONSE_OK: - break; - default: - return -1; - } } + } - // TODO: maybe IFF brand_new_user - if (ARDOUR::Profile->get_mixbus () && Config->get_copy_demo_sessions ()) { - std::string dspd (Config->get_default_session_parent_dir()); - Searchpath ds (ARDOUR::ardour_data_search_path()); - ds.add_subdirectory_to_paths ("sessions"); - vector<string> demos; - find_files_matching_pattern (demos, ds, ARDOUR::session_archive_suffix); - - ARDOUR::RecentSessions rs; - ARDOUR::read_recent_sessions (rs); - - for (vector<string>::iterator i = demos.begin(); i != demos.end (); ++i) { - /* "demo-session" must be inside "demo-session.<session_archive_suffix>" */ - std::string name = basename_nosuffix (basename_nosuffix (*i)); - std::string path = Glib::build_filename (dspd, name); - /* skip if session-dir already exists */ - if (Glib::file_test(path.c_str(), Glib::FILE_TEST_IS_DIR)) { - continue; - } - /* skip sessions that are already in 'recent'. - * eg. a new user changed <session-default-dir> shorly after installation - */ - for (ARDOUR::RecentSessions::iterator r = rs.begin(); r != rs.end(); ++r) { - if ((*r).first == name) { - continue; - } - } - try { - PBD::FileArchive ar (*i); - if (0 == ar.inflate (dspd)) { - store_recent_sessions (name, path); - info << string_compose (_("Copied Demo Session %1."), name) << endmsg; - } - } catch (...) {} - } + return 0; +} + +void +ARDOUR_UI::load_session_from_startup_fsm () +{ + string session_path = startup_fsm->session_path; + string session_name = startup_fsm->session_name; + string session_template = startup_fsm->session_template; + bool session_is_new = startup_fsm->session_is_new; + BusProfile bus_profile = startup_fsm->bus_profile; + + std::cerr << " loading from " << session_path << " as " << session_name << " templ " << session_template << " is_new " << session_is_new << " bp " << bus_profile.master_out_channels << std::endl; + + if (session_is_new) { + + if (build_session (session_path, session_name, &bus_profile)) { } - /* go get a session */ + if (!session_template.empty() && session_template.substr (0, 11) == "urn:ardour:") { + meta_session_setup (session_template.substr (11)); + } + + } else { - const bool new_session_required = (ARDOUR_COMMAND_LINE::new_session || (!ARDOUR::Profile->get_mixbus() && brand_new_user)); + int ret = load_session (session_path, session_name, session_template); - if (get_session_parameters (false, new_session_required, ARDOUR_COMMAND_LINE::load_template)) { - std::cerr << "Cannot get session parameters."<< std::endl; - return -1; + if (ret == -2) { + /* not connected to the AudioEngine, so quit to avoid an infinite loop */ + exit (EXIT_FAILURE); } } +} +void +ARDOUR_UI::startup_done () +{ use_config (); WM::Manager::instance().show_visible (); @@ -582,10 +576,6 @@ ARDOUR_UI::starting () _status_bar_visibility.update (); BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME)); - - /* all other dialogs are created conditionally */ - - return 0; } void |