libs/gst/controller/: Keep last-value and only call set_property if value has changed...
authorStefan Kost <ensonic@users.sourceforge.net>
Mon, 17 Nov 2008 21:41:35 +0000 (21:41 +0000)
committerStefan Kost <ensonic@users.sourceforge.net>
Mon, 17 Nov 2008 21:41:35 +0000 (21:41 +0000)
Original commit message from CVS:
* libs/gst/controller/gstcontroller.c:
* libs/gst/controller/gstcontrollerprivate.h:
Keep last-value and only call set_property if value has changed. This
supresses all the g_object_notifies we would trigger otherwise. It
also allows the user to chage the value while there is no controller
change.

ChangeLog
libs/gst/controller/gstcontroller.c
libs/gst/controller/gstcontrollerprivate.h

index d479772e804b0d7bc3511676056068871b2b52fb..cc5f182698fc568645a5523f772176ba094cbcf9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-11-17  Stefan Kost  <ensonic@users.sf.net>
+
+       * libs/gst/controller/gstcontroller.c:
+       * libs/gst/controller/gstcontrollerprivate.h:
+         Keep last-value and only call set_property if value has changed. This
+         supresses all the g_object_notifies we would trigger otherwise. It
+         also allows the user to chage the value while there is no controller
+         change.
+
 2008-11-17  Stefan Kost  <ensonic@users.sf.net>
 
        * gst/gstvalue.c:
index 85499010b72b00584d33964b0b84f3fe57f7c13c..b9d37e133712832bb6e558f8b1f29b1328e7a081 100644 (file)
@@ -146,6 +146,8 @@ gst_controlled_property_new (GObject * object, const gchar * name)
       prop->pspec = pspec;
       prop->name = pspec->name;
       prop->disabled = FALSE;
+      memset (&prop->last_value, 0, sizeof (GValue));
+      g_value_init (&prop->last_value, G_PARAM_SPEC_VALUE_TYPE (prop->pspec));
     }
   } else {
     GST_WARNING ("class '%s' has no property '%s'", G_OBJECT_TYPE_NAME (object),
@@ -166,6 +168,7 @@ gst_controlled_property_free (GstControlledProperty * prop)
 {
   if (prop->csource)
     g_object_unref (prop->csource);
+  g_value_unset (&prop->last_value);
   g_free (prop);
 }
 
@@ -691,7 +694,10 @@ gst_controller_sync_values (GstController * self, GstClockTime timestamp)
     g_value_init (&value, G_PARAM_SPEC_VALUE_TYPE (prop->pspec));
     ret = gst_control_source_get_value (prop->csource, timestamp, &value);
     if (G_LIKELY (ret)) {
-      g_object_set_property (self->object, prop->name, &value);
+      if (gst_value_compare (&value, &prop->last_value) != GST_VALUE_EQUAL) {
+        g_object_set_property (self->object, prop->name, &value);
+        g_value_copy (&value, &prop->last_value);
+      }
     } else {
       GST_LOG ("no control value");
     }
index ab600e92d3a6a2a819f5f2b4fb8f13fec5264904..9b578c83e04f9462aa214dcd902cd261c7caaac5 100644 (file)
@@ -41,6 +41,7 @@ typedef struct _GstControlledProperty
   gchar *name;                  /* name of the property */
   GstControlSource *csource;    /* GstControlSource for this property */
   gboolean disabled;
+  GValue last_value;
 } GstControlledProperty;
 
 #define GST_CONTROLLED_PROPERTY(obj)    ((GstControlledProperty *)(obj))