enough with umpteen "i18n.h" files. Consolidate on pbd/i18n.h
[ardour.git] / libs / pbd / pbd.cc
index 1bf977c90a0d51a935ce6d50de4e8ffbf56f33e3..ab0f668f26d93406dc6632fc370b01e88851e22c 100644 (file)
 
 #include <iostream>
 #include <cstdlib>
+#include <string>
+
+#ifdef PLATFORM_WINDOWS
+#include <fcntl.h>
+#endif
 
 #include <giomm.h>
 
 
 #include "pbd/pbd.h"
 #include "pbd/debug.h"
+#include "pbd/error.h"
 #include "pbd/id.h"
 #include "pbd/enumwriter.h"
+#include "pbd/fpu.h"
+
+#ifdef PLATFORM_WINDOWS
+#include <winsock2.h>
+#include "pbd/windows_timer_utils.h"
+#include "pbd/windows_mmcss.h"
+#endif
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 extern void setup_libpbd_enums ();
 
@@ -37,7 +50,40 @@ namespace {
 
 static bool libpbd_initialized = false;
 
+static
+void
+set_debug_options_from_env ()
+{
+       bool set;
+       std::string options;
+
+       options = Glib::getenv ("PBD_DEBUG", set);
+       if (set) {
+               std::cerr << X_("PBD_DEBUG=") << options << std::endl;
+               PBD::parse_debug_options (options.c_str());
+       }
+}
+
+#ifdef PLATFORM_WINDOWS
+static
+void
+test_timers_from_env ()
+{
+       bool set;
+       std::string options;
+
+       options = Glib::getenv ("PBD_TEST_TIMERS", set);
+       if (set) {
+               if (!PBD::QPC::check_timer_valid ()) {
+                       PBD::error << X_("Windows QPC Timer source not usable") << endmsg;
+               } else {
+                       PBD::info << X_("Windows QPC Timer source usable") << endmsg;
+               }
+       }
 }
+#endif
+
+} // namespace
 
 bool
 PBD::init ()
@@ -46,6 +92,33 @@ PBD::init ()
                return true;
        }
 
+#ifdef PLATFORM_WINDOWS
+       // Essential!!  Make sure that any files used by Ardour
+       //              will be created or opened in BINARY mode!
+       _fmode = O_BINARY;
+
+       WSADATA wsaData;
+
+       /* Initialize windows socket DLL for PBD::CrossThreadChannel
+        */
+
+       if (WSAStartup(MAKEWORD(1,1),&wsaData) != 0) {
+               fatal << X_("Windows socket initialization failed with error: ") << WSAGetLastError() << endmsg;
+               abort();
+               /*NOTREACHED*/
+               return false;
+       }
+
+       QPC::initialize();
+       test_timers_from_env ();
+
+       if (!PBD::MMCSS::initialize()) {
+               PBD::info << X_("Unable to initialize MMCSS") << endmsg;
+       } else {
+               PBD::info << X_("MMCSS Initialized") << endmsg;
+       }
+#endif
+
        if (!Glib::thread_supported()) {
                Glib::thread_init();
        }
@@ -56,6 +129,8 @@ PBD::init ()
 
        setup_libpbd_enums ();
 
+       set_debug_options_from_env ();
+
        libpbd_initialized = true;
        return true;
 }
@@ -63,5 +138,11 @@ PBD::init ()
 void
 PBD::cleanup ()
 {
+#ifdef PLATFORM_WINDOWS
+       PBD::MMCSS::deinitialize ();
+       WSACleanup();
+#endif
+
        EnumWriter::destroy ();
+       FPU::destroy ();
 }