audio: correctly handle short read/writes
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 17 Jun 2009 11:17:30 +0000 (13:17 +0200)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 17 Jun 2009 11:17:30 +0000 (13:17 +0200)
gst-libs/gst/audio/gstaudiosink.c
gst-libs/gst/audio/gstaudiosrc.c

index 2d4bfe5..114a971 100644 (file)
@@ -229,11 +229,11 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
 
     /* buffer must be started */
     if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
-      gint written = 0;
+      gint written;
 
       left = len;
       do {
-        written = writefunc (sink, readptr + written, left);
+        written = writefunc (sink, readptr, left);
         GST_LOG_OBJECT (sink, "transfered %d bytes of %d from segment %d",
             written, left, readseg);
         if (written < 0 || written > left) {
@@ -245,6 +245,7 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
           break;
         }
         left -= written;
+        readptr += written;
       } while (left > 0);
 
       /* clear written samples */
index 6026734..4541b9d 100644 (file)
@@ -215,20 +215,21 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
     gint readseg;
 
     if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
-      gint read = 0;
+      gint read;
 
       left = len;
       do {
-        read = readfunc (src, readptr + read, left);
+        read = readfunc (src, readptr, left);
         GST_LOG_OBJECT (src, "transfered %d bytes of %d to segment %d", read,
             left, readseg);
         if (read < 0 || read > left) {
           GST_WARNING_OBJECT (src,
-              "error reading data (reason: %s), skipping segment",
+              "error reading data %d (reason: %s), skipping segment", read,
               g_strerror (errno));
           break;
         }
         left -= read;
+        readptr += read;
       } while (left > 0);
 
       /* we read one segment */