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
diff --git a/audio/aidl/default/EffectContext.cpp b/audio/aidl/default/EffectContext.cpp
index 2e12918..4f226c4 100644
--- a/audio/aidl/default/EffectContext.cpp
+++ b/audio/aidl/default/EffectContext.cpp
@@ -46,7 +46,7 @@
::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 @@
return static_cast<float*>(mWorkBuffer.data());
}
+size_t EffectContext::getWorkBufferSize() const {
+ return mWorkBuffer.size();
+}
+
std::shared_ptr<EffectContext::StatusMQ> EffectContext::getStatusFmq() const {
return mStatusMQ;
}
@@ -206,6 +210,8 @@
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 b76269a..c29bf79 100644
--- a/audio/aidl/default/EffectImpl.cpp
+++ b/audio/aidl/default/EffectImpl.cpp
@@ -327,7 +327,9 @@
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 24f3b5d..b3d730d 100644
--- a/audio/aidl/default/include/effect-impl/EffectContext.h
+++ b/audio/aidl/default/include/effect-impl/EffectContext.h
@@ -49,6 +49,7 @@
std::shared_ptr<DataMQ> getOutputDataFmq() const;
float* getWorkBuffer();
+ size_t getWorkBufferSize() const;
// reset buffer status by abandon input data in FMQ
void resetBuffer();