summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-12-22 10:45:37 +0100
committerTim-Philipp Müller <tim@centricular.com>2015-06-10 19:27:23 +0100
commit9204caa2208c323e9994c535e650f8e948595937 (patch)
tree97a66ebaaf41320e9918d843f444837fc66c5fbf
parent6984d039ddc5f5c77af7d03af1e1228d43c8fc42 (diff)
downloadgstreamer-plugins-base-9204caa2208c323e9994c535e650f8e948595937.tar.gz
audiobase{sink,src}: Don't hold the object lock while calling create_ringbuffer() vfunc
The implementation of that vfunc might want to use the object lock for something too. It's generally not a good idea to keep the object lock while calling any function implemented elsewhere. Also the ringbuffer can only be NULL at this point, remove a useless if block. And in the sink actually hold the object lock while setting the ringbuffer on the instance. Code accessing this is expected to use the object lock, so do it here ourselves too.
-rw-r--r--gst-libs/gst/audio/gstaudiobasesink.c24
-rw-r--r--gst-libs/gst/audio/gstaudiobasesrc.c22
2 files changed, 36 insertions, 10 deletions
diff --git a/gst-libs/gst/audio/gstaudiobasesink.c b/gst-libs/gst/audio/gstaudiobasesink.c
index 4be998815..df313dc76 100644
--- a/gst-libs/gst/audio/gstaudiobasesink.c
+++ b/gst-libs/gst/audio/gstaudiobasesink.c
@@ -2189,14 +2189,22 @@ gst_audio_base_sink_change_state (GstElement * element,
GstAudioBaseSink *sink = GST_AUDIO_BASE_SINK (element);
switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
- if (sink->ringbuffer == NULL) {
- gst_audio_clock_reset (GST_AUDIO_CLOCK (sink->provided_clock), 0);
- sink->ringbuffer = gst_audio_base_sink_create_ringbuffer (sink);
- }
+ case GST_STATE_CHANGE_NULL_TO_READY:{
+ GstAudioRingBuffer *rb;
+
+ gst_audio_clock_reset (GST_AUDIO_CLOCK (sink->provided_clock), 0);
+ rb = gst_audio_base_sink_create_ringbuffer (sink);
+ if (rb == NULL)
+ goto create_failed;
+
+ GST_OBJECT_LOCK (sink);
+ sink->ringbuffer = rb;
+ GST_OBJECT_UNLOCK (sink);
+
if (!gst_audio_ring_buffer_open_device (sink->ringbuffer))
goto open_failed;
break;
+ }
case GST_STATE_CHANGE_READY_TO_PAUSED:
gst_audio_base_sink_reset_sync (sink);
gst_audio_ring_buffer_set_flushing (sink->ringbuffer, FALSE);
@@ -2291,6 +2299,12 @@ gst_audio_base_sink_change_state (GstElement * element,
return ret;
/* ERRORS */
+create_failed:
+ {
+ /* subclass must post a meaningful error message */
+ GST_DEBUG_OBJECT (sink, "create failed");
+ return GST_STATE_CHANGE_FAILURE;
+ }
open_failed:
{
/* subclass must post a meaningful error message */
diff --git a/gst-libs/gst/audio/gstaudiobasesrc.c b/gst-libs/gst/audio/gstaudiobasesrc.c
index 38b22b54c..7517cd88f 100644
--- a/gst-libs/gst/audio/gstaudiobasesrc.c
+++ b/gst-libs/gst/audio/gstaudiobasesrc.c
@@ -1124,17 +1124,23 @@ gst_audio_base_src_change_state (GstElement * element,
GstAudioBaseSrc *src = GST_AUDIO_BASE_SRC (element);
switch (transition) {
- case GST_STATE_CHANGE_NULL_TO_READY:
+ case GST_STATE_CHANGE_NULL_TO_READY:{
+ GstAudioRingBuffer *rb;
+
GST_DEBUG_OBJECT (src, "NULL->READY");
+ gst_audio_clock_reset (GST_AUDIO_CLOCK (src->clock), 0);
+ rb = gst_audio_base_src_create_ringbuffer (src);
+ if (rb == NULL)
+ goto create_failed;
+
GST_OBJECT_LOCK (src);
- if (src->ringbuffer == NULL) {
- gst_audio_clock_reset (GST_AUDIO_CLOCK (src->clock), 0);
- src->ringbuffer = gst_audio_base_src_create_ringbuffer (src);
- }
+ src->ringbuffer = rb;
GST_OBJECT_UNLOCK (src);
+
if (!gst_audio_ring_buffer_open_device (src->ringbuffer))
goto open_failed;
break;
+ }
case GST_STATE_CHANGE_READY_TO_PAUSED:
GST_DEBUG_OBJECT (src, "READY->PAUSED");
src->next_sample = -1;
@@ -1197,6 +1203,12 @@ gst_audio_base_src_change_state (GstElement * element,
return ret;
/* ERRORS */
+create_failed:
+ {
+ /* subclass must post a meaningful error message */
+ GST_DEBUG_OBJECT (src, "create failed");
+ return GST_STATE_CHANGE_FAILURE;
+ }
open_failed:
{
/* subclass must post a meaningful error message */