diff --git a/audio/aidl/default/EffectContext.cpp b/audio/aidl/default/EffectContext.cpp index 4f226c4bf6..9575790644 100644 --- a/audio/aidl/default/EffectContext.cpp +++ b/audio/aidl/default/EffectContext.cpp @@ -22,6 +22,7 @@ using aidl::android::hardware::audio::common::getChannelCount; using aidl::android::hardware::audio::common::getFrameSizeInBytes; using aidl::android::hardware::audio::effect::IEffect; +using aidl::android::hardware::audio::effect::kReopenSupportedVersion; using aidl::android::media::audio::common::PcmType; using ::android::hardware::EventFlag; @@ -40,7 +41,8 @@ EffectContext::EffectContext(size_t statusDepth, const Parameter::Common& common mOutputMQ = std::make_shared(outBufferSizeInFloat); if (!mStatusMQ->isValid() || !mInputMQ->isValid() || !mOutputMQ->isValid()) { - LOG(ERROR) << __func__ << " created invalid FMQ"; + LOG(ERROR) << __func__ << " created invalid FMQ, statusMQ: " << mStatusMQ->isValid() + << " inputMQ: " << mInputMQ->isValid() << " outputMQ: " << mOutputMQ->isValid(); } ::android::status_t status = @@ -52,7 +54,9 @@ EffectContext::EffectContext(size_t statusDepth, const Parameter::Common& common // reset buffer status by abandon input data in FMQ void EffectContext::resetBuffer() { auto buffer = static_cast(mWorkBuffer.data()); - std::vector status(mStatusMQ->availableToRead()); + if (mStatusMQ) { + std::vector status(mStatusMQ->availableToRead()); + } if (mInputMQ) { mInputMQ->read(buffer, mInputMQ->availableToRead()); } @@ -71,7 +75,7 @@ void EffectContext::dupeFmqWithReopen(IEffect::OpenEffectReturn* effectRet) { } void EffectContext::dupeFmq(IEffect::OpenEffectReturn* effectRet) { - if (effectRet) { + if (effectRet && mStatusMQ && mInputMQ && mOutputMQ) { effectRet->statusMQ = mStatusMQ->dupeDesc(); effectRet->inputDataMQ = mInputMQ->dupeDesc(); effectRet->outputDataMQ = mOutputMQ->dupeDesc(); @@ -191,24 +195,34 @@ EventFlag* EffectContext::getStatusEventFlag() { } RetCode EffectContext::updateIOFrameSize(const Parameter::Common& common) { - const auto iFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes( + const auto prevInputFrameSize = mInputFrameSize; + const auto prevOutputFrameSize = mOutputFrameSize; + mInputFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes( common.input.base.format, common.input.base.channelMask); - const auto oFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes( + mOutputFrameSize = ::aidl::android::hardware::audio::common::getFrameSizeInBytes( common.output.base.format, common.output.base.channelMask); + // workBuffer and data MQ not allocated yet, no need to update + if (mWorkBuffer.size() == 0 || !mInputMQ || !mOutputMQ) { + return RetCode::SUCCESS; + } + // IEffect::reopen introduced in android.hardware.audio.effect-V2 + if (mVersion < kReopenSupportedVersion) { + LOG(WARNING) << __func__ << " skipped for HAL version " << mVersion; + return RetCode::SUCCESS; + } bool needUpdateMq = false; - if (mInputMQ && - (mInputFrameSize != iFrameSize || mCommon.input.frameCount != common.input.frameCount)) { + if (mInputFrameSize != prevInputFrameSize || + mCommon.input.frameCount != common.input.frameCount) { mInputMQ.reset(); needUpdateMq = true; } - if (mOutputMQ && - (mOutputFrameSize != oFrameSize || mCommon.output.frameCount != common.output.frameCount)) { + if (mOutputFrameSize != prevOutputFrameSize || + mCommon.output.frameCount != common.output.frameCount) { mOutputMQ.reset(); needUpdateMq = true; } - mInputFrameSize = iFrameSize; - mOutputFrameSize = oFrameSize; + if (needUpdateMq) { mWorkBuffer.resize(std::max(common.input.frameCount * mInputFrameSize / sizeof(float), common.output.frameCount * mOutputFrameSize / sizeof(float))); diff --git a/audio/aidl/default/EffectImpl.cpp b/audio/aidl/default/EffectImpl.cpp index c97a03e8a3..4d7b9809c6 100644 --- a/audio/aidl/default/EffectImpl.cpp +++ b/audio/aidl/default/EffectImpl.cpp @@ -49,10 +49,16 @@ ndk::ScopedAStatus EffectImpl::open(const Parameter::Common& common, RETURN_IF(common.input.base.format.pcm != common.output.base.format.pcm || common.input.base.format.pcm != PcmType::FLOAT_32_BIT, EX_ILLEGAL_ARGUMENT, "dataMustBe32BitsFloat"); + std::lock_guard lg(mImplMutex); RETURN_OK_IF(mState != State::INIT); mImplContext = createContext(common); RETURN_IF(!mImplContext, EX_NULL_POINTER, "nullContext"); + + int version = 0; + RETURN_IF(!getInterfaceVersion(&version).isOk(), EX_UNSUPPORTED_OPERATION, + "FailedToGetInterfaceVersion"); + mImplContext->setVersion(version); mEventFlag = mImplContext->getStatusEventFlag(); if (specific.has_value()) { diff --git a/audio/aidl/default/include/effect-impl/EffectContext.h b/audio/aidl/default/include/effect-impl/EffectContext.h index b3d730df17..275378e9b8 100644 --- a/audio/aidl/default/include/effect-impl/EffectContext.h +++ b/audio/aidl/default/include/effect-impl/EffectContext.h @@ -44,6 +44,7 @@ class EffectContext { } } + void setVersion(int version) { mVersion = version; } std::shared_ptr getStatusFmq() const; std::shared_ptr getInputDataFmq() const; std::shared_ptr getOutputDataFmq() const; @@ -82,10 +83,11 @@ class EffectContext { virtual ::android::hardware::EventFlag* getStatusEventFlag(); protected: - size_t mInputFrameSize; - size_t mOutputFrameSize; - size_t mInputChannelCount; - size_t mOutputChannelCount; + int mVersion = 0; + size_t mInputFrameSize = 0; + size_t mOutputFrameSize = 0; + size_t mInputChannelCount = 0; + size_t mOutputChannelCount = 0; Parameter::Common mCommon = {}; std::vector mOutputDevice = {}; aidl::android::media::audio::common::AudioMode mMode = @@ -98,13 +100,13 @@ class EffectContext { private: // fmq and buffers - std::shared_ptr mStatusMQ; - std::shared_ptr mInputMQ; - std::shared_ptr mOutputMQ; + std::shared_ptr mStatusMQ = nullptr; + std::shared_ptr mInputMQ = nullptr; + std::shared_ptr mOutputMQ = nullptr; // std::shared_ptr mRet; // work buffer set by effect instances, the access and update are in same thread - std::vector mWorkBuffer; + std::vector mWorkBuffer = {}; - ::android::hardware::EventFlag* mEfGroup; + ::android::hardware::EventFlag* mEfGroup = nullptr; }; } // namespace aidl::android::hardware::audio::effect