AIDL effect: Add all aosp effects default implementation

Bug: 238913361
Test: atest VtsHalAudioEffectTargetTest
atest VtsHalAudioEffectFactoryTargetTest
atest VtsHalEqualizerTargetTest

Change-Id: I6825ba77ae0707f97e852f0faa52ce3486ba2af5
diff --git a/audio/aidl/default/equalizer/Equalizer.cpp b/audio/aidl/default/equalizer/Equalizer.cpp
index 43fa206..0e07d39 100644
--- a/audio/aidl/default/equalizer/Equalizer.cpp
+++ b/audio/aidl/default/equalizer/Equalizer.cpp
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cstddef>
 #define LOG_TAG "AHAL_EqualizerSw"
 #include <Utils.h>
 #include <algorithm>
@@ -24,11 +25,18 @@
 
 #include "equalizer-impl/EqualizerSw.h"
 
-using android::hardware::audio::common::getFrameSizeInBytes;
+using aidl::android::hardware::audio::effect::EqualizerSw;
+using aidl::android::hardware::audio::effect::EqualizerSwImplUUID;
+using aidl::android::hardware::audio::effect::IEffect;
+using aidl::android::hardware::audio::effect::State;
+using aidl::android::media::audio::common::AudioUuid;
 
-namespace aidl::android::hardware::audio::effect {
-
-extern "C" binder_exception_t createEffect(std::shared_ptr<IEffect>* instanceSpp) {
+extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
+                                           std::shared_ptr<IEffect>* instanceSpp) {
+    if (!in_impl_uuid || *in_impl_uuid != EqualizerSwImplUUID) {
+        LOG(ERROR) << __func__ << "uuid not supported";
+        return EX_ILLEGAL_ARGUMENT;
+    }
     if (instanceSpp) {
         *instanceSpp = ndk::SharedRefBase::make<EqualizerSw>();
         LOG(DEBUG) << __func__ << " instance " << instanceSpp->get() << " created";
@@ -51,212 +59,39 @@
     return EX_NONE;
 }
 
-ndk::ScopedAStatus EqualizerSw::open(const Parameter::Common& common,
-                                     const Parameter::Specific& specific,
-                                     OpenEffectReturn* _aidl_return) {
-    LOG(DEBUG) << __func__;
-    if (mState != State::INIT) {
-        LOG(WARNING) << __func__ << " eq already open";
-        return ndk::ScopedAStatus::ok();
-    }
-
-    // Set essential parameters before create worker thread.
-    setCommonParameter(common);
-    setSpecificParameter(specific);
-
-    LOG(DEBUG) << " common: " << common.toString() << " specific " << specific.toString();
-
-    auto& input = common.input;
-    auto& output = common.output;
-    size_t inputFrameSize = getFrameSizeInBytes(input.base.format, input.base.channelMask);
-    size_t outputFrameSize = getFrameSizeInBytes(output.base.format, output.base.channelMask);
-    mContext = std::make_shared<EqualizerSwContext>(1, input.frameCount * inputFrameSize,
-                                                    output.frameCount * outputFrameSize);
-    if (!mContext) {
-        LOG(ERROR) << __func__ << " created EqualizerSwContext failed";
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_UNSUPPORTED_OPERATION,
-                                                                "FailedToCreateFmq");
-    }
-    setContext(mContext);
-
-    // create the worker thread
-    if (RetCode::SUCCESS != createThread(LOG_TAG)) {
-        LOG(ERROR) << __func__ << " created worker thread failed";
-        mContext.reset();
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_UNSUPPORTED_OPERATION,
-                                                                "FailedToCreateWorker");
-    }
-
-    _aidl_return->statusMQ = mContext->getStatusFmq()->dupeDesc();
-    _aidl_return->inputDataMQ = mContext->getInputDataFmq()->dupeDesc();
-    _aidl_return->outputDataMQ = mContext->getOutputDataFmq()->dupeDesc();
-    mState = State::IDLE;
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus EqualizerSw::close() {
-    if (mState == State::INIT) {
-        LOG(WARNING) << __func__ << " instance already closed";
-        return ndk::ScopedAStatus::ok();
-    } else if (mState == State::PROCESSING) {
-        LOG(ERROR) << __func__ << " instance still processing";
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_STATE,
-                                                                "EqInstanceProcessing");
-    }
-
-    // stop the worker thread
-    mState = State::INIT;
-    destroyThread();
-    mContext.reset();
-
-    LOG(DEBUG) << __func__;
-    return ndk::ScopedAStatus::ok();
-}
+namespace aidl::android::hardware::audio::effect {
 
 ndk::ScopedAStatus EqualizerSw::getDescriptor(Descriptor* _aidl_return) {
-    LOG(DEBUG) << __func__ << mDesc.toString();
-    *_aidl_return = mDesc;
+    LOG(DEBUG) << __func__ << kDesc.toString();
+    *_aidl_return = kDesc;
     return ndk::ScopedAStatus::ok();
 }
 
-ndk::ScopedAStatus EqualizerSw::command(CommandId in_commandId) {
-    LOG(DEBUG) << __func__ << ": receive command:" << toString(in_commandId);
-    if (mState == State::INIT) {
-        LOG(ERROR) << __func__ << ": instance not open yet";
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_STATE,
-                                                                "CommandStateError");
-    }
-    switch (in_commandId) {
-        case CommandId::START:
-            // start processing.
-            mState = State::PROCESSING;
-            startThread();
-            LOG(DEBUG) << __func__ << " state: " << toString(mState);
-            return ndk::ScopedAStatus::ok();
-        case CommandId::STOP:
-            // stop processing.
-            mState = State::IDLE;
-            stopThread();
-            LOG(DEBUG) << __func__ << " state: " << toString(mState);
-            return ndk::ScopedAStatus::ok();
-        case CommandId::RESET:
-            // TODO: reset buffer status.
-            mState = State::IDLE;
-            stopThread();
-            LOG(DEBUG) << __func__ << " state: " << toString(mState);
-            return ndk::ScopedAStatus::ok();
-        default:
-            return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                                    "CommandIdNotSupported");
-    }
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus EqualizerSw::setParameter(const Parameter& in_param) {
-    if (mState == State::INIT) {
-        LOG(ERROR) << __func__ << ": instance not open yet";
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_STATE, "StateError");
-    }
-    LOG(DEBUG) << __func__ << " with: " << in_param.toString();
-    auto tag = in_param.getTag();
-    switch (tag) {
-        case Parameter::common: {
-            return setCommonParameter(in_param.get<Parameter::common>());
-        }
-        case Parameter::specific: {
-            return setSpecificParameter(in_param.get<Parameter::specific>());
-        }
-        default:
-            return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                                    "ParameterNotSupported");
-    }
-}
-
-ndk::ScopedAStatus EqualizerSw::getParameter(const Parameter::Id& in_paramId,
-                                             Parameter* _aidl_return) {
-    LOG(DEBUG) << __func__ << in_paramId.toString();
-    auto tag = in_paramId.getTag();
-    switch (tag) {
-        case Parameter::Id::commonTag: {
-            _aidl_return->set<Parameter::common>(mCommonParam);
-            LOG(DEBUG) << __func__ << " get: " << _aidl_return->toString();
-            return ndk::ScopedAStatus::ok();
-        }
-        case Parameter::Id::specificId: {
-            auto& id = in_paramId.get<Parameter::Id::specificId>();
-            Parameter::Specific specific;
-            ndk::ScopedAStatus status = getSpecificParameter(id, &specific);
-            if (!status.isOk()) {
-                LOG(ERROR) << __func__
-                           << " getSpecificParameter error: " << status.getDescription();
-                return status;
-            }
-            _aidl_return->set<Parameter::specific>(specific);
-            LOG(DEBUG) << __func__ << _aidl_return->toString();
-            return ndk::ScopedAStatus::ok();
-        }
-        case Parameter::Id::vendorTag: {
-            LOG(DEBUG) << __func__ << " noop for vendor tag now";
-            return ndk::ScopedAStatus::ok();
-        }
-    }
-    LOG(ERROR) << " unsupported tag: " << toString(tag);
-    return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                            "Parameter:IdNotSupported");
-}
-
-ndk::ScopedAStatus EqualizerSw::getState(State* _aidl_return) {
-    *_aidl_return = mState;
-    return ndk::ScopedAStatus::ok();
-}
-
-/// Private methods.
-ndk::ScopedAStatus EqualizerSw::setCommonParameter(const Parameter::Common& common) {
-    mCommonParam = common;
-    LOG(DEBUG) << __func__ << " set: " << mCommonParam.toString();
-    return ndk::ScopedAStatus::ok();
-}
-
-ndk::ScopedAStatus EqualizerSw::setSpecificParameter(const Parameter::Specific& specific) {
-    if (Parameter::Specific::equalizer != specific.getTag()) {
-        LOG(ERROR) << " unsupported effect: " << specific.toString();
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                                "EffectNotSupported");
-    }
+ndk::ScopedAStatus EqualizerSw::setParameterSpecific(const Parameter::Specific& specific) {
+    RETURN_IF(Parameter::Specific::equalizer != specific.getTag(), EX_ILLEGAL_ARGUMENT,
+              "EffectNotSupported");
+    std::lock_guard lg(mMutex);
+    RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
 
     auto& eqParam = specific.get<Parameter::Specific::equalizer>();
     auto tag = eqParam.getTag();
     switch (tag) {
-        case Equalizer::bandLevels: {
-            auto& bandLevels = eqParam.get<Equalizer::bandLevels>();
-            const auto& [minItem, maxItem] = std::minmax_element(
-                    bandLevels.begin(), bandLevels.end(),
-                    [](const auto& a, const auto& b) { return a.index < b.index; });
-            if (bandLevels.size() >= NUM_OF_BANDS || minItem->index < 0 ||
-                maxItem->index >= NUM_OF_BANDS) {
-                LOG(ERROR) << " bandLevels " << bandLevels.size() << "minIndex " << minItem->index
-                           << "maxIndex " << maxItem->index << " illegal ";
-                return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                                        "ExceedMaxBandNum");
-            }
-            mBandLevels = bandLevels;
-            return ndk::ScopedAStatus::ok();
-        }
         case Equalizer::preset: {
-            int preset = eqParam.get<Equalizer::preset>();
-            if (preset < 0 || preset >= NUM_OF_PRESETS) {
-                LOG(ERROR) << " preset: " << preset << " invalid";
-                return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                                        "ExceedMaxBandNum");
-            }
-            mPreset = preset;
-            LOG(DEBUG) << __func__ << " preset set to " << mPreset;
+            RETURN_IF(mContext->setEqPreset(eqParam.get<Equalizer::preset>()) != RetCode::SUCCESS,
+                      EX_ILLEGAL_ARGUMENT, "setBandLevelsFailed");
             return ndk::ScopedAStatus::ok();
         }
-        case Equalizer::vendor: {
-            LOG(DEBUG) << __func__ << " noop for vendor tag now";
+        case Equalizer::bandLevels: {
+            RETURN_IF(mContext->setEqBandLevels(eqParam.get<Equalizer::bandLevels>()) !=
+                              RetCode::SUCCESS,
+                      EX_ILLEGAL_ARGUMENT, "setBandLevelsFailed");
             return ndk::ScopedAStatus::ok();
         }
+        default: {
+            LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
+            return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+                                                                    "EqTagNotSupported");
+        }
     }
 
     LOG(ERROR) << __func__ << " unsupported eq param tag: " << toString(tag);
@@ -264,59 +99,72 @@
                                                             "ParamNotSupported");
 }
 
-ndk::ScopedAStatus EqualizerSw::getSpecificParameter(Parameter::Specific::Id id,
+ndk::ScopedAStatus EqualizerSw::getParameterSpecific(const Parameter::Id& id,
                                                      Parameter::Specific* specific) {
-    Equalizer eqParam;
     auto tag = id.getTag();
-    if (tag != Parameter::Specific::Id::equalizerTag) {
-        LOG(ERROR) << " invalid tag: " << toString(tag);
-        return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                                "UnsupportedTag");
+    RETURN_IF(Parameter::Id::equalizerTag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
+    auto eqId = id.get<Parameter::Id::equalizerTag>();
+    auto eqIdTag = eqId.getTag();
+    switch (eqIdTag) {
+        case Equalizer::Id::commonTag:
+            return getParameterEqualizer(eqId.get<Equalizer::Id::commonTag>(), specific);
+        default:
+            LOG(ERROR) << __func__ << " tag " << toString(eqIdTag) << " not supported";
+            return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+                                                                    "EqualizerTagNotSupported");
     }
-    auto eqTag = id.get<Parameter::Specific::Id::equalizerTag>();
-    switch (eqTag) {
+}
+
+ndk::ScopedAStatus EqualizerSw::getParameterEqualizer(const Equalizer::Tag& tag,
+                                                      Parameter::Specific* specific) {
+    std::lock_guard lg(mMutex);
+    RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
+
+    Equalizer eqParam;
+    switch (tag) {
         case Equalizer::bandLevels: {
-            eqParam.set<Equalizer::bandLevels>(mBandLevels);
-            specific->set<Parameter::Specific::equalizer>(eqParam);
-            return ndk::ScopedAStatus::ok();
+            eqParam.set<Equalizer::bandLevels>(mContext->getEqBandLevels());
+            break;
         }
         case Equalizer::preset: {
-            eqParam.set<Equalizer::preset>(mPreset);
-            LOG(DEBUG) << __func__ << " preset " << mPreset;
-            specific->set<Parameter::Specific::equalizer>(eqParam);
-            return ndk::ScopedAStatus::ok();
+            eqParam.set<Equalizer::preset>(mContext->getEqPreset());
+            break;
         }
-        case Equalizer::vendor: {
-            LOG(DEBUG) << __func__ << " noop for vendor tag now";
-            return ndk::ScopedAStatus::ok();
+        default: {
+            LOG(ERROR) << __func__ << " not handled tag: " << toString(tag);
+            return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
+                                                                    "unsupportedTag");
         }
     }
-    LOG(ERROR) << __func__ << " unsupported eq param: " << toString(eqTag);
-    return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
-                                                            "ParamNotSupported");
+
+    specific->set<Parameter::Specific::equalizer>(eqParam);
+    return ndk::ScopedAStatus::ok();
 }
 
-void EqualizerSw::cleanUp() {
-    if (State::PROCESSING == mState) {
-        command(CommandId::STOP);
+std::shared_ptr<EffectContext> EqualizerSw::createContext(const Parameter::Common& common) {
+    if (mContext) {
+        LOG(DEBUG) << __func__ << " context already exist";
+        return mContext;
     }
-    if (State::INIT != mState) {
-        close();
-    }
+    mContext = std::make_shared<EqualizerSwContext>(1 /* statusFmqDepth */, common);
+    return mContext;
 }
 
-IEffect::Status EqualizerSw::status(binder_status_t status, size_t consumed, size_t produced) {
-    IEffect::Status ret;
-    ret.status = status;
-    ret.fmqByteConsumed = consumed;
-    ret.fmqByteProduced = produced;
-    return ret;
+RetCode EqualizerSw::releaseContext() {
+    if (mContext) {
+        mContext.reset();
+    }
+    return RetCode::SUCCESS;
 }
 
 // Processing method running in EffectWorker thread.
-IEffect::Status EqualizerSw::effectProcessImpl() {
+IEffect::Status EqualizerSw::effectProcessImpl(float* in, float* out, int process) {
     // TODO: get data buffer and process.
-    return status(STATUS_OK, mContext->availableToRead(), mContext->availableToWrite());
+    LOG(DEBUG) << __func__ << " in " << in << " out " << out << " process " << process;
+    for (int i = 0; i < process; i++) {
+        *out++ = *in++;
+    }
+    return {STATUS_OK, process, process};
 }
 
 }  // namespace aidl::android::hardware::audio::effect