summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2009-06-17 13:17:30 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2009-06-17 13:17:30 +0200
commite4492c24ea832a85935e2723de7fc963ac12635b (patch)
treeaf661aa8a0185adb501f730927913061c30cb082
parent2c5f455423290838f788da7770549bd3211c62f6 (diff)
audio: correctly handle short read/writes
-rw-r--r--gst-libs/gst/audio/gstaudiosink.c5
-rw-r--r--gst-libs/gst/audio/gstaudiosrc.c7
2 files changed, 7 insertions, 5 deletions
diff --git a/gst-libs/gst/audio/gstaudiosink.c b/gst-libs/gst/audio/gstaudiosink.c
index 2d4bfe530..114a971d0 100644
--- a/gst-libs/gst/audio/gstaudiosink.c
+++ b/gst-libs/gst/audio/gstaudiosink.c
@@ -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 */
diff --git a/gst-libs/gst/audio/gstaudiosrc.c b/gst-libs/gst/audio/gstaudiosrc.c
index 602673438..4541b9da3 100644
--- a/gst-libs/gst/audio/gstaudiosrc.c
+++ b/gst-libs/gst/audio/gstaudiosrc.c
@@ -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 */