try to fix various warnings from gcc when optimization flags are enabled
[ardour.git] / libs / ardour / globals.cc
index 78994c41017af23185bff66e3e075c0fdc6c0f86..2cd886b03ea9f95858f56da1eef6de3915b90b0b 100644 (file)
@@ -29,6 +29,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <time.h>
 
 #ifdef WINDOWS_VST_SUPPORT
 #include <fst.h>
@@ -50,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>
 
@@ -60,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"
 #include "pbd/basename.h"
 
 #include "midi++/port.h"
-#include "midi++/manager.h"
 #include "midi++/mmc.h"
 
 #include "ardour/analyser.h"
 #include "ardour/audio_library.h"
+#include "ardour/audio_backend.h"
 #include "ardour/audioengine.h"
 #include "ardour/audioplaylist.h"
 #include "ardour/audioregion.h"
@@ -79,6 +79,7 @@
 #include "ardour/control_protocol_manager.h"
 #include "ardour/filesystem_paths.h"
 #include "ardour/midi_region.h"
+#include "ardour/midiport_manager.h"
 #include "ardour/mix.h"
 #include "ardour/panner_manager.h"
 #include "ardour/plugin_manager.h"
@@ -224,18 +225,12 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
                return true;
        }
 
-       if (!Glib::thread_supported()) {
-               Glib::thread_init();
-       }
-
-       // 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 ();
@@ -337,6 +332,8 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
        EventTypeMap::instance().new_parameter(EnvelopeAutomation);
        EventTypeMap::instance().new_parameter(MidiCCAutomation);
 
+       ARDOUR::AudioEngine::create ();
+
        libardour_initialized = true;
 
        return true;
@@ -345,9 +342,6 @@ ARDOUR::init (bool use_windows_vst, bool try_optimization, const char* localedir
 void
 ARDOUR::init_post_engine ()
 {
-       /* the MIDI Manager is needed by the ControlProtocolManager */
-       MIDI::Manager::create (AudioEngine::instance()->jack());
-
        ControlProtocolManager::instance().discover_control_protocols ();
 
        XMLNode* node;
@@ -360,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();
@@ -373,8 +373,9 @@ ARDOUR::cleanup ()
 #ifdef LXVST_SUPPORT
        vstfx_exit();
 #endif
-       EnumWriter::destroy ();
-       return 0;
+       PBD::cleanup ();
+
+       return;
 }
 
 void
@@ -524,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;
 }
@@ -536,10 +537,54 @@ 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);
 
        return ret;
 }
+
+/** 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 ()
+{
+       struct timespec ts;
+       if (clock_gettime (CLOCK_MONOTONIC, &ts) != 0) {
+               /* EEEK! */
+               return 0;
+       }
+       return (microseconds_t) ts.tv_sec * 1000000 + (ts.tv_nsec/1000);
+}