diff --git a/src/win32/thread.c b/src/win32/thread.c index dedf1d47028dcee3b91391050d26b7295d85deba..4602eb3e53d2506dc4a6a8312c5b28bf9f4a91b6 100644 --- a/src/win32/thread.c +++ b/src/win32/thread.c @@ -564,16 +564,20 @@ static vlc_tick_t mdate_perf_100ns(void) return VLC_TICK_FROM_MSFTIME(counter.QuadPart); } +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 +static void (WINAPI *SystemTimeAsFileTime_)(LPFILETIME) = GetSystemTimeAsFileTime; +#endif // _WIN32_WINNT < _WIN32_WINNT_WIN8 + static vlc_tick_t mdate_wall (void) { FILETIME ts; ULARGE_INTEGER s; -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) && (!defined(VLC_WINSTORE_APP) || _WIN32_WINNT >= 0x0A00) +#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 GetSystemTimePreciseAsFileTime (&ts); -#else - GetSystemTimeAsFileTime (&ts); -#endif +#else // _WIN32_WINNT < _WIN32_WINNT_WIN8 + SystemTimeAsFileTime_ (&ts); +#endif // _WIN32_WINNT < _WIN32_WINNT_WIN8 s.LowPart = ts.dwLowDateTime; s.HighPart = ts.dwHighDateTime; /* hundreds of nanoseconds */ @@ -665,6 +669,12 @@ static void SelectClockSource(libvlc_int_t *obj) if (!strcmp (name, "wall")) { msg_Dbg (obj, "using system time as clock source"); +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 + HMODULE h = GetModuleHandle(TEXT("kernel32.dll")); + SystemTimeAsFileTime_ = (void*)GetProcAddress(h, "GetSystemTimePreciseAsFileTime"); + if (unlikely(SystemTimeAsFileTime_ == NULL)) // win7 + SystemTimeAsFileTime_ = GetSystemTimeAsFileTime; +#endif // _WIN32_WINNT < _WIN32_WINNT_WIN8 mdate_selected = mdate_wall; } else diff --git a/src/win32/timer.c b/src/win32/timer.c index ee1ce62294d42352e34b55d5dfe98d361f9298eb..d8be662c402d0a204822b6df3e1f44cf56602358 100644 --- a/src/win32/timer.c +++ b/src/win32/timer.c @@ -44,10 +44,25 @@ static VOID CALLBACK timer_callback(PTP_CALLBACK_INSTANCE instance, timer->func(timer->data); } +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 +static vlc_once_t TIMER_INIT_FUNC = VLC_STATIC_ONCE; +static void (WINAPI *SystemTimeAsFileTime_)(LPFILETIME); +#endif // _WIN32_WINNT < _WIN32_WINNT_WIN8 + int vlc_timer_create (vlc_timer_t *id, void (*func) (void *), void *data) { struct vlc_timer *timer = malloc (sizeof (*timer)); +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 + if (unlikely(!vlc_once_begin(&TIMER_INIT_FUNC))) { + HMODULE h = GetModuleHandle(TEXT("kernel32.dll")); + SystemTimeAsFileTime_ = (void*)GetProcAddress(h, "GetSystemTimePreciseAsFileTime"); + if (unlikely(SystemTimeAsFileTime_ == NULL)) // win7 + SystemTimeAsFileTime_ = GetSystemTimeAsFileTime; + vlc_once_complete(&TIMER_INIT_FUNC); + } +#endif // _WIN32_WINNT < _WIN32_WINNT_WIN8 + if (timer == NULL) return ENOMEM; timer->t = CreateThreadpoolTimer(timer_callback, timer, NULL); @@ -94,11 +109,11 @@ void vlc_timer_schedule (vlc_timer_t timer, bool absolute, /* Get the system FILETIME */ FILETIME time; -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) && (!defined(VLC_WINSTORE_APP) || _WIN32_WINNT >= 0x0A00) +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 + SystemTimeAsFileTime_(&time); +#else // _WIN32_WINNT >= _WIN32_WINNT_WIN8 GetSystemTimePreciseAsFileTime(&time); -#else - GetSystemTimeAsFileTime(&time); -#endif +#endif // _WIN32_WINNT >= _WIN32_WINNT_WIN8 /* Convert it to ULARGE_INTEGER to allow calculation (addition here) */ ULARGE_INTEGER time_ul = {