From 31033595e4552fe05f4377a01286291c05e27736 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 28 Apr 2006 15:07:41 +0000 Subject: [PATCH] gst/arg-types.py: GstMiniObject used as virtual methods parameters should be unreffed before calling the method and t... Original commit message from CVS: * gst/arg-types.py: GstMiniObject used as virtual methods parameters should be unreffed before calling the method and the ref-ed. Added Params and Returns for const-gchar*, GType and gulong so the code generator can generate more virtual methods handlers/proxys. * gst/gst-types.defs: * gst/gst.defs: * gst/interfaces.defs: Added vtable and virtual method definition for interfaces so we can properly use virtual methods from those interfaces in python. --- ChangeLog | 13 ++++ gst/arg-types.py | 63 +++++++++++++++-- gst/gst-types.defs | 2 + gst/gst.defs | 31 ++++++++ gst/interfaces.defs | 168 +++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 271 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb576ca853..9b2435b844 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-04-28 Edward Hervey + + * gst/arg-types.py: + GstMiniObject used as virtual methods parameters should be unreffed + before calling the method and the ref-ed. + Added Params and Returns for const-gchar*, GType and gulong so the + code generator can generate more virtual methods handlers/proxys. + * gst/gst-types.defs: + * gst/gst.defs: + * gst/interfaces.defs: + Added vtable and virtual method definition for interfaces so we can properly use virtual + methods from those interfaces in python. + 2006-04-28 Edward Hervey * gst/gstmodule.c: (init_gst): diff --git a/gst/arg-types.py b/gst/arg-types.py index a60aecfc4c..b9dbf41e3f 100644 --- a/gst/arg-types.py +++ b/gst/arg-types.py @@ -23,7 +23,7 @@ # Author: David I. Lehn from argtypes import UInt64Arg, Int64Arg, PointerArg, ArgMatcher, ArgType, matcher -from reversewrapper import Parameter, ReturnType, GBoxedParam, GBoxedReturn +from reversewrapper import Parameter, ReturnType, GBoxedParam, GBoxedReturn, IntParam, IntReturn class XmlNodeArg(ArgType): """libxml2 node generator""" @@ -147,14 +147,15 @@ class GstMiniObjectParam(Parameter): def convert_c2py(self): self.wrapper.add_declaration("PyObject *py_%s = NULL;" % self.name) - self.wrapper.write_code(code=("if (%s)\n" + self.wrapper.write_code(code=("if (%s) {\n" " py_%s = pygstminiobject_new((GstMiniObject *) %s);\n" - "else {\n" + " gst_mini_object_unref ((GstMiniObject *) %s);\n" + "} else {\n" " Py_INCREF(Py_None);\n" " py_%s = Py_None;\n" "}" - % (self.name, self.name, self.name, self.name)), - cleanup=("Py_DECREF(py_%s);" % self.name)) + % (self.name, self.name, self.name, self.name, self.name)), + cleanup=("gst_mini_object_ref ((GstMiniObject *) %s);\nPy_DECREF(py_%s);" % (self.name, self.name))) self.wrapper.add_pyargv_item("py_%s" % self.name) matcher.register_reverse('GstMiniObject*', GstMiniObjectParam) @@ -266,6 +267,50 @@ class UInt64Return(ReturnType): failure_expression="!PyLong_Check(py_retval)", failure_cleanup='PyErr_SetString(PyExc_TypeError, "retval should be an long");') self.wrapper.write_code("retval = PyLong_AsUnsignedLongLongMask(py_retval);") + +class ULongParam(Parameter): + + def get_c_type(self): + return self.props.get('c_type', 'gulong') + + def convert_c2py(self): + self.wrapper.add_declaration("PyObject *py_%s;" % self.name) + self.wrapper.write_code(code=("py_%s = PyLong_FromUnsignedLong(%s);" % + (self.name, self.name)), + cleanup=("Py_DECREF(py_%s);" % self.name)) + self.wrapper.add_pyargv_item("py_%s" % self.name) + +class ULongReturn(ReturnType): + def get_c_type(self): + return self.props.get('c_type', 'gulong') + def write_decl(self): + self.wrapper.add_declaration("%s retval;" % self.get_c_type()) + def write_error_return(self): + self.wrapper.write_code("return -G_MAXINT;") + def write_conversion(self): + self.wrapper.write_code( + code=None, + failure_expression="!PyLong_Check(py_retval)", + failure_cleanup='PyErr_SetString(PyExc_TypeError, "retval should be an long");') + self.wrapper.write_code("retval = PyLong_AsUnsignedLongMask(py_retval);") + +class ConstStringReturn(ReturnType): + + def get_c_type(self): + return "const gchar *" + + def write_decl(self): + self.wrapper.add_declaration("const gchar *retval;") + + def write_error_return(self): + self.wrapper.write_code("return NULL;") + + def write_conversion(self): + self.wrapper.write_code( + code=None, + failure_expression="!PyString_Check(py_retval)", + failure_cleanup='PyErr_SetString(PyExc_TypeError, "retval should be a string");') + self.wrapper.write_code("retval = g_strdup(PyString_AsString(py_retval));") matcher.register('GstClockTime', UInt64Arg()) matcher.register('GstClockTimeDiff', Int64Arg()) @@ -294,4 +339,12 @@ for typename in ["guint64", "GstClockTime"]: matcher.register_reverse(typename, UInt64Param) matcher.register_reverse_ret(typename, UInt64Return) +matcher.register_reverse_ret("const-gchar*", ConstStringReturn) + +matcher.register_reverse("GType", IntParam) +matcher.register_reverse_ret("GType", IntReturn) + +matcher.register_reverse("gulong", ULongParam) +matcher.register_reverse_ret("gulong", ULongReturn) + del arg diff --git a/gst/gst-types.defs b/gst/gst-types.defs index ed8b087d2a..3bb7222f68 100644 --- a/gst/gst-types.defs +++ b/gst/gst-types.defs @@ -1028,6 +1028,7 @@ (in-module "Gst") (c-name "GstURIHandler") (gtype-id "GST_TYPE_URI_HANDLER") + (vtable "GstURIHandlerInterface") ) (define-interface TagSetter @@ -1040,5 +1041,6 @@ (in-module "Gst") (c-name "GstImplementsInterface") (gtype-id "GST_TYPE_IMPLEMENTS_INTERFACE") + (vtable "GstImplementsInterfaceClass") ) diff --git a/gst/gst.defs b/gst/gst.defs index 05cc62a9fb..01ad3586aa 100644 --- a/gst/gst.defs +++ b/gst/gst.defs @@ -2599,6 +2599,14 @@ ) ) +(define-virtual supported + (of-object "GstImplementsInterface") + (return-type "gboolean") + (parameters + '("GType" "iface_type") + ) +) + ;; From ../gstreamer/gst/gstiterator.h (define-function iterator_new @@ -6212,6 +6220,29 @@ ) ) +(define-virtual get_type + (of-object "GstURIHandler") + (return-type "guint") +) + +(define-virtual get_protocols + (of-object "GstURIHandler") + (return-type "gchar**") +) + +(define-virtual get_uri + (of-object "GstURIHandler") + (return-type "const-gchar*") +) + +(define-virtual set_uri + (of-object "GstURIHandler") + (return-type "gboolean") + (parameters + '("const-gchar*" "uri") + ) +) + ;; From ../gstreamer/gst/gstutils.h (define-function util_set_value_from_string diff --git a/gst/interfaces.defs b/gst/interfaces.defs index 829d34eb4f..1f39228a4a 100644 --- a/gst/interfaces.defs +++ b/gst/interfaces.defs @@ -12,6 +12,7 @@ (in-module "Gst") (c-name "GstColorBalance") (gtype-id "GST_TYPE_COLOR_BALANCE") + (vtable "GstColorBalanceClass") ) (define-object ColorBalanceChannel @@ -33,6 +34,7 @@ (fields '("GstMixerType" "mixer_type") ) + (vtable "GstMixerClass") ) (define-object MixerTrack @@ -60,18 +62,21 @@ (in-module "Gst") (c-name "GstNavigation") (gtype-id "GST_TYPE_NAVIGATION") + (vtable "GstNavigationInterface") ) (define-interface PropertyProbe (in-module "Gst") (c-name "GstPropertyProbe") (gtype-id "GST_TYPE_PROPERTY_PROBE") + (vtable "GstPropertyProbeInterface") ) (define-interface Tuner (in-module "Gst") (c-name "GstTuner") (gtype-id "GST_TYPE_TUNER") + (vtable "GstTunerClass") ) (define-object TunerChannel @@ -189,6 +194,28 @@ ) ) +(define-virtual list_channels + (of-object "GstColorBalance") + (return-type "const-GList*") +) + +(define-virtual set_value + (of-object "GstColorBalance") + (return-type "none") + (parameters + '("GstColorBalanceChannel*" "channel") + '("gint" "value") + ) +) + +(define-virtual get_value + (of-object "GstColorBalance") + (return-type "gint") + (parameters + '("GstColorBalanceChannel*" "channel") + ) +) + ;; From /opt/gnome/include/gstreamer-0.7/gst/mixer/mixer.h @@ -303,6 +330,48 @@ ) ) +(define-virtual list_tracks + (of-object "GstMixer") + (return-type "const-GList*") +) + +(define-virtual set_volume + (of-object "GstMixer") + (return-type "none") + (parameters + '("GstMixerTrack*" "track") + '("gint*" "volumes") + ) +) + +(define-virtual get_volume + (of-object "GstMixer") + (return-type "none") + (parameters + '("GstMixerTrack*" "track") + '("gint*" "volumes") + ) +) + +(define-virtual set_mute + (of-object "GstMixer") + (return-type "none") + (parameters + '("GstMixerTrack*" "track") + '("gboolean" "mute") + ) +) + +(define-virtual set_record + (of-object "GstMixer") + (return-type "none") + (parameters + '("GstMixerTrack*" "track") + '("gboolean" "record") + ) +) + + ;; From ../gst-plugins-base/gst-libs/gst/interfaces/mixeroptions.h (define-function gst_mixer_options_get_type @@ -355,7 +424,13 @@ ) ) - +(define-virtual send_event + (of-object "GstNavigation") + (return-type "none") + (parameters + '("GstStructure*" "structure") + ) +) ;; From /opt/gnome/include/gstreamer-0.7/gst/propertyprobe/propertyprobe.h @@ -451,6 +526,37 @@ ) ) +(define-virtual get_properties + (of-object "GstPropertyProbe") + (return-type "const-GList*") +) + +(define-virtual needs_probe + (of-object "GstPropertyProbe") + (return-type "gboolean") + (parameters + '("guint" "prop_id") + '("const-GParamSpec*" "pspec") + ) +) + +(define-virtual probe_property + (of-object "GstPropertyProbe") + (return-type "none") + (parameters + '("guint" "prop_id") + '("const-GParamSpec*" "pspec") + ) +) + +(define-virtual get_values + (of-object "GstPropertyProbe") + (return-type "GValueArray*") + (parameters + '("guint" "prop_id") + '("const-GParamSpec*" "pspec") + ) +) ;; From /opt/gnome/include/gstreamer-0.7/gst/tuner/tuner.h @@ -586,6 +692,66 @@ ) ) +(define-virtual list_channels + (of-object "GstTuner") + (return-type "const-GList*") +) + +(define-virtual set_channel + (of-object "GstTuner") + (return-type "none") + (parameters + '("GstTunerChannel*" "channel") + ) +) + +(define-virtual get_channel + (of-object "GstTuner") + (return-type "GstTunerChannel*") +) + +(define-virtual list_norms + (of-object "GstTuner") + (return-type "const-GList*") +) + +(define-virtual set_norm + (of-object "GstTuner") + (return-type "none") + (parameters + '("GstTunerNorm*" "channel") + ) +) + +(define-virtual get_norm + (of-object "GstTuner") + (return-type "GstTunerNorm*") +) + +(define-virtual set_frequency + (of-object "GstTuner") + (return-type "none") + (parameters + '("GstTunerChannel*" "channel") + '("gulong" "frequency") + ) +) + +(define-virtual get_frequency + (of-object "GstTuner") + (return-type "gulong") + (parameters + '("GstTunerChannel*" "channel") + ) +) + +(define-virtual signal_strength + (of-object "GstTuner") + (return-type "gint") + (parameters + '("GstTunerChannel*" "channel") + ) +)