diff --git a/gst/gstelement.c b/gst/gstelement.c index ee68027a2b..7d8ede6960 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -33,7 +33,9 @@ enum { STATE_CHANGE, NEW_PAD, + PAD_REMOVED, NEW_GHOST_PAD, + GHOST_PAD_REMOVED, ERROR, EOS, LAST_SIGNAL @@ -100,11 +102,21 @@ gst_element_class_init (GstElementClass *klass) GTK_SIGNAL_OFFSET (GstElementClass, new_pad), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GST_TYPE_PAD); + gst_element_signals[PAD_REMOVED] = + gtk_signal_new ("pad_removed", GTK_RUN_LAST, gtkobject_class->type, + GTK_SIGNAL_OFFSET (GstElementClass, pad_removed), + gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, + GST_TYPE_PAD); gst_element_signals[NEW_GHOST_PAD] = gtk_signal_new ("new_ghost_pad", GTK_RUN_LAST, gtkobject_class->type, GTK_SIGNAL_OFFSET (GstElementClass, new_ghost_pad), gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, GST_TYPE_PAD); + gst_element_signals[GHOST_PAD_REMOVED] = + gtk_signal_new ("ghost_pad_removed", GTK_RUN_LAST, gtkobject_class->type, + GTK_SIGNAL_OFFSET (GstElementClass, ghost_pad_removed), + gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, + GST_TYPE_PAD); gst_element_signals[ERROR] = gtk_signal_new ("error", GTK_RUN_LAST, gtkobject_class->type, GTK_SIGNAL_OFFSET (GstElementClass, error), @@ -296,6 +308,36 @@ gst_element_add_pad (GstElement *element, GstPad *pad) gtk_signal_emit (GTK_OBJECT (element), gst_element_signals[NEW_PAD], pad); } +/** + * gst_element_remove_pad: + * @element: element to remove pad from + * @pad: pad to remove + * + * Remove a pad (connection point) from the element, + */ +void +gst_element_remove_pad (GstElement *element, GstPad *pad) +{ + g_return_if_fail (element != NULL); + g_return_if_fail (GST_IS_ELEMENT (element)); + g_return_if_fail (pad != NULL); + g_return_if_fail (GST_IS_PAD (pad)); + + g_return_if_fail (GST_PAD_PARENT (pad) == element); + + /* add it to the list */ + element->pads = g_list_remove (element->pads, pad); + element->numpads--; + if (gst_pad_get_direction (pad) == GST_PAD_SRC) + element->numsrcpads--; + else + element->numsinkpads--; + + gtk_signal_emit (GTK_OBJECT (element), gst_element_signals[NEW_PAD], pad); + + gst_object_unparent (GST_OBJECT (pad)); +} + /** * gst_element_add_ghost_pad: * @element: element to add ghost pad to diff --git a/gst/gstelement.h b/gst/gstelement.h index adfc3daa61..8a7d24dc89 100644 --- a/gst/gstelement.h +++ b/gst/gstelement.h @@ -166,11 +166,13 @@ struct _GstElementClass { GstElementFactory *elementfactory; /* signal callbacks */ - void (*state_change) (GstElement *element,GstElementState state); - void (*new_pad) (GstElement *element,GstPad *pad); - void (*new_ghost_pad) (GstElement *element,GstPad *pad); - void (*error) (GstElement *element,gchar *error); - void (*eos) (GstElement *element); + void (*state_change) (GstElement *element,GstElementState state); + void (*new_pad) (GstElement *element,GstPad *pad); + void (*pad_removed) (GstElement *element,GstPad *pad); + void (*new_ghost_pad) (GstElement *element,GstPad *pad); + void (*ghost_pad_removed) (GstElement *element,GstPad *pad); + void (*error) (GstElement *element,gchar *error); + void (*eos) (GstElement *element); /* local pointers for get/set */ void (*set_arg) (GtkObject *object, @@ -222,6 +224,7 @@ void gst_element_set_sched (GstElement *element, GstSchedule *sched); GstSchedule* gst_element_get_sched (GstElement *element); void gst_element_add_pad (GstElement *element, GstPad *pad); +void gst_element_remove_pad (GstElement *element, GstPad *pad); GstPad* gst_element_get_pad (GstElement *element, const gchar *name); GList* gst_element_get_pad_list (GstElement *element); GList* gst_element_get_padtemplate_list (GstElement *element); diff --git a/gst/gstobject.c b/gst/gstobject.c index 937883b84e..97f16efd7e 100644 --- a/gst/gstobject.c +++ b/gst/gstobject.c @@ -238,6 +238,8 @@ gst_object_real_destroy (GtkObject *gtk_object) { GST_DEBUG (GST_CAT_REFCOUNTING, "destroy\n"); + GST_OBJECT_PARENT (gtk_object) = NULL; + parent_class->destroy (gtk_object); }