[gstreamermm] Wrapped Gst::AudioFilter vfuncs.



commit a785d017885c66c7165fdfb0941f02a2795fc611
Author: José Alburquerque <jaalburqu svn gnome org>
Date:   Tue May 5 20:11:33 2009 -0400

    Wrapped Gst::AudioFilter vfuncs.
---
 ChangeLog                     |   17 ++++++++++
 gstreamer/src/audiofilter.ccg |   72 +++++++++++++++++++++++++++++++++++++++++
 gstreamer/src/audiofilter.hg  |   16 ++++++++-
 gstreamer/src/gst_vfuncs.defs |   10 ++++++
 gstreamer/src/ringbuffer.ccg  |   68 ++++++++++++++++++++++----------------
 gstreamer/src/ringbuffer.hg   |   16 +++------
 gstreamer/src/tagsetter.ccg   |    2 -
 7 files changed, 158 insertions(+), 43 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index f8f24c3..fbae99a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 2009-05-05  José Alburquerque  <jaalburqu svn gnome org>
 
+	* gstreamer/src/ringbuffer.ccg:
+	* gstreamer/src/ringbuffer.hg: Removed accidentally included
+	Gst::RingBufferSpec::gobj_copy() method.  Added a Gst::RingBufferSpec
+	castitem constructor.  Added
+	Gst::RingBufferSpec::copy_fields_{to,from} methods and made them
+	public; Removed the Gst::RingBufferSpec::set_fields() method (because
+	it is implemented in the copy_fields_from method.
+
+	* gstreamer/src/audiofilter.ccg:
+	* gstreamer/src/audiofilter.hg:
+	* gstreamer/src/gst_vfuncs.defs: Wrapped Gst::AudioFilter vfuncs.
+
+	* gstreamer/src/tagsetter.ccg: Marked TODO's completed because the
+	gst_tag_setter_add_{tags,tag_values} functions have been corrected.
+
+2009-05-05  José Alburquerque  <jaalburqu svn gnome org>
+
 	* gstreamer/src/object.hg: Wrapped deep_notify signal.
 	* gstreamer/src/gst_signals.defs.patch: Modified so that when patch is
 	applied to signal defs file, GstObject's deep notify signal has
diff --git a/gstreamer/src/audiofilter.ccg b/gstreamer/src/audiofilter.ccg
index 1cf3ba5..c8bdc1a 100644
--- a/gstreamer/src/audiofilter.ccg
+++ b/gstreamer/src/audiofilter.ccg
@@ -20,3 +20,75 @@
 #include <gst/audio/gstaudiofilter.h>
 
 _PINCLUDE(gstreamermm/private/basetransform_p.h)
+
+namespace Gst
+{
+
+#ifdef GLIBMM_VFUNCS_ENABLED
+gboolean AudioFilter_Class::setup_vfunc_callback(GstAudioFilter* self, GstRingBufferSpec* format)
+{
+  Glib::ObjectBase *const obj_base = static_cast<Glib::ObjectBase*>(
+      Glib::ObjectBase::_get_current_wrapper((GObject*)self));
+
+  // Non-gtkmmproc-generated custom classes implicitly call the default
+  // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc-
+  // generated classes can use this optimisation, which avoids the unnecessary
+  // parameter conversions if there is no possibility of the virtual function
+  // being overridden:
+  if(obj_base && obj_base->is_derived_())
+  {
+    CppObjectType *const obj = dynamic_cast<CppObjectType* const>(obj_base);
+    if(obj) // This can be NULL during destruction.
+    {
+      #ifdef GLIBMM_EXCEPTIONS_ENABLED
+      try // Trap C++ exceptions which would normally be lost because this is a C callback.
+      {
+      #endif //GLIBMM_EXCEPTIONS_ENABLED
+        Gst::RingBufferSpec spec(format);
+        // Call the virtual member method, which derived classes might override.
+        gboolean const result = static_cast<int>(obj->setup_vfunc(spec));
+        spec.copy_fields_to(*format);
+        return result;
+      #ifdef GLIBMM_EXCEPTIONS_ENABLED
+      }
+      catch(...)
+      {
+        Glib::exception_handlers_invoke();
+      }
+      #endif //GLIBMM_EXCEPTIONS_ENABLED
+    }
+  }
+  
+  BaseClassType *const base = static_cast<BaseClassType*>(
+      g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class).
+  );
+
+  // Call the original underlying C function:
+  if(base && base->setup)
+    return (*base->setup)(self, format);
+
+
+  typedef gboolean RType;
+  return RType();
+}
+bool Gst::AudioFilter::setup_vfunc(Gst::RingBufferSpec& format) 
+{
+  BaseClassType *const base = static_cast<BaseClassType*>(
+      g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class).
+  );
+
+  if(base && base->setup)
+  {
+    GstRingBufferSpec gst_spec;
+    format.copy_fields_to(gst_spec);
+    bool const result = (*base->setup)(gobj(),&gst_spec);
+    format.copy_fields_from(gst_spec);
+    return result;
+  }
+
+  typedef bool RType;
+  return RType();
+}
+#endif //GLIBMM_VFUNCS_ENABLED
+
+} // namespace Gst
diff --git a/gstreamer/src/audiofilter.hg b/gstreamer/src/audiofilter.hg
index 03f8935..21f0fa8 100644
--- a/gstreamer/src/audiofilter.hg
+++ b/gstreamer/src/audiofilter.hg
@@ -18,6 +18,7 @@
  */
 
 #include <gstreamermm/basetransform.h>
