} else {
src->filename = g_strdup (g_value_get_string (value));
}
+ g_object_notify (G_OBJECT (src), "location");
break;
case ARG_BLOCKSIZE:
src->block_size = g_value_get_ulong (value);
+ g_object_notify (G_OBJECT (src), "blocksize");
break;
case ARG_OFFSET:
src->curoffset = g_value_get_int64 (value);
+ g_object_notify (G_OBJECT (src), "offset");
break;
case ARG_MAPSIZE:
if ((src->mapsize % src->pagesize) == 0)
+ {
src->mapsize = g_value_get_ulong (value);
+ g_object_notify (G_OBJECT (src), "mmapsize");
+ }
else
GST_INFO(0, "invalid mapsize, must a multiple of pagesize, which is %d\n",src->pagesize);
break;
case ARG_TOUCH:
src->touch = g_value_get_boolean (value);
+ g_object_notify (G_OBJECT (src), "touch");
break;
default:
break;
/* we're done, return the buffer */
src->curoffset += GST_BUFFER_SIZE(buf);
+ g_object_notify (G_OBJECT (src), "offset");
return buf;
}
src->curoffset = 0;
+ /* now notify of the changes */
+ g_object_freeze_notify (G_OBJECT (src));
+ g_object_notify (G_OBJECT (src), "filesize");
+ g_object_notify (G_OBJECT (src), "offset");
+ g_object_thaw_notify (G_OBJECT (src));
+
GST_FLAG_SET (src, GST_FILESRC_OPEN);
}
return TRUE;
src->fd = 0;
src->filelen = 0;
src->curoffset = 0;
+ /* and notify that things changed */
+ g_object_freeze_notify (G_OBJECT (src));
+ g_object_notify (G_OBJECT (src), "filesize");
+ g_object_notify (G_OBJECT (src), "offset");
+ g_object_thaw_notify (G_OBJECT (src));
+
if (src->mapbuf)
gst_buffer_unref (src->mapbuf);
return FALSE;
break;
}
+ g_object_notify (G_OBJECT (src), "offset");
src->seek_happened = TRUE;
src->need_flush = GST_EVENT_SEEK_FLUSH(event);
gst_event_free (event);
/* element check */
sink = GST_MD5SINK (element);
- g_return_val_if_fail (sink != NULL, GST_PAD_CONNECT_REFUSED);
- g_return_val_if_fail (GST_IS_MD5SINK (sink), GST_PAD_CONNECT_REFUSED);
+
+ g_return_val_if_fail (GST_IS_MD5SINK (sink), GST_STATE_FAILURE);
switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_READY_TO_PAUSED:
md5_init_ctx (sink);
+ g_object_notify (G_OBJECT (element), "md5");
break;
case GST_STATE_PAUSED_TO_READY:
md5_finish_ctx (sink, sink->md5);
+ g_object_notify (G_OBJECT (element), "md5");
break;
default:
break;
switch (prop_id) {
case ARG_MD5:
- md5_read_ctx (sink, sink->md5);
+ /* you could actually get a value for the current md5. This is currently disabled.
+ * md5_read_ctx (sink, sink->md5); */
g_value_set_pointer (value, sink->md5);
break;
default:
#define g_object_ref(obj) gtk_object_ref((GtkObject *)(obj))
#define g_object_unref(obj) gtk_object_unref((GtkObject *)(obj))
+/* notification - just disable it */
+#define g_object_freeze_notify(obj)
+#define g_object_notify(obj,name)
+#define g_object_thaw_notify(obj)
+
/* the helper macros for type checking */
#define G_TYPE_CHECK_INSTANCE_CAST GTK_CHECK_CAST
#define G_TYPE_CHECK_INSTANCE_TYPE GTK_CHECK_TYPE
#define G_TYPE_STRING GTK_TYPE_STRING
#define G_TYPE_POINTER GTK_TYPE_POINTER
#define G_TYPE_BOXED GTK_TYPE_BOXED
-#define G_TYPE_PARAM GTK_TYPE_PARAM
+#define G_TYPE_PARAM GTK_TYPE_POINTER
/* marshallers */
#define g_cclosure_marshal_VOID__VOID gtk_marshal_NONE__NONE
#define gst_marshal_VOID__STRING gtk_marshal_NONE__STRING
#define gst_marshal_VOID__POINTER gtk_marshal_NONE__POINTER
#define gst_marshal_VOID__OBJECT gtk_marshal_NONE__POINTER
+#define gst_marshal_VOID__OBJECT_PARAM gtk_marshal_NONE__POINTER_POINTER
#define gst_marshal_VOID__OBJECT_POINTER gtk_marshal_NONE__POINTER_POINTER
#define gst_marshal_VOID__INT_INT gtk_marshal_NONE__INT_INT
#define G_SIGNAL_RUN_CLEANUP 0
#define G_SIGNAL_NO_RECURSE GTK_RUN_NO_RECURSE
#define G_SIGNAL_NO_HOOKS GTK_RUN_NO_HOOKS
+#define G_SIGNAL_DETAILED 0
#define GCallback gpointer /* FIXME?*/
#define G_CALLBACK(f) ((gpointer)(f))
const GValue *value, GParamSpec *pspec);
void (*get_property) (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec);
+
+ void (*dispatch_properties_changed) (GObject *object, guint n_pspecs,
+ GParamSpec **pspecs);
+
};
GType g_object_get_type (void);
VOID:STRING
VOID:POINTER
VOID:OBJECT
+VOID:OBJECT,PARAM
VOID:OBJECT,POINTER
VOID:INT,INT
/* Object signals and args */
enum {
PARENT_SET,
+ DEEP_NOTIFY,
#ifndef GST_DISABLE_LOADSAVE_REGISTRY
OBJECT_SAVED,
#endif
GParamSpec * pspec);
static void gst_object_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec);
+static void gst_object_dispatch_properties_changed (GObject * object, guint n_pspecs, GParamSpec **pspecs);
static void gst_object_dispose (GObject *object);
static void gst_object_finalize (GObject *object);
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_object_set_property);
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_object_get_property);
+ gobject_class->dispatch_properties_changed = GST_DEBUG_FUNCPTR (gst_object_dispatch_properties_changed);
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_NAME,
g_param_spec_string ("name", "Name", "The name of the object",
G_STRUCT_OFFSET (GstObjectClass, parent_set), NULL, NULL,
g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1,
G_TYPE_OBJECT);
+ gst_object_signals[DEEP_NOTIFY] =
+ g_signal_new ("deep_notify", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS,
+ G_STRUCT_OFFSET (GstObjectClass, deep_notify), NULL, NULL,
+ gst_marshal_VOID__OBJECT_PARAM, G_TYPE_NONE,
+ 2, G_TYPE_OBJECT, G_TYPE_PARAM);
#ifndef GST_DISABLE_LOADSAVE_REGISTRY
gst_object_signals[OBJECT_SAVED] =
g_signal_new ("object_saved", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
break;
}
}
+static void
+gst_object_dispatch_properties_changed (GObject *object,
+ guint n_pspecs,
+ GParamSpec **pspecs)
+{
+#ifdef USE_GLIB2
+ GstObject *gst_object;
+ guint i;
+
+ /* do the standard dispatching */
+ parent_class->dispatch_properties_changed (object, n_pspecs, pspecs);
+
+ /* now let the parent dispatch those, too */
+ gst_object = GST_OBJECT (object);
+ while (gst_object)
+ {
+ /* need own category? */
+ GST_DEBUG (GST_CAT_EVENT, "deep notification from %s to %s\n", GST_OBJECT_NAME (object), GST_OBJECT_NAME (gst_object));
+ for (i = 0; i < n_pspecs; i++)
+ g_signal_emit (gst_object, gst_object_signals[DEEP_NOTIFY], g_quark_from_string (pspecs[i]->name), (GstObject *) object, pspecs[i]);
+
+ gst_object = GST_OBJECT_PARENT (gst_object);
+ }
+#endif /* USE_GLIB2 */
+}
+
/**
* gst_object_get_path_string:
* @object: GstObject to get the path from
/* signals */
void (*parent_set) (GstObject *object, GstObject *parent);
+ void (*deep_notify) (GstObject *object, GstObject *orig, GParamSpec *pspec);
#ifndef GST_DISABLE_LOADSAVE_REGISTRY
void (*object_saved) (GstObject *object, xmlNodePtr parent);
#endif
} else {
src->filename = g_strdup (g_value_get_string (value));
}
+ g_object_notify (G_OBJECT (src), "location");
break;
case ARG_BLOCKSIZE:
src->block_size = g_value_get_ulong (value);
+ g_object_notify (G_OBJECT (src), "blocksize");
break;
case ARG_OFFSET:
src->curoffset = g_value_get_int64 (value);
+ g_object_notify (G_OBJECT (src), "offset");
break;
case ARG_MAPSIZE:
if ((src->mapsize % src->pagesize) == 0)
+ {
src->mapsize = g_value_get_ulong (value);
+ g_object_notify (G_OBJECT (src), "mmapsize");
+ }
else
GST_INFO(0, "invalid mapsize, must a multiple of pagesize, which is %d\n",src->pagesize);
break;
case ARG_TOUCH:
src->touch = g_value_get_boolean (value);
+ g_object_notify (G_OBJECT (src), "touch");
break;
default:
break;
/* we're done, return the buffer */
src->curoffset += GST_BUFFER_SIZE(buf);
+ g_object_notify (G_OBJECT (src), "offset");
return buf;
}
src->curoffset = 0;
+ /* now notify of the changes */
+ g_object_freeze_notify (G_OBJECT (src));
+ g_object_notify (G_OBJECT (src), "filesize");
+ g_object_notify (G_OBJECT (src), "offset");
+ g_object_thaw_notify (G_OBJECT (src));
+
GST_FLAG_SET (src, GST_FILESRC_OPEN);
}
return TRUE;
src->fd = 0;
src->filelen = 0;
src->curoffset = 0;
+ /* and notify that things changed */
+ g_object_freeze_notify (G_OBJECT (src));
+ g_object_notify (G_OBJECT (src), "filesize");
+ g_object_notify (G_OBJECT (src), "offset");
+ g_object_thaw_notify (G_OBJECT (src));
+
if (src->mapbuf)
gst_buffer_unref (src->mapbuf);
return FALSE;
break;
}
+ g_object_notify (G_OBJECT (src), "offset");
src->seek_happened = TRUE;
src->need_flush = GST_EVENT_SEEK_FLUSH(event);
gst_event_free (event);
/* element check */
sink = GST_MD5SINK (element);
- g_return_val_if_fail (sink != NULL, GST_PAD_CONNECT_REFUSED);
- g_return_val_if_fail (GST_IS_MD5SINK (sink), GST_PAD_CONNECT_REFUSED);
+
+ g_return_val_if_fail (GST_IS_MD5SINK (sink), GST_STATE_FAILURE);
switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_READY_TO_PAUSED:
md5_init_ctx (sink);
+ g_object_notify (G_OBJECT (element), "md5");
break;
case GST_STATE_PAUSED_TO_READY:
md5_finish_ctx (sink, sink->md5);
+ g_object_notify (G_OBJECT (element), "md5");
break;
default:
break;
switch (prop_id) {
case ARG_MD5:
- md5_read_ctx (sink, sink->md5);
+ /* you could actually get a value for the current md5. This is currently disabled.
+ * md5_read_ctx (sink, sink->md5); */
g_value_set_pointer (value, sink->md5);
break;
default: