xref: /aosp_15_r20/frameworks/av/services/audiopolicy/service/AudioPolicyEffects.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #pragma once
18*ec779b8eSAndroid Build Coastguard Worker 
19*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h>
20*ec779b8eSAndroid Build Coastguard Worker #include <stdio.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <string.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <future>
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/mutex.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <cutils/misc.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioEffect.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <media/audiohal/EffectsFactoryHalInterface.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <utils/SortedVector.h>
32*ec779b8eSAndroid Build Coastguard Worker 
33*ec779b8eSAndroid Build Coastguard Worker namespace android {
34*ec779b8eSAndroid Build Coastguard Worker 
35*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
36*ec779b8eSAndroid Build Coastguard Worker 
37*ec779b8eSAndroid Build Coastguard Worker /**
38*ec779b8eSAndroid Build Coastguard Worker  * AudioPolicyEffects class.
39*ec779b8eSAndroid Build Coastguard Worker  *
40*ec779b8eSAndroid Build Coastguard Worker  * This class manages all effects attached to input and output streams in AudioPolicyService.
41*ec779b8eSAndroid Build Coastguard Worker  * The effect configurations can be queried in several ways:
42*ec779b8eSAndroid Build Coastguard Worker  *
43*ec779b8eSAndroid Build Coastguard Worker  * With HIDL HAL, the configuration file `audio_effects.xml` will be loaded by libAudioHal. If this
44*ec779b8eSAndroid Build Coastguard Worker  * file does not exist, AudioPolicyEffects class will fallback to load configuration from
45*ec779b8eSAndroid Build Coastguard Worker  * `/vendor/etc/audio_effects.conf` (AUDIO_EFFECT_VENDOR_CONFIG_FILE). If this file also does not
46*ec779b8eSAndroid Build Coastguard Worker  * exist, the configuration will be loaded from the file `/system/etc/audio_effects.conf`.
47*ec779b8eSAndroid Build Coastguard Worker  *
48*ec779b8eSAndroid Build Coastguard Worker  * With AIDL HAL, the configuration will be queried with the method `IFactory::queryProcessing()`.
49*ec779b8eSAndroid Build Coastguard Worker  */
50*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyEffects : public RefBase
51*ec779b8eSAndroid Build Coastguard Worker {
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker public:
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker     // The constructor will parse audio_effects.conf
56*ec779b8eSAndroid Build Coastguard Worker     // First it will look whether vendor specific file exists,
57*ec779b8eSAndroid Build Coastguard Worker     // otherwise it will parse the system default file.
58*ec779b8eSAndroid Build Coastguard Worker     explicit AudioPolicyEffects(const sp<EffectsFactoryHalInterface>& effectsFactoryHal);
59*ec779b8eSAndroid Build Coastguard Worker 
60*ec779b8eSAndroid Build Coastguard Worker     // NOTE: methods on AudioPolicyEffects should never be called with the AudioPolicyService
61*ec779b8eSAndroid Build Coastguard Worker     // main mutex (mMutex) held as they will indirectly call back into AudioPolicyService when
62*ec779b8eSAndroid Build Coastguard Worker     // managing audio effects.
63*ec779b8eSAndroid Build Coastguard Worker 
64*ec779b8eSAndroid Build Coastguard Worker     // Return a list of effect descriptors for default input effects
65*ec779b8eSAndroid Build Coastguard Worker     // associated with audioSession
66*ec779b8eSAndroid Build Coastguard Worker     status_t queryDefaultInputEffects(audio_session_t audioSession,
67*ec779b8eSAndroid Build Coastguard Worker                              effect_descriptor_t *descriptors,
68*ec779b8eSAndroid Build Coastguard Worker                              uint32_t* count) EXCLUDES_AudioPolicyEffects_Mutex;
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker     // Add all input effects associated with this input
71*ec779b8eSAndroid Build Coastguard Worker     // Effects are attached depending on the audio_source_t
72*ec779b8eSAndroid Build Coastguard Worker     status_t addInputEffects(audio_io_handle_t input,
73*ec779b8eSAndroid Build Coastguard Worker                              audio_source_t inputSource,
74*ec779b8eSAndroid Build Coastguard Worker                              audio_session_t audioSession) EXCLUDES_AudioPolicyEffects_Mutex;
75*ec779b8eSAndroid Build Coastguard Worker 
76*ec779b8eSAndroid Build Coastguard Worker     // Add all input effects associated to this input
77*ec779b8eSAndroid Build Coastguard Worker     status_t releaseInputEffects(audio_io_handle_t input,
78*ec779b8eSAndroid Build Coastguard Worker                                  audio_session_t audioSession) EXCLUDES_AudioPolicyEffects_Mutex;
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker     // Return a list of effect descriptors for default output effects
81*ec779b8eSAndroid Build Coastguard Worker     // associated with audioSession
82*ec779b8eSAndroid Build Coastguard Worker     status_t queryDefaultOutputSessionEffects(audio_session_t audioSession,
83*ec779b8eSAndroid Build Coastguard Worker                              effect_descriptor_t *descriptors,
84*ec779b8eSAndroid Build Coastguard Worker                              uint32_t* count) EXCLUDES_AudioPolicyEffects_Mutex;
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker     // Add all output effects associated to this output
87*ec779b8eSAndroid Build Coastguard Worker     // Effects are attached depending on the audio_stream_type_t
88*ec779b8eSAndroid Build Coastguard Worker     status_t addOutputSessionEffects(audio_io_handle_t output,
89*ec779b8eSAndroid Build Coastguard Worker                              audio_stream_type_t stream,
90*ec779b8eSAndroid Build Coastguard Worker                              audio_session_t audioSession) EXCLUDES_AudioPolicyEffects_Mutex;
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker     // release all output effects associated with this output stream and audiosession
93*ec779b8eSAndroid Build Coastguard Worker     status_t releaseOutputSessionEffects(audio_io_handle_t output,
94*ec779b8eSAndroid Build Coastguard Worker                              audio_stream_type_t stream,
95*ec779b8eSAndroid Build Coastguard Worker                              audio_session_t audioSession) EXCLUDES_AudioPolicyEffects_Mutex;
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker     // Add the effect to the list of default effects for sources of type |source|.
98*ec779b8eSAndroid Build Coastguard Worker     status_t addSourceDefaultEffect(const effect_uuid_t *type,
99*ec779b8eSAndroid Build Coastguard Worker                                     const String16& opPackageName,
100*ec779b8eSAndroid Build Coastguard Worker                                     const effect_uuid_t *uuid,
101*ec779b8eSAndroid Build Coastguard Worker                                     int32_t priority,
102*ec779b8eSAndroid Build Coastguard Worker                                     audio_source_t source,
103*ec779b8eSAndroid Build Coastguard Worker                                     audio_unique_id_t* id) EXCLUDES_AudioPolicyEffects_Mutex;
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker     // Add the effect to the list of default effects for streams of a given usage.
106*ec779b8eSAndroid Build Coastguard Worker     status_t addStreamDefaultEffect(const effect_uuid_t *type,
107*ec779b8eSAndroid Build Coastguard Worker                                     const String16& opPackageName,
108*ec779b8eSAndroid Build Coastguard Worker                                     const effect_uuid_t *uuid,
109*ec779b8eSAndroid Build Coastguard Worker                                     int32_t priority,
110*ec779b8eSAndroid Build Coastguard Worker                                     audio_usage_t usage,
111*ec779b8eSAndroid Build Coastguard Worker                                     audio_unique_id_t* id) EXCLUDES_AudioPolicyEffects_Mutex;
112*ec779b8eSAndroid Build Coastguard Worker 
113*ec779b8eSAndroid Build Coastguard Worker     // Remove the default source effect from wherever it's attached.
114*ec779b8eSAndroid Build Coastguard Worker     status_t removeSourceDefaultEffect(audio_unique_id_t id) EXCLUDES_AudioPolicyEffects_Mutex;
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker     // Remove the default stream effect from wherever it's attached.
117*ec779b8eSAndroid Build Coastguard Worker     status_t removeStreamDefaultEffect(audio_unique_id_t id) EXCLUDES_AudioPolicyEffects_Mutex;
118*ec779b8eSAndroid Build Coastguard Worker 
119*ec779b8eSAndroid Build Coastguard Worker     // Initializes the Effects (AudioSystem must be ready as this creates audio client objects).
120*ec779b8eSAndroid Build Coastguard Worker     void initDefaultDeviceEffects() EXCLUDES(mDeviceEffectsMutex) EXCLUDES_EffectHandle_Mutex;
121*ec779b8eSAndroid Build Coastguard Worker 
122*ec779b8eSAndroid Build Coastguard Worker private:
123*ec779b8eSAndroid Build Coastguard Worker 
124*ec779b8eSAndroid Build Coastguard Worker     // class to store the description of an effects and its parameters
125*ec779b8eSAndroid Build Coastguard Worker     // as defined in audio_effects.conf
126*ec779b8eSAndroid Build Coastguard Worker     class EffectDesc {
127*ec779b8eSAndroid Build Coastguard Worker     public:
EffectDesc(std::string_view name,const effect_uuid_t & typeUuid,const String16 & opPackageName,const effect_uuid_t & uuid,uint32_t priority,audio_unique_id_t id)128*ec779b8eSAndroid Build Coastguard Worker         EffectDesc(std::string_view name,
129*ec779b8eSAndroid Build Coastguard Worker                    const effect_uuid_t& typeUuid,
130*ec779b8eSAndroid Build Coastguard Worker                    const String16& opPackageName,
131*ec779b8eSAndroid Build Coastguard Worker                    const effect_uuid_t& uuid,
132*ec779b8eSAndroid Build Coastguard Worker                    uint32_t priority,
133*ec779b8eSAndroid Build Coastguard Worker                    audio_unique_id_t id) :
134*ec779b8eSAndroid Build Coastguard Worker                         mName(name),
135*ec779b8eSAndroid Build Coastguard Worker                         mTypeUuid(typeUuid),
136*ec779b8eSAndroid Build Coastguard Worker                         mOpPackageName(opPackageName),
137*ec779b8eSAndroid Build Coastguard Worker                         mUuid(uuid),
138*ec779b8eSAndroid Build Coastguard Worker                         mPriority(priority),
139*ec779b8eSAndroid Build Coastguard Worker                         mId(id) { }
140*ec779b8eSAndroid Build Coastguard Worker         // Modern EffectDesc usage:
EffectDesc(std::string_view name,const effect_uuid_t & uuid)141*ec779b8eSAndroid Build Coastguard Worker         EffectDesc(std::string_view name, const effect_uuid_t& uuid) :
142*ec779b8eSAndroid Build Coastguard Worker                         EffectDesc(name,
143*ec779b8eSAndroid Build Coastguard Worker                                    *EFFECT_UUID_NULL,
144*ec779b8eSAndroid Build Coastguard Worker                                    String16(""),
145*ec779b8eSAndroid Build Coastguard Worker                                    uuid,
146*ec779b8eSAndroid Build Coastguard Worker                                    0,
147*ec779b8eSAndroid Build Coastguard Worker                                    AUDIO_UNIQUE_ID_ALLOCATE) { }
EffectDesc(const EffectDesc & orig)148*ec779b8eSAndroid Build Coastguard Worker         EffectDesc(const EffectDesc& orig) :
149*ec779b8eSAndroid Build Coastguard Worker                         mName(orig.mName),
150*ec779b8eSAndroid Build Coastguard Worker                         mTypeUuid(orig.mTypeUuid),
151*ec779b8eSAndroid Build Coastguard Worker                         mOpPackageName(orig.mOpPackageName),
152*ec779b8eSAndroid Build Coastguard Worker                         mUuid(orig.mUuid),
153*ec779b8eSAndroid Build Coastguard Worker                         mPriority(orig.mPriority),
154*ec779b8eSAndroid Build Coastguard Worker                         mId(orig.mId),
155*ec779b8eSAndroid Build Coastguard Worker                         mParams(orig.mParams) { }
156*ec779b8eSAndroid Build Coastguard Worker 
157*ec779b8eSAndroid Build Coastguard Worker         const std::string mName;
158*ec779b8eSAndroid Build Coastguard Worker         const effect_uuid_t mTypeUuid;
159*ec779b8eSAndroid Build Coastguard Worker         const String16 mOpPackageName;
160*ec779b8eSAndroid Build Coastguard Worker         const effect_uuid_t mUuid;
161*ec779b8eSAndroid Build Coastguard Worker         const int32_t mPriority;
162*ec779b8eSAndroid Build Coastguard Worker         const audio_unique_id_t mId;
163*ec779b8eSAndroid Build Coastguard Worker         std::vector<std::shared_ptr<const effect_param_t>> mParams;
164*ec779b8eSAndroid Build Coastguard Worker     };
165*ec779b8eSAndroid Build Coastguard Worker 
166*ec779b8eSAndroid Build Coastguard Worker     using EffectDescVector = std::vector<std::shared_ptr<EffectDesc>>;
167*ec779b8eSAndroid Build Coastguard Worker 
168*ec779b8eSAndroid Build Coastguard Worker     class EffectVector {
169*ec779b8eSAndroid Build Coastguard Worker     public:
EffectVector(audio_session_t session)170*ec779b8eSAndroid Build Coastguard Worker         explicit EffectVector(audio_session_t session) : mSessionId(session) {}
171*ec779b8eSAndroid Build Coastguard Worker 
172*ec779b8eSAndroid Build Coastguard Worker         // Enable or disable all effects in effect vector
173*ec779b8eSAndroid Build Coastguard Worker         void setProcessorEnabled(bool enabled);
174*ec779b8eSAndroid Build Coastguard Worker 
175*ec779b8eSAndroid Build Coastguard Worker         const audio_session_t mSessionId;
176*ec779b8eSAndroid Build Coastguard Worker         // AudioPolicyManager keeps mMutex, no need for lock on reference count here
177*ec779b8eSAndroid Build Coastguard Worker         int mRefCount = 0;
178*ec779b8eSAndroid Build Coastguard Worker         std::vector<sp<AudioEffect>> mEffects;
179*ec779b8eSAndroid Build Coastguard Worker     };
180*ec779b8eSAndroid Build Coastguard Worker 
181*ec779b8eSAndroid Build Coastguard Worker     /**
182*ec779b8eSAndroid Build Coastguard Worker      * @brief The DeviceEffects class stores the effects associated to a given Device Port.
183*ec779b8eSAndroid Build Coastguard Worker      */
184*ec779b8eSAndroid Build Coastguard Worker     class DeviceEffects {
185*ec779b8eSAndroid Build Coastguard Worker     public:
DeviceEffects(std::unique_ptr<EffectDescVector> effectDescriptors,audio_devices_t device,std::string_view address)186*ec779b8eSAndroid Build Coastguard Worker         DeviceEffects(std::unique_ptr<EffectDescVector> effectDescriptors,
187*ec779b8eSAndroid Build Coastguard Worker                                audio_devices_t device, std::string_view address) :
188*ec779b8eSAndroid Build Coastguard Worker             mEffectDescriptors(std::move(effectDescriptors)),
189*ec779b8eSAndroid Build Coastguard Worker             mDeviceType(device), mDeviceAddress(address) {}
190*ec779b8eSAndroid Build Coastguard Worker 
191*ec779b8eSAndroid Build Coastguard Worker         std::vector<sp<AudioEffect>> mEffects;
getDeviceType()192*ec779b8eSAndroid Build Coastguard Worker         audio_devices_t getDeviceType() const { return mDeviceType; }
getDeviceAddress()193*ec779b8eSAndroid Build Coastguard Worker         std::string getDeviceAddress() const { return mDeviceAddress; }
194*ec779b8eSAndroid Build Coastguard Worker         const std::unique_ptr<EffectDescVector> mEffectDescriptors;
195*ec779b8eSAndroid Build Coastguard Worker 
196*ec779b8eSAndroid Build Coastguard Worker     private:
197*ec779b8eSAndroid Build Coastguard Worker         const audio_devices_t mDeviceType;
198*ec779b8eSAndroid Build Coastguard Worker         const std::string mDeviceAddress;
199*ec779b8eSAndroid Build Coastguard Worker 
200*ec779b8eSAndroid Build Coastguard Worker     };
201*ec779b8eSAndroid Build Coastguard Worker 
202*ec779b8eSAndroid Build Coastguard Worker     status_t loadAudioEffectConfig_ll(const sp<EffectsFactoryHalInterface>& effectsFactoryHal)
203*ec779b8eSAndroid Build Coastguard Worker             REQUIRES(mMutex, mDeviceEffectsMutex);
204*ec779b8eSAndroid Build Coastguard Worker 
205*ec779b8eSAndroid Build Coastguard Worker     // Legacy: Begin methods below.
206*ec779b8eSAndroid Build Coastguard Worker     // Parse audio_effects.conf - called from constructor.
207*ec779b8eSAndroid Build Coastguard Worker     status_t loadAudioEffectConfigLegacy_l(const char* path) REQUIRES(mMutex);
208*ec779b8eSAndroid Build Coastguard Worker 
209*ec779b8eSAndroid Build Coastguard Worker     // Legacy: Load all automatic effect configurations
210*ec779b8eSAndroid Build Coastguard Worker     status_t loadInputEffectConfigurations_l(cnode* root,
211*ec779b8eSAndroid Build Coastguard Worker             const EffectDescVector& effects) REQUIRES(mMutex);
212*ec779b8eSAndroid Build Coastguard Worker     status_t loadStreamEffectConfigurations_l(cnode* root,
213*ec779b8eSAndroid Build Coastguard Worker             const EffectDescVector& effects) REQUIRES(mMutex);
214*ec779b8eSAndroid Build Coastguard Worker 
215*ec779b8eSAndroid Build Coastguard Worker     // Legacy: static methods below.
216*ec779b8eSAndroid Build Coastguard Worker 
217*ec779b8eSAndroid Build Coastguard Worker     static audio_source_t inputSourceNameToEnum(const char *name);
218*ec779b8eSAndroid Build Coastguard Worker 
219*ec779b8eSAndroid Build Coastguard Worker     static audio_stream_type_t streamNameToEnum(const char* name);
220*ec779b8eSAndroid Build Coastguard Worker 
221*ec779b8eSAndroid Build Coastguard Worker     // Load all effects descriptors in configuration file
222*ec779b8eSAndroid Build Coastguard Worker     static EffectDescVector loadEffects(cnode* root);
223*ec779b8eSAndroid Build Coastguard Worker     static std::shared_ptr<AudioPolicyEffects::EffectDesc> loadEffect(cnode* root);
224*ec779b8eSAndroid Build Coastguard Worker     static std::shared_ptr<EffectDescVector> loadEffectConfig(cnode* root,
225*ec779b8eSAndroid Build Coastguard Worker             const EffectDescVector& effects);
226*ec779b8eSAndroid Build Coastguard Worker 
227*ec779b8eSAndroid Build Coastguard Worker     // Load all automatic effect parameters
228*ec779b8eSAndroid Build Coastguard Worker     static void loadEffectParameters(
229*ec779b8eSAndroid Build Coastguard Worker             cnode* root, std::vector<std::shared_ptr<const effect_param_t>>& params);
230*ec779b8eSAndroid Build Coastguard Worker 
231*ec779b8eSAndroid Build Coastguard Worker     // loadEffectParameter returns a shared_ptr instead of a unique_ptr as there may
232*ec779b8eSAndroid Build Coastguard Worker     // be multiple references to the same effect parameter.
233*ec779b8eSAndroid Build Coastguard Worker     static std::shared_ptr<const effect_param_t> loadEffectParameter(cnode* root);
234*ec779b8eSAndroid Build Coastguard Worker     static size_t readParamValue(cnode* node,
235*ec779b8eSAndroid Build Coastguard Worker                           char **param,
236*ec779b8eSAndroid Build Coastguard Worker                           size_t *curSize,
237*ec779b8eSAndroid Build Coastguard Worker                           size_t *totSize);
238*ec779b8eSAndroid Build Coastguard Worker     static size_t growParamSize(char** param,
239*ec779b8eSAndroid Build Coastguard Worker                          size_t size,
240*ec779b8eSAndroid Build Coastguard Worker                          size_t *curSize,
241*ec779b8eSAndroid Build Coastguard Worker                          size_t *totSize);
242*ec779b8eSAndroid Build Coastguard Worker 
243*ec779b8eSAndroid Build Coastguard Worker     // Legacy: End methods above.
244*ec779b8eSAndroid Build Coastguard Worker 
245*ec779b8eSAndroid Build Coastguard Worker     // Note: The association of Effects to audio source, session, or stream
246*ec779b8eSAndroid Build Coastguard Worker     // is done through std::map instead of std::unordered_map.  This gives
247*ec779b8eSAndroid Build Coastguard Worker     // better reproducibility of issues, since map is ordered and more predictable
248*ec779b8eSAndroid Build Coastguard Worker     // in enumeration.
249*ec779b8eSAndroid Build Coastguard Worker 
250*ec779b8eSAndroid Build Coastguard Worker     // protects access to mInputSources, mInputSessions, mOutputStreams, mOutputSessions
251*ec779b8eSAndroid Build Coastguard Worker     // never hold AudioPolicyService::mMutex when calling AudioPolicyEffects methods as
252*ec779b8eSAndroid Build Coastguard Worker     // those can call back into AudioPolicyService methods and try to acquire the mutex
253*ec779b8eSAndroid Build Coastguard Worker     mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioPolicyEffects_Mutex};
254*ec779b8eSAndroid Build Coastguard Worker     // Automatic input effects are configured per audio_source_t
255*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_source_t, std::shared_ptr<EffectDescVector>> mInputSources
256*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mMutex);
257*ec779b8eSAndroid Build Coastguard Worker     // Automatic input effects are unique for an audio_session_t.
258*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_session_t, std::shared_ptr<EffectVector>> mInputSessions
259*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mMutex);
260*ec779b8eSAndroid Build Coastguard Worker 
261*ec779b8eSAndroid Build Coastguard Worker     // Automatic output effects are organized per audio_stream_type_t
262*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_stream_type_t, std::shared_ptr<EffectDescVector>> mOutputStreams
263*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mMutex);
264*ec779b8eSAndroid Build Coastguard Worker     // Automatic output effects are unique for an audio_session_t.
265*ec779b8eSAndroid Build Coastguard Worker     std::map<audio_session_t, std::shared_ptr<EffectVector>> mOutputSessions
266*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mMutex);
267*ec779b8eSAndroid Build Coastguard Worker 
268*ec779b8eSAndroid Build Coastguard Worker     /**
269*ec779b8eSAndroid Build Coastguard Worker      * @brief mDeviceEffects map of device effects indexed by the device address
270*ec779b8eSAndroid Build Coastguard Worker      */
271*ec779b8eSAndroid Build Coastguard Worker 
272*ec779b8eSAndroid Build Coastguard Worker     // mDeviceEffects is never accessed through AudioPolicyEffects methods.
273*ec779b8eSAndroid Build Coastguard Worker     // We keep a separate mutex here to catch future methods attempting to access this variable.
274*ec779b8eSAndroid Build Coastguard Worker     std::mutex mDeviceEffectsMutex;
275*ec779b8eSAndroid Build Coastguard Worker     std::map<std::string, std::unique_ptr<DeviceEffects>> mDeviceEffects
276*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mDeviceEffectsMutex);
277*ec779b8eSAndroid Build Coastguard Worker };
278*ec779b8eSAndroid Build Coastguard Worker 
279*ec779b8eSAndroid Build Coastguard Worker } // namespace android
280