+#include <gstreamermm/ringbuffer.h>
 
 _DEFS(gstreamermm,gst)
 
@@ -45,7 +46,20 @@ class AudioFilter : public Gst::BaseTransform
   _CLASS_GOBJECT(AudioFilter, GstAudioFilter, GST_AUDIO_FILTER, Gst::BaseTransform, GstBaseTransform)
 
 public:
-  //TODO: Wrap vfuncs.
+#ifdef GLIBMM_VFUNCS_ENABLED
+  /** Virtual function, called whenever the format changes.
+   */
+  virtual bool setup_vfunc(Gst::RingBufferSpec& format);
+#endif //GLIBMM_VFUNCS_ENABLED
+
+protected:
+#m4begin
+  _PUSH(SECTION_PCC_CLASS_INIT_VFUNCS)
+  klass->setup = &setup_vfunc_callback;
+  _SECTION(SECTION_PH_VFUNCS)
+  static gboolean setup_vfunc_callback(GstAudioFilter* self, GstRingBufferSpec* format);
+  _POP()
+#m4end
 };
 
 } // namespace Gst
diff --git a/gstreamer/src/gst_vfuncs.defs b/gstreamer/src/gst_vfuncs.defs
index 81c1b63..d8ced50 100644
--- a/gstreamer/src/gst_vfuncs.defs
+++ b/gstreamer/src/gst_vfuncs.defs
@@ -684,6 +684,16 @@
   )
 )
 
