wasapi: Fixed underruns in the Exclusive mode on UWP platform (or when timeBeginPeriod does not allow to set 1 ms granularity) by assuming that system timer granularity on UWP equals to 10 msec, make sure time to sleep provided by GetNextSleepTime is aligned to the granularity of the system timer.
This commit is contained in:
parent
e5279859ce
commit
f3924081ab
1 changed files with 10 additions and 4 deletions
|
|
@ -825,7 +825,7 @@ static inline UINT32 ThreadIdleScheduler_NextSleep(ThreadIdleScheduler *sched)
|
||||||
// ------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------
|
||||||
typedef struct _SystemTimer
|
typedef struct _SystemTimer
|
||||||
{
|
{
|
||||||
UINT32 granularity;
|
INT32 granularity;
|
||||||
|
|
||||||
} SystemTimer;
|
} SystemTimer;
|
||||||
static LARGE_INTEGER g_SystemTimerFrequency;
|
static LARGE_INTEGER g_SystemTimerFrequency;
|
||||||
|
|
@ -849,12 +849,15 @@ static BOOL SystemTimer_SetGranularity(SystemTimer *timer, UINT32 granularity)
|
||||||
{
|
{
|
||||||
PRINT(("SetSystemTimer: timeBeginPeriod(1) failed!\n"));
|
PRINT(("SetSystemTimer: timeBeginPeriod(1) failed!\n"));
|
||||||
|
|
||||||
timer->granularity = 0;
|
timer->granularity = 10;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
(void)timer;
|
|
||||||
(void)granularity;
|
(void)granularity;
|
||||||
|
|
||||||
|
// UWP does not support increase of the timer precision change and thus calling WaitForSingleObject with anything
|
||||||
|
// below 10 milliseconds will cause underruns for input and output stream.
|
||||||
|
timer->granularity = 10;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
@ -6113,8 +6116,11 @@ static inline INT32 GetNextSleepTime(SystemTimer *timer, ThreadIdleScheduler *sc
|
||||||
//
|
//
|
||||||
INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime);
|
INT32 procTime = (INT32)(SystemTimer_GetTime(timer) - startTime);
|
||||||
nextSleepTime -= procTime;
|
nextSleepTime -= procTime;
|
||||||
if (nextSleepTime < 0)
|
if (nextSleepTime < timer->granularity)
|
||||||
nextSleepTime = 0;
|
nextSleepTime = 0;
|
||||||
|
else
|
||||||
|
if (timer->granularity > 1)
|
||||||
|
nextSleepTime = ALIGN_BWD(nextSleepTime, timer->granularity);
|
||||||
|
|
||||||
#ifdef PA_WASAPI_LOG_TIME_SLOTS
|
#ifdef PA_WASAPI_LOG_TIME_SLOTS
|
||||||
printf("{%d},", procTime);
|
printf("{%d},", procTime);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue