Loading audio/aidl/default/EffectContext.cpp +25 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -40,7 +41,8 @@ EffectContext::EffectContext(size_t statusDepth, const Parameter::Common& common mOutputMQ = std::make_shared<DataMQ>(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 = Loading @@ -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<float*>(mWorkBuffer.data()); if (mStatusMQ) { std::vector<IEffect::Status> status(mStatusMQ->availableToRead()); } if (mInputMQ) { mInputMQ->read(buffer, mInputMQ->availableToRead()); } Loading @@ -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(); Loading Loading @@ -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))); Loading audio/aidl/default/EffectImpl.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading audio/aidl/default/include/effect-impl/EffectContext.h +11 −9 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ class EffectContext { } } void setVersion(int version) { mVersion = version; } std::shared_ptr<StatusMQ> getStatusFmq() const; std::shared_ptr<DataMQ> getInputDataFmq() const; std::shared_ptr<DataMQ> getOutputDataFmq() const; Loading Loading @@ -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<aidl::android::media::audio::common::AudioDeviceDescription> mOutputDevice = {}; aidl::android::media::audio::common::AudioMode mMode = Loading @@ -98,13 +100,13 @@ class EffectContext { private: // fmq and buffers std::shared_ptr<StatusMQ> mStatusMQ; std::shared_ptr<DataMQ> mInputMQ; std::shared_ptr<DataMQ> mOutputMQ; std::shared_ptr<StatusMQ> mStatusMQ = nullptr; std::shared_ptr<DataMQ> mInputMQ = nullptr; std::shared_ptr<DataMQ> mOutputMQ = nullptr; // std::shared_ptr<IEffect::OpenEffectReturn> mRet; // work buffer set by effect instances, the access and update are in same thread std::vector<float> mWorkBuffer; std::vector<float> mWorkBuffer = {}; ::android::hardware::EventFlag* mEfGroup; ::android::hardware::EventFlag* mEfGroup = nullptr; }; } // namespace aidl::android::hardware::audio::effect Loading
audio/aidl/default/EffectContext.cpp +25 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -40,7 +41,8 @@ EffectContext::EffectContext(size_t statusDepth, const Parameter::Common& common mOutputMQ = std::make_shared<DataMQ>(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 = Loading @@ -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<float*>(mWorkBuffer.data()); if (mStatusMQ) { std::vector<IEffect::Status> status(mStatusMQ->availableToRead()); } if (mInputMQ) { mInputMQ->read(buffer, mInputMQ->availableToRead()); } Loading @@ -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(); Loading Loading @@ -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))); Loading
audio/aidl/default/EffectImpl.cpp +6 −0 Original line number Diff line number Diff line Loading @@ -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()) { Loading
audio/aidl/default/include/effect-impl/EffectContext.h +11 −9 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ class EffectContext { } } void setVersion(int version) { mVersion = version; } std::shared_ptr<StatusMQ> getStatusFmq() const; std::shared_ptr<DataMQ> getInputDataFmq() const; std::shared_ptr<DataMQ> getOutputDataFmq() const; Loading Loading @@ -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<aidl::android::media::audio::common::AudioDeviceDescription> mOutputDevice = {}; aidl::android::media::audio::common::AudioMode mMode = Loading @@ -98,13 +100,13 @@ class EffectContext { private: // fmq and buffers std::shared_ptr<StatusMQ> mStatusMQ; std::shared_ptr<DataMQ> mInputMQ; std::shared_ptr<DataMQ> mOutputMQ; std::shared_ptr<StatusMQ> mStatusMQ = nullptr; std::shared_ptr<DataMQ> mInputMQ = nullptr; std::shared_ptr<DataMQ> mOutputMQ = nullptr; // std::shared_ptr<IEffect::OpenEffectReturn> mRet; // work buffer set by effect instances, the access and update are in same thread std::vector<float> mWorkBuffer; std::vector<float> mWorkBuffer = {}; ::android::hardware::EventFlag* mEfGroup; ::android::hardware::EventFlag* mEfGroup = nullptr; }; } // namespace aidl::android::hardware::audio::effect