From 46ec57c41502cd287e85cc5c9f4d6bfa069ca85a Mon Sep 17 00:00:00 2001 From: Steve Underwood Date: Fri, 10 May 2013 11:54:20 +0800 Subject: [PATCH] The gettimeofday() function spandsp provided for Windows apparently falls over after 25 hours. I guess not many people are inserting header lines on FAX pages. Hopefully this update fixes the problem. --- libs/spandsp/src/msvc/gettimeofday.c | 34 +++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/libs/spandsp/src/msvc/gettimeofday.c b/libs/spandsp/src/msvc/gettimeofday.c index c59f19e0b8..66422e1087 100644 --- a/libs/spandsp/src/msvc/gettimeofday.c +++ b/libs/spandsp/src/msvc/gettimeofday.c @@ -4,11 +4,33 @@ #include "windows.h" +const unsigned long long int DELTA_EPOCH_IN_MICROSECS = 11644473600000000LLU + void gettimeofday(struct timeval *tv, void *tz) { - long int l = GetTickCount(); - - tv->tv_sec = l / 1000; - tv->tv_usec = (l % 1000) * 1000; - return; -} + FILETIME ft; + unsigned long long int highResolutionTime; + TIME_ZONE_INFORMATION tz_winapi; + int result_tz; + long long int timezone_time_bias_in_minutes; + + ZeroMemory(&ft, sizeof(ft)); + ZeroMemory(&tz_winapi, sizeof(tz_winapi)); + + GetSystemTimeAsFileTime(&ft); + result_tz = GetTimeZoneInformation(&tz_winapi); + timezone_time_bias_in_minutes = tz_winapi.Bias + ((result_tz == TIME_ZONE_ID_DAYLIGHT) ? tz_winapi.DaylightBias : 0); + + highResolutionTime = ft.dwHighDateTime; + highResolutionTime <<= 32; + highResolutionTime |= ft.dwLowDateTime; + + /* Converting file time to unix epoch */ + /* Convert to microseconds */ + highResolutionTime /= 10; + /* Add timezone bias conververt from minutes to microsecond */ + highResolutionTime -= timezone_time_bias_in_minutes*60*1000000; + highResolutionTime -= DELTA_EPOCH_IN_MICROSECS; + tv->tv_sec = (long int) (highResolutionTime/1000000LLU); + tv->tv_usec = (highResolutionTime%1000000LLU); +}