vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Mon Sep 3 14:34:13 2012 +0300| [eb7da3f02bc22f8f14c3d6cfa95b271e356de7be] | committer: Rémi Denis-Courmont
wasapi: do not assume mdate() returns the performance counter > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=eb7da3f02bc22f8f14c3d6cfa95b271e356de7be --- modules/audio_output/wasapi.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/modules/audio_output/wasapi.c b/modules/audio_output/wasapi.c index 8eeda67..73e9de0 100644 --- a/modules/audio_output/wasapi.c +++ b/modules/audio_output/wasapi.c @@ -26,6 +26,7 @@ #define COBJMACROS #define CONST_VTABLE +#include <stdlib.h> #include <assert.h> #include <audioclient.h> #include <audiopolicy.h> @@ -55,6 +56,36 @@ vlc_module_begin() set_callbacks(Open, Close) vlc_module_end() +static LARGE_INTEGER freq; /* performance counters frequency */ + +BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID); /* avoid warning */ + +BOOL WINAPI DllMain(HINSTANCE dll, DWORD reason, LPVOID reserved) +{ + (void) dll; + (void) reserved; + + switch (reason) + { + case DLL_PROCESS_ATTACH: + if (!QueryPerformanceFrequency(&freq)) + return FALSE; + break; + } + return TRUE; +} + +static UINT64 GetQPC(void) +{ + LARGE_INTEGER counter; + + if (!QueryPerformanceCounter(&counter)) + abort(); + + lldiv_t d = lldiv(counter.QuadPart, freq.QuadPart); + return (d.quot * 10000000) + ((d.rem * 10000000) / freq.QuadPart); +} + static int TryEnter(vlc_object_t *obj) { HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); @@ -107,12 +138,13 @@ static void Play(audio_output_t *aout, block_t *block, mtime_t *restrict drift) { UINT64 pos, qpcpos; - /* NOTE: this assumes mdate() uses QPC() (which it currently does). */ hr = IAudioClock_GetPosition(sys->clock, &pos, &qpcpos); if (SUCCEEDED(hr)) { - qpcpos = (qpcpos + 5) / 10; /* 100ns -> 1µs */ - *drift = mdate() - qpcpos; + qpcpos = GetQPC() - qpcpos; + static_assert((10000000 % CLOCK_FREQ) == 0, + "Frequency conversion broken"); + *drift = qpcpos / (10000000 / CLOCK_FREQ); } else msg_Warn(aout, "cannot get position (error 0x%lx)", hr); _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org http://mailman.videolan.org/listinfo/vlc-commits