From 9bca2cd6f869c7651418b21d0523ed6ac19390cc Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 17 Sep 2009 14:10:27 +0000 Subject: more NSD hacks, including a new exception thrown when loading a session at a different SR than JACK, and the user opts not to load it git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@5672 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui.cc | 25 ++++++++++++++++++------- gtk2_ardour/new_session_dialog.cc | 36 ++++++++++++++++++++++-------------- gtk2_ardour/new_session_dialog.h | 1 + libs/ardour/ardour/session.h | 6 ++++++ libs/ardour/session_state.cc | 4 ++-- 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index d5785ed9d9..0accfe403d 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -2316,8 +2317,6 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be new_session_dialog->set_existing_session (false); new_session_dialog->set_current_page (0); // new engine page new_session_dialog->engine_control.unset_interface_chosen (); - cerr << "go back and show the engine setup tab again , beir = " - << backend_audio_is_running << endl; response = Gtk::RESPONSE_NONE; goto try_again; @@ -2328,7 +2327,7 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be if (response == Gtk::RESPONSE_OK) { session_name = new_session_dialog->session_name(); - + if (session_name.empty()) { response = Gtk::RESPONSE_NONE; goto try_again; @@ -2346,8 +2345,9 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be session_name = Glib::path_get_basename (session_name); } else { - + session_path = new_session_dialog->session_folder(); + } template_name = Glib::ustring(); @@ -2392,6 +2392,8 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be if (Glib::file_test (session_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { + new_session_dialog->hide (); + if (ask_about_loading_existing_session (session_path)) { goto loadit; } else { @@ -2525,6 +2527,12 @@ ARDOUR_UI::load_session (const Glib::ustring& path, const Glib::ustring& snap_na goto out; } + /* this exception is also special */ + + catch (Session::SRMismatchRejected& err) { + goto out; /* just go back and reload something else, etc. */ + } + catch (...) { MessageDialog msg (string_compose(_("Session \"%1 (snapshot %2)\" did not load successfully"), path, snap_name), @@ -3117,14 +3125,17 @@ ARDOUR_UI::write_buffer_stats () std::ofstream fout; struct tm tm; char buf[64]; - char* path; + char path[PATH_MAX+1]; int fd; - if ((path = tempnam (0, "ardourBuffering")) == 0) { + strcpy (path, "ardourBufferingXXXXXX"); + + if ((fd = mkstemp (path )) < 0) { cerr << X_("cannot find temporary name for ardour buffer stats") << endl; return; } - + fout.open (path); + close (fd); if (!fout) { cerr << string_compose (X_("cannot open file %1 for ardour buffer stats"), path) << endl; diff --git a/gtk2_ardour/new_session_dialog.cc b/gtk2_ardour/new_session_dialog.cc index af514fee05..7ee04b5b31 100644 --- a/gtk2_ardour/new_session_dialog.cc +++ b/gtk2_ardour/new_session_dialog.cc @@ -48,6 +48,7 @@ NewSessionDialog::NewSessionDialog() { in_destructor = false; session_name_label = new Gtk::Label(_("Name :")); + last_name_page = NewPage; m_name = new Gtk::Entry(); m_name->set_text(ARDOUR_COMMAND_LINE::session_name); @@ -593,12 +594,11 @@ NewSessionDialog::set_session_folder(const Glib::ustring& dir) char* res; if (!Glib::file_test (dir, Glib::FILE_TEST_IS_DIR)) { realdir = Glib::path_get_dirname (realdir); - cerr << "didn't exist, use " << realdir << endl; } if ((res = canonicalize_file_name (realdir.c_str())) != 0) { - cerr << "canonical, use " << res << endl; m_folder->set_current_folder (res); + engine_page_session_folder = res; free (res); } @@ -626,12 +626,18 @@ NewSessionDialog::session_name() const switch (which_page()) { case NewPage: + return Glib::filename_from_utf8(m_name->get_text()); + case EnginePage: - /* new or audio setup pages */ - if (!(page_set & OpenPage) && !(page_set & NewPage)) { - return Glib::filename_from_utf8(engine_page_session_name); + if (!(page_set & (OpenPage|NewPage))) { + return engine_page_session_name; + } else if (last_name_page == NewPage) { + return Glib::filename_from_utf8(m_name->get_text()); + } else { + /* relax and use the open page stuff at the end */ } - return Glib::filename_from_utf8(m_name->get_text()); + break; + default: break; } @@ -639,6 +645,7 @@ NewSessionDialog::session_name() const if (m_treeview->get_selection()->count_selected_rows() == 0) { return Glib::filename_from_utf8(str); } + Gtk::TreeModel::iterator i = m_treeview->get_selection()->get_selected(); return (*i)[recent_columns.visible_name]; } @@ -651,13 +658,13 @@ NewSessionDialog::session_folder() const return Glib::filename_from_utf8(m_folder->get_filename()); case EnginePage: - if (!(page_set & OpenPage) && !(page_set & NewPage)) { - /* just engine page, nothing else */ + if (!(page_set & (OpenPage|NewPage))) { return Glib::filename_from_utf8(engine_page_session_folder); - } - if (page_set == EnginePage) { + } else if (last_name_page == NewPage) { /* use m_folder since it should be set */ return Glib::filename_from_utf8(m_folder->get_filename()); + } else { + /* relax and use the open page stuff at the end */ } break; @@ -770,8 +777,6 @@ NewSessionDialog::which_page () const { int num = m_notebook->get_current_page(); - cerr << "current page set = " << std::hex << page_set << std::dec << endl; - if (page_set == NewPage) { return NewPage; @@ -891,6 +896,7 @@ NewSessionDialog::notebook_page_changed (GtkNotebookPage* np, uint pagenum) } else { set_response_sensitive (Gtk::RESPONSE_OK, true); } + last_name_page = OpenPage; break; case EnginePage: @@ -898,14 +904,14 @@ NewSessionDialog::notebook_page_changed (GtkNotebookPage* np, uint pagenum) if (!engine_control.interface_chosen()) { m_okbutton->set_label(_("Start Audio Engine")); } else { - m_okbutton->set_label(_("Open")); + m_okbutton->set_label(_("Start")); } m_okbutton->set_image (*(manage (new Gtk::Image (Gtk::Stock::OPEN, Gtk::ICON_SIZE_BUTTON)))); set_response_sensitive (Gtk::RESPONSE_NONE, false); set_response_sensitive (Gtk::RESPONSE_OK, true); break; - default: + case NewPage: on_new_session_page = true; m_okbutton->set_label(_("New")); m_okbutton->set_image (*(new Gtk::Image (Gtk::Stock::NEW, Gtk::ICON_SIZE_BUTTON))); @@ -915,6 +921,8 @@ NewSessionDialog::notebook_page_changed (GtkNotebookPage* np, uint pagenum) } else { set_response_sensitive (Gtk::RESPONSE_OK, true); } + last_name_page = NewPage; + break; } } diff --git a/gtk2_ardour/new_session_dialog.h b/gtk2_ardour/new_session_dialog.h index 81a0bebfac..c4495dccd5 100644 --- a/gtk2_ardour/new_session_dialog.h +++ b/gtk2_ardour/new_session_dialog.h @@ -220,6 +220,7 @@ protected: sigc::connection ic_connection; void engine_interface_chosen(); + Pages last_name_page; }; #endif // NEW_SESSION_DIALOG_H diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 42095004fc..eb806c8b7f 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -656,6 +656,12 @@ class Session : public PBD::StatefulDestructible static sigc::signal AskAboutSampleRateMismatch; + class SRMismatchRejected : public std::exception { + public: + SRMismatchRejected () {} + const char* what() const throw() { return "Sample rate mismatch rejected"; } + }; + /* handlers should return !0 for use pending state, 0 for ignore it. */ diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 6e13e3977f..537086bc9e 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1158,10 +1158,10 @@ Session::set_state (const XMLNode& node) if ((prop = node.property (X_("sample-rate"))) != 0) { _nominal_frame_rate = atoi (prop->value()); - + if (_nominal_frame_rate != _current_frame_rate) { if (AskAboutSampleRateMismatch (_nominal_frame_rate, _current_frame_rate)) { - return -1; + throw SRMismatchRejected(); } } } -- cgit v1.2.3