diff --git a/ChangeLog b/ChangeLog index 3f054b7fb7..aec61df134 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2005-09-30 Thomas Vander Stichele + + * gst/gst.defs: + * gst/gst.override: + * gst/gstbin.override: + deprecate add_many/remove_many, fold into add/remove + * gst/gstmodule.c: (init_gst): + add AddError and RemoveError + * testsuite/Makefile.am: + remove fatal warnings, until we can wrap log handlers + and catch our expected add/remove errors + * testsuite/test_bin.py: + add tests for new add/remove semantics + * testsuite/test_pad.py: + * testsuite/test_pipeline.py: + fix up + 2005-09-29 Johan Dahlin * gst/gstelement.override (_wrap_gst_element_get_state): return an diff --git a/gst/gst.defs b/gst/gst.defs index ade6142fc1..8a7716c0bc 100644 --- a/gst/gst.defs +++ b/gst/gst.defs @@ -70,10 +70,21 @@ (define-method add (of-object "GstBin") (c-name "gst_bin_add") - (return-type "gboolean") + (return-type "none") (parameters - '("GstElement*" "element") + '("GstElement*" "element_1") ) + (varargs #t) +) + +(define-method add_many + (of-object "GstBin") + (c-name "gst_bin_add_many") + (return-type "none") + (parameters + '("GstElement*" "element_1") + ) + (varargs #t) ) (define-method remove @@ -81,10 +92,20 @@ (c-name "gst_bin_remove") (return-type "gboolean") (parameters - '("GstElement*" "element") + '("GstElement*" "element_1") ) + (varargs #t) ) +(define-method remove_many + (of-object "GstBin") + (c-name "gst_bin_remove_many") + (return-type "gboolean") + (parameters + '("GstElement*" "element_1") + ) + (varargs #t) +) (define-method get_by_name (of-object "GstBin") (c-name "gst_bin_get_by_name") @@ -5917,16 +5938,6 @@ ) ) -(define-method add_many - (of-object "GstBin") - (c-name "gst_bin_add_many") - (return-type "none") - (parameters - '("GstElement*" "element_1") - ) - (varargs #t) -) - (define-method remove_many (of-object "GstBin") (c-name "gst_bin_remove_many") diff --git a/gst/gst.override b/gst/gst.override index dc79763d6a..eda7786d44 100644 --- a/gst/gst.override +++ b/gst/gst.override @@ -51,6 +51,8 @@ headers #include PyObject *PyGstExc_LinkError = NULL; +PyObject *PyGstExc_AddError = NULL; +PyObject *PyGstExc_RemoveError = NULL; GST_DEBUG_CATEGORY_EXTERN (python_debug); #define GST_CAT_DEFAULT python_debug diff --git a/gst/gstbin.override b/gst/gstbin.override index 65109a93fc..d0f6148019 100644 --- a/gst/gstbin.override +++ b/gst/gstbin.override @@ -24,9 +24,9 @@ ignore gst_bin_get_by_name_recurse_up %% -override gst_bin_add_many args +override gst_bin_add args static PyObject * -_wrap_gst_bin_add_many(PyGObject *self, PyObject *args) +_wrap_gst_bin_add(PyGObject *self, PyObject *args) { PyGObject *element; int i, len; @@ -49,16 +49,30 @@ _wrap_gst_bin_add_many(PyGObject *self, PyObject *args) for (i = 0; i < len; i++) { element = (PyGObject*)PyTuple_GetItem(args, i); - gst_bin_add(GST_BIN(self->obj), GST_ELEMENT(element->obj)); + if (!gst_bin_add(GST_BIN(self->obj), GST_ELEMENT(element->obj))) { + PyErr_Format(PyGstExc_AddError, "Could not add element '%s'", GST_OBJECT_NAME(element->obj)); + return NULL; + } } Py_INCREF(Py_None); return Py_None; } + %% -override gst_bin_remove_many args +override gst_bin_add_many kwargs static PyObject * -_wrap_gst_bin_remove_many(PyGObject *self, PyObject *args) +_wrap_gst_bin_add_many(PyGObject *self, PyObject *args) +{ + if (PyErr_Warn(PyExc_DeprecationWarning, "gst.Bin.add_many() is deprecated, use gst.Bin.add()") < 0) + return NULL; + return _wrap_gst_bin_add (self, args); +} + +%% +override gst_bin_remove args +static PyObject * +_wrap_gst_bin_remove(PyGObject *self, PyObject *args) { PyGObject *element; int i, len; @@ -81,12 +95,27 @@ _wrap_gst_bin_remove_many(PyGObject *self, PyObject *args) for (i = 0; i < len; i++) { element = (PyGObject*)PyTuple_GetItem(args, i); - gst_bin_remove(GST_BIN(self->obj), GST_ELEMENT(element->obj)); + if (!gst_bin_remove(GST_BIN(self->obj), GST_ELEMENT(element->obj))) { + PyErr_Format(PyGstExc_RemoveError, "Could not remove element '%s'", GST_OBJECT_NAME(element->obj)); + return NULL; + } } Py_INCREF(Py_None); return Py_None; } + +%% +override gst_bin_remove_many kwargs +static PyObject * +_wrap_gst_bin_remove_many(PyGObject *self, PyObject *args) +{ + if (PyErr_Warn(PyExc_DeprecationWarning, "gst.Bin.remove_many() is deprecated, use gst.Bin.remove()") < 0) + return NULL; + return _wrap_gst_bin_remove (self, args); +} + + %% override gst_bin_get_by_name kwargs static PyObject * diff --git a/gst/gstmodule.c b/gst/gstmodule.c index e056576610..553a657582 100644 --- a/gst/gstmodule.c +++ b/gst/gstmodule.c @@ -41,6 +41,8 @@ extern PyMethodDef pygst_functions[]; extern GSList *mainloops; extern void _pygst_main_quit(void); extern PyObject *PyGstExc_LinkError; +extern PyObject *PyGstExc_AddError; +extern PyObject *PyGstExc_RemoveError; GST_DEBUG_CATEGORY (pygst_debug); /* for bindings code */ GST_DEBUG_CATEGORY (python_debug); /* for python code */ @@ -171,12 +173,23 @@ init_gst (void) PyModule_AddObject(m, "CLOCK_TIME_NONE", PyLong_FromUnsignedLongLong(GST_CLOCK_TIME_NONE)); - /* LinkError exception */ + /* exceptions */ PyGstExc_LinkError = PyErr_NewException("gst.LinkError", PyExc_RuntimeError, NULL); PyDict_SetItemString(d, "LinkError", PyGstExc_LinkError); + PyGstExc_AddError = PyErr_NewException("gst.AddError", + PyExc_RuntimeError, + NULL); + PyDict_SetItemString(d, "AddError", PyGstExc_AddError); + + PyGstExc_RemoveError = PyErr_NewException("gst.RemoveError", + PyExc_RuntimeError, + NULL); + PyDict_SetItemString(d, "RemoveError", PyGstExc_RemoveError); + + pygstminiobject_register_class(d, "GstMiniObject", GST_TYPE_MINI_OBJECT, &PyGstMiniObject_Type, NULL); diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am index d2fbb6efce..4df6010b65 100644 --- a/testsuite/Makefile.am +++ b/testsuite/Makefile.am @@ -31,11 +31,11 @@ tests = \ test_xml.py check-local: testhelper.la - @G_DEBUG=fatal_warnings PYTHONPATH=$(top_builddir):$(top_builddir)/gst/.libs:`pwd`:$(top_srcdir):$(PYTHONPATH) $(PYTHON) $(srcdir)/runtests.py + @PYTHONPATH=$(top_builddir):$(top_builddir)/gst/.libs:`pwd`:$(top_srcdir):$(PYTHONPATH) $(PYTHON) $(srcdir)/runtests.py @rm -fr *.pyc check-verbose: testhelper.la - @VERBOSE=yes G_DEBUG=fatal_warnings PYTHONPATH=$(top_builddir):$(top_builddir)/gst/.libs:`pwd`:$(top_srcdir):$(PYTHONPATH) $(PYTHON) $(srcdir)/runtests.py + @VERBOSE=yes PYTHONPATH=$(top_builddir):$(top_builddir)/gst/.libs:`pwd`:$(top_srcdir):$(PYTHONPATH) $(PYTHON) $(srcdir)/runtests.py @rm -fr *.pyc EXTRA_DIST = $(tests) common.py runtests.py test-object.h diff --git a/testsuite/test_bin.py b/testsuite/test_bin.py index e15c1516c0..f4475d01e9 100644 --- a/testsuite/test_bin.py +++ b/testsuite/test_bin.py @@ -95,5 +95,32 @@ class BinSubclassTest(TestCase): # back to NULL bin.set_state(gst.STATE_NULL) +class BinAddRemove(TestCase): + def setUp(self): + TestCase.setUp(self) + self.bin = gst.Bin('bin') + + def tearDown(self): + del self.bin + TestCase.tearDown(self) + + def testError(self): + src = gst.element_factory_make('fakesrc', 'name') + sink = gst.element_factory_make('fakesink', 'name') + self.bin.add(src) + self.assertRaises(gst.AddError, self.bin.add, sink) + self.assertRaises(gst.AddError, self.bin.add, src) + self.assertRaises(gst.RemoveError, self.bin.remove, sink) + self.bin.remove(src) + self.assertRaises(gst.RemoveError, self.bin.remove, src) + + def testMany(self): + src = gst.element_factory_make('fakesrc') + sink = gst.element_factory_make('fakesink') + self.bin.add(src, sink) + self.assertRaises(gst.AddError, self.bin.add, src, sink) + self.bin.remove(src, sink) + self.assertRaises(gst.RemoveError, self.bin.remove, src, sink) + if __name__ == "__main__": unittest.main() diff --git a/testsuite/test_pad.py b/testsuite/test_pad.py index 79bf87794c..6fc997225d 100644 --- a/testsuite/test_pad.py +++ b/testsuite/test_pad.py @@ -98,7 +98,7 @@ class PadProbeTest(TestCase): self.assertEquals(self.fakesrc.__gstrefcount__, 1) self.assertEquals(sys.getrefcount(self.fakesrc), 3) - self.pipeline.add_many(self.fakesrc, self.fakesink) + self.pipeline.add(self.fakesrc, self.fakesink) self.assertEquals(self.fakesrc.__gstrefcount__, 2) # added self.assertEquals(sys.getrefcount(self.fakesrc), 3) diff --git a/testsuite/test_pipeline.py b/testsuite/test_pipeline.py index 6417f77de3..6417ae8d8d 100644 --- a/testsuite/test_pipeline.py +++ b/testsuite/test_pipeline.py @@ -54,7 +54,7 @@ class Pipeline(TestCase): source = gst.element_factory_make('fakesrc', 'source') source.set_property('num-buffers', 5) sink = gst.element_factory_make('fakesink', 'sink') - self.pipeline.add_many(source, sink) + self.pipeline.add(source, sink) gst.element_link_many(source, sink) def tearDown(self): @@ -93,7 +93,7 @@ class PipelineAndBus(TestCase): self.pipeline.set_property('play-timeout', 0L) source = gst.element_factory_make('fakesrc', 'source') sink = gst.element_factory_make('fakesink', 'sink') - self.pipeline.add_many(source, sink) + self.pipeline.add(source, sink) gst.element_link_many(source, sink) self.bus = self.pipeline.get_bus()