Avoid calling readAdvance in a loop
This commit is contained in:
@@ -874,20 +874,21 @@ void OpenSLCapture::captureSamples(al::byte *buffer, uint samples)
|
|||||||
/* Read the desired samples from the ring buffer then advance its read
|
/* Read the desired samples from the ring buffer then advance its read
|
||||||
* pointer.
|
* pointer.
|
||||||
*/
|
*/
|
||||||
|
size_t adv_count{0};
|
||||||
auto rdata = mRing->getReadVector();
|
auto rdata = mRing->getReadVector();
|
||||||
for(uint i{0};i < samples;)
|
for(uint i{0};i < samples;)
|
||||||
{
|
{
|
||||||
const uint rem{minu(samples - i, update_size - mSplOffset)};
|
const uint rem{minu(samples - i, update_size - mSplOffset)};
|
||||||
std::copy_n(rdata.first.buf + mSplOffset*mFrameSize, rem*mFrameSize,
|
std::copy_n(rdata.first.buf + mSplOffset*size_t{mFrameSize}, rem*size_t{mFrameSize},
|
||||||
buffer + i*mFrameSize);
|
buffer + i*size_t{mFrameSize});
|
||||||
|
|
||||||
mSplOffset += rem;
|
mSplOffset += rem;
|
||||||
if(mSplOffset == update_size)
|
if(mSplOffset == update_size)
|
||||||
{
|
{
|
||||||
/* Finished a chunk, reset the offset and advance the read pointer. */
|
/* Finished a chunk, reset the offset and advance the read pointer. */
|
||||||
mSplOffset = 0;
|
mSplOffset = 0;
|
||||||
mRing->readAdvance(1);
|
|
||||||
|
|
||||||
|
++adv_count;
|
||||||
rdata.first.len -= 1;
|
rdata.first.len -= 1;
|
||||||
if(!rdata.first.len)
|
if(!rdata.first.len)
|
||||||
rdata.first = rdata.second;
|
rdata.first = rdata.second;
|
||||||
@@ -897,6 +898,7 @@ void OpenSLCapture::captureSamples(al::byte *buffer, uint samples)
|
|||||||
|
|
||||||
i += rem;
|
i += rem;
|
||||||
}
|
}
|
||||||
|
mRing->readAdvance(adv_count);
|
||||||
|
|
||||||
SLAndroidSimpleBufferQueueItf bufferQueue{};
|
SLAndroidSimpleBufferQueueItf bufferQueue{};
|
||||||
if LIKELY(mDevice->Connected.load(std::memory_order_acquire))
|
if LIKELY(mDevice->Connected.load(std::memory_order_acquire))
|
||||||
|
|||||||
Reference in New Issue
Block a user