diff options
-rw-r--r-- | osdep/timer-win2.c | 12 | ||||
-rw-r--r-- | osdep/timer.c | 9 | ||||
-rw-r--r-- | player/main.c | 4 |
3 files changed, 18 insertions, 7 deletions
diff --git a/osdep/timer-win2.c b/osdep/timer-win2.c index 136bb0becc..ed09ed18db 100644 --- a/osdep/timer-win2.c +++ b/osdep/timer-win2.c @@ -21,6 +21,7 @@ #include <windows.h> #include <sys/time.h> #include <mmsystem.h> +#include <stdlib.h> #include "timer.h" void mp_sleep_us(int64_t us) @@ -42,8 +43,15 @@ uint64_t mp_raw_time_us(void) return tv.tv_sec * 1000000LL + tv.tv_usec; } +static void restore_timer(void) +{ + // The MSDN documents that begin/end "must" be matched. This satisfies + // this requirement. + timeEndPeriod(1); +} + void mp_raw_time_init(void) { - // request 1ms timer resolution - timeBeginPeriod(1); + timeBeginPeriod(1); // request 1ms timer resolution + atexit(restore_timer); } diff --git a/osdep/timer.c b/osdep/timer.c index d8dd49b9f7..f2c64959ab 100644 --- a/osdep/timer.c +++ b/osdep/timer.c @@ -16,12 +16,14 @@ */ #include <stdlib.h> +#include <pthread.h> #include "timer.h" static uint64_t raw_time_offset; +pthread_once_t timer_init_once = PTHREAD_ONCE_INIT; -void mp_time_init(void) +static void do_timer_init(void) { mp_raw_time_init(); srand(mp_raw_time_us()); @@ -32,6 +34,11 @@ void mp_time_init(void) raw_time_offset -= 10000000; } +void mp_time_init(void) +{ + pthread_once(&timer_init_once, do_timer_init); +} + int64_t mp_time_us(void) { return mp_raw_time_us() - raw_time_offset; diff --git a/player/main.c b/player/main.c index 1709776fa7..e0371cc5ca 100644 --- a/player/main.c +++ b/player/main.c @@ -130,10 +130,6 @@ static MP_NORETURN void exit_player(struct MPContext *mpctx, mp_lua_uninit(mpctx); #endif -#if defined(__MINGW32__) - timeEndPeriod(1); -#endif - #if HAVE_COCOA cocoa_set_input_context(NULL); #endif |