X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd.cc;h=ab0f668f26d93406dc6632fc370b01e88851e22c;hb=cd5a319e4842862fa6e84f35e3781fce73e129cf;hp=dd33f3103bf4527c9faace9fce7fdaf1674f9c90;hpb=1db894f8865bfc8eacfccf623f8d8c458bf87fd8;p=ardour.git diff --git a/libs/pbd/pbd.cc b/libs/pbd/pbd.cc index dd33f3103b..ab0f668f26 100644 --- a/libs/pbd/pbd.cc +++ b/libs/pbd/pbd.cc @@ -19,6 +19,11 @@ #include #include +#include + +#ifdef PLATFORM_WINDOWS +#include +#endif #include @@ -26,16 +31,59 @@ #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 +#include "pbd/windows_timer_utils.h" +#include "pbd/windows_mmcss.h" +#endif + +#include "pbd/i18n.h" -#include "i18n.h" +extern void setup_libpbd_enums (); 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 () @@ -44,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(); } @@ -52,6 +127,10 @@ PBD::init () PBD::ID::init (); + setup_libpbd_enums (); + + set_debug_options_from_env (); + libpbd_initialized = true; return true; } @@ -59,5 +138,11 @@ PBD::init () void PBD::cleanup () { +#ifdef PLATFORM_WINDOWS + PBD::MMCSS::deinitialize (); + WSACleanup(); +#endif + EnumWriter::destroy (); + FPU::destroy (); }