From 08c05dd017c07b08d5701e52a7eba8b873ee8706 Mon Sep 17 00:00:00 2001 From: Shunkai Yao Date: Thu, 25 Jan 2024 00:45:55 +0000 Subject: [PATCH] Update work buffer size with input/output frame size change call process with the minimal of input/output fmq data capacity Bug: 321543210 Test: atest VtsHalAudioEffectTargetTest Test: flash to pixel phone and test audio Change-Id: I0c5087f541dc8526ac733a0c35f0d06f878d78a1 --- audio/aidl/default/EffectContext.cpp | 8 +++++++- audio/aidl/default/EffectImpl.cpp | 4 +++- audio/aidl/default/include/effect-impl/EffectContext.h | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) 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();