diff options
Diffstat (limited to 'osdep/timer-win2.c')
-rw-r--r-- | osdep/timer-win2.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/osdep/timer-win2.c b/osdep/timer-win2.c index 63c423560f..72bcca5b4e 100644 --- a/osdep/timer-win2.c +++ b/osdep/timer-win2.c @@ -19,12 +19,39 @@ #include <sys/time.h> #include <mmsystem.h> #include <stdlib.h> +#include <versionhelpers.h> + #include "timer.h" #include "config.h" static LARGE_INTEGER perf_freq; +// ms values +static int hires_max = 50; +static int hires_res = 1; + +int mp_start_hires_timers(int wait_ms) +{ +#if !HAVE_UWP + // policy: request hires_res ms resolution if wait < hires_max ms + if (wait_ms > 0 && wait_ms <= hires_max && + timeBeginPeriod(hires_res) == TIMERR_NOERROR) + { + return hires_res; + } +#endif + return 0; +} + +void mp_end_hires_timers(int res_ms) +{ +#if !HAVE_UWP + if (res_ms > 0) + timeEndPeriod(res_ms); +#endif +} + void mp_sleep_us(int64_t us) { if (us < 0) @@ -34,7 +61,9 @@ void mp_sleep_us(int64_t us) // it may take some time until it actually starts to run again if (us < 1000) us = 1000; + int hrt = mp_start_hires_timers(us / 1000); Sleep(us / 1000); + mp_end_hires_timers(hrt); } uint64_t mp_raw_time_us(void) @@ -52,7 +81,37 @@ uint64_t mp_raw_time_us(void) void mp_raw_time_init(void) { QueryPerformanceFrequency(&perf_freq); + #if !HAVE_UWP - timeBeginPeriod(1); // request 1ms timer resolution + // allow (undocumented) control of all the High Res Timers parameters, + // for easier experimentation and diagnostic of bug reports. + const char *v; + + // 1..1000 ms max timetout for hires (used in "perwait" mode) + if ((v = getenv("MPV_HRT_MAX"))) { + int hmax = atoi(v); + if (hmax >= 1 && hmax <= 1000) + hires_max = hmax; + } + + // 1..15 ms hires resolution (not used in "never" mode) + if ((v = getenv("MPV_HRT_RES"))) { + int res = atoi(v); + if (res >= 1 && res <= 15) + hires_res = res; + } + + // "always"/"never"/"perwait" (or "auto" - same as unset) + if (!(v = getenv("MPV_HRT")) || !strcmp(v, "auto")) + v = IsWindows10OrGreater() ? "perwait" : "always"; + + if (!strcmp(v, "perwait")) { + // no-op, already per-wait + } else if (!strcmp(v, "never")) { + hires_max = 0; + } else { // "always" or unknown value + hires_max = 0; + timeBeginPeriod(hires_res); + } #endif } |