[gstreamermm] Wrapped Gst::AudioFilter vfuncs.
- From: José Alburquerque <jaalburqu src gnome org>
- To: svn-commits-list gnome org
- Subject: [gstreamermm] Wrapped Gst::AudioFilter vfuncs.
- Date: Tue, 5 May 2009 20:12:08 -0400 (EDT)
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]