diff options
author | Seungha Yang <seungha@centricular.com> | 2023-01-24 23:26:50 +0900 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2023-01-26 16:07:43 +0000 |
commit | 1f45b0e7e3e06cf17e4e17aeb4ac830c07370ff8 (patch) | |
tree | bf25fb48a670acfe517d3904b8d3375ab7c2d9eb | |
parent | d8bef5c7e7d744069fd904c556e15c58c3b6be76 (diff) | |
download | gstreamer-1f45b0e7e3e06cf17e4e17aeb4ac830c07370ff8.tar.gz |
wasapi2src: Fix loopback capture on Windows 10 Anniversary Update
... or older. Work around an OS bug that loopback capture
device doesn't notify event.
Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1738
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3809>
-rw-r--r-- | subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp b/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp index 60231e387b..d3f468e931 100644 --- a/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp +++ b/subprojects/gst-plugins-bad/sys/wasapi2/gstwasapi2ringbuffer.cpp @@ -703,7 +703,10 @@ gst_wasapi2_ring_buffer_io_callback (GstWasapi2RingBuffer * self) } if (self->running) { - if (gst_wasapi2_result (hr)) { + if (gst_wasapi2_result (hr) && + /* In case of normal loopback capture, this method is called from + * silence feeding thread. Don't schedule again in that case */ + self->device_class != GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { hr = MFPutWaitingWorkItem (self->event_handle, 0, self->callback_result, &self->callback_key); @@ -751,17 +754,16 @@ gst_wasapi2_ring_buffer_fill_loopback_silence (GstWasapi2RingBuffer * self) if (!gst_wasapi2_result (hr)) return hr; - if (padding_frames >= self->buffer_size) { + if (padding_frames >= self->loopback_buffer_size) { GST_INFO_OBJECT (self, "Padding size %d is larger than or equal to buffer size %d", - padding_frames, self->buffer_size); + padding_frames, self->loopback_buffer_size); return S_OK; } - can_write = self->buffer_size - padding_frames; + can_write = self->loopback_buffer_size - padding_frames; - GST_TRACE_OBJECT (self, - "Writing %d silent frames offset at %" G_GUINT64_FORMAT, can_write); + GST_TRACE_OBJECT (self, "Writing %d silent frames", can_write); hr = render_client->GetBuffer (can_write, &data); if (!gst_wasapi2_result (hr)) @@ -787,6 +789,12 @@ gst_wasapi2_ring_buffer_loopback_callback (GstWasapi2RingBuffer * self) hr = gst_wasapi2_ring_buffer_fill_loopback_silence (self); + /* On Windows versions prior to Windows 10, a pull-mode capture client will + * not receive any events when a stream is initialized with event-driven + * buffering */ + if (gst_wasapi2_result (hr)) + hr = gst_wasapi2_ring_buffer_io_callback (self); + if (self->running) { if (gst_wasapi2_result (hr)) { hr = MFPutWaitingWorkItem (self->loopback_event_handle, 0, @@ -1203,13 +1211,15 @@ gst_wasapi2_ring_buffer_start_internal (GstWasapi2RingBuffer * self) goto error; } - hr = MFPutWaitingWorkItem (self->event_handle, 0, self->callback_result, - &self->callback_key); - if (!gst_wasapi2_result (hr)) { - GST_ERROR_OBJECT (self, "Failed to put waiting item"); - client_handle->Stop (); - self->running = FALSE; - goto error; + if (self->device_class != GST_WASAPI2_CLIENT_DEVICE_CLASS_LOOPBACK_CAPTURE) { + hr = MFPutWaitingWorkItem (self->event_handle, 0, self->callback_result, + &self->callback_key); + if (!gst_wasapi2_result (hr)) { + GST_ERROR_OBJECT (self, "Failed to put waiting item"); + client_handle->Stop (); + self->running = FALSE; + goto error; + } } return TRUE; |