+2005-06-28 Edward Hervey <edward@fluendo.com>
+
+ * codegen/codegen.py: (GstMiniObjectWrapper.constructor_tmpl):
+ let's not forget to wrap the MiniObject :)
+
+ * gst/gst-types.defs:
+ * gst/gst.defs:
+ Always keep up to date with the core
+
+ * gst/gstelement.override:
+ override for gst_element_query_position
+
+ * gst/pygstminiobject.c:
+ * gst/pygstminiobject.h:
+ * gst/gst.override:
+ PyGstMiniObject now properly wrap GstMiniObject and are referenced in a
+ global hash table
+
2005-06-26 Edward Hervey <edward@fluendo.com>
* codegen/argtypes.py:
' return -1;\n' \
' }\n' \
'%(aftercreate)s' \
+ ' pygstminiobject_register_wrapper((PyObject *)self);\n' \
' return 0;\n' \
'}\n\n'
method_tmpl = \
'("ok" "GST_FLOW_OK")
'("resend" "GST_FLOW_RESEND")
'("error" "GST_FLOW_ERROR")
- '("not-connected" "GST_FLOW_NOT_CONNECTED")
+ '("not-linked" "GST_FLOW_NOT_LINKED")
'("not-negotiated" "GST_FLOW_NOT_NEGOTIATED")
'("wrong-state" "GST_FLOW_WRONG_STATE")
'("unexpected" "GST_FLOW_UNEXPECTED")
(return-type "GstIterator*")
)
+(define-method iterate_src_pads
+ (of-object "GstElement")
+ (c-name "gst_element_iterate_src_pads")
+ (return-type "GstIterator*")
+)
+
+(define-method iterate_sink_pads
+ (of-object "GstElement")
+ (c-name "gst_element_iterate_sink_pads")
+ (return-type "GstIterator*")
+)
+
(define-method send_event
(of-object "GstElement")
(c-name "gst_element_send_event")
)
)
-(define-method ref
- (of-object "GstObject")
+(define-function object_ref
(c-name "gst_object_ref")
- (return-type "GstObject*")
+ (return-type "gpointer")
+ (parameters
+ '("gpointer" "object")
+ )
)
-(define-method unref
- (of-object "GstObject")
+(define-function object_unref
(c-name "gst_object_unref")
- (return-type "GstObject*")
+ (return-type "none")
+ (parameters
+ '("gpointer" "object")
+ )
)
-(define-method sink
- (of-object "GstObject")
+(define-function object_sink
(c-name "gst_object_sink")
(return-type "none")
+ (parameters
+ '("gpointer" "object")
+ )
)
(define-function object_replace
(c-name "gst_pad_set_active")
(return-type "gboolean")
(parameters
- '("GstActivateMode" "mode")
+ '("gboolean" "active")
)
)
-(define-method peer_set_active
+(define-method is_active
(of-object "GstPad")
- (c-name "gst_pad_peer_set_active")
+ (c-name "gst_pad_is_active")
+ (return-type "gboolean")
+)
+
+(define-method activate_pull
+ (of-object "GstPad")
+ (c-name "gst_pad_activate_pull")
(return-type "gboolean")
(parameters
- '("GstActivateMode" "mode")
+ '("gboolean" "active")
)
)
-(define-method is_active
+(define-method activate_push
(of-object "GstPad")
- (c-name "gst_pad_is_active")
+ (c-name "gst_pad_activate_push")
(return-type "gboolean")
+ (parameters
+ '("gboolean" "active")
+ )
)
(define-method set_blocked
)
)
-(define-method set_loop_function
+(define-method set_activatepull_function
+ (of-object "GstPad")
+ (c-name "gst_pad_set_activatepull_function")
+ (return-type "none")
+ (parameters
+ '("GstPadActivateModeFunction" "activatepull")
+ )
+)
+
+(define-method set_activatepush_function
(of-object "GstPad")
- (c-name "gst_pad_set_loop_function")
+ (c-name "gst_pad_set_activatepush_function")
(return-type "none")
(parameters
- '("GstPadLoopFunction" "loop")
+ '("GstPadActivateModeFunction" "activatepush")
)
)
(is-constructor-of "GstPipeline")
(return-type "GstElement*")
(parameters
- '("const-gchar*" "name")
+ '("const-gchar*" "name" (null-ok) (default "NULL"))
)
)
(return-type "none")
)
+(define-function gst_alloc_trace_print_live
+ (c-name "gst_alloc_trace_print_live")
+ (return-type "none")
+)
+
(define-function alloc_trace_set_flags_all
(c-name "gst_alloc_trace_set_flags_all")
(return-type "none")
#endif
if (!pygst_value_init())
return;
+ pygst_miniobject_init();
}
%%
modulename gst
GstElementState state;
GstElementStateReturn ret;
+ /* Only returns the state for the time being */
ret = gst_element_get_state(GST_ELEMENT (self->obj), &state, NULL, NULL);
if (!ret) {
PyErr_SetString(PyExc_RuntimeError, "conversion could not be performed");
return list;
}
+%%
+override gst_element_query_position args
+static PyObject *
+_wrap_gst_element_query_position (PyGObject *self, PyObject *args)
+{
+ gint64 cur, end;
+ gint format;
+ PyObject *pformat;
+ PyObject *ret;
+ int i;
+
+ pformat = (PyObject*)PyTuple_GetItem(args, 0);
+ if (pyg_enum_get_value (GST_TYPE_FORMAT, pformat, &format)) {
+ PyErr_SetString(PyExc_TypeError, "argument should be a GstFormat");
+ return NULL;
+ }
+
+ ret = PyList_New(0);
+ if ((gst_element_query_position(GST_ELEMENT (self->obj), (GstFormat*) &format, &cur, &end))) {
+ PyList_Append(ret, PyLong_FromLong(cur));
+ PyList_Append(ret, PyLong_FromLong(end));
+ PyList_Append(ret, pyg_enum_from_gtype (GST_TYPE_FORMAT, format ));
+ } else {
+ for (i = 0; i < 2; i++) {
+ Py_INCREF(Py_None);
+ PyList_Append(ret, Py_None);
+ }
+ PyList_Append(ret, pformat);
+ }
+
+ return ret;
+}
static int pygstminiobject_traverse(PyGstMiniObject *self, visitproc visit, void *arg);
static int pygstminiobject_clear(PyGstMiniObject *self);
+static GHashTable *miniobjs;
+
+void
+pygst_miniobject_init()
+{
+ miniobjs = g_hash_table_new (NULL, NULL);
+}
/**
* pygstminiobject_lookup_class:
}
/**
+ * pygstminiobject_register_wrapper:
+ * @self: the wrapper instance
+ *
+ * In the constructor of PyGTK wrappers, this function should be
+ * called after setting the obj member. It will tie the wrapper
+ * instance to the Gstminiobject so that the same wrapper instance will
+ * always be used for this Gstminiobject instance. It will also sink any
+ * floating references on the Gstminiobject.
+ */
+void
+pygstminiobject_register_wrapper(PyObject *self)
+{
+ GstMiniObject *obj = ((PyGstMiniObject *)self)->obj;
+
+ if (!pygstminiobject_wrapper_key)
+ pygstminiobject_wrapper_key=g_quark_from_static_string(pygstminiobject_wrapper_id);
+
+ Py_INCREF(self);
+ g_hash_table_insert (miniobjs, (gpointer) obj, (gpointer) self);
+/* gst_mini_object_set_qdata_full(obj, pygstminiobject_wrapper_key, self, */
+/* pyg_destroy_notify); */
+}
+
+
+/**
* pygstminiobject_new:
* @obj: a GstMiniObject instance.
*
return Py_None;
}
- /* create wrapper */
- PyTypeObject *tp = pygstminiobject_lookup_class(G_OBJECT_TYPE(obj));
- /* need to bump type refcount if created with
- pygstminiobject_new_with_interfaces(). fixes bug #141042 */
- if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE)
- Py_INCREF(tp);
- self = PyObject_GC_New(PyGstMiniObject, tp);
- if (self == NULL)
- return NULL;
- self->obj = gst_mini_object_ref(obj);
-
- self->inst_dict = NULL;
- self->weakreflist = NULL;
- /* save wrapper pointer so we can access it later */
- Py_INCREF(self);
- /* g_object_set_qdata_full(obj, pygstminiobject_wrapper_key, self, */
-/* pyg_destroy_notify); */
-
- PyObject_GC_Track((PyObject *)self);
+ /* we already have a wrapper for this object -- return it. */
+ self = (PyGstMiniObject *)g_hash_table_lookup (miniobjs, (gpointer) obj);
+/* self = (PyGstMiniObject *)gst_mini_object_get_qdata(obj, pygstminiobject_wrapper_key); */
+ if (self != NULL) {
+ Py_INCREF(self);
+ } else {
+ /* create wrapper */
+ PyTypeObject *tp = pygstminiobject_lookup_class(G_OBJECT_TYPE(obj));
+ /* need to bump type refcount if created with
+ pygstminiobject_new_with_interfaces(). fixes bug #141042 */
+ if (tp->tp_flags & Py_TPFLAGS_HEAPTYPE)
+ Py_INCREF(tp);
+ self = PyObject_GC_New(PyGstMiniObject, tp);
+ if (self == NULL)
+ return NULL;
+ self->obj = gst_mini_object_make_writable(obj);
+
+ self->inst_dict = NULL;
+ self->weakreflist = NULL;
+ /* save wrapper pointer so we can access it later */
+ Py_INCREF(self);
+ g_hash_table_insert (miniobjs, (gpointer) obj, (gpointer) self);
+/* gst_mini_object_set_qdata_full(obj, pygstminiobject_wrapper_key, self, */
+/* pyg_destroy_notify); */
+
+ PyObject_GC_Track((PyObject *)self);
+ }
return (PyObject *)self;
}
/* the following causes problems with subclassed types */
/* self->ob_type->tp_free((PyObject *)self); */
+ g_hash_table_remove (miniobjs, (gpointer) self);
PyObject_GC_Del(self);
}
static void
pygstminiobject_free(PyObject *op)
{
+ g_hash_table_remove (miniobjs, (gpointer) op);
PyObject_GC_Del(op);
}
pygstminiobject_register_class(PyObject *dict, const gchar *type_name,
GType gtype, PyTypeObject *type,
PyObject *bases);
+void
+pygstminiobject_register_wrapper(PyObject *self);
+
+void
+pygst_miniobject_init();
#ifndef _INSIDE_PYGSTMINIOBJECT_
extern PyTypeObject PyGstMiniObject_Type;
-#define init_pygstminiobject() { \
- PyObject *gstminiobject = PyImport_ImportModule("gstminiobject"); \
- if (gstminiobject != NULL) { \
- PyObject *mdict = PyModule_GetDict(gstminiobject); \
- PyObject *cobject = PyDict_GetItemString(mdict, "_PyGstMiniObject_API"); \
- if (PyCObject_Check(cobject)) \
- _PyGstMiniObject_API = (struct _PyGstMiniObject_Functions *)PyCObject_AsVoidPtr(cobject); \
- else { \
- PyErr_SetString(PyExc_RuntimeError, \
- "could not find _PyGstMiniObject_API object"); \
- return; \
- } \
- } else { \
- PyErr_SetString(PyExc_ImportError, \
- "could not import gst"); \
- return; \
- } \
-}
-
#endif /* !_INSIDE_PYGSTMINIOBJECT_ */
G_END_DECLS