diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-11-12 18:06:45 +0100 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2014-11-12 18:10:45 +0100 |
commit | 6c3b3bef4e1bb682ccf637b8ddc0a395b079bb75 (patch) | |
tree | bd19a90d1e49d5709fc6f16e02b59e5477bcad4e /gst/inter | |
parent | 5977ef5552f89fc1cd52a5331a1650a0508c29a0 (diff) | |
download | gstreamer-plugins-bad-6c3b3bef4e1bb682ccf637b8ddc0a395b079bb75.tar.gz |
interaudiosink: Make sure to store at least period-time samples at once in the adapter
It's better to create some more silence than having the source pull multiple
short buffers out of the adapter and insert silence between them.
Diffstat (limited to 'gst/inter')
-rw-r--r-- | gst/inter/gstinteraudiosink.c | 49 | ||||
-rw-r--r-- | gst/inter/gstinteraudiosink.h | 1 |
2 files changed, 48 insertions, 2 deletions
diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c index f8c307153..a2b07ac96 100644 --- a/gst/inter/gstinteraudiosink.c +++ b/gst/inter/gstinteraudiosink.c @@ -63,6 +63,8 @@ static gboolean gst_inter_audio_sink_start (GstBaseSink * sink); static gboolean gst_inter_audio_sink_stop (GstBaseSink * sink); static gboolean gst_inter_audio_sink_set_caps (GstBaseSink * sink, GstCaps * caps); +static gboolean gst_inter_audio_sink_event (GstBaseSink * sink, + GstEvent * event); static GstFlowReturn gst_inter_audio_sink_render (GstBaseSink * sink, GstBuffer * buffer); static gboolean gst_inter_audio_sink_query (GstBaseSink * sink, @@ -83,6 +85,7 @@ GST_STATIC_PAD_TEMPLATE ("sink", ); /* class initialization */ +#define parent_class gst_inter_audio_sink_parent_class G_DEFINE_TYPE (GstInterAudioSink, gst_inter_audio_sink, GST_TYPE_BASE_SINK); static void @@ -110,6 +113,7 @@ gst_inter_audio_sink_class_init (GstInterAudioSinkClass * klass) GST_DEBUG_FUNCPTR (gst_inter_audio_sink_get_times); base_sink_class->start = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_start); base_sink_class->stop = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_stop); + base_sink_class->event = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_event); base_sink_class->set_caps = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_set_caps); base_sink_class->render = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_render); base_sink_class->query = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_query); @@ -124,6 +128,7 @@ static void gst_inter_audio_sink_init (GstInterAudioSink * interaudiosink) { interaudiosink->channel = g_strdup ("default"); + interaudiosink->input_adapter = gst_adapter_new (); } void @@ -166,6 +171,7 @@ gst_inter_audio_sink_finalize (GObject * object) /* clean up object here */ g_free (interaudiosink->channel); + gst_object_unref (interaudiosink->input_adapter); G_OBJECT_CLASS (gst_inter_audio_sink_parent_class)->finalize (object); } @@ -225,6 +231,8 @@ gst_inter_audio_sink_stop (GstBaseSink * sink) gst_inter_surface_unref (interaudiosink->surface); interaudiosink->surface = NULL; + gst_adapter_clear (interaudiosink->input_adapter); + return TRUE; } @@ -249,6 +257,31 @@ gst_inter_audio_sink_set_caps (GstBaseSink * sink, GstCaps * caps) return TRUE; } +static gboolean +gst_inter_audio_sink_event (GstBaseSink * sink, GstEvent * event) +{ + GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (sink); + + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS:{ + GstBuffer *tmp; + guint n; + + if ((n = gst_adapter_available (interaudiosink->input_adapter)) > 0) { + g_mutex_lock (&interaudiosink->surface->mutex); + tmp = gst_adapter_take_buffer (interaudiosink->input_adapter, n); + gst_adapter_push (interaudiosink->surface->audio_adapter, tmp); + g_mutex_unlock (&interaudiosink->surface->mutex); + } + break; + } + default: + break; + } + + return GST_BASE_SINK_CLASS (parent_class)->event (sink, event); +} + static GstFlowReturn gst_inter_audio_sink_render (GstBaseSink * sink, GstBuffer * buffer) { @@ -280,8 +313,20 @@ gst_inter_audio_sink_render (GstBaseSink * sink, GstBuffer * buffer) period_samples * bpf); n -= period_samples; } - gst_adapter_push (interaudiosink->surface->audio_adapter, - gst_buffer_ref (buffer)); + + n = gst_adapter_available (interaudiosink->input_adapter); + if (period_samples * bpf > gst_buffer_get_size (buffer) + n) { + gst_adapter_push (interaudiosink->input_adapter, gst_buffer_ref (buffer)); + } else { + GstBuffer *tmp; + + if (n > 0) { + tmp = gst_adapter_take_buffer (interaudiosink->input_adapter, n); + gst_adapter_push (interaudiosink->surface->audio_adapter, tmp); + } + gst_adapter_push (interaudiosink->surface->audio_adapter, + gst_buffer_ref (buffer)); + } g_mutex_unlock (&interaudiosink->surface->mutex); return GST_FLOW_OK; diff --git a/gst/inter/gstinteraudiosink.h b/gst/inter/gstinteraudiosink.h index fc184a77d..8f8c9a256 100644 --- a/gst/inter/gstinteraudiosink.h +++ b/gst/inter/gstinteraudiosink.h @@ -41,6 +41,7 @@ struct _GstInterAudioSink GstInterSurface *surface; char *channel; + GstAdapter *input_adapter; GstAudioInfo info; }; |