summaryrefslogtreecommitdiff
path: root/src/audio.c
diff options
context:
space:
mode:
authorBenjamin Franzke <benjaminfranzke@googlemail.com>2013-11-22 09:25:53 +0100
committerBenjamin Franzke <benjaminfranzke@googlemail.com>2013-11-22 14:40:08 +0100
commitb83262a1c025d0775d0f73c87341d71d7f1c3996 (patch)
tree83ff5ad98c39b25f718c7c7bb96d0a9470612208 /src/audio.c
parenta60894a1f1c1fba4d7244a9b2a52f322e3ed9e12 (diff)
downloadcmumble-b83262a1c025d0775d0f73c87341d71d7f1c3996.tar.gz
cmumble-b83262a1c025d0775d0f73c87341d71d7f1c3996.tar.bz2
cmumble-b83262a1c025d0775d0f73c87341d71d7f1c3996.zip
audio: Pull and send the recorded buffer from the main thread
Tests showed this lets the appsink pull more buffers, since the streaming thread is not blocked due to network write.
Diffstat (limited to 'src/audio.c')
-rw-r--r--src/audio.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/audio.c b/src/audio.c
index d77434b..a373871 100644
--- a/src/audio.c
+++ b/src/audio.c
@@ -62,6 +62,29 @@ pull_buffer(GstAppSink *sink, gpointer user_data)
return GST_FLOW_OK;
}
+static gboolean
+idle(gpointer user_data)
+{
+ struct cmumble *cm = user_data;
+ GstAppSink *sink;
+
+ while ((sink = g_async_queue_try_pop(cm->async_queue)) != NULL)
+ pull_buffer(sink, cm);
+
+ return FALSE;
+}
+
+static GstFlowReturn
+new_buffer(GstAppSink *sink, gpointer user_data)
+{
+ struct cmumble *cm = user_data;
+
+ g_async_queue_push(cm->async_queue, sink);
+ g_idle_add(idle, cm);
+
+ return GST_FLOW_OK;
+}
+
static int
setup_recording_gst_pipeline(struct cmumble *cm)
{
@@ -88,7 +111,7 @@ setup_recording_gst_pipeline(struct cmumble *cm)
gst_app_sink_set_emit_signals(cm->audio.sink, TRUE);
gst_app_sink_set_drop(cm->audio.sink, FALSE);;
- g_signal_connect(sink, "new-buffer", G_CALLBACK(pull_buffer), cm);
+ g_signal_connect(sink, "new-buffer", G_CALLBACK(new_buffer), cm);
caps = gst_caps_new_simple("audio/x-celt",
"rate", G_TYPE_INT, SAMPLERATE,