+; GstAudioFilter
+
+(define-vfunc setup
+  (of-object "GstAudioFilter")
+  (return-type "gboolean")
+  (parameters
+   '("GstRingBufferSpec*" "format")
+  )
+)
+
 ; GstColorBalance
 
 (define-vfunc list_channels
diff --git a/gstreamer/src/ringbuffer.ccg b/gstreamer/src/ringbuffer.ccg
index 27a594e..061e4df 100644
--- a/gstreamer/src/ringbuffer.ccg
+++ b/gstreamer/src/ringbuffer.ccg
@@ -17,9 +17,8 @@
  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <gst/audio/audio-enumtypes.h>
-#include <gstreamermm/caps.h>
 #include <string.h>
+#include <gst/audio/audio-enumtypes.h>
 _PINCLUDE(gstreamermm/private/object_p.h)
 
 static void RingBuffer_Fill_gstreamermm_callback(GstRingBuffer* rbuf, guint8* data, guint len, gpointer user_data)
@@ -43,7 +42,18 @@ static void RingBuffer_Fill_gstreamermm_callback(GstRingBuffer* rbuf, guint8* da
 namespace Gst
 {
 
-void RingBufferSpec::set_fields(GstRingBufferSpec& spec)
+RingBufferSpec::RingBufferSpec(GstRingBufferSpec* castitem)
+{
+  if (castitem)
+    copy_fields_from(*castitem);
+  else
+  {
+    GstRingBufferSpec empty;
+    copy_fields_from(empty);
+  }
+}
+
+void RingBufferSpec::copy_fields_from(GstRingBufferSpec& spec)
 {
   type = (Gst::BufferFormatType)(spec.type);
   format = (Gst::BufferFormat)(spec.format);
@@ -63,6 +73,26 @@ void RingBufferSpec::set_fields(GstRingBufferSpec& spec)
   memcpy(silence_sample, spec.silence_sample, sizeof(silence_sample));
 }
 
+void RingBufferSpec::copy_fields_to(GstRingBufferSpec& spec)
+{
+  spec.type = (GstBufferFormatType)(type);
+  spec.format = (GstBufferFormat)(format);
+  spec.sign = sign;
+  spec.bigend = bigend;
+  spec.width = width;
+  spec.depth = depth;
+  spec.rate = rate;
+  spec.channels = channels;
+  spec.latency_time = latency_time;
+  spec.buffer_time = buffer_time;
+  spec.segsize = segsize;
+  spec.segtotal = segtotal;
+  spec.bytes_per_sample = bytes_per_sample;
+  spec.seglatency = seglatency;
+
+  memcpy(spec.silence_sample, silence_sample, sizeof(spec.silence_sample));
+}
+
 void RingBuffer::set_fill_slot(const SlotFill& slot)
 {
   if (_slot_set())
@@ -87,39 +117,19 @@ bool RingBuffer::_slot_set(bool mark_set) const
 
 bool RingBuffer::acquire(Gst::RingBufferSpec& spec)
 {
-  GstRingBufferSpec gst_spec =
-  {
-    spec.caps->gobj(), (GstBufferFormatType)(spec.type),
-    (GstBufferFormat)(spec.format), spec.sign, spec.bigend, spec.width,
-    spec.depth, spec.rate, spec.channels, spec.latency_time, spec.buffer_time,
-    spec.segsize, spec.segtotal, spec.bytes_per_sample, {0,},
-    spec.seglatency
-  };
-
-  memcpy(gst_spec.silence_sample, spec.silence_sample,
-    sizeof(gst_spec.silence_sample));
-
+  GstRingBufferSpec gst_spec;
+  spec.copy_fields_to(gst_spec);
   gboolean const result = gst_ring_buffer_acquire(gobj(), &gst_spec);
-  spec.set_fields(gst_spec);
+  spec.copy_fields_from(gst_spec);
   return result;
 }
 
 bool RingBuffer::parse_caps(Gst::RingBufferSpec& spec, const Glib::RefPtr<Gst::Caps>& caps)
 {
-  GstRingBufferSpec gst_spec =
-  {
-    spec.caps->gobj(), (GstBufferFormatType)(spec.type),
-    (GstBufferFormat)(spec.format), spec.sign, spec.bigend, spec.width,
-    spec.depth, spec.rate, spec.channels, spec.latency_time, spec.buffer_time,
-    spec.segsize, spec.segtotal, spec.bytes_per_sample, {0,},
-    spec.seglatency
-  };
-
-  memcpy(gst_spec.silence_sample, spec.silence_sample,
-    sizeof(gst_spec.silence_sample));
-
+  GstRingBufferSpec gst_spec;
+  spec.copy_fields_to(gst_spec);
   gboolean const result = gst_ring_buffer_parse_caps(&gst_spec, caps->gobj());
-  spec.set_fields(gst_spec);
+  spec.copy_fields_from(gst_spec);
   return result;
 }
 
diff --git a/gstreamer/src/ringbuffer.hg b/gstreamer/src/ringbuffer.hg
index 2104ef1..af036b5 100644
--- a/gstreamer/src/ringbuffer.hg
+++ b/gstreamer/src/ringbuffer.hg
@@ -18,6 +18,7 @@
  */
 
 #include <gst/audio/gstringbuffer.h>
+#include <gstreamermm/caps.h>
 #include <gstreamermm/object.h>
 #include <gstreamermm/format.h>
 
@@ -26,8 +27,6 @@ _DEFS(gstreamermm,gst)
 namespace Gst
 {
 
-class Caps;
-
 _WRAP_ENUM(RingBufferSegState, GstRingBufferSegState)
 _WRAP_ENUM(RingBufferState, GstRingBufferState)
 _WRAP_ENUM(BufferFormat, GstBufferFormat)
@@ -40,12 +39,8 @@ class RingBufferSpec
 {
   _CLASS_GENERIC(RingBufferSpec, GstRingBufferSpec)
 public:
-  /** Copy the Gst::RingBufferSpec to a C object GstRingBufferSpec.  The C
-   * object should be freed when no longer needed.  A gobj() method is not
-   * implemented because there is no underlying C object to a
-   * Gst::RingBufferSpec.
-   */
-  GstRingBufferSpec* gobj_copy();
+  /// Construct a Gst::RingBufferSpec from a GstRingBufferSpec.
+  RingBufferSpec(GstRingBufferSpec* castitem);
 
   /** The caps that generated the Spec. */
   Glib::RefPtr<Gst::Caps> caps;
@@ -112,9 +107,8 @@ public:
   int           seglatency;
 
 #ifndef DOXYGEN_SHOULD_SKIP_THIS
-protected:
-  friend class RingBuffer;
-  void set_fields(GstRingBufferSpec& spec);
+  void copy_fields_from(GstRingBufferSpec& spec);
+  void copy_fields_to(GstRingBufferSpec& spec);
 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
 };
 
diff --git a/gstreamer/src/tagsetter.ccg b/gstreamer/src/tagsetter.ccg
index 92db137..a768164 100644
--- a/gstreamer/src/tagsetter.ccg
+++ b/gstreamer/src/tagsetter.ccg
@@ -22,13 +22,11 @@ namespace Gst
 
 void TagSetter::add_tag(const Glib::ustring& tag, const Glib::ValueBase& value, TagMergeMode mode)
 {
-  //TODO: The gst_tag_setter_add_tag_values() documentation says nothing about ending the .. with NULL.
   gst_tag_setter_add_tag_values(gobj(), (GstTagMergeMode) mode, tag.c_str(), value.gobj(), (void*)0);
 }
 
 void TagSetter::add_tag(const Glib::ustring& tag, const char* data, TagMergeMode mode)
 {
-  //TODO: The gst_tag_setter_add_tags() documentation says nothing about ending the .. with NULL. 
   gst_tag_setter_add_tags(gobj(), (GstTagMergeMode) mode, tag.c_str(), data, (void*)0);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]