diff options
author | Phil Burk <philburk@google.com> | 2019-08-13 15:06:41 -0700 |
---|---|---|
committer | Phil Burk <philburk@google.com> | 2019-08-13 15:06:41 -0700 |
commit | 550bf16347783d92dcdcb4e442f9948d79c815c0 (patch) | |
tree | 248b350781b6f1d766cc6e78164a672997df75aa | |
parent | 919cd422d9cef6f391156bfd86cd0dae95f30772 (diff) | |
download | oboe-550bf16347783d92dcdcb4e442f9948d79c815c0.tar.gz |
FIFO: move threshold up to AudioStreamBuffered
Make FIFO cleaner.
-rw-r--r-- | src/fifo/FifoBuffer.cpp | 17 | ||||
-rw-r--r-- | src/opensles/AudioStreamBuffered.cpp | 16 | ||||
-rw-r--r-- | src/opensles/AudioStreamBuffered.h | 2 |
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 { |