initial checkin for the deep_notify signal which replaces INFO events in the long...
authorBenjamin Otte <otte@gnome.org>
Tue, 5 Feb 2002 21:11:43 +0000 (21:11 +0000)
committerBenjamin Otte <otte@gnome.org>
Tue, 5 Feb 2002 21:11:43 +0000 (21:11 +0000)
Original commit message from CVS:
initial checkin for the deep_notify signal which replaces INFO events in the long run.
PLEASE do not use gst_element_[info,message,error] anymore. Use g_object_notify instead.
Thank you.

gst/elements/gstfilesrc.c
gst/elements/gstmd5sink.c
gst/gobject2gtk.h
gst/gstmarshal.list
gst/gstobject.c
gst/gstobject.h
plugins/elements/gstfilesrc.c
plugins/elements/gstmd5sink.c

index c29b0c1..6ab7c88 100644 (file)
@@ -247,21 +247,28 @@ gst_filesrc_set_property (GObject *object, guint prop_id, const GValue *value, G
       } 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;
@@ -542,6 +549,7 @@ gst_filesrc_get (GstPad *pad)
 
   /* we're done, return the buffer */
   src->curoffset += GST_BUFFER_SIZE(buf);
+  g_object_notify (G_OBJECT (src), "offset");
   return buf;
 }
 
@@ -579,6 +587,12 @@ gst_filesrc_open_file (GstFileSrc *src)
 
     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;
@@ -597,6 +611,12 @@ gst_filesrc_close_file (GstFileSrc *src)
   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);
 
@@ -654,6 +674,7 @@ gst_filesrc_srcpad_event (GstPad *pad, GstEvent *event)
           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);
index 96ae594..767a0cc 100644 (file)
@@ -422,15 +422,17 @@ gst_md5sink_change_state (GstElement *element)
   
   /* 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;
@@ -454,7 +456,8 @@ gst_md5sink_get_property (GObject *object, guint prop_id, GValue *value, GParamS
   
   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:
index c22feca..ee1c0fc 100644 (file)
@@ -42,6 +42,11 @@ typedef struct _GObjectClass GObjectClass;
 #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
@@ -70,7 +75,7 @@ typedef struct _GObjectClass GObjectClass;
 #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
@@ -100,6 +105,7 @@ typedef struct _GObjectClass GObjectClass;
 #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
 
@@ -197,6 +203,7 @@ void g2g_object_run_dispose (GObject *object);
 #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))
@@ -431,6 +438,10 @@ struct _GObjectClass {
                         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);
index a7de23f..9625d84 100644 (file)
@@ -4,5 +4,6 @@ VOID:INT
 VOID:STRING
 VOID:POINTER
 VOID:OBJECT
+VOID:OBJECT,PARAM
 VOID:OBJECT,POINTER
 VOID:INT,INT
index a33ce0f..edc5d2d 100644 (file)
@@ -27,6 +27,7 @@
 /* Object signals and args */
 enum {
   PARENT_SET,
+  DEEP_NOTIFY,
 #ifndef GST_DISABLE_LOADSAVE_REGISTRY
   OBJECT_SAVED,
 #endif
@@ -62,6 +63,7 @@ static void           gst_object_set_property         (GObject * object, guint prop_id, const G
                                                         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);
@@ -105,6 +107,7 @@ gst_object_class_init (GstObjectClass *klass)
 
   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",
@@ -115,6 +118,12 @@ gst_object_class_init (GstObjectClass *klass)
                   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,
@@ -574,6 +583,32 @@ gst_object_get_property (GObject* object, guint prop_id,
       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
index 0f2078b..294a7e4 100644 (file)
@@ -102,6 +102,7 @@ struct _GstObjectClass {
 
   /* 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
index c29b0c1..6ab7c88 100644 (file)
@@ -247,21 +247,28 @@ gst_filesrc_set_property (GObject *object, guint prop_id, const GValue *value, G
       } 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;
@@ -542,6 +549,7 @@ gst_filesrc_get (GstPad *pad)
 
   /* we're done, return the buffer */
   src->curoffset += GST_BUFFER_SIZE(buf);
+  g_object_notify (G_OBJECT (src), "offset");
   return buf;
 }
 
@@ -579,6 +587,12 @@ gst_filesrc_open_file (GstFileSrc *src)
 
     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;
@@ -597,6 +611,12 @@ gst_filesrc_close_file (GstFileSrc *src)
   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);
 
@@ -654,6 +674,7 @@ gst_filesrc_srcpad_event (GstPad *pad, GstEvent *event)
           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);
index 96ae594..767a0cc 100644 (file)
@@ -422,15 +422,17 @@ gst_md5sink_change_state (GstElement *element)
   
   /* 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;
@@ -454,7 +456,8 @@ gst_md5sink_get_property (GObject *object, guint prop_id, GValue *value, GParamS
   
   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: