OSDN Git Service

iovec is offset and length now
authorGlenn Kasten <gkasten@google.com>
Fri, 17 Jun 2016 17:43:34 +0000 (10:43 -0700)
committerGlenn Kasten <gkasten@google.com>
Fri, 17 Jun 2016 18:04:01 +0000 (11:04 -0700)
Change-Id: I0e6c2186382d600e9e2a60e0347b78de972f0149

audio_utils/fifo.cpp
audio_utils/include/audio_utils/fifo.h

index 92e0a9f..ec71d5f 100644 (file)
@@ -133,10 +133,12 @@ ssize_t audio_utils_fifo_writer::write(const void *buffer, size_t count)
     audio_utils_iovec iovec[2];
     ssize_t availToWrite = obtain(iovec, count);
     if (availToWrite > 0) {
-        memcpy(iovec[0].mBase, buffer, iovec[0].mLen * mFifo.mFrameSize);
-        if (iovec[1].mLen > 0) {
-            memcpy(iovec[1].mBase, (char *) buffer + (iovec[0].mLen * mFifo.mFrameSize),
-                    iovec[1].mLen * mFifo.mFrameSize);
+        memcpy((char *) mFifo.mBuffer + iovec[0].mOffset * mFifo.mFrameSize, buffer,
+                iovec[0].mLength * mFifo.mFrameSize);
+        if (iovec[1].mLength > 0) {
+            memcpy((char *) mFifo.mBuffer + iovec[1].mOffset * mFifo.mFrameSize,
+                    (char *) buffer + (iovec[0].mLength * mFifo.mFrameSize),
+                    iovec[1].mLength * mFifo.mFrameSize);
         }
         release(availToWrite);
     }
@@ -168,10 +170,10 @@ ssize_t audio_utils_fifo_writer::obtain(audio_utils_iovec iovec[2], size_t count
         part1 = availToWrite;
     }
     size_t part2 = part1 > 0 ? availToWrite - part1 : 0;
-    iovec[0].mLen = part1;
-    iovec[0].mBase = part1 > 0 ? (char *) mFifo.mBuffer + (rearMasked * mFifo.mFrameSize) : NULL;
-    iovec[1].mLen = part2;
-    iovec[1].mBase = part2 > 0 ? mFifo.mBuffer : NULL;
+    iovec[0].mOffset = rearMasked;
+    iovec[0].mLength = part1;
+    iovec[1].mOffset = 0;
+    iovec[1].mLength = part2;
     mObtained = availToWrite;
     return availToWrite;
 }
@@ -208,10 +210,12 @@ ssize_t audio_utils_fifo_reader::read(void *buffer, size_t count, size_t *lost)
     audio_utils_iovec iovec[2];
     ssize_t availToRead = obtain(iovec, count, lost);
     if (availToRead > 0) {
-        memcpy(buffer, iovec[0].mBase, iovec[0].mLen * mFifo.mFrameSize);
-        if (iovec[1].mLen > 0) {
-            memcpy((char *) buffer + (iovec[0].mLen * mFifo.mFrameSize), iovec[1].mBase,
-                    iovec[1].mLen * mFifo.mFrameSize);
+        memcpy(buffer, (char *) mFifo.mBuffer + iovec[0].mOffset * mFifo.mFrameSize,
+                iovec[0].mLength * mFifo.mFrameSize);
+        if (iovec[1].mLength > 0) {
+            memcpy((char *) buffer + (iovec[0].mLength * mFifo.mFrameSize),
+                    (char *) mFifo.mBuffer + iovec[1].mOffset * mFifo.mFrameSize,
+                    iovec[1].mLength * mFifo.mFrameSize);
         }
         release(availToRead);
     }
@@ -261,10 +265,10 @@ ssize_t audio_utils_fifo_reader::obtain(audio_utils_iovec iovec[2], size_t count
         part1 = availToRead;
     }
     size_t part2 = part1 > 0 ? availToRead - part1 : 0;
-    iovec[0].mLen = part1;
-    iovec[0].mBase = part1 > 0 ? (char *) mFifo.mBuffer + (frontMasked * mFifo.mFrameSize) : NULL;
-    iovec[1].mLen = part2;
-    iovec[1].mBase = part2 > 0 ? mFifo.mBuffer : NULL;
+    iovec[0].mOffset = frontMasked;
+    iovec[0].mLength = part1;
+    iovec[1].mOffset = 0;
+    iovec[1].mLength = part2;
     mObtained = availToRead;
     return availToRead;
 }
index 08dc3f9..f12e3f2 100644 (file)
@@ -101,8 +101,8 @@ private:
 // Describes one virtually contiguous fragment of a logically contiguous slice.
 // Compare to struct iovec for readv(2) and writev(2).
 struct audio_utils_iovec {
-    void   *mBase;  // const void * for audio_utils_fifo_reader::obtain()
-    size_t  mLen;   // in frames
+    uint32_t    mOffset;    // in frames, relative to mBuffer, undefined if mLength == 0
+    uint32_t    mLength;    // in frames
 };
 
 ////////////////////////////////////////////////////////////////////////////////