aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Burk <philburk@google.com>2019-08-13 15:06:41 -0700
committerPhil Burk <philburk@google.com>2019-08-13 15:06:41 -0700
commit550bf16347783d92dcdcb4e442f9948d79c815c0 (patch)
tree248b350781b6f1d766cc6e78164a672997df75aa
parent919cd422d9cef6f391156bfd86cd0dae95f30772 (diff)
downloadoboe-550bf16347783d92dcdcb4e442f9948d79c815c0.tar.gz
FIFO: move threshold up to AudioStreamBuffered
Make FIFO cleaner.
-rw-r--r--src/fifo/FifoBuffer.cpp17
-rw-r--r--src/opensles/AudioStreamBuffered.cpp16
-rw-r--r--src/opensles/AudioStreamBuffered.h2
3 files changed, 18 insertions, 17 deletions
diff --git a/src/fifo/FifoBuffer.cpp b/src/fifo/FifoBuffer.cpp
index 501fee69..1438941c 100644
--- a/src/fifo/FifoBuffer.cpp
+++ b/src/fifo/FifoBuffer.cpp
@@ -80,16 +80,17 @@ int32_t FifoBuffer::read(void *buffer, int32_t numFrames) {
if (numFrames <= 0) {
return 0;
}
+ // safe because numFrames is guaranteed positive
uint32_t framesToRead = static_cast<uint32_t>(numFrames);
uint32_t framesAvailable = mFifo->getFullFramesAvailable();
framesToRead = std::min(framesToRead, framesAvailable);
- uint32_t readIndex = mFifo->getReadIndex();
+ uint32_t readIndex = mFifo->getReadIndex(); // ranges 0 to capacity
uint8_t *destination = reinterpret_cast<uint8_t *>(buffer);
uint8_t *source = &mStorage[convertFramesToBytes(readIndex)];
if ((readIndex + framesToRead) > mFifo->getFrameCapacity()) {
// read in two parts, first part here is at the end of the mStorage buffer
- uint32_t frames1 = mFifo->getFrameCapacity() - readIndex;
+ int32_t frames1 = static_cast<int32_t>(mFifo->getFrameCapacity() - readIndex);
int32_t numBytes = convertFramesToBytes(frames1);
if (numBytes < 0) {
return static_cast<int32_t>(Result::ErrorOutOfRange);
@@ -98,7 +99,7 @@ int32_t FifoBuffer::read(void *buffer, int32_t numFrames) {
destination += numBytes;
// read second part, which is at the beginning of mStorage
source = &mStorage[0];
- int frames2 = framesToRead - frames1;
+ int32_t frames2 = static_cast<uint32_t>(framesToRead - frames1);
numBytes = convertFramesToBytes(frames2);
if (numBytes < 0) {
return static_cast<int32_t>(Result::ErrorOutOfRange);
@@ -121,6 +122,7 @@ int32_t FifoBuffer::write(const void *buffer, int32_t numFrames) {
if (numFrames <= 0) {
return 0;
}
+ // Guaranteed positive.
uint32_t framesToWrite = static_cast<uint32_t>(numFrames);
uint32_t framesAvailable = mFifo->getEmptyFramesAvailable();
framesToWrite = std::min(framesToWrite, framesAvailable);
@@ -131,7 +133,7 @@ int32_t FifoBuffer::write(const void *buffer, int32_t numFrames) {
uint8_t *destination = &mStorage[byteIndex];
if ((writeIndex + framesToWrite) > mFifo->getFrameCapacity()) {
// write in two parts, first part here
- int frames1 = mFifo->getFrameCapacity() - writeIndex;
+ int32_t frames1 = static_cast<uint32_t>(mFifo->getFrameCapacity() - writeIndex);
int32_t numBytes = convertFramesToBytes(frames1);
if (numBytes < 0) {
return static_cast<int32_t>(Result::ErrorOutOfRange);
@@ -140,8 +142,8 @@ int32_t FifoBuffer::write(const void *buffer, int32_t numFrames) {
// read second part
source += convertFramesToBytes(frames1);
destination = &mStorage[0];
- int framesLeft = framesToWrite - frames1;
- numBytes = convertFramesToBytes(framesLeft);
+ int frames2 = static_cast<uint32_t>(framesToWrite - frames1);
+ numBytes = convertFramesToBytes(frames2);
if (numBytes < 0) {
return static_cast<int32_t>(Result::ErrorOutOfRange);
}
@@ -161,6 +163,9 @@ int32_t FifoBuffer::write(const void *buffer, int32_t numFrames) {
int32_t FifoBuffer::readNow(void *buffer, int32_t numFrames) {
int32_t framesRead = read(buffer, numFrames);
+ if (framesRead < 0) {
+ return framesRead;
+ }
int32_t framesLeft = numFrames - framesRead;
mFramesReadCount += framesRead;
mFramesUnderrunCount += framesLeft;
diff --git a/src/opensles/AudioStreamBuffered.cpp b/src/opensles/AudioStreamBuffered.cpp
index 3972529b..7e48e4e6 100644
--- a/src/opensles/AudioStreamBuffered.cpp
+++ b/src/opensles/AudioStreamBuffered.cpp
@@ -131,7 +131,12 @@ ResultWithValue<int32_t> AudioStreamBuffered::transfer(void *buffer,
if (getDirection() == Direction::Input) {
result = mFifoBuffer->read(data, framesLeft);
} else {
- result = mFifoBuffer->write(data, framesLeft);
+ // between zero and capacity
+ uint32_t fullFrames = mFifoBuffer->getFifoControllerBase()->getFullFramesAvailable();
+ // Do not write above threshold size.
+ int32_t emptyFrames = getBufferSizeInFrames() - static_cast<int32_t>(fullFrames);
+ int32_t framesToWrite = std::max(0, std::min(framesLeft, emptyFrames));
+ result = mFifoBuffer->write(data, framesToWrite);
}
if (result > 0) {
data += mFifoBuffer->convertFramesToBytes(result);
@@ -226,17 +231,10 @@ ResultWithValue<int32_t> AudioStreamBuffered::setBufferSizeInFrames(int32_t requ
} else if (requestedFrames < getFramesPerBurst()) {
requestedFrames = getFramesPerBurst();
}
- mFifoBuffer->setThresholdFrames(requestedFrames);
+ mBufferSizeInFrames = requestedFrames;
return ResultWithValue<int32_t>(requestedFrames);
}
-int32_t AudioStreamBuffered::getBufferSizeInFrames() {
- if (mFifoBuffer) {
- mBufferSizeInFrames = mFifoBuffer->getThresholdFrames();
- }
- return mBufferSizeInFrames;
-}
-
int32_t AudioStreamBuffered::getBufferCapacityInFrames() const {
if (mFifoBuffer) {
return mFifoBuffer->getBufferCapacityInFrames();
diff --git a/src/opensles/AudioStreamBuffered.h b/src/opensles/AudioStreamBuffered.h
index 4ed23e9b..5923e8db 100644
--- a/src/opensles/AudioStreamBuffered.h
+++ b/src/opensles/AudioStreamBuffered.h
@@ -47,8 +47,6 @@ public:
ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override;
- int32_t getBufferSizeInFrames() override;
-
int32_t getBufferCapacityInFrames() const override;
ResultWithValue<int32_t> getXRunCount() const override {