X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd.cc;h=ab0f668f26d93406dc6632fc370b01e88851e22c;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=1bf977c90a0d51a935ce6d50de4e8ffbf56f33e3;hpb=e6521bb0434d88802aa28e75235bc8c19ebb9262;p=ardour.git diff --git a/libs/pbd/pbd.cc b/libs/pbd/pbd.cc index 1bf977c90a..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,10 +31,18 @@ #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 "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 (); }