mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-10 15:36:24 +01:00
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
This commit is contained in:
parent
58c2acc99e
commit
9bca2cd6f8
5 changed files with 50 additions and 24 deletions
|
|
@ -25,6 +25,7 @@
|
|||
#include <time.h>
|
||||
#include <cerrno>
|
||||
#include <fstream>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
case EnginePage:
|
||||
/* new or audio setup pages */
|
||||
if (!(page_set & OpenPage) && !(page_set & NewPage)) {
|
||||
return Glib::filename_from_utf8(engine_page_session_name);
|
||||
}
|
||||
return Glib::filename_from_utf8(m_name->get_text());
|
||||
|
||||
case EnginePage:
|
||||
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 */
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -220,6 +220,7 @@ protected:
|
|||
|
||||
sigc::connection ic_connection;
|
||||
void engine_interface_chosen();
|
||||
Pages last_name_page;
|
||||
};
|
||||
|
||||
#endif // NEW_SESSION_DIALOG_H
|
||||
|
|
|
|||
|
|
@ -656,6 +656,12 @@ class Session : public PBD::StatefulDestructible
|
|||
|
||||
static sigc::signal<int,nframes_t, nframes_t> 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.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue