Browse Source

wasapi: use a faster perfomance clock in the normal case

We don't need an expensive lldiv() in the normal case.
In this variant, the read value is simplify divided by 10.
Steve Lhomme 5 years ago
committed by Alexandre Janniaux
parent
commit
ec9b8c4569
  1. 40
      modules/access/wasapi.c
  2. 37
      modules/audio_output/wasapi.c

40
modules/access/wasapi.c

@ -41,6 +41,29 @@
static LARGE_INTEGER freq; /* performance counters frequency */
static msftime_t GetQPC(void)
{
LARGE_INTEGER counter;
if (unlikely(!QueryPerformanceCounter(&counter)))
abort();
lldiv_t d = lldiv(counter.QuadPart, freq.QuadPart);
return (d.quot * 10000000) + ((d.rem * 10000000) / freq.QuadPart);
}
static msftime_t GetQPC_100ns(void)
{
LARGE_INTEGER counter;
if (unlikely(!QueryPerformanceCounter(&counter)))
abort();
return counter.QuadPart;
}
static msftime_t (*get_qpc)(void);
BOOL WINAPI DllMain(HANDLE dll, DWORD reason, LPVOID reserved)
{
(void) dll;
@ -51,22 +74,15 @@ BOOL WINAPI DllMain(HANDLE dll, DWORD reason, LPVOID reserved)
case DLL_PROCESS_ATTACH:
if (!QueryPerformanceFrequency(&freq))
return FALSE;
if (freq.QuadPart == 10000000)
get_qpc = GetQPC_100ns;
else
get_qpc = GetQPC;
break;
}
return TRUE;
}
static msftime_t 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_assert(CLOCK_FREQ * 10 == 10000000,
"REFERENCE_TIME conversion broken");
@ -324,7 +340,7 @@ static unsigned __stdcall Thread(void *data)
if (hr != S_OK)
continue;
pts = vlc_tick_now() - VLC_TICK_FROM_MSFTIME(GetQPC() - qpc);
pts = vlc_tick_now() - VLC_TICK_FROM_MSFTIME(get_qpc() - qpc);
es_out_SetPCR(demux->out, pts);

37
modules/audio_output/wasapi.c

@ -69,25 +69,46 @@ DEFINE_GUID(_KSDATAFORMAT_SUBTYPE_IEC61937_DOLBY_MLP,
0x000c, 0x0cea, 0x0010, 0x80, 0x00,
0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
static BOOL CALLBACK InitFreq(INIT_ONCE *once, void *param, void **context)
{
(void) once; (void) context;
return QueryPerformanceFrequency(param);
}
static LARGE_INTEGER freq; /* performance counters frequency */
static msftime_t GetQPC(void)
{
LARGE_INTEGER counter;
if (!QueryPerformanceCounter(&counter))
if (unlikely(!QueryPerformanceCounter(&counter)))
abort();
lldiv_t d = lldiv(counter.QuadPart, freq.QuadPart);
return (d.quot * 10000000) + ((d.rem * 10000000) / freq.QuadPart);
}
static msftime_t GetQPC_100ns(void)
{
LARGE_INTEGER counter;
if (unlikely(!QueryPerformanceCounter(&counter)))
abort();
return counter.QuadPart;
}
static msftime_t (*get_qpc)(void);
static BOOL CALLBACK InitFreq(INIT_ONCE *once, void *param, void **context)
{
(void) once; (void) context;
LARGE_INTEGER *qpc_freq = param;
BOOL res = QueryPerformanceFrequency(qpc_freq);
if (res)
{
if (qpc_freq->QuadPart == 10000000)
get_qpc = GetQPC_100ns;
else
get_qpc = GetQPC;
}
return res;
}
typedef struct aout_stream_sys
{
IAudioClient *client;
@ -151,7 +172,7 @@ static HRESULT TimeGet(aout_stream_t *s, vlc_tick_t *restrict delay)
static_assert((10000000 % CLOCK_FREQ) == 0, "Frequency conversion broken");
*delay = written - tick_pos
- VLC_TICK_FROM_MSFTIME(GetQPC() - qpcpos);
- VLC_TICK_FROM_MSFTIME(get_qpc() - qpcpos);
return hr;
}

Loading…
Cancel
Save