wasapi: Handle return value of WaitForSingleObject
authorNirbheek Chauhan <nirbheek@centricular.com>
Mon, 9 Apr 2018 23:43:17 +0000 (05:13 +0530)
committerNirbheek Chauhan <nirbheek@centricular.com>
Mon, 9 Apr 2018 23:46:54 +0000 (05:16 +0530)
The wait could've failed for whatever reason, we should handle that.

sys/wasapi/gstwasapisink.c
sys/wasapi/gstwasapisrc.c

index 8267d3f..77720be 100644 (file)
@@ -616,9 +616,16 @@ gst_wasapi_sink_write (GstAudioSink * asink, gpointer data, guint length)
   GST_OBJECT_UNLOCK (self);
 
   while (pending > 0) {
+    DWORD dwWaitResult;
     guint can_frames, have_frames, n_frames, write_len;
 
-    WaitForSingleObject (self->event_handle, INFINITE);
+    dwWaitResult = WaitForSingleObject (self->event_handle, INFINITE);
+    if (dwWaitResult != WAIT_OBJECT_0) {
+      GST_ERROR_OBJECT (self, "Error waiting for event handle: %x",
+          (guint) dwWaitResult);
+      length -= pending;
+      goto beach;
+    }
 
     /* We have N frames to be written out */
     have_frames = pending / (self->mix_format->nBlockAlign);
index da1e097..4c51a40 100644 (file)
@@ -565,10 +565,17 @@ gst_wasapi_src_read (GstAudioSrc * asrc, gpointer data, guint length,
   GST_OBJECT_UNLOCK (self);
 
   while (wanted > 0) {
+    DWORD dwWaitResult;
     guint have_frames, n_frames, want_frames, read_len;
 
     /* Wait for data to become available */
-    WaitForSingleObject (self->event_handle, INFINITE);
+    dwWaitResult = WaitForSingleObject (self->event_handle, INFINITE);
+    if (dwWaitResult != WAIT_OBJECT_0) {
+      GST_ERROR_OBJECT (self, "Error waiting for event handle: %x",
+          (guint) dwWaitResult);
+      length = 0;
+      goto beach;
+    }
 
     hr = IAudioCaptureClient_GetBuffer (self->capture_client,
         (BYTE **) & from, &have_frames, &flags, NULL, NULL);