• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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