// ------------------------------------------------------------------------------------------\r
static __forceinline UINT32 GetFramesSleepTime(UINT32 nFrames, UINT32 nSamplesPerSec)\r
{\r
+ if (nSamplesPerSec == 0)\r
+ return 0;\r
#define REFTIMES_PER_SEC 10000000\r
#define REFTIMES_PER_MILLISEC 10000\r
// Calculate the actual duration of the allocated buffer.\r
}\r
\r
// Boost thread priority\r
- stream->hAvTask = NULL;\r
PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority);\r
\r
// Initialize event & start INPUT stream\r
{\r
PaWasapiHostProcessor processor[S_COUNT];\r
HRESULT hr;\r
- DWORD dwResult = S_OUTPUT;\r
BOOL bInitOutput = FALSE;\r
PaWasapiStream *stream = (PaWasapiStream *)param;\r
\r
// Calculate the actual duration of the allocated buffer.\r
- DWORD sleep_ms = GetFramesSleepTime(stream->out.framesPerHostCallback, stream->out.wavex.Format.nSamplesPerSec);\r
+ DWORD sleep_ms = 0;\r
+ DWORD sleep_ms_in = GetFramesSleepTime(stream->in.framesPerHostCallback, stream->in.wavex.Format.nSamplesPerSec);\r
+ DWORD sleep_ms_out = GetFramesSleepTime(stream->out.framesPerHostCallback, stream->out.wavex.Format.nSamplesPerSec);\r
+ if ((sleep_ms_in != 0) && (sleep_ms_out != 0))\r
+ sleep_ms = min(sleep_ms_in, sleep_ms_out);\r
+ else\r
+ {\r
+ sleep_ms = (sleep_ms_in ? sleep_ms_in : sleep_ms_out);\r
+ }\r
\r
// Setup data processors\r
PaWasapiHostProcessor defaultProcessor;\r
processor[S_OUTPUT] = (stream->hostProcessOverrideOutput.processor != NULL ? stream->hostProcessOverrideOutput : defaultProcessor);\r
\r
// Boost thread priority\r
- stream->hAvTask = NULL;\r
PaWasapi_ThreadPriorityBoost((void **)&stream->hAvTask, stream->nThreadPriority);\r
\r
// Initialize event & start INPUT stream\r
// Processing Loop\r
while (WaitForSingleObject(stream->hCloseRequest, sleep_ms) == WAIT_TIMEOUT)\r
{\r
- // Process S_INPUT/S_OUTPUT\r
- switch (dwResult)\r
+ for (INT32 i = 0; i < S_COUNT; ++i)\r
{\r
- // Input stream\r
- case S_INPUT: {\r
- if (stream->cclient == NULL)\r
- break;\r
- PollInputBuffer(stream, processor);\r
- break; }\r
+ // Process S_INPUT/S_OUTPUT\r
+ switch (i)\r
+ {\r
+ // Input stream\r
+ case S_INPUT: {\r
+ if (stream->cclient == NULL)\r
+ break;\r
+ PollInputBuffer(stream, processor);\r
+ break; }\r
\r
- // Output stream\r
- case S_OUTPUT: {\r
+ // Output stream\r
+ case S_OUTPUT: {\r
\r
- if (stream->rclient == NULL)\r
- break;\r
+ if (stream->rclient == NULL)\r
+ break;\r
\r
- UINT32 frames = stream->out.framesPerHostCallback;\r
+ UINT32 frames = stream->out.framesPerHostCallback;\r
\r
- // Get Read position\r
- UINT32 padding = 0;\r
- hr = stream->out.client->GetCurrentPadding(&padding);\r
- if (hr != S_OK)\r
- {\r
- LogHostError(hr);\r
- break;\r
- }\r
+ // Get Read position\r
+ UINT32 padding = 0;\r
+ hr = stream->out.client->GetCurrentPadding(&padding);\r
+ if (hr != S_OK)\r
+ {\r
+ LogHostError(hr);\r
+ break;\r
+ }\r
\r
- // Fill buffer\r
- frames -= padding;\r
- if (frames != 0)\r
- FillOutputBuffer(stream, processor, frames);\r
+ // Fill buffer\r
+ frames -= padding;\r
+ if (frames != 0)\r
+ FillOutputBuffer(stream, processor, frames);\r
\r
- break; }\r
+ break; }\r
+ }\r
}\r
}\r
\r