cleanup a couple of audio file format names as reported by libsndfile
[ardour.git] / gtk2_ardour / ardour_ui.cc
index be60ac728e68b6c0fbd5dfc0fa7ccd94dbed9f6a..2d4e94883494a1bf291d578e1b5bb2bbd489e667 100644 (file)
@@ -25,6 +25,7 @@
 #include <time.h>
 #include <cerrno>
 #include <fstream>
+#include <stdlib.h>
 
 #include <iostream>
 
@@ -569,7 +570,7 @@ ARDOUR_UI::update_autosave ()
 {
         ENSURE_GUI_THREAD (mem_fun (*this, &ARDOUR_UI::update_autosave));
         
-        if (session->dirty()) {
+        if (session && session->dirty()) {
                 if (_autosave_connection.connected()) {
                         _autosave_connection.disconnect();
                 }
@@ -1160,6 +1161,7 @@ ARDOUR_UI::check_audioengine ()
                        MessageDialog msg (_("Ardour is not connected to JACK\n"
                                             "You cannot open or close sessions in this condition"));
                        pop_back_splash ();
+                       msg.set_position (WIN_POS_CENTER);
                        msg.run ();
                        return false;
                }
@@ -1182,7 +1184,7 @@ ARDOUR_UI::open_session ()
 
                /* ardour sessions are folders */
 
-               open_session_selector = new Gtk::FileChooserDialog (_("open session"), FILE_CHOOSER_ACTION_OPEN);
+               open_session_selector = new Gtk::FileChooserDialog (_("Open Session"), FILE_CHOOSER_ACTION_OPEN);
                open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
                open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT);
                open_session_selector->set_default_response(Gtk::RESPONSE_ACCEPT);
@@ -1848,6 +1850,7 @@ ARDOUR_UI::snapshot_session ()
 
        prompter.set_name ("Prompter");
        prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
+       prompter.set_title (_("Take Snapshot"));
        prompter.set_prompt (_("Name of New Snapshot"));
        prompter.set_initial_text (timebuf);
 
@@ -1856,13 +1859,13 @@ ARDOUR_UI::snapshot_session ()
        case RESPONSE_ACCEPT:
                prompter.get_result (snapname);
                if (snapname.length()){
-                       if (snapname.find ('/')) {
+                       if (snapname.find ('/') != string::npos) {
                                MessageDialog msg (_("To ensure compatibility with various systems\n"
                                                     "snapshot names may not contain a '/' character"));
                                msg.run ();
                                goto again;
                        }
-                       if (snapname.find ('\\')) {
+                       if (snapname.find ('\\') != string::npos) {
                                MessageDialog msg (_("To ensure compatibility with various systems\n"
                                                     "snapshot names may not contain a '\\' character"));
                                msg.run ();
@@ -1953,7 +1956,6 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
 
 void
 ARDOUR_UI::save_template ()
-
 {
        ArdourPrompter prompter (true);
        string name;
@@ -1963,6 +1965,7 @@ ARDOUR_UI::save_template ()
        }
 
        prompter.set_name (X_("Prompter"));
+       prompter.set_title (_("Save Mix Template"));
        prompter.set_prompt (_("Name for mix template:"));
        prompter.set_initial_text(session->name() + _("-template"));
        prompter.add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT);
@@ -1984,6 +1987,9 @@ ARDOUR_UI::save_template ()
 void
 ARDOUR_UI::fontconfig_dialog ()
 {
+#if 0
+  /* this issue seems to have gone away with changes to font handling in GTK/Quartz
+   */
 #ifdef GTKOSX
        /* X11 users will always have fontconfig info around, but new GTK-OSX users 
           may not and it can take a while to build it. Warn them.
@@ -2007,6 +2013,7 @@ ARDOUR_UI::fontconfig_dialog ()
                msg.run ();
        }
 #endif
+#endif
 }
 
 void
@@ -2090,6 +2097,7 @@ ARDOUR_UI::ask_about_loading_existing_session (const Glib::ustring& session_path
        
        
        msg.set_name (X_("CleanupDialog"));
+       msg.set_title (_("Cleanup Unused Sources"));
        msg.set_wmclass (X_("existing_session"), "Ardour");
        msg.set_position (Gtk::WIN_POS_MOUSE);
        pop_back_splash ();
@@ -2301,15 +2309,21 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be
                                response = Gtk::RESPONSE_REJECT;
                                goto try_again;
                        }
+                       
+                       /* hide the NSD while we start up the engine */
+
+                       new_session_dialog->hide ();
+                       flush_pending ();
                }
-               
+
                if (create_engine ()) {
 
                        backend_audio_error (!backend_audio_is_running, new_session_dialog);
                        flush_pending ();
 
                        new_session_dialog->set_existing_session (false);
-                       new_session_dialog->set_current_page (2);
+                       new_session_dialog->set_current_page (0); // new engine page
+                       new_session_dialog->engine_control.unset_interface_chosen ();
 
                        response = Gtk::RESPONSE_NONE;
                        goto try_again;
@@ -2320,7 +2334,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;
@@ -2338,23 +2352,31 @@ 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();                        
                        switch (new_session_dialog->which_page()) {
 
                        case NewSessionDialog::OpenPage: 
-                       case NewSessionDialog::EnginePage:
                                goto loadit;
                                break;
 
+                       case NewSessionDialog::EnginePage:
+                               if (new_session_dialog->engine_control.interface_chosen() && !session_path.empty()) {
+                                       goto loadit;
+                               } else {
+                                       goto try_again;
+                               }
+                               break;
+
                        case NewSessionDialog::NewPage: /* nominally the "new" session creator, but could be in use for an old session */
                                
                                should_be_new = true;
 
-                               if (session_name.find ('/')) {
+                               if (session_name.find ('/') != Glib::ustring::npos) {
                                        MessageDialog msg (*new_session_dialog, _("To ensure compatibility with various systems\n"
                                                         "session names may not contain a '/' character"));
                                        msg.run ();
@@ -2362,7 +2384,7 @@ ARDOUR_UI::get_session_parameters (bool backend_audio_is_running, bool should_be
                                        goto try_again;
                                }
 
-                               if (session_name.find ('\\')) {
+                               if (session_name.find ('\\') != Glib::ustring::npos) {
                                        MessageDialog msg (*new_session_dialog, _("To ensure compatibility with various systems\n"
                                                         "session names may not contain a '\\' character"));
                                        msg.run ();
@@ -2377,6 +2399,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 {
@@ -2466,16 +2490,6 @@ ARDOUR_UI::load_session (const Glib::ustring& path, const Glib::ustring& snap_na
                goto out;
        }
 
-       /* if it already exists, we must have write access */
-
-       if (Glib::file_test (path.c_str(), Glib::FILE_TEST_EXISTS) && ::access (path.c_str(), W_OK)) {
-               MessageDialog msg (*editor, _("You do not have write access to this session.\n"
-                                             "This prevents the session from being loaded."));
-               pop_back_splash ();
-               msg.run ();
-               goto out;
-       }
-
        loading_message (_("Please wait while Ardour loads your session"));
 
        try {
@@ -2510,6 +2524,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),
@@ -2628,6 +2648,8 @@ ARDOUR_UI::show_about ()
                about->signal_response().connect(mem_fun (*this, &ARDOUR_UI::about_signal_response) );
        }
 
+       about->set_transient_for(*editor);
+
        about->show_all ();
 }
 
@@ -2683,7 +2705,8 @@ ARDOUR_UI::hide_splash ()
 }
 
 void
-ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, const string & msg)
+ARDOUR_UI::display_cleanup_results (Session::cleanup_report& rep, const gchar* list_title, 
+                                   const string& plural_msg, const string& singular_msg)
 {
        size_t removed;
 
@@ -2738,18 +2761,32 @@ require some unused files to continue to exist."));
 
        dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP);
 
-       if (rep.space < 1048576.0f) {
-               if (removed > 1) {
-                 txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
-               } else {
-                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo"));
-               }
+
+       /* subst:
+          %1 - number of files removed
+          %2 - location of "dead_sounds"
+          %3 - size of files affected
+          %4 - prefix for "bytes" to produce sensible results (e.g. mega, kilo, giga)
+       */
+
+       const char* bprefix;
+       float space_adjusted;
+
+       if (rep.space < 1000000.0f) {
+               bprefix = X_("kilo");
+               space_adjusted = truncf((float)rep.space / 1000.0f);
+       } else if (rep.space < (1000000.0f * 1000)) {
+               bprefix = X_("mega");
+               space_adjusted = truncf((float)rep.space / (1000000.0f));
        } else {
-               if (removed > 1) {
-                       txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
-               } else {
-                       txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega"));
-               }
+               bprefix = X_("giga");
+               space_adjusted = truncf((float)rep.space / (1000000.0f * 1000));
+       }
+
+       if (removed > 1) {
+               txt.set_text (string_compose (plural_msg, removed, session->path() + "dead_sounds", space_adjusted, bprefix));
+       } else {
+               txt.set_text (string_compose (singular_msg, removed, session->path() + "dead_sounds", space_adjusted, bprefix));
        }
 
        dhbox.pack_start (*dimage, true, false, 5);
@@ -2836,12 +2873,19 @@ After cleanup, unused audio files will be moved to a \
        display_cleanup_results (rep, 
                                 _("cleaned files"),
                                 _("\
-The following %1 %2 not in use and \n\
+The following %1 files were not in use and \n\
 have been moved to:\n\
-%3. \n\n\
+%2. \n\n\
 Flushing the wastebasket will \n\
 release an additional\n\
-%4 %5bytes of disk space.\n"
+%3 %4bytes of disk space.\n"),
+                                _("\
+The following file was not in use and \n       \
+has been moved to:\n                           \
+%2. \n\n\
+Flushing the wastebasket will \n\
+release an additional\n\
+%3 %4bytes of disk space.\n"
                                         ));
 
 }
@@ -2862,9 +2906,12 @@ ARDOUR_UI::flush_trash ()
 
        display_cleanup_results (rep, 
                                 _("deleted file"),
-                                _("The following %1 %2 deleted from\n\
-%3,\n\
-releasing %4 %5bytes of disk space"));
+                                _("The following %1 files were deleted from\n\
+%2,\n\
+releasing %3 %4bytes of disk space"),
+                                _("The following file was deleted from\n\
+%2,\n\
+releasing %3 %4bytes of disk space"));
 }
 
 void
@@ -3077,14 +3124,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;