on session-load: skip output-change-handler until IOs are restored
[ardour.git] / libs / ardour / globals.cc
index c2d524ccc78b6424d7c67a4c2f91ed78b544921d..4c91956ffda0d1151f98b34e43dd27899578b5eb 100644 (file)
@@ -21,6 +21,7 @@
 #endif
 
 #include <cstdio> // Needed so that libraptor (included in lrdf) won't complain
+#include <cstdlib>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <xmmintrin.h>
 #endif
 
+#ifdef check
+#undef check /* stupid Apple and their un-namespaced, generic Carbon macros */
+#endif 
+
 #include <giomm.h>
 
 #include <glibmm/fileutils.h>
@@ -52,6 +57,7 @@
 
 #include <lrdf.h>
 
+#include "pbd/cpus.h"
 #include "pbd/error.h"
 #include "pbd/id.h"
 #include "pbd/strsplit.h"
@@ -108,6 +114,7 @@ mix_buffers_with_gain_t ARDOUR::mix_buffers_with_gain = 0;
 mix_buffers_no_gain_t   ARDOUR::mix_buffers_no_gain = 0;
 
 PBD::Signal1<void,std::string> ARDOUR::BootMessage;
+PBD::Signal0<void> ARDOUR::GUIIdle;
 
 namespace ARDOUR {
 extern void setup_enum_writer ();
@@ -199,10 +206,8 @@ lotsa_files_please ()
                                error << string_compose (_("Could not set system open files limit to %1"), rl.rlim_cur) << endmsg;
                        }
                } else {
-                       if (rl.rlim_cur == RLIM_INFINITY) {
-                               info << _("Removed open file count limit. Excellent!") << endmsg;
-                       } else {
-                               info << string_compose (_("%1 will be limited to %2 open files"), PROGRAM_NAME, rl.rlim_cur) << endmsg;
+                       if (rl.rlim_cur != RLIM_INFINITY) {
+                               info << string_compose (_("Your system is configured to limit %1 to only %2 open files"), PROGRAM_NAME, rl.rlim_cur) << endmsg;
                        }
                }
        } else {
@@ -211,7 +216,7 @@ lotsa_files_please ()
 }
 
 int
-ARDOUR::init (bool use_windows_vst, bool try_optimization)
+ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir)
 {
        if (!Glib::thread_supported()) {
                Glib::thread_init();
@@ -220,7 +225,9 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization)
        // this really should be in PBD::init..if there was one
        Gio::init ();
 
-       (void) bindtextdomain(PACKAGE, LOCALEDIR);
+#ifdef ENABLE_NLS
+       (void) bindtextdomain(PACKAGE, localedir);
+#endif
 
        PBD::ID::init ();
        SessionEvent::init_event_pool ();
@@ -298,7 +305,11 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization)
        (void) PluginManager::instance();
 
         ProcessThread::init ();
-        BufferManager::init (10); // XX should be num_processors_for_dsp + 1 for the GUI thread
+       /* the + 4 is a bit of a handwave. i don't actually know
+          how many more per-thread buffer sets we need above
+          the h/w concurrency, but its definitely > 1 more.
+       */
+        BufferManager::init (hardware_concurrency() + 4); 
 
         PannerManager::instance().discover_panners();
 
@@ -455,15 +466,72 @@ ARDOUR::setup_fpu ()
 #endif
 }
 
+/* this can be changed to modify the translation behaviour for
+   cases where the user has never expressed a preference.
+*/
+static const bool translate_by_default = true;
+
 string
-ARDOUR::translation_kill_path ()
+ARDOUR::translation_enable_path ()
 {
-        return Glib::build_filename (user_config_directory(), ".love_is_the_language_of_audio");
+        return Glib::build_filename (user_config_directory(), ".translate");
 }
 
 bool
-ARDOUR::translations_are_disabled ()
+ARDOUR::translations_are_enabled ()
 {
-        /* if file does not exist, we don't translate (bundled ardour only) */
-        return Glib::file_test (translation_kill_path(), Glib::FILE_TEST_EXISTS) == false;
+       int fd = ::open (ARDOUR::translation_enable_path().c_str(), O_RDONLY);
+
+       if (fd < 0) {
+               return translate_by_default;
+       }
+
+       char c;
+       bool ret = false;
+
+       if (::read (fd, &c, 1) == 1 && c == '1') {
+               ret = true;
+       }
+
+       ::close (fd);
+
+       return ret;
+}
+
+bool
+ARDOUR::set_translations_enabled (bool yn)
+{
+       string i18n_enabler = ARDOUR::translation_enable_path();
+       int fd = ::open (i18n_enabler.c_str(), O_WRONLY|O_CREAT|O_TRUNC, 0644);
+
+       if (fd < 0) {
+               return false;
+       }
+       
+       char c;
+       
+       if (yn) {
+               c = '1';
+       } else {
+               c = '0';
+       }
+       
+       ::write (fd, &c, 1);
+       ::close (fd);
+
+       return true;
+}
+
+
+vector<SyncSource>
+ARDOUR::get_available_sync_options ()
+{
+       vector<SyncSource> ret;
+
+       ret.push_back (JACK);
+       ret.push_back (MTC);
+       ret.push_back (MIDIClock);
+       ret.push_back (LTC);
+
+       return ret;
 }