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