win32: Implement rtclock based on QueryPerformanceCounter

Also remove some unnecessary <time.h> headers.
This commit is contained in:
Maarten Bosmans 2011-01-18 11:26:57 +01:00
parent 5699954d33
commit a39a83665f
9 changed files with 36 additions and 19 deletions

View file

@ -25,7 +25,6 @@
#include <inttypes.h> #include <inttypes.h>
#include <sys/time.h> #include <sys/time.h>
#include <time.h>
#include <pulse/cdecl.h> #include <pulse/cdecl.h>
#include <pulse/sample.h> #include <pulse/sample.h>

View file

@ -24,7 +24,6 @@
***/ ***/
#include <sys/time.h> #include <sys/time.h>
#include <time.h>
#include <pulse/cdecl.h> #include <pulse/cdecl.h>
#include <pulse/sample.h> #include <pulse/sample.h>

View file

@ -23,10 +23,10 @@
#include <config.h> #include <config.h>
#endif #endif
#include <pulse/timeval.h>
#include <pulsecore/core-rtclock.h> #include <pulsecore/core-rtclock.h>
#include "rtclock.h" #include "rtclock.h"
#include "timeval.h"
pa_usec_t pa_rtclock_now(void) { pa_usec_t pa_rtclock_now(void) {
struct timeval tv; struct timeval tv;

View file

@ -37,29 +37,22 @@
#include "timeval.h" #include "timeval.h"
struct timeval *pa_gettimeofday(struct timeval *tv) { struct timeval *pa_gettimeofday(struct timeval *tv) {
#ifdef HAVE_GETTIMEOFDAY
pa_assert(tv); pa_assert(tv);
pa_assert_se(gettimeofday(tv, NULL) == 0); #if defined(OS_IS_WIN32)
return tv;
#elif defined(OS_IS_WIN32)
/* /*
* Copied from implementation by Steven Edwards (LGPL). * Copied from implementation by Steven Edwards (LGPL).
* Found on wine mailing list. * Found on wine mailing list.
*/ */
#if defined(_MSC_VER) || defined(__BORLANDC__) #if defined(_MSC_VER) || defined(__BORLANDC__)
#define EPOCHFILETIME (116444736000000000i64) #define EPOCHFILETIME (116444736000000000i64)
#else #else
#define EPOCHFILETIME (116444736000000000LL) #define EPOCHFILETIME (116444736000000000LL)
#endif #endif
FILETIME ft; FILETIME ft;
LARGE_INTEGER li; LARGE_INTEGER li;
int64_t t; int64_t t;
pa_assert(tv);
GetSystemTimeAsFileTime(&ft); GetSystemTimeAsFileTime(&ft);
li.LowPart = ft.dwLowDateTime; li.LowPart = ft.dwLowDateTime;
li.HighPart = ft.dwHighDateTime; li.HighPart = ft.dwHighDateTime;
@ -68,11 +61,13 @@ struct timeval *pa_gettimeofday(struct timeval *tv) {
t /= 10; /* In microseconds */ t /= 10; /* In microseconds */
tv->tv_sec = (time_t) (t / PA_USEC_PER_SEC); tv->tv_sec = (time_t) (t / PA_USEC_PER_SEC);
tv->tv_usec = (suseconds_t) (t % PA_USEC_PER_SEC); tv->tv_usec = (suseconds_t) (t % PA_USEC_PER_SEC);
#elif defined(HAVE_GETTIMEOFDAY)
return tv; pa_assert_se(gettimeofday(tv, NULL) == 0);
#else #else
#error "Platform lacks gettimeofday() or equivalent function." #error "Platform lacks gettimeofday() or equivalent function."
#endif #endif
return tv;
} }
pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b) { pa_usec_t pa_timeval_diff(const struct timeval *a, const struct timeval *b) {

View file

@ -31,7 +31,6 @@
#include <stdio.h> #include <stdio.h>
#include <inttypes.h> #include <inttypes.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h>
#include <limits.h> #include <limits.h>
#include <sys/stat.h> #include <sys/stat.h>

View file

@ -40,12 +40,20 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#ifdef HAVE_WINDOWS_H
#include <windows.h>
#endif
#include <pulse/timeval.h> #include <pulse/timeval.h>
#include <pulsecore/macro.h> #include <pulsecore/macro.h>
#include <pulsecore/core-error.h> #include <pulsecore/core-error.h>
#include "core-rtclock.h" #include "core-rtclock.h"
#ifdef OS_IS_WIN32
static int64_t counter_freq = 0;
#endif
pa_usec_t pa_rtclock_age(const struct timeval *tv) { pa_usec_t pa_rtclock_age(const struct timeval *tv) {
struct timeval now; struct timeval now;
pa_assert(tv); pa_assert(tv);
@ -88,6 +96,17 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC; tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC;
return tv; return tv;
#elif defined(OS_IS_WIN32)
if (counter_freq > 0) {
LARGE_INTEGER count;
pa_assert_se(QueryPerformanceCounter(&count));
tv->tv_sec = count.QuadPart / counter_freq;
tv->tv_usec = (count.QuadPart % counter_freq) * PA_USEC_PER_SEC / counter_freq;
return tv;
}
#endif /* HAVE_CLOCK_GETTIME */ #endif /* HAVE_CLOCK_GETTIME */
return pa_gettimeofday(tv); return pa_gettimeofday(tv);
@ -118,6 +137,11 @@ pa_bool_t pa_rtclock_hrtimer(void) {
pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0); pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0);
return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC); return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
#elif defined(OS_IS_WIN32)
if (counter_freq > 0)
return counter_freq >= (int64_t) (PA_USEC_PER_SEC/PA_HRTIMER_THRESHOLD_USEC);
#endif /* HAVE_CLOCK_GETTIME */ #endif /* HAVE_CLOCK_GETTIME */
return FALSE; return FALSE;
@ -148,6 +172,12 @@ void pa_rtclock_hrtimer_enable(void) {
} }
} }
#elif defined(OS_IS_WIN32)
LARGE_INTEGER freq;
pa_assert_se(QueryPerformanceFrequency(&freq));
counter_freq = freq.QuadPart;
#endif #endif
} }

View file

@ -34,11 +34,9 @@
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#include <time.h>
#include <ctype.h> #include <ctype.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h>
#include <dirent.h> #include <dirent.h>
#ifdef HAVE_LANGINFO_H #ifdef HAVE_LANGINFO_H

View file

@ -23,8 +23,6 @@
#include <config.h> #include <config.h>
#endif #endif
#include <sys/time.h>
#include <time.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>

View file

@ -25,7 +25,6 @@
#include <inttypes.h> #include <inttypes.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>
#include <time.h>
#include <pulse/sample.h> #include <pulse/sample.h>
#include <pulse/channelmap.h> #include <pulse/channelmap.h>