diff --git a/audio/aidl/default/EffectContext.cpp b/audio/aidl/default/EffectContext.cpp index 2e1291822a..4f226c4bf6 100644 --- a/audio/aidl/default/EffectContext.cpp +++ b/audio/aidl/default/EffectContext.cpp @@ -46,7 +46,7 @@ EffectContext::EffectContext(size_t statusDepth, const Parameter::Common& common ::android::status_t status = EventFlag::createEventFlag(mStatusMQ->getEventFlagWord(), &mEfGroup); LOG_ALWAYS_FATAL_IF(status != ::android::OK || !mEfGroup, " create EventFlagGroup failed "); - mWorkBuffer.reserve(std::max(inBufferSizeInFloat, outBufferSizeInFloat)); + mWorkBuffer.resize(std::max(inBufferSizeInFloat, outBufferSizeInFloat)); } // reset buffer status by abandon input data in FMQ @@ -82,6 +82,10 @@ float* EffectContext::getWorkBuffer() { return static_cast(mWorkBuffer.data()); } +size_t EffectContext::getWorkBufferSize() const { + return mWorkBuffer.size(); +} + std::shared_ptr EffectContext::getStatusFmq() const { return mStatusMQ; } @@ -206,6 +210,8 @@ RetCode EffectContext::updateIOFrameSize(const Parameter::Common& common) { mInputFrameSize = iFrameSize; mOutputFrameSize = oFrameSize; if (needUpdateMq) { + mWorkBuffer.resize(std::max(common.input.frameCount * mInputFrameSize / sizeof(float), + common.output.frameCount * mOutputFrameSize / sizeof(float))); return notifyDataMqUpdate(); } return RetCode::SUCCESS; diff --git a/audio/aidl/default/EffectImpl.cpp b/audio/aidl/default/EffectImpl.cpp index b76269aa52..c29bf79945 100644 --- a/audio/aidl/default/EffectImpl.cpp +++ b/audio/aidl/default/EffectImpl.cpp @@ -327,7 +327,9 @@ void EffectImpl::process() { return; } - auto processSamples = inputMQ->availableToRead(); + assert(mImplContext->getWorkBufferSize() >= + std::max(inputMQ->availableToRead(), outputMQ->availableToWrite())); + auto processSamples = std::min(inputMQ->availableToRead(), outputMQ->availableToWrite()); if (processSamples) { inputMQ->read(buffer, processSamples); IEffect::Status status = effectProcessImpl(buffer, buffer, processSamples); diff --git a/audio/aidl/default/include/effect-impl/EffectContext.h b/audio/aidl/default/include/effect-impl/EffectContext.h index 24f3b5dcf2..b3d730df17 100644 --- a/audio/aidl/default/include/effect-impl/EffectContext.h +++ b/audio/aidl/default/include/effect-impl/EffectContext.h @@ -49,6 +49,7 @@ class EffectContext { std::shared_ptr getOutputDataFmq() const; float* getWorkBuffer(); + size_t getWorkBufferSize() const; // reset buffer status by abandon input data in FMQ void resetBuffer();