1 /* 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #pragma once 18 #include <cstdlib> 19 #include <memory> 20 21 #include <aidl/android/hardware/audio/effect/BnEffect.h> 22 #include <fmq/AidlMessageQueue.h> 23 24 #include "EffectContext.h" 25 #include "EffectThread.h" 26 #include "EffectTypes.h" 27 #include "effect-impl/EffectContext.h" 28 #include "effect-impl/EffectThread.h" 29 #include "effect-impl/EffectTypes.h" 30 31 extern "C" binder_exception_t destroyEffect( 32 const std::shared_ptr<aidl::android::hardware::audio::effect::IEffect>& instanceSp); 33 34 namespace aidl::android::hardware::audio::effect { 35 36 class EffectImpl : public BnEffect, public EffectThread { 37 public: 38 EffectImpl() = default; 39 virtual ~EffectImpl() = default; 40 41 virtual ndk::ScopedAStatus open(const Parameter::Common& common, 42 const std::optional<Parameter::Specific>& specific, 43 OpenEffectReturn* ret) override; 44 virtual ndk::ScopedAStatus close() override; 45 virtual ndk::ScopedAStatus command(CommandId id) override; 46 47 virtual ndk::ScopedAStatus getState(State* state) override; 48 virtual ndk::ScopedAStatus setParameter(const Parameter& param) override; 49 virtual ndk::ScopedAStatus getParameter(const Parameter::Id& id, Parameter* param) override; 50 51 virtual ndk::ScopedAStatus setParameterCommon(const Parameter& param); 52 virtual ndk::ScopedAStatus getParameterCommon(const Parameter::Tag& tag, Parameter* param); 53 54 /* Methods MUST be implemented by each effect instances */ 55 virtual ndk::ScopedAStatus getDescriptor(Descriptor* desc) = 0; 56 virtual ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) = 0; 57 virtual ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id, 58 Parameter::Specific* specific) = 0; 59 60 virtual std::string getEffectName() = 0; 61 virtual IEffect::Status effectProcessImpl(float* in, float* out, int samples) override; 62 63 /** 64 * Effect context methods must be implemented by each effect. 65 * Each effect can derive from EffectContext and define its own context, but must upcast to 66 * EffectContext for EffectImpl to use. 67 */ 68 virtual std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) = 0; 69 virtual std::shared_ptr<EffectContext> getContext() = 0; 70 virtual RetCode releaseContext() = 0; 71 72 protected: 73 State mState = State::INIT; 74 75 IEffect::Status status(binder_status_t status, size_t consumed, size_t produced); 76 void cleanUp(); 77 78 /** 79 * Optional CommandId handling methods for effects to override. 80 * For CommandId::START, EffectImpl call commandImpl before starting the EffectThread 81 * processing. 82 * For CommandId::STOP and CommandId::RESET, EffectImpl call commandImpl after stop the 83 * EffectThread processing. 84 */ 85 virtual ndk::ScopedAStatus commandImpl(CommandId id); 86 }; 87 } // namespace aidl::android::hardware::audio::effect 88