audio: correctly handle short read/writes

This commit is contained in:
Wim Taymans 2009-06-17 13:17:30 +02:00
parent 2c5f455423
commit e4492c24ea
2 changed files with 7 additions and 5 deletions

View File

@ -229,11 +229,11 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
/* buffer must be started */ /* buffer must be started */
if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) { if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
gint written = 0; gint written;
left = len; left = len;
do { do {
written = writefunc (sink, readptr + written, left); written = writefunc (sink, readptr, left);
GST_LOG_OBJECT (sink, "transfered %d bytes of %d from segment %d", GST_LOG_OBJECT (sink, "transfered %d bytes of %d from segment %d",
written, left, readseg); written, left, readseg);
if (written < 0 || written > left) { if (written < 0 || written > left) {
@ -245,6 +245,7 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
break; break;
} }
left -= written; left -= written;
readptr += written;
} while (left > 0); } while (left > 0);
/* clear written samples */ /* clear written samples */

View File

@ -215,20 +215,21 @@ audioringbuffer_thread_func (GstRingBuffer * buf)
gint readseg; gint readseg;
if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) { if (gst_ring_buffer_prepare_read (buf, &readseg, &readptr, &len)) {
gint read = 0; gint read;
left = len; left = len;
do { 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, GST_LOG_OBJECT (src, "transfered %d bytes of %d to segment %d", read,
left, readseg); left, readseg);
if (read < 0 || read > left) { if (read < 0 || read > left) {
GST_WARNING_OBJECT (src, GST_WARNING_OBJECT (src,
"error reading data (reason: %s), skipping segment", "error reading data %d (reason: %s), skipping segment", read,
g_strerror (errno)); g_strerror (errno));
break; break;
} }
left -= read; left -= read;
readptr += read;
} while (left > 0); } while (left > 0);
/* we read one segment */ /* we read one segment */