gst/modplug/gstmodplug.*: set correct timestamps on outgoing buffers
authorBenjamin Otte <otte@gnome.org>
Sun, 14 Mar 2004 13:11:14 +0000 (13:11 +0000)
committerBenjamin Otte <otte@gnome.org>
Sun, 14 Mar 2004 13:11:14 +0000 (13:11 +0000)
Original commit message from CVS:
* gst/modplug/gstmodplug.cc:
* gst/modplug/gstmodplug.h:
set correct timestamps on outgoing buffers

ChangeLog
gst/modplug/gstmodplug.cc
gst/modplug/gstmodplug.h

index 7e8566d..f760574 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 06701c6..e6e67e3 100644 (file)
@@ -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));   
index 95a7144..c4a98b8 100644 (file)
@@ -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 */