merge exportvis branch into cairocanvas, to reduce the number of "floating" branches.
[ardour.git] / libs / ardour / globals.cc
index 89edc66e8423ea77aac04f415cc0fc02ca57541c..2cd886b03ea9f95858f56da1eef6de3915b90b0b 100644 (file)
@@ -51,8 +51,6 @@
 #undef check /* stupid Apple and their un-namespaced, generic Carbon macros */
 #endif 
 
-#include <giomm.h>
-
 #include <glibmm/fileutils.h>
 #include <glibmm/miscutils.h>
 
@@ -61,6 +59,7 @@
 #include "pbd/cpus.h"
 #include "pbd/error.h"
 #include "pbd/id.h"
+#include "pbd/pbd.h"
 #include "pbd/strsplit.h"
 #include "pbd/fpu.h"
 #include "pbd/file_utils.h"
@@ -109,6 +108,8 @@ using namespace ARDOUR;
 using namespace std;
 using namespace PBD;
 
+bool libardour_initialized = false;
+
 compute_peak_t          ARDOUR::compute_peak = 0;
 find_peaks_t            ARDOUR::find_peaks = 0;
 apply_gain_to_buffer_t  ARDOUR::apply_gain_to_buffer = 0;
@@ -217,21 +218,19 @@ lotsa_files_please ()
        }
 }
 
-int
+bool
 ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir)
 {
-       if (!Glib::thread_supported()) {
-               Glib::thread_init();
+       if (libardour_initialized) {
+               return true;
        }
 
-       // this really should be in PBD::init..if there was one
-       Gio::init ();
+       if (!PBD::init()) return false;
 
 #ifdef ENABLE_NLS
        (void) bindtextdomain(PACKAGE, localedir);
 #endif
 
-       PBD::ID::init ();
        SessionEvent::init_event_pool ();
 
        SessionObject::make_property_quarks ();
@@ -271,7 +270,7 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
        Config = new RCConfiguration;
 
        if (Config->load_state ()) {
-               return -1;
+               return false;
        }
 
        Config->set_use_windows_vst (use_windows_vst);
@@ -284,13 +283,13 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 
 #ifdef WINDOWS_VST_SUPPORT
        if (Config->get_use_windows_vst() && fst_init (0)) {
-               return -1;
+               return false;
        }
 #endif
 
 #ifdef LXVST_SUPPORT
        if (Config->get_use_lxvst() && vstfx_init (0)) {
-               return -1;
+               return false;
        }
 #endif
 
@@ -335,7 +334,9 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 
        ARDOUR::AudioEngine::create ();
 
-       return 0;
+       libardour_initialized = true;
+
+       return true;
 }
 
 void
@@ -353,9 +354,15 @@ ARDOUR::init_post_engine ()
        ARDOUR::PluginManager::instance().refresh ();
 }
 
-int
-ARDOUR::cleanup ()
+void
+ARDOUR::cleanup () 
 {
+       if (!libardour_initialized) {
+               return;
+       }
+
+       ARDOUR::AudioEngine::destroy ();
+
        delete Library;
        lrdf_cleanup ();
        delete &ControlProtocolManager::instance();
@@ -366,8 +373,9 @@ ARDOUR::cleanup ()
 #ifdef LXVST_SUPPORT
        vstfx_exit();
 #endif
-       EnumWriter::destroy ();
-       return 0;
+       PBD::cleanup ();
+
+       return;
 }
 
 void
@@ -517,8 +525,8 @@ ARDOUR::set_translations_enabled (bool yn)
                c = '0';
        }
        
-       ::write (fd, &c, 1);
-       ::close (fd);
+       (void) ::write (fd, &c, 1);
+       (void) ::close (fd);
 
        return true;
 }
@@ -529,7 +537,11 @@ ARDOUR::get_available_sync_options ()
 {
        vector<SyncSource> ret;
 
-       ret.push_back (JACK);
+       boost::shared_ptr<AudioBackend> backend = AudioEngine::instance()->current_backend();
+       if (backend && backend->name() == "JACK") {
+               ret.push_back (Engine);
+       }
+
        ret.push_back (MTC);
        ret.push_back (MIDIClock);
        ret.push_back (LTC);
@@ -540,6 +552,31 @@ ARDOUR::get_available_sync_options ()
 /** Return a monotonic value for the number of microseconds that have elapsed
  * since an arbitrary zero origin.
  */
+
+#ifdef __MACH__
+/* Thanks Apple for not implementing this basic SUSv2, POSIX.1-2001 function
+ */
+#include <mach/mach_time.h>
+#define CLOCK_REALTIME 0
+#define CLOCK_MONOTONIC 0
+int 
+clock_gettime (int /*clk_id*/, struct timespec *t)
+{
+        static bool initialized = false;
+        static mach_timebase_info_data_t timebase;
+        if (!initialized) {
+                mach_timebase_info(&timebase);
+                initialized = true;
+        }
+        uint64_t time;
+        time = mach_absolute_time();
+        double nseconds = ((double)time * (double)timebase.numer)/((double)timebase.denom);
+        double seconds = ((double)time * (double)timebase.numer)/((double)timebase.denom * 1e9);
+        t->tv_sec = seconds;
+        t->tv_nsec = nseconds;
+        return 0;
+}
+#endif
  
 microseconds_t
 ARDOUR::get_microseconds ()