]> Repos - portaudio/commitdiff
wasapi: fixed capturing callback not called if paWinWasapiPolling flag specified...
authordmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Sat, 20 Feb 2010 11:55:20 +0000 (11:55 +0000)
committerdmitrykos <dmitrykos@0f58301d-fd10-0410-b4af-bbb618454e57>
Sat, 20 Feb 2010 11:55:20 +0000 (11:55 +0000)
src/hostapi/wasapi/pa_win_wasapi.cpp

index 9540398c4f634982fa2993f6bb164de562002b3e..ec938fd454e717d952e746188a35b7dee1bf760f 100644 (file)
@@ -504,6 +504,8 @@ static UINT32 AlignFramesPerBuffer(UINT32 nFrames, UINT32 nSamplesPerSec, UINT32
 // ------------------------------------------------------------------------------------------\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
@@ -2833,7 +2835,6 @@ PA_THREAD_FUNC ProcThreadEvent(void *param)
        }\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
@@ -2927,12 +2928,19 @@ PA_THREAD_FUNC ProcThreadPoll(void *param)
 {\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
@@ -2942,7 +2950,6 @@ PA_THREAD_FUNC ProcThreadPoll(void *param)
     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
@@ -2977,39 +2984,42 @@ PA_THREAD_FUNC ProcThreadPoll(void *param)
        // 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