diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-06-17 13:17:30 +0200 |
---|---|---|
committer | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-06-17 13:17:30 +0200 |
commit | e4492c24ea832a85935e2723de7fc963ac12635b (patch) | |
tree | af661aa8a0185adb501f730927913061c30cb082 | |
parent | 2c5f455423290838f788da7770549bd3211c62f6 (diff) |
audio: correctly handle short read/writes
-rw-r--r-- | gst-libs/gst/audio/gstaudiosink.c | 5 | ||||
-rw-r--r-- | gst-libs/gst/audio/gstaudiosrc.c | 7 |
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 */ |