diff options
Diffstat (limited to 'audio/gsta2dpsink.c')
-rw-r--r-- | audio/gsta2dpsink.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/audio/gsta2dpsink.c b/audio/gsta2dpsink.c index a2b3286c..b5b1c576 100644 --- a/audio/gsta2dpsink.c +++ b/audio/gsta2dpsink.c @@ -80,6 +80,17 @@ static void gst_a2dp_sink_finalize(GObject *obj) G_OBJECT_CLASS (parent_class)->finalize (obj); } +static GstState gst_a2dp_sink_get_state(GstA2dpSink *self) +{ + GstState current, pending; + + gst_element_get_state(GST_ELEMENT(self), ¤t, &pending, 0); + if (pending == GST_STATE_VOID_PENDING) + return current; + + return pending; +} + /* * Helper function to create elements, add to the bin and link it * to another element. @@ -89,6 +100,7 @@ static GstElement* gst_a2dp_sink_init_element(GstA2dpSink *self, GstElement *link_to) { GstElement *element; + GstState state; GST_LOG_OBJECT(self, "Initializing %s", elementname); @@ -104,17 +116,19 @@ static GstElement* gst_a2dp_sink_init_element(GstA2dpSink *self, goto cleanup_and_fail; } - if (gst_element_set_state(element, GST_STATE_PLAYING) == + state = gst_a2dp_sink_get_state(self); + if (gst_element_set_state(element, state) == GST_STATE_CHANGE_FAILURE) { GST_ERROR_OBJECT(self, "%s failed to go to playing", elementname); goto remove_element_and_fail; } - if (!gst_element_link(link_to, element)) { - GST_ERROR_OBJECT(self, "couldn't link %s", elementname); - goto remove_element_and_fail; - } + if (link_to != NULL) + if (!gst_element_link(link_to, element)) { + GST_ERROR_OBJECT(self, "couldn't link %s", elementname); + goto remove_element_and_fail; + } return element; @@ -241,7 +255,6 @@ static GstStateChangeReturn gst_a2dp_sink_change_state(GstElement *element, case GST_STATE_CHANGE_NULL_TO_READY: self->sink_is_in_bin = FALSE; - self->sink = GST_AVDTP_SINK(gst_element_factory_make( "avdtpsink", "avdtpsink")); if (self->sink == NULL) { @@ -260,8 +273,10 @@ static GstStateChangeReturn gst_a2dp_sink_change_state(GstElement *element, break; } - if (ret == GST_STATE_CHANGE_FAILURE) + if (ret == GST_STATE_CHANGE_FAILURE) { + g_mutex_unlock(self->cb_mutex); return ret; + } ret = GST_ELEMENT_CLASS(parent_class)->change_state(element, transition); @@ -295,7 +310,6 @@ static GstStateChangeReturn gst_a2dp_sink_change_state(GstElement *element, gst_a2dp_sink_remove_dynamic_elements(self); break; - default: break; } @@ -558,16 +572,16 @@ static gboolean gst_a2dp_sink_handle_event(GstPad *pad, GstEvent *event) if (self->newseg_event != NULL) gst_event_unref(self->newseg_event); self->newseg_event = gst_event_ref(event); + } else if (GST_EVENT_TYPE(event) == GST_EVENT_TAG && parent != GST_OBJECT_CAST(self)) { - if (self->taglist == NULL) { + if (self->taglist == NULL) gst_event_parse_tag(event, &self->taglist); - } else { + else { gst_event_parse_tag(event, &taglist); gst_tag_list_insert(self->taglist, taglist, GST_TAG_MERGE_REPLACE); } - /* FIXME handle tag events */ } if (parent != NULL) @@ -614,11 +628,15 @@ static gboolean gst_a2dp_sink_init_fakesink(GstA2dpSink *self) static gboolean gst_a2dp_sink_remove_fakesink(GstA2dpSink *self) { g_mutex_lock(self->cb_mutex); + if (self->fakesink != NULL) { + gst_element_set_locked_state(self->fakesink, TRUE); gst_element_set_state(self->fakesink, GST_STATE_NULL); + gst_bin_remove(GST_BIN(self), self->fakesink); self->fakesink = NULL; } + g_mutex_unlock(self->cb_mutex); return TRUE; |