diff options
-rw-r--r-- | ext/sidplay/gstsiddec.cc | 81 |
1 files changed, 25 insertions, 56 deletions
diff --git a/ext/sidplay/gstsiddec.cc b/ext/sidplay/gstsiddec.cc index 7f0a94ab..c4f3b1ec 100644 --- a/ext/sidplay/gstsiddec.cc +++ b/ext/sidplay/gstsiddec.cc @@ -123,9 +123,6 @@ gst_sid_memory_get_type (void) return sid_memory_type; } -static void gst_siddec_base_init (gpointer g_class); -static void gst_siddec_class_init (GstSidDec * klass); -static void gst_siddec_init (GstSidDec * siddec); static void gst_siddec_finalize (GObject * object); static GstFlowReturn gst_siddec_chain (GstPad * pad, GstBuffer * buffer); @@ -141,58 +138,17 @@ static void gst_siddec_get_property (GObject * object, guint prop_id, static void gst_siddec_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static GstElementClass *parent_class = NULL; - -GType -gst_siddec_get_type (void) -{ - static GType siddec_type = 0; - - if (G_UNLIKELY (siddec_type == 0)) { - static const GTypeInfo siddec_info = { - sizeof (GstSidDecClass), - gst_siddec_base_init, - NULL, - (GClassInitFunc) gst_siddec_class_init, - NULL, - NULL, - sizeof (GstSidDec), - 0, - (GInstanceInitFunc) gst_siddec_init, - NULL - }; - - siddec_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstSidDec", &siddec_info, - (GTypeFlags) 0); - } - - return siddec_type; -} +#define gst_siddec_parent_class parent_class +G_DEFINE_TYPE (GstSidDec, gst_siddec, GST_TYPE_ELEMENT); static void -gst_siddec_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_set_details_simple (element_class, "Sid decoder", - "Codec/Decoder/Audio", "Use libsidplay to decode SID audio tunes", - "Wim Taymans <wim.taymans@gmail.com>"); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&src_templ)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&sink_templ)); -} - -static void -gst_siddec_class_init (GstSidDec * klass) +gst_siddec_class_init (GstSidDecClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; - - parent_class = GST_ELEMENT_CLASS (g_type_class_peek_parent (klass)); + gstelement_class = (GstElementClass *) klass; gobject_class->finalize = gst_siddec_finalize; gobject_class->set_property = gst_siddec_set_property; @@ -232,6 +188,15 @@ gst_siddec_class_init (GstSidDec * klass) g_object_class_install_property (gobject_class, PROP_METADATA, g_param_spec_boxed ("metadata", "Metadata", "Metadata", GST_TYPE_CAPS, (GParamFlags)(G_PARAM_READABLE | G_PARAM_STATIC_STRINGS))); + + gst_element_class_set_details_simple (gstelement_class, "Sid decoder", + "Codec/Decoder/Audio", "Use libsidplay to decode SID audio tunes", + "Wim Taymans <wim.taymans@gmail.com>"); + + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&src_templ)); + gst_element_class_add_pad_template (gstelement_class, + gst_static_pad_template_get (&sink_templ)); } static void @@ -383,16 +348,18 @@ play_loop (GstPad * pad) GstFlowReturn ret; GstSidDec *siddec; GstBuffer *out; + guint8 *data; gint64 value, offset, time; GstFormat format; siddec = GST_SIDDEC (gst_pad_get_parent (pad)); out = gst_buffer_new_and_alloc (siddec->blocksize); - gst_buffer_set_caps (out, GST_PAD_CAPS (pad)); + data = (guint8 *) gst_buffer_map (out, NULL, NULL, GST_MAP_WRITE); sidEmuFillBuffer (*siddec->engine, *siddec->tune, - GST_BUFFER_DATA (out), GST_BUFFER_SIZE (out)); + data, siddec->blocksize); + gst_buffer_unmap (out, data, siddec->blocksize); /* get offset in samples */ format = GST_FORMAT_DEFAULT; @@ -453,6 +420,7 @@ static gboolean start_play_tune (GstSidDec * siddec) { gboolean res; + GstSegment segment; if (!siddec->tune->load (siddec->tune_buffer, siddec->tune_len)) goto could_not_load; @@ -466,8 +434,9 @@ start_play_tune (GstSidDec * siddec) siddec->tune_number)) goto could_not_init; + gst_segment_init (&segment, GST_FORMAT_TIME); gst_pad_push_event (siddec->srcpad, - gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0)); + gst_event_new_segment (&segment)); res = gst_pad_start_task (siddec->srcpad, (GstTaskFunction) play_loop, siddec->srcpad); @@ -506,7 +475,7 @@ gst_siddec_sink_event (GstPad * pad, GstEvent * event) case GST_EVENT_EOS: res = start_play_tune (siddec); break; - case GST_EVENT_NEWSEGMENT: + case GST_EVENT_SEGMENT: res = FALSE; break; default: @@ -527,12 +496,12 @@ gst_siddec_chain (GstPad * pad, GstBuffer * buffer) siddec = GST_SIDDEC (gst_pad_get_parent (pad)); - size = GST_BUFFER_SIZE (buffer); + size = gst_buffer_get_size (buffer); if (siddec->tune_len + size > maxSidtuneFileLen) goto overflow; - memcpy (siddec->tune_buffer + siddec->tune_len, GST_BUFFER_DATA (buffer), - size); + gst_buffer_extract (buffer, 0, siddec->tune_buffer + siddec->tune_len, size); + siddec->tune_len += size; gst_buffer_unref (buffer); |