Only send data to IEffect for processing in PROCESSING state
Effect instance won't be able to process data in other states
Bug: 293896175
Test: Enable AIDL and test YouTube with effects enabled
Change-Id: Ida968fc760a8172de4e1663a37d3cbe7a9633f64
Merged-In: Ida968fc760a8172de4e1663a37d3cbe7a9633f64
diff --git a/media/libaudiohal/impl/EffectHalAidl.cpp b/media/libaudiohal/impl/EffectHalAidl.cpp
index ae4a530..b8e62ae 100644
--- a/media/libaudiohal/impl/EffectHalAidl.cpp
+++ b/media/libaudiohal/impl/EffectHalAidl.cpp
@@ -56,6 +56,7 @@
using ::aidl::android::hardware::audio::effect::Descriptor;
using ::aidl::android::hardware::audio::effect::IEffect;
using ::aidl::android::hardware::audio::effect::IFactory;
+using ::aidl::android::hardware::audio::effect::State;
namespace android {
namespace effect {
@@ -165,13 +166,20 @@
// write to input FMQ here, wait for statusMQ STATUS_OK, and read from output FMQ
status_t EffectHalAidl::process() {
+ State state = State::INIT;
+ if (mConversion->isBypassing() || !mEffect->getState(&state).isOk() ||
+ state != State::PROCESSING) {
+ ALOGI("%s skipping %s process because it's %s", __func__, mDesc.common.name.c_str(),
+ mConversion->isBypassing()
+ ? "bypassing"
+ : aidl::android::hardware::audio::effect::toString(state).c_str());
+ return OK;
+ }
+
auto statusQ = mConversion->getStatusMQ();
auto inputQ = mConversion->getInputMQ();
auto outputQ = mConversion->getOutputMQ();
auto efGroup = mConversion->getEventFlagGroup();
- if (mConversion->isBypassing()) {
- return OK;
- }
if (!statusQ || !statusQ->isValid() || !inputQ || !inputQ->isValid() || !outputQ ||
!outputQ->isValid() || !efGroup) {
ALOGE("%s invalid FMQ [Status %d I %d O %d] efGroup %p", __func__,