diff --git a/libobs/util/platform-cocoa.m b/libobs/util/platform-cocoa.m index a70b19ed863d05e9c959695996c2d615043c735d..e5f99ca9fb63bc4666a0888c11746f10f37aef9f 100644 --- a/libobs/util/platform-cocoa.m +++ b/libobs/util/platform-cocoa.m @@ -87,14 +87,43 @@ void os_sleep_ms(uint32_t duration) usleep(duration*1000); } + +/* clock function selection taken from libc++ */ +static uint64_t ns_time_simple() +{ + return mach_absolute_time(); +} + +static double ns_time_compute_factor() +{ + mach_timebase_info_data_t info = {1, 1}; + mach_timebase_info(&info); + return ((double)info.numer) / info.denom; +} + +static uint64_t ns_time_full() +{ + static double factor = 0.; + if (factor == 0.) factor = ns_time_compute_factor(); + return (uint64_t)(mach_absolute_time() * factor); +} + +typedef uint64_t (*time_func)(); + +static time_func ns_time_select_func() +{ + mach_timebase_info_data_t info = {1, 1}; + mach_timebase_info(&info); + if (info.denom == info.numer) + return ns_time_simple; + return ns_time_full; +} + uint64_t os_gettime_ns(void) { - uint64_t t = mach_absolute_time(); -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - Nanoseconds nano = AbsoluteToNanoseconds(*(AbsoluteTime*) &t); -#pragma clang diagnostic pop - return *(uint64_t*) &nano; + static time_func f = NULL; + if (!f) f = ns_time_select_func(); + return f(); } /* gets the location ~/Library/Application Support/[name] */