Added gst_element_remove_pad. more refcounting stuff (object unparent on destroy)

Original commit message from CVS:
Added gst_element_remove_pad.
more refcounting stuff (object unparent on destroy)
This commit is contained in:
Wim Taymans 2001-05-12 14:07:13 +00:00
parent d5cb52427f
commit b42e262efe
3 changed files with 52 additions and 5 deletions

View file

@ -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

View file

@ -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);

View file

@ -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);
}