Loading media/libaudiohal/impl/EffectConversionHelperAidl.cpp +28 −2 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ * limitations under the License. */ #include <cstddef> #include <cstdint> #include <cstring> #include <optional> Loading Loading @@ -44,6 +45,7 @@ using ::aidl::android::hardware::audio::effect::State; using ::aidl::android::media::audio::common::AudioDeviceDescription; using ::aidl::android::media::audio::common::AudioMode; using ::aidl::android::media::audio::common::AudioSource; using ::android::hardware::EventFlag; using android::effect::utils::EffectParamReader; using android::effect::utils::EffectParamWriter; Loading Loading @@ -127,6 +129,8 @@ status_t EffectConversionHelperAidl::handleSetParameter(uint32_t cmdSize, const status_t EffectConversionHelperAidl::handleGetParameter(uint32_t cmdSize, const void* pCmdData, uint32_t* replySize, void* pReplyData) { if (cmdSize < sizeof(effect_param_t) || !pCmdData || !replySize || !pReplyData) { ALOGE("%s illegal cmdSize %u pCmdData %p replySize %p replyData %p", __func__, cmdSize, pCmdData, replySize, pReplyData); return BAD_VALUE; } Loading Loading @@ -183,8 +187,9 @@ status_t EffectConversionHelperAidl::handleSetConfig(uint32_t cmdSize, const voi } if (state == State::INIT) { ALOGI("%s at state %s, opening effect", __func__, android::internal::ToString(state).c_str()); ALOGI("%s at state %s, opening effect with input %s output %s", __func__, android::internal::ToString(state).c_str(), common.input.toString().c_str(), common.output.toString().c_str()); IEffect::OpenEffectReturn openReturn; RETURN_STATUS_IF_ERROR( statusTFromBinderStatus(mEffect->open(common, std::nullopt, &openReturn))); Loading @@ -200,6 +205,11 @@ status_t EffectConversionHelperAidl::handleSetConfig(uint32_t cmdSize, const voi mInputQ = std::make_shared<DataMQ>(openReturn.inputDataMQ); mOutputQ = std::make_shared<DataMQ>(openReturn.outputDataMQ); } if (status_t status = updateEventFlags(); status != OK) { mEffect->close(); return status; } mCommon = common; } else if (mCommon != common) { ALOGI("%s at state %s, setParameter", __func__, android::internal::ToString(state).c_str()); Loading Loading @@ -343,6 +353,7 @@ status_t EffectConversionHelperAidl::handleSetOffload(uint32_t cmdSize, const vo mStatusQ = std::make_shared<StatusMQ>(ret->statusMQ); mInputQ = std::make_shared<DataMQ>(ret->inputDataMQ); mOutputQ = std::make_shared<DataMQ>(ret->outputDataMQ); RETURN_STATUS_IF_ERROR(updateEventFlags()); } return *static_cast<int32_t*>(pReplyData) = OK; } Loading Loading @@ -387,5 +398,20 @@ status_t EffectConversionHelperAidl::handleVisualizerMeasure(uint32_t cmdSize __ return visualizerMeasure(replySize, pReplyData); } status_t EffectConversionHelperAidl::updateEventFlags() { status_t status = BAD_VALUE; EventFlag* efGroup = nullptr; if (mStatusQ->isValid()) { status = EventFlag::createEventFlag(mStatusQ->getEventFlagWord(), &efGroup); if (status != OK || !efGroup) { ALOGE("%s: create EventFlagGroup failed, ret %d, egGroup %p", __func__, status, efGroup); status = (status == OK) ? BAD_VALUE : status; } } mEfGroup.reset(efGroup, EventFlagDeleter()); return status; } } // namespace effect } // namespace android media/libaudiohal/impl/EffectConversionHelperAidl.h +13 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ class EffectConversionHelperAidl { std::shared_ptr<StatusMQ> getStatusMQ() { return mStatusQ; } std::shared_ptr<DataMQ> getInputMQ() { return mInputQ; } std::shared_ptr<DataMQ> getOutputMQ() { return mOutputQ; } std::shared_ptr<android::hardware::EventFlag> getEventFlagGroup() { return mEfGroup; } protected: const int32_t mSessionId; Loading Loading @@ -85,6 +86,17 @@ class EffectConversionHelperAidl { std::shared_ptr<StatusMQ> mStatusQ = nullptr; std::shared_ptr<DataMQ> mInputQ = nullptr, mOutputQ = nullptr; struct EventFlagDeleter { void operator()(::android::hardware::EventFlag* flag) const { if (flag) { ::android::hardware::EventFlag::deleteEventFlag(&flag); } } }; std::shared_ptr<android::hardware::EventFlag> mEfGroup = nullptr; status_t updateEventFlags(); status_t handleInit(uint32_t cmdSize, const void* pCmdData, uint32_t* replySize, void* pReplyData); status_t handleSetConfig(uint32_t cmdSize, const void* pCmdData, uint32_t* replySize, Loading Loading @@ -121,6 +133,7 @@ class EffectConversionHelperAidl { virtual status_t visualizerMeasure(uint32_t* replySize __unused, void* pReplyData __unused) { return BAD_VALUE; } }; } // namespace effect Loading media/libaudiohal/impl/EffectHalAidl.cpp +6 −4 Original line number Diff line number Diff line Loading @@ -161,16 +161,17 @@ status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) return OK; } // write to input FMQ here, wait for statusMQ STATUS_OK, and read from output FMQ status_t EffectHalAidl::process() { auto statusQ = mConversion->getStatusMQ(); auto inputQ = mConversion->getInputMQ(); auto outputQ = mConversion->getOutputMQ(); auto efGroup = mConversion->getEventFlagGroup(); if (!statusQ || !statusQ->isValid() || !inputQ || !inputQ->isValid() || !outputQ || !outputQ->isValid()) { ALOGE("%s invalid FMQ [Status %d I %d O %d]", __func__, statusQ ? statusQ->isValid() : 0, inputQ ? inputQ->isValid() : 0, outputQ ? outputQ->isValid() : 0); !outputQ->isValid() || !efGroup) { ALOGE("%s invalid FMQ [Status %d I %d O %d] efGroup %p", __func__, statusQ ? statusQ->isValid() : 0, inputQ ? inputQ->isValid() : 0, outputQ ? outputQ->isValid() : 0, efGroup.get()); return INVALID_OPERATION; } Loading @@ -187,6 +188,7 @@ status_t EffectHalAidl::process() { floatsToWrite, mInBuffer->audioBuffer(), inputQ->availableToWrite()); return INVALID_OPERATION; } efGroup->wake(aidl::android::hardware::audio::effect::kEventFlagNotEmpty); IEffect::Status retStatus{}; if (!statusQ->readBlocking(&retStatus, 1) || retStatus.status != OK || Loading media/libaudiohal/impl/EffectHalAidl.h +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <fmq/AidlMessageQueue.h> #include <media/audiohal/EffectHalInterface.h> #include <system/audio_effect.h> #include <system/audio_effects/aidl_effects_utils.h> #include "EffectConversionHelperAidl.h" Loading Loading
media/libaudiohal/impl/EffectConversionHelperAidl.cpp +28 −2 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ * limitations under the License. */ #include <cstddef> #include <cstdint> #include <cstring> #include <optional> Loading Loading @@ -44,6 +45,7 @@ using ::aidl::android::hardware::audio::effect::State; using ::aidl::android::media::audio::common::AudioDeviceDescription; using ::aidl::android::media::audio::common::AudioMode; using ::aidl::android::media::audio::common::AudioSource; using ::android::hardware::EventFlag; using android::effect::utils::EffectParamReader; using android::effect::utils::EffectParamWriter; Loading Loading @@ -127,6 +129,8 @@ status_t EffectConversionHelperAidl::handleSetParameter(uint32_t cmdSize, const status_t EffectConversionHelperAidl::handleGetParameter(uint32_t cmdSize, const void* pCmdData, uint32_t* replySize, void* pReplyData) { if (cmdSize < sizeof(effect_param_t) || !pCmdData || !replySize || !pReplyData) { ALOGE("%s illegal cmdSize %u pCmdData %p replySize %p replyData %p", __func__, cmdSize, pCmdData, replySize, pReplyData); return BAD_VALUE; } Loading Loading @@ -183,8 +187,9 @@ status_t EffectConversionHelperAidl::handleSetConfig(uint32_t cmdSize, const voi } if (state == State::INIT) { ALOGI("%s at state %s, opening effect", __func__, android::internal::ToString(state).c_str()); ALOGI("%s at state %s, opening effect with input %s output %s", __func__, android::internal::ToString(state).c_str(), common.input.toString().c_str(), common.output.toString().c_str()); IEffect::OpenEffectReturn openReturn; RETURN_STATUS_IF_ERROR( statusTFromBinderStatus(mEffect->open(common, std::nullopt, &openReturn))); Loading @@ -200,6 +205,11 @@ status_t EffectConversionHelperAidl::handleSetConfig(uint32_t cmdSize, const voi mInputQ = std::make_shared<DataMQ>(openReturn.inputDataMQ); mOutputQ = std::make_shared<DataMQ>(openReturn.outputDataMQ); } if (status_t status = updateEventFlags(); status != OK) { mEffect->close(); return status; } mCommon = common; } else if (mCommon != common) { ALOGI("%s at state %s, setParameter", __func__, android::internal::ToString(state).c_str()); Loading Loading @@ -343,6 +353,7 @@ status_t EffectConversionHelperAidl::handleSetOffload(uint32_t cmdSize, const vo mStatusQ = std::make_shared<StatusMQ>(ret->statusMQ); mInputQ = std::make_shared<DataMQ>(ret->inputDataMQ); mOutputQ = std::make_shared<DataMQ>(ret->outputDataMQ); RETURN_STATUS_IF_ERROR(updateEventFlags()); } return *static_cast<int32_t*>(pReplyData) = OK; } Loading Loading @@ -387,5 +398,20 @@ status_t EffectConversionHelperAidl::handleVisualizerMeasure(uint32_t cmdSize __ return visualizerMeasure(replySize, pReplyData); } status_t EffectConversionHelperAidl::updateEventFlags() { status_t status = BAD_VALUE; EventFlag* efGroup = nullptr; if (mStatusQ->isValid()) { status = EventFlag::createEventFlag(mStatusQ->getEventFlagWord(), &efGroup); if (status != OK || !efGroup) { ALOGE("%s: create EventFlagGroup failed, ret %d, egGroup %p", __func__, status, efGroup); status = (status == OK) ? BAD_VALUE : status; } } mEfGroup.reset(efGroup, EventFlagDeleter()); return status; } } // namespace effect } // namespace android
media/libaudiohal/impl/EffectConversionHelperAidl.h +13 −0 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ class EffectConversionHelperAidl { std::shared_ptr<StatusMQ> getStatusMQ() { return mStatusQ; } std::shared_ptr<DataMQ> getInputMQ() { return mInputQ; } std::shared_ptr<DataMQ> getOutputMQ() { return mOutputQ; } std::shared_ptr<android::hardware::EventFlag> getEventFlagGroup() { return mEfGroup; } protected: const int32_t mSessionId; Loading Loading @@ -85,6 +86,17 @@ class EffectConversionHelperAidl { std::shared_ptr<StatusMQ> mStatusQ = nullptr; std::shared_ptr<DataMQ> mInputQ = nullptr, mOutputQ = nullptr; struct EventFlagDeleter { void operator()(::android::hardware::EventFlag* flag) const { if (flag) { ::android::hardware::EventFlag::deleteEventFlag(&flag); } } }; std::shared_ptr<android::hardware::EventFlag> mEfGroup = nullptr; status_t updateEventFlags(); status_t handleInit(uint32_t cmdSize, const void* pCmdData, uint32_t* replySize, void* pReplyData); status_t handleSetConfig(uint32_t cmdSize, const void* pCmdData, uint32_t* replySize, Loading Loading @@ -121,6 +133,7 @@ class EffectConversionHelperAidl { virtual status_t visualizerMeasure(uint32_t* replySize __unused, void* pReplyData __unused) { return BAD_VALUE; } }; } // namespace effect Loading
media/libaudiohal/impl/EffectHalAidl.cpp +6 −4 Original line number Diff line number Diff line Loading @@ -161,16 +161,17 @@ status_t EffectHalAidl::setOutBuffer(const sp<EffectBufferHalInterface>& buffer) return OK; } // write to input FMQ here, wait for statusMQ STATUS_OK, and read from output FMQ status_t EffectHalAidl::process() { auto statusQ = mConversion->getStatusMQ(); auto inputQ = mConversion->getInputMQ(); auto outputQ = mConversion->getOutputMQ(); auto efGroup = mConversion->getEventFlagGroup(); if (!statusQ || !statusQ->isValid() || !inputQ || !inputQ->isValid() || !outputQ || !outputQ->isValid()) { ALOGE("%s invalid FMQ [Status %d I %d O %d]", __func__, statusQ ? statusQ->isValid() : 0, inputQ ? inputQ->isValid() : 0, outputQ ? outputQ->isValid() : 0); !outputQ->isValid() || !efGroup) { ALOGE("%s invalid FMQ [Status %d I %d O %d] efGroup %p", __func__, statusQ ? statusQ->isValid() : 0, inputQ ? inputQ->isValid() : 0, outputQ ? outputQ->isValid() : 0, efGroup.get()); return INVALID_OPERATION; } Loading @@ -187,6 +188,7 @@ status_t EffectHalAidl::process() { floatsToWrite, mInBuffer->audioBuffer(), inputQ->availableToWrite()); return INVALID_OPERATION; } efGroup->wake(aidl::android::hardware::audio::effect::kEventFlagNotEmpty); IEffect::Status retStatus{}; if (!statusQ->readBlocking(&retStatus, 1) || retStatus.status != OK || Loading
media/libaudiohal/impl/EffectHalAidl.h +1 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <fmq/AidlMessageQueue.h> #include <media/audiohal/EffectHalInterface.h> #include <system/audio_effect.h> #include <system/audio_effects/aidl_effects_utils.h> #include "EffectConversionHelperAidl.h" Loading