[Commits] SDL: pulseaudio: Just read/dump captured data in FlushCapture.

libsdl.org revision control commits-owner at libsdl.org
Sat Feb 17 15:36:39 PST 2018


details:   https://hg.libsdl.org/SDL/rev/625cdd85edfe
changeset: 11878:625cdd85edfe
user:      Ryan C. Gordon <icculus at icculus.org>
date:      Sat Feb 17 18:30:21 2018 -0500
description:
pulseaudio: Just read/dump captured data in FlushCapture.

Apparently pa_stream_flush() doesn't work as expected:

https://lists.freedesktop.org/archives/pulseaudio-discuss/2012-April/013328.html

Fixes Bugzilla #4087.

diffstat:

 src/audio/pulseaudio/SDL_pulseaudio.c |  25 ++++++++++++++++++-------
 1 files changed, 18 insertions(+), 7 deletions(-)

diffs (49 lines):

diff -r 2a25e8690229 -r 625cdd85edfe src/audio/pulseaudio/SDL_pulseaudio.c
--- a/src/audio/pulseaudio/SDL_pulseaudio.c	Fri Feb 16 14:56:28 2018 -0500
+++ b/src/audio/pulseaudio/SDL_pulseaudio.c	Sat Feb 17 18:30:21 2018 -0500
@@ -250,12 +250,6 @@
 }
 
 static void
-stream_operation_complete_no_op(pa_stream *s, int success, void *userdata)
-{
-    /* no-op for pa_stream_drain(), etc, to use for callback. */
-}
-
-static void
 WaitForPulseOperation(pa_mainloop *mainloop, pa_operation *o)
 {
     /* This checks for NO errors currently. Either fix that, check results elsewhere, or do things you don't care about. */
@@ -426,6 +420,8 @@
 PULSEAUDIO_FlushCapture(_THIS)
 {
     struct SDL_PrivateAudioData *h = this->hidden;
+    const void *data = NULL;
+    size_t nbytes = 0;
 
     if (h->capturebuf != NULL) {
         PULSEAUDIO_pa_stream_drop(h->stream);
@@ -433,7 +429,22 @@
         h->capturelen = 0;
     }
 
-    WaitForPulseOperation(h->mainloop, PULSEAUDIO_pa_stream_flush(h->stream, stream_operation_complete_no_op, NULL));
+    while (SDL_TRUE) {
+        if (PULSEAUDIO_pa_context_get_state(h->context) != PA_CONTEXT_READY ||
+            PULSEAUDIO_pa_stream_get_state(h->stream) != PA_STREAM_READY ||
+            PULSEAUDIO_pa_mainloop_iterate(h->mainloop, 1, NULL) < 0) {
+            SDL_OpenedAudioDeviceDisconnected(this);
+            return;  /* uhoh, pulse failed! */
+        }
+
+        if (PULSEAUDIO_pa_stream_readable_size(h->stream) == 0) {
+            break;  /* no data available, so we're done. */
+        }
+
+        /* a new fragment is available! Just dump it. */
+        PULSEAUDIO_pa_stream_peek(h->stream, &data, &nbytes);
+        PULSEAUDIO_pa_stream_drop(h->stream);  /* drop this fragment. */
+    }
 }
 
 static void


More information about the commits mailing list