diff --git a/gtk2_ardour/engine_dialog.cc b/gtk2_ardour/engine_dialog.cc index b53f01c46b..8ed8957c9f 100644 --- a/gtk2_ardour/engine_dialog.cc +++ b/gtk2_ardour/engine_dialog.cc @@ -670,11 +670,28 @@ EngineControl::engine_running () return false; } +int +EngineControl::prepare () +{ + string driver = driver_combo.get_active_text(); + + if (driver == "SoundGrid") { + return soundgrid_init (inputs_adjustment.get_value(), outputs_adjustment.get_value(), + 16, /* max tracks */ + 16, /* max busses */ + 8 /* max plugins per track */ + ); + } + + return 0; +} + int EngineControl::setup_engine () { vector args; std::string cwd = "/tmp"; + string driver = driver_combo.get_active_text(); build_command_line (args); @@ -699,7 +716,6 @@ EngineControl::setup_engine () jackdrc << endl; jackdrc.close (); - string driver = driver_combo.get_active_text(); if (driver == "SoundGrid") { soundgrid_configure (); } @@ -721,13 +737,7 @@ EngineControl::enumerate_devices (const string& driver) } else if (driver == "CoreAudio") { devices[driver] = enumerate_coreaudio_devices (); } else if (driver == "SoundGrid") { - - soundgrid_init (inputs_adjustment.get_value(), outputs_adjustment.get_value(), - 16, /* max tracks */ - 16, /* max busses */ - 8 /* max plugins per track */ - ); - devices[driver] = SoundGrid::lan_port_names(); + devices[driver].clear (); #else diff --git a/gtk2_ardour/engine_dialog.h b/gtk2_ardour/engine_dialog.h index 094f492e65..ba431b3319 100644 --- a/gtk2_ardour/engine_dialog.h +++ b/gtk2_ardour/engine_dialog.h @@ -43,6 +43,7 @@ class EngineControl : public Gtk::VBox { static bool engine_running (); int setup_engine (); + int prepare (); bool was_used() const { return _used; } XMLNode& get_state (); diff --git a/gtk2_ardour/soundgrid.mm b/gtk2_ardour/soundgrid.mm index c0efe91d88..38b393f8de 100644 --- a/gtk2_ardour/soundgrid.mm +++ b/gtk2_ardour/soundgrid.mm @@ -44,6 +44,10 @@ #include #include +#include +#include + +#include "gtkmm2ext/gtk_ui.h" #include "pbd/compose.h" @@ -54,10 +58,14 @@ #include "gui_thread.h" #include "soundgrid.h" +#include "i18n.h" + using namespace PBD; using std::cerr; static NSWindow* sg_window = 0; +static Gtk::MessageDialog* wait_dialog = 0; +static Gtk::ProgressBar* pbar = 0; static PBD::ScopedConnection sg_connection; static void @@ -76,14 +84,24 @@ soundgrid_shutdown () static bool soundgrid_driver_init (uint32_t max_phys_inputs, uint32_t max_phys_outputs, uint32_t max_tracks) { + wait_dialog->set_secondary_text (_("Nearly ready..."), true); + pbar->hide (); + + Gtkmm2ext::UI::instance()->flush_pending (); + ARDOUR::SoundGrid::instance().configure_driver (max_phys_inputs, max_phys_outputs, max_tracks); + + /* end the wait dialog */ + + wait_dialog->response (0); + return false; /* do not call again */ } -int -soundgrid_init (uint32_t max_phys_inputs, uint32_t max_phys_outputs, - uint32_t max_tracks, uint32_t max_busses, - uint32_t max_plugins) +static bool +soundgrid_initialize (uint32_t max_tracks, uint32_t max_busses, + uint32_t max_phys_inputs, uint32_t max_phys_outputs, + uint32_t max_plugins) { /* create a new window that we don't display (at least not as of August 2012, but we can give it to the SoundGrid library @@ -99,27 +117,73 @@ soundgrid_init (uint32_t max_phys_inputs, uint32_t max_phys_outputs, [sg_window retain]; ARDOUR::SoundGrid::Shutdown.connect (sg_connection, MISSING_INVALIDATOR, soundgrid_shutdown, gui_context()); - + if (ARDOUR::SoundGrid::instance().initialize ([sg_window contentView], max_tracks, max_busses, max_phys_inputs, - max_phys_inputs, + max_phys_outputs, max_plugins)) { [sg_window release]; sg_window = 0; - return -1; + } else { + + /* as of early August 2012, we need to wait 5 seconds before configuring the CoreAudio driver */ + + Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (soundgrid_driver_init), + max_phys_inputs, max_phys_outputs, max_tracks), 5000); + + /* tell everyone/everything that we're using soundgrid */ + + ARDOUR::Profile->set_soundgrid (); } - /* as of early August 2012, we need to wait 5 seconds before configuring the CoreAudio driver */ + return false; /* do not call again */ +} - Glib::signal_timeout().connect (sigc::bind (sigc::ptr_fun (soundgrid_driver_init), - max_phys_inputs, max_phys_outputs, max_tracks), 5000); +static bool +pulse_pbar () +{ + pbar->pulse(); + return true; +} - /* tell everyone/everything that we're using soundgrid */ +int +soundgrid_init (uint32_t max_phys_inputs, uint32_t max_phys_outputs, + uint32_t max_tracks, uint32_t max_busses, + uint32_t max_plugins) +{ + Glib::signal_idle().connect (sigc::bind (sigc::ptr_fun (soundgrid_initialize), + max_tracks, max_busses, + max_phys_inputs, + max_phys_outputs, + max_plugins)); - ARDOUR::Profile->set_soundgrid (); + + wait_dialog = new Gtk::MessageDialog (_("Please wait while SoundGrid is initialized (approx 6 seconds)"), + true, /* use markup */ + Gtk::MESSAGE_WARNING, + Gtk::BUTTONS_NONE, + true); /* modal */ + + wait_dialog->set_position (Gtk::WIN_POS_CENTER); + wait_dialog->set_title (_("SoundGrid Initializing ...")); + + pbar = manage (new Gtk::ProgressBar); + sigc::connection pulse_connection; + + pbar->set_size_request (100, -1); + wait_dialog->get_vbox()->pack_start (*pbar, false, false); + pbar->show (); + + pulse_connection = Glib::signal_timeout().connect (sigc::ptr_fun (pulse_pbar), 250); + + wait_dialog->run (); + + pulse_connection.disconnect (); + + delete wait_dialog; return 0; } diff --git a/gtk2_ardour/startup.cc b/gtk2_ardour/startup.cc index cab8f6b83c..20ed00bc60 100644 --- a/gtk2_ardour/startup.cc +++ b/gtk2_ardour/startup.cc @@ -655,7 +655,18 @@ ArdourStartup::on_apply () void ArdourStartup::on_prepare (Gtk::Widget* page) { - if (page == &session_vbox) { + if (page == &ic_vbox) { + + /* need to check with engine dialog and see if something needs to be done + before we move on (SoundGrid) + */ + + if (engine_dialog) { + if (engine_dialog->prepare ()) { + /* failure - do not proceed to new page */ + } + } + } else if (page == &session_vbox) { if (ic_new_session_button.get_active()) { /* new session requested */ @@ -684,7 +695,7 @@ ArdourStartup::on_prepare (Gtk::Widget* page) } } } - } + } } void