From: <en...@fr...> - 2005-04-11 18:56:27
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ensonic Date: Mon Apr 11 2005 11:56:23 PDT Log message: added _valist functions to API ideas about interpolator implementations implemented more convinience API Modified files: gst-controller : ChangeLog README gst-controller/src: gst-controller.c gst-controller.h gst-helper.c gst-interpolation.c Added files: gst-controller/examples: .cvsignore Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/ChangeLog.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/README.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/examples/.cvsignore?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gst-controller.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gst-controller.h.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gst-helper.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gst-interpolation.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-sandbox/gst-controller/ChangeLog,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- ChangeLog 8 Apr 2005 09:16:04 -0000 1.16 +++ ChangeLog 11 Apr 2005 18:56:10 -0000 1.17 @@ -1,3 +1,20 @@ +2005-04-11 Stefan Kost <en...@us...> + + reviewed by: <delete if not using a buddy> + * README: + * examples/.cvsignore: + * src/gst-controller.c: (gst_controller_new_valist), + (gst_controller_new), (gst_controller_remove_properties_valist), + (gst_controller_remove_properties), (gst_controller_set_from_list): + * src/gst-controller.h: + * src/gst-helper.c: (g_object_control_properties), + (g_object_uncontrol_properties): + * src/gst-interpolation.c: (interpolate_linear_get): + added _valist functions to API + ideas about interpolator implementations + implemented more convinience API 2005-04-08 Stefan Kost <en...@us...> * README: Index: README RCS file: /cvs/gstreamer/gst-sandbox/gst-controller/README,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- README 8 Apr 2005 09:16:04 -0000 1.3 +++ README 11 Apr 2005 18:56:10 -0000 1.4 @@ -7,6 +7,8 @@ The purpose of the library is to provide a mechanism to schedule property value changes for gobjects. +Further ideas and discussion can be found at: +http://www.buzztard.org/index.php/Dynamic_parameters BUILDING --- NEW FILE: .cvsignore --- audio-example Index: gst-controller.c RCS file: /cvs/gstreamer/gst-sandbox/gst-controller/src/gst-controller.c,v --- gst-controller.c 8 Apr 2005 09:16:04 -0000 1.16 +++ gst-controller.c 11 Apr 2005 18:56:11 -0000 1.17 @@ -178,29 +178,28 @@ /* methods */ /** - * gst_controller_new: + * gst_controller_new_valist: * @object: the object of which some properties should be controlled - * @...: %NULL terminated list of property names that should be controlled + * @var_args: %NULL terminated list of property names that should be controlled * * Creates a new GstController for the given object's properties * Returns: the new controller. */ -GstController *gst_controller_new (GObject *object, ...) +GstController *gst_controller_new_valist (GObject *object, va_list var_args) { - GstController *self; + GstController *self; GstControlledProperty *prop; - va_list var_args; gchar *name; g_return_val_if_fail (object,NULL); - - GST_INFO("setting up a new controller"); + GST_INFO("setting up a new controller"); /* TODO should this method check if the given object implements GstParent and if so instantiate a GstParentController ? - BilboEd : This is too specific to be put here, don't we want + BilboEd: This is too specific to be put here, don't we want GstController to be as generic as possible ? Ensonic: So we will have gst_parent_controller_new as well and maybe a @@ -217,35 +216,57 @@ } // create GstControlledProperty for each property - va_start (var_args, object); while((name = va_arg (var_args, gchar*))) { // create GstControlledProperty and add to self->propeties List if((prop=gst_controlled_property_new(object,name))) self->properties=g_list_prepend(self->properties,prop); } va_end (var_args); + return(self); +} + +/** + * gst_controller_new: + * @object: the object of which some properties should be controlled + * @...: %NULL terminated list of property names that should be controlled + * + * Creates a new GstController for the given object's properties + * Returns: the new controller. + */ +GstController *gst_controller_new (GObject *object, ...) +{ + GstController *self; + va_list var_args; + g_return_val_if_fail (object,NULL); + va_start (var_args, object); + self=gst_controller_new_valist(object,var_args); + va_end (var_args); return(self); } * gst_controller_remove_properties: * @self: the controller object from which some properties should be removed - * @...: %NULL terminated list of property names that should be removed + * @var_args: %NULL terminated list of property names that should be removed * Removes the given object properties from the controller * Returns: %FALSE if one of the given property isn't handled by the controller, %TRUE otherwise -gboolean gst_controller_remove_properties (GstController *self,...) +gboolean gst_controller_remove_properties_valist (GstController *self, va_list var_args) gboolean res=TRUE; GList* node; - va_start (var_args, self); + g_return_val_if_fail (GST_IS_CONTROLLER(self),FALSE); // find the property in the properties list of the controller, remove and free it g_mutex_lock (self->lock); @@ -258,7 +279,29 @@ res=FALSE; } g_mutex_unlock (self->lock); - } + } + return(res); + * gst_controller_remove_properties: + * @self: the controller object from which some properties should be removed + * @...: %NULL terminated list of property names that should be removed + * Removes the given object properties from the controller + * Returns: %FALSE if one of the given property isn't handled by the controller, %TRUE otherwise +gboolean gst_controller_remove_properties (GstController *self,...) + gboolean res; + g_return_val_if_fail (GST_IS_CONTROLLER(self),FALSE); + va_start (var_args, self); + res=gst_controller_remove_properties_valist(self,var_args); return(res); @@ -274,7 +317,6 @@ * Returns: FALSE if the values couldn't be set (ex : properties not handled by controller), TRUE otherwise - gboolean gst_controller_set (GstController *self, gchar * property_name, GstClockTime timestamp, GValue * value) @@ -314,14 +356,43 @@ return(FALSE); -gboolean gst_controller_set_many (GstController *self, gchar * property_name, + * gst_controller_set_from_list: + * @self: the controller object which handles the properties + * @property_name: the name of the property to set + * @timedvalues: a list with #GstTimedValue items + * Sets multiple timed values at once. + * Returns: FALSE if the values couldn't be set (ex : properties not handled by controller), TRUE otherwise +gboolean gst_controller_set_from_list (GstController *self, gchar * property_name, GSList * timedvalues) - /* TODO isn't it a bit unconventional to pass then as a list - better call it gst_controller_set_many_from_list + GstControlledProperty *prop; + GSList *node; + GstTimedValue *tv; - BilboEd : agreed - */ + g_return_val_if_fail (property_name,FALSE); + g_mutex_lock (self->lock); + if((prop=gst_controller_find_controlled_property(self,property_name))) + { + for(node=timedvalues;node;node=g_slist_next(node)) { + tv=node->data; + if(G_VALUE_TYPE(&tv->value)==prop->type) + { + g_return_val_if_fail (GST_CLOCK_TIME_IS_VALID(tv->timestamp),FALSE); + /* TODO copy the timed value or just link in? */ + } + else { + GST_WARNING("incompatible value type for property '%s'",prop->name); + } + } + g_mutex_unlock (self->lock); @@ -359,7 +430,6 @@ * Returns: a copy of the list, or %NULL if the property isn't handled by the controller const GList *gst_controller_get_all (GstController *self, gchar * property_name) @@ -379,7 +449,6 @@ * Returns: TRUE if the controller values could be applied to the object properties, FALSE otherwise gboolean gst_controller_sink_values (GstController *self, GObject * object, GstClockTime timestamp) Index: gst-controller.h RCS file: /cvs/gstreamer/gst-sandbox/gst-controller/src/gst-controller.h,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gst-controller.h 8 Apr 2005 09:16:04 -0000 1.14 +++ gst-controller.h 11 Apr 2005 18:56:11 -0000 1.15 @@ -148,12 +148,15 @@ /* GstController functions */ +GstController *gst_controller_new_valist (GObject *object, va_list var_args); GstController *gst_controller_new (GObject * object,...); -gboolean gst_controller_remove_properties (GstController * controller,...); +gboolean gst_controller_remove_properties_valist (GstController * controller, va_list var_args); +gboolean gst_controller_remove_properties (GstController * controller, ...); gboolean gst_controller_set (GstController * controller, gchar * property_name, GstClockTime timestamp, GValue * value); -gboolean gst_controller_set_many (GstController * controller, gchar * property_name, +gboolean gst_controller_set_from_list (GstController * controller, gchar * property_name, GSList * timedvalues); Index: gst-helper.c RCS file: /cvs/gstreamer/gst-sandbox/gst-controller/src/gst-helper.c,v retrieving revision 1.2 diff -u -d -r1.2 -r1.3 --- gst-helper.c 7 Apr 2005 16:37:42 -0000 1.2 +++ gst-helper.c 11 Apr 2005 18:56:11 -0000 1.3 @@ -28,13 +28,14 @@ GstController *g_object_control_properties (GObject *object,...) GstController *ctrl; g_return_val_if_fail (object,FALSE); - ctrl=g_object_get_qdata(object,controller_key); - return(NULL); + va_list var_args; + va_start (var_args, object); + ctrl=gst_controller_new_valist(object,var_args); + va_end (var_args); + return(ctrl); @@ -48,15 +49,20 @@ gboolean g_object_uncontrol_properties (GObject *object,...) + gboolean res=FALSE; - g_return_val_if_fail(ctrl,FALSE); - return(FALSE); + if((ctrl=g_object_get_qdata(object,controller_key))) + { + va_list var_args; + va_start (var_args, object); + res=gst_controller_remove_properties_valist(ctrl,var_args); + va_end (var_args); + return(res); Index: gst-interpolation.c RCS file: /cvs/gstreamer/gst-sandbox/gst-controller/src/gst-interpolation.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gst-interpolation.c 7 Apr 2005 18:19:46 -0000 1.5 +++ gst-interpolation.c 11 Apr 2005 18:56:11 -0000 1.6 @@ -104,8 +104,20 @@ tv2=node->data; timediff=tv2->timestamp-tv1->timestamp; - /* TODO yieks, now we need to do that for each GValue type :( - valuediff= + /* TODO yieks, now we need to do that for each GValue type :( + + IDEA + We can have function pointers to g_value_{set,get}_xxx in + the GstControlledProperty. + Next we have implementations for: + LONG: G_TYPE_CHAR, G_TYPE_UCHAR, ... G_TYPE_INT + INT64: G_TYPE_LONG, G_TYPE_ULONG + DOUBLE: G_TYPE_FLOAT, G_TYPE_DOUBLE + What do we do about INT64? + valuediff=value2-value1 + result=value1+valuediff*((timestamp-tv1->timestamp)/timediff); */ } |