diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2014-12-22 10:45:37 +0100 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2015-06-10 19:27:23 +0100 |
commit | 9204caa2208c323e9994c535e650f8e948595937 (patch) | |
tree | 97a66ebaaf41320e9918d843f444837fc66c5fbf | |
parent | 6984d039ddc5f5c77af7d03af1e1228d43c8fc42 (diff) | |
download | gstreamer-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.c | 24 | ||||
-rw-r--r-- | gst-libs/gst/audio/gstaudiobasesrc.c | 22 |
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 */ |