diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gst/modplug/gstmodplug.cc | 41 | ||||
-rw-r--r-- | gst/modplug/gstmodplug.h | 1 |
3 files changed, 31 insertions, 17 deletions
@@ -1,6 +1,12 @@ 2004-03-14 Benjamin Otte <otte@gnome.org> * gst/modplug/gstmodplug.cc: + * gst/modplug/gstmodplug.h: + set correct timestamps on outgoing buffers + +2004-03-14 Benjamin Otte <otte@gnome.org> + + * gst/modplug/gstmodplug.cc: handle events - don't do crap when a discont arrives that's not necessary This allows correct loading and playback of mods in Rhythmbox diff --git a/gst/modplug/gstmodplug.cc b/gst/modplug/gstmodplug.cc index 06701c6d..e6e67e33 100644 --- a/gst/modplug/gstmodplug.cc +++ b/gst/modplug/gstmodplug.cc @@ -530,7 +530,7 @@ gst_modplug_loop (GstElement *element) /* GstBuffer *buf;*/ modplug->seek_at = -1; - modplug->need_discont = FALSE; + modplug->need_discont = TRUE; modplug->eos = FALSE; /* buf = gst_pad_pull (modplug->sinkpad); @@ -621,29 +621,36 @@ gst_modplug_loop (GstElement *element) modplug->seek_at = -1; } + if (modplug->need_discont && GST_PAD_IS_USABLE (modplug->srcpad)) + { + GstEvent *discont; + gint64 value; + GstFormat format = GST_FORMAT_TIME; + + if (gst_modplug_src_query (modplug->srcpad, GST_QUERY_POSITION, &format, &value)) { + discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, value, GST_FORMAT_UNDEFINED); + modplug->timestamp = value; + } else { + modplug->timestamp = GST_CLOCK_TIME_NONE; + discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_UNDEFINED); + } + gst_pad_push (modplug->srcpad, GST_DATA (discont)); + modplug->need_discont= FALSE; + } + if (modplug->mSoundFile->Read (modplug->audiobuffer, modplug->length) != 0) { GstBuffer *buffer_out; - GstFormat format; - gint64 value; - format = GST_FORMAT_TIME; - gst_modplug_src_query (modplug->srcpad, GST_QUERY_POSITION, &format, &value); - - if (modplug->need_discont && GST_PAD_IS_USABLE (modplug->srcpad)) - { - GstEvent *discont; - - discont = gst_event_new_discontinuous (FALSE, GST_FORMAT_TIME, value, NULL); - gst_pad_push (modplug->srcpad, GST_DATA (discont)); - - modplug->need_discont= FALSE; - } - buffer_out = gst_buffer_new (); GST_BUFFER_DATA (buffer_out) = (guchar *) g_memdup (modplug->audiobuffer, modplug->length); GST_BUFFER_SIZE (buffer_out) = modplug->length; - GST_BUFFER_TIMESTAMP (buffer_out) = value; + GST_BUFFER_TIMESTAMP (buffer_out) = modplug->timestamp; + + if (GST_CLOCK_TIME_IS_VALID (modplug->timestamp)) { + GST_BUFFER_DURATION (buffer_out) = modplug->length * GST_SECOND / modplug->frequency / modplug->channel / (modplug->_16bit ? 2 : 1) ; + modplug->timestamp += GST_BUFFER_DURATION (buffer_out); + } if (GST_PAD_IS_USABLE (modplug->srcpad)) gst_pad_push (modplug->srcpad, GST_DATA (buffer_out)); diff --git a/gst/modplug/gstmodplug.h b/gst/modplug/gstmodplug.h index 95a71443..c4a98b86 100644 --- a/gst/modplug/gstmodplug.h +++ b/gst/modplug/gstmodplug.h @@ -70,6 +70,7 @@ struct _GstModPlug { gboolean eos; gint64 seek_at; guint64 song_size; + guint64 timestamp; CSoundFile *mSoundFile; gboolean opened; /* set to TRUE when mSoundFile is created */ |