1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2009 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 #ifndef ANDROID_AUDIOPOLICYSERVICE_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_AUDIOPOLICYSERVICE_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <android/media/BnAudioPolicyService.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <android/media/GetSpatializerResponse.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/mutex.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <com/android/media/permission/INativePermissionController.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <cutils/misc.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <cutils/config_utils.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <cutils/compiler.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h> 30*ec779b8eSAndroid Build Coastguard Worker #include <utils/SortedVector.h> 31*ec779b8eSAndroid Build Coastguard Worker #include <binder/ActivityManager.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <binder/BinderService.h> 33*ec779b8eSAndroid Build Coastguard Worker #include <binder/IUidObserver.h> 34*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h> 35*ec779b8eSAndroid Build Coastguard Worker #include <system/audio_policy.h> 36*ec779b8eSAndroid Build Coastguard Worker #include <media/ToneGenerator.h> 37*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioEffect.h> 38*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioPolicy.h> 39*ec779b8eSAndroid Build Coastguard Worker #include <media/IAudioPolicyServiceLocal.h> 40*ec779b8eSAndroid Build Coastguard Worker #include <media/NativePermissionController.h> 41*ec779b8eSAndroid Build Coastguard Worker #include <media/UsecaseValidator.h> 42*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ServiceUtilities.h> 43*ec779b8eSAndroid Build Coastguard Worker #include "AudioPolicyEffects.h" 44*ec779b8eSAndroid Build Coastguard Worker #include "CaptureStateNotifier.h" 45*ec779b8eSAndroid Build Coastguard Worker #include "Spatializer.h" 46*ec779b8eSAndroid Build Coastguard Worker #include <AudioPolicyInterface.h> 47*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/BnSensorPrivacyListener.h> 48*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h> 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker #include <numeric> 51*ec779b8eSAndroid Build Coastguard Worker #include <unordered_map> 52*ec779b8eSAndroid Build Coastguard Worker 53*ec779b8eSAndroid Build Coastguard Worker namespace android { 54*ec779b8eSAndroid Build Coastguard Worker 55*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState; 56*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfig; 57*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfigBase; 58*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDevice; 59*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceDescription; 60*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFormatDescription; 61*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMMapPolicyInfo; 62*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMMapPolicyType; 63*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMode; 64*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioSource; 65*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioStreamType; 66*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUsage; 67*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUuid; 68*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::Int; 69*ec779b8eSAndroid Build Coastguard Worker 70*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 71*ec779b8eSAndroid Build Coastguard Worker 72*ec779b8eSAndroid Build Coastguard Worker namespace media::audiopolicy { 73*ec779b8eSAndroid Build Coastguard Worker class AudioRecordClient; 74*ec779b8eSAndroid Build Coastguard Worker } 75*ec779b8eSAndroid Build Coastguard Worker 76*ec779b8eSAndroid Build Coastguard Worker using ::android::media::audiopolicy::AudioRecordClient; 77*ec779b8eSAndroid Build Coastguard Worker using ::com::android::media::permission::INativePermissionController; 78*ec779b8eSAndroid Build Coastguard Worker using ::com::android::media::permission::NativePermissionController; 79*ec779b8eSAndroid Build Coastguard Worker using ::com::android::media::permission::IPermissionProvider; 80*ec779b8eSAndroid Build Coastguard Worker 81*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyService : 82*ec779b8eSAndroid Build Coastguard Worker public BinderService<AudioPolicyService>, 83*ec779b8eSAndroid Build Coastguard Worker public media::BnAudioPolicyService, 84*ec779b8eSAndroid Build Coastguard Worker public IBinder::DeathRecipient, 85*ec779b8eSAndroid Build Coastguard Worker public SpatializerPolicyCallback, 86*ec779b8eSAndroid Build Coastguard Worker public media::IAudioPolicyServiceLocal 87*ec779b8eSAndroid Build Coastguard Worker { 88*ec779b8eSAndroid Build Coastguard Worker friend class sp<AudioPolicyService>; 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker public: 91*ec779b8eSAndroid Build Coastguard Worker // for BinderService getServiceName()92*ec779b8eSAndroid Build Coastguard Worker static const char *getServiceName() ANDROID_API { return "media.audio_policy"; } 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker virtual status_t dump(int fd, const Vector<String16>& args); 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker // 97*ec779b8eSAndroid Build Coastguard Worker // BnAudioPolicyService (see AudioPolicyInterface for method descriptions) 98*ec779b8eSAndroid Build Coastguard Worker // 99*ec779b8eSAndroid Build Coastguard Worker binder::Status onNewAudioModulesAvailable() override; 100*ec779b8eSAndroid Build Coastguard Worker binder::Status setDeviceConnectionState( 101*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyDeviceState state, 102*ec779b8eSAndroid Build Coastguard Worker const android::media::audio::common::AudioPort& port, 103*ec779b8eSAndroid Build Coastguard Worker const AudioFormatDescription& encodedFormat) override; 104*ec779b8eSAndroid Build Coastguard Worker binder::Status getDeviceConnectionState(const AudioDevice& device, 105*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyDeviceState* _aidl_return) override; 106*ec779b8eSAndroid Build Coastguard Worker binder::Status handleDeviceConfigChange( 107*ec779b8eSAndroid Build Coastguard Worker const AudioDevice& device, 108*ec779b8eSAndroid Build Coastguard Worker const std::string& deviceName, 109*ec779b8eSAndroid Build Coastguard Worker const AudioFormatDescription& encodedFormat) override; 110*ec779b8eSAndroid Build Coastguard Worker binder::Status setPhoneState(AudioMode state, int32_t uid) override; 111*ec779b8eSAndroid Build Coastguard Worker binder::Status setForceUse(media::AudioPolicyForceUse usage, 112*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyForcedConfig config) override; 113*ec779b8eSAndroid Build Coastguard Worker binder::Status getForceUse(media::AudioPolicyForceUse usage, 114*ec779b8eSAndroid Build Coastguard Worker media::AudioPolicyForcedConfig* _aidl_return) override; 115*ec779b8eSAndroid Build Coastguard Worker binder::Status getOutput(AudioStreamType stream, int32_t* _aidl_return) override; 116*ec779b8eSAndroid Build Coastguard Worker binder::Status getOutputForAttr(const media::audio::common::AudioAttributes& attr, 117*ec779b8eSAndroid Build Coastguard Worker int32_t session, 118*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState &attributionSource, 119*ec779b8eSAndroid Build Coastguard Worker const AudioConfig& config, 120*ec779b8eSAndroid Build Coastguard Worker int32_t flags, const std::vector<int32_t>& selectedDeviceIds, 121*ec779b8eSAndroid Build Coastguard Worker media::GetOutputForAttrResponse* _aidl_return) override; 122*ec779b8eSAndroid Build Coastguard Worker binder::Status startOutput(int32_t portId) override; 123*ec779b8eSAndroid Build Coastguard Worker binder::Status stopOutput(int32_t portId) override; 124*ec779b8eSAndroid Build Coastguard Worker binder::Status releaseOutput(int32_t portId) override; 125*ec779b8eSAndroid Build Coastguard Worker binder::Status getInputForAttr(const media::audio::common::AudioAttributes& attr, int32_t input, 126*ec779b8eSAndroid Build Coastguard Worker int32_t riid, int32_t session, 127*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState &attributionSource, 128*ec779b8eSAndroid Build Coastguard Worker const AudioConfigBase& config, int32_t flags, 129*ec779b8eSAndroid Build Coastguard Worker int32_t selectedDeviceId, 130*ec779b8eSAndroid Build Coastguard Worker media::GetInputForAttrResponse* _aidl_return) override; 131*ec779b8eSAndroid Build Coastguard Worker binder::Status startInput(int32_t portId) override; 132*ec779b8eSAndroid Build Coastguard Worker binder::Status stopInput(int32_t portId) override; 133*ec779b8eSAndroid Build Coastguard Worker binder::Status releaseInput(int32_t portId) override; 134*ec779b8eSAndroid Build Coastguard Worker binder::Status setDeviceAbsoluteVolumeEnabled(const AudioDevice& device, 135*ec779b8eSAndroid Build Coastguard Worker bool enabled, 136*ec779b8eSAndroid Build Coastguard Worker AudioStreamType streamToDriveAbs) override; 137*ec779b8eSAndroid Build Coastguard Worker binder::Status initStreamVolume(AudioStreamType stream, int32_t indexMin, 138*ec779b8eSAndroid Build Coastguard Worker int32_t indexMax) override; 139*ec779b8eSAndroid Build Coastguard Worker binder::Status setStreamVolumeIndex(AudioStreamType stream, 140*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceDescription& device, 141*ec779b8eSAndroid Build Coastguard Worker int32_t index, bool muted) override; 142*ec779b8eSAndroid Build Coastguard Worker binder::Status getStreamVolumeIndex(AudioStreamType stream, 143*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceDescription& device, 144*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 145*ec779b8eSAndroid Build Coastguard Worker binder::Status setVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr, 146*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceDescription& device, 147*ec779b8eSAndroid Build Coastguard Worker int32_t index, bool muted) override; 148*ec779b8eSAndroid Build Coastguard Worker binder::Status getVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr, 149*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceDescription& device, 150*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 151*ec779b8eSAndroid Build Coastguard Worker binder::Status getMaxVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr, 152*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 153*ec779b8eSAndroid Build Coastguard Worker binder::Status getMinVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr, 154*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 155*ec779b8eSAndroid Build Coastguard Worker binder::Status getStrategyForStream(AudioStreamType stream, 156*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 157*ec779b8eSAndroid Build Coastguard Worker binder::Status getDevicesForAttributes(const media::audio::common::AudioAttributes& attr, 158*ec779b8eSAndroid Build Coastguard Worker bool forVolume, 159*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice>* _aidl_return) override; 160*ec779b8eSAndroid Build Coastguard Worker binder::Status getOutputForEffect(const media::EffectDescriptor& desc, 161*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 162*ec779b8eSAndroid Build Coastguard Worker binder::Status registerEffect(const media::EffectDescriptor& desc, int32_t io, int32_t strategy, 163*ec779b8eSAndroid Build Coastguard Worker int32_t session, int32_t id) override; 164*ec779b8eSAndroid Build Coastguard Worker binder::Status unregisterEffect(int32_t id) override; 165*ec779b8eSAndroid Build Coastguard Worker binder::Status setEffectEnabled(int32_t id, bool enabled) override; 166*ec779b8eSAndroid Build Coastguard Worker binder::Status moveEffectsToIo(const std::vector<int32_t>& ids, int32_t io) override; 167*ec779b8eSAndroid Build Coastguard Worker binder::Status isStreamActive(AudioStreamType stream, int32_t inPastMs, 168*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 169*ec779b8eSAndroid Build Coastguard Worker binder::Status isStreamActiveRemotely(AudioStreamType stream, int32_t inPastMs, 170*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 171*ec779b8eSAndroid Build Coastguard Worker binder::Status isSourceActive(AudioSource source, bool* _aidl_return) override; 172*ec779b8eSAndroid Build Coastguard Worker binder::Status queryDefaultPreProcessing( 173*ec779b8eSAndroid Build Coastguard Worker int32_t audioSession, Int* count, 174*ec779b8eSAndroid Build Coastguard Worker std::vector<media::EffectDescriptor>* _aidl_return) override; 175*ec779b8eSAndroid Build Coastguard Worker binder::Status addSourceDefaultEffect(const AudioUuid& type, 176*ec779b8eSAndroid Build Coastguard Worker const std::string& opPackageName, 177*ec779b8eSAndroid Build Coastguard Worker const AudioUuid& uuid, int32_t priority, 178*ec779b8eSAndroid Build Coastguard Worker AudioSource source, 179*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 180*ec779b8eSAndroid Build Coastguard Worker binder::Status addStreamDefaultEffect(const AudioUuid& type, 181*ec779b8eSAndroid Build Coastguard Worker const std::string& opPackageName, 182*ec779b8eSAndroid Build Coastguard Worker const AudioUuid& uuid, int32_t priority, 183*ec779b8eSAndroid Build Coastguard Worker AudioUsage usage, int32_t* _aidl_return) override; 184*ec779b8eSAndroid Build Coastguard Worker binder::Status removeSourceDefaultEffect(int32_t id) override; 185*ec779b8eSAndroid Build Coastguard Worker binder::Status removeStreamDefaultEffect(int32_t id) override; 186*ec779b8eSAndroid Build Coastguard Worker binder::Status setSupportedSystemUsages( 187*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioUsage>& systemUsages) override; 188*ec779b8eSAndroid Build Coastguard Worker binder::Status setAllowedCapturePolicy(int32_t uid, int32_t capturePolicy) override; 189*ec779b8eSAndroid Build Coastguard Worker binder::Status getOffloadSupport(const media::audio::common::AudioOffloadInfo& info, 190*ec779b8eSAndroid Build Coastguard Worker media::AudioOffloadMode* _aidl_return) override; 191*ec779b8eSAndroid Build Coastguard Worker binder::Status isDirectOutputSupported(const AudioConfigBase& config, 192*ec779b8eSAndroid Build Coastguard Worker const media::audio::common::AudioAttributes& attributes, 193*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 194*ec779b8eSAndroid Build Coastguard Worker binder::Status listAudioPorts(media::AudioPortRole role, media::AudioPortType type, 195*ec779b8eSAndroid Build Coastguard Worker Int* count, std::vector<media::AudioPortFw>* ports, 196*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 197*ec779b8eSAndroid Build Coastguard Worker binder::Status listDeclaredDevicePorts(media::AudioPortRole role, 198*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioPortFw>* _aidl_return) override; 199*ec779b8eSAndroid Build Coastguard Worker binder::Status getAudioPort(int portId, 200*ec779b8eSAndroid Build Coastguard Worker media::AudioPortFw* _aidl_return) override; 201*ec779b8eSAndroid Build Coastguard Worker binder::Status createAudioPatch(const media::AudioPatchFw& patch, int32_t handle, 202*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 203*ec779b8eSAndroid Build Coastguard Worker binder::Status releaseAudioPatch(int32_t handle) override; 204*ec779b8eSAndroid Build Coastguard Worker binder::Status listAudioPatches(Int* count, std::vector<media::AudioPatchFw>* patches, 205*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 206*ec779b8eSAndroid Build Coastguard Worker binder::Status setAudioPortConfig(const media::AudioPortConfigFw& config) override; 207*ec779b8eSAndroid Build Coastguard Worker binder::Status registerClient(const sp<media::IAudioPolicyServiceClient>& client) override; 208*ec779b8eSAndroid Build Coastguard Worker binder::Status setAudioPortCallbacksEnabled(bool enabled) override; 209*ec779b8eSAndroid Build Coastguard Worker binder::Status setAudioVolumeGroupCallbacksEnabled(bool enabled) override; 210*ec779b8eSAndroid Build Coastguard Worker binder::Status acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return) override; 211*ec779b8eSAndroid Build Coastguard Worker binder::Status releaseSoundTriggerSession(int32_t session) override; 212*ec779b8eSAndroid Build Coastguard Worker binder::Status getPhoneState(AudioMode* _aidl_return) override; 213*ec779b8eSAndroid Build Coastguard Worker binder::Status registerPolicyMixes(const std::vector<media::AudioMix>& mixes, 214*ec779b8eSAndroid Build Coastguard Worker bool registration) override; 215*ec779b8eSAndroid Build Coastguard Worker binder::Status updatePolicyMixes( 216*ec779b8eSAndroid Build Coastguard Worker const ::std::vector<::android::media::AudioMixUpdate>& updates) override; 217*ec779b8eSAndroid Build Coastguard Worker binder::Status setUidDeviceAffinities(int32_t uid, 218*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 219*ec779b8eSAndroid Build Coastguard Worker binder::Status removeUidDeviceAffinities(int32_t uid) override; 220*ec779b8eSAndroid Build Coastguard Worker binder::Status setUserIdDeviceAffinities( 221*ec779b8eSAndroid Build Coastguard Worker int32_t userId, 222*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 223*ec779b8eSAndroid Build Coastguard Worker binder::Status removeUserIdDeviceAffinities(int32_t userId) override; 224*ec779b8eSAndroid Build Coastguard Worker binder::Status startAudioSource(const media::AudioPortConfigFw& source, 225*ec779b8eSAndroid Build Coastguard Worker const media::audio::common::AudioAttributes& attributes, 226*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 227*ec779b8eSAndroid Build Coastguard Worker binder::Status stopAudioSource(int32_t portId) override; 228*ec779b8eSAndroid Build Coastguard Worker binder::Status setMasterMono(bool mono) override; 229*ec779b8eSAndroid Build Coastguard Worker binder::Status getMasterMono(bool* _aidl_return) override; 230*ec779b8eSAndroid Build Coastguard Worker binder::Status getStreamVolumeDB(AudioStreamType stream, int32_t index, 231*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceDescription& device, 232*ec779b8eSAndroid Build Coastguard Worker float* _aidl_return) override; 233*ec779b8eSAndroid Build Coastguard Worker binder::Status getSurroundFormats(Int* count, 234*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioFormatDescription>* formats, 235*ec779b8eSAndroid Build Coastguard Worker std::vector<bool>* formatsEnabled) override; 236*ec779b8eSAndroid Build Coastguard Worker binder::Status getReportedSurroundFormats( 237*ec779b8eSAndroid Build Coastguard Worker Int* count, std::vector<AudioFormatDescription>* formats) override; 238*ec779b8eSAndroid Build Coastguard Worker binder::Status getHwOffloadFormatsSupportedForBluetoothMedia( 239*ec779b8eSAndroid Build Coastguard Worker const AudioDeviceDescription& device, 240*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioFormatDescription>* _aidl_return) override; 241*ec779b8eSAndroid Build Coastguard Worker binder::Status setSurroundFormatEnabled(const AudioFormatDescription& audioFormat, 242*ec779b8eSAndroid Build Coastguard Worker bool enabled) override; 243*ec779b8eSAndroid Build Coastguard Worker binder::Status setAssistantServicesUids(const std::vector<int32_t>& uids) override; 244*ec779b8eSAndroid Build Coastguard Worker binder::Status setActiveAssistantServicesUids(const std::vector<int32_t>& activeUids) override; 245*ec779b8eSAndroid Build Coastguard Worker binder::Status setA11yServicesUids(const std::vector<int32_t>& uids) override; 246*ec779b8eSAndroid Build Coastguard Worker binder::Status setCurrentImeUid(int32_t uid) override; 247*ec779b8eSAndroid Build Coastguard Worker binder::Status isHapticPlaybackSupported(bool* _aidl_return) override; 248*ec779b8eSAndroid Build Coastguard Worker binder::Status isUltrasoundSupported(bool* _aidl_return) override; 249*ec779b8eSAndroid Build Coastguard Worker binder::Status isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return) override; 250*ec779b8eSAndroid Build Coastguard Worker binder::Status listAudioProductStrategies( 251*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioProductStrategy>* _aidl_return) override; 252*ec779b8eSAndroid Build Coastguard Worker binder::Status getProductStrategyFromAudioAttributes( 253*ec779b8eSAndroid Build Coastguard Worker const media::audio::common::AudioAttributes& aa, 254*ec779b8eSAndroid Build Coastguard Worker bool fallbackOnDefault, 255*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 256*ec779b8eSAndroid Build Coastguard Worker binder::Status listAudioVolumeGroups( 257*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioVolumeGroup>* _aidl_return) override; 258*ec779b8eSAndroid Build Coastguard Worker binder::Status getVolumeGroupFromAudioAttributes( 259*ec779b8eSAndroid Build Coastguard Worker const media::audio::common::AudioAttributes& aa, 260*ec779b8eSAndroid Build Coastguard Worker bool fallbackOnDefault, 261*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) override; 262*ec779b8eSAndroid Build Coastguard Worker binder::Status setRttEnabled(bool enabled) override; 263*ec779b8eSAndroid Build Coastguard Worker binder::Status isCallScreenModeSupported(bool* _aidl_return) override; 264*ec779b8eSAndroid Build Coastguard Worker binder::Status setDevicesRoleForStrategy( 265*ec779b8eSAndroid Build Coastguard Worker int32_t strategy, media::DeviceRole role, 266*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 267*ec779b8eSAndroid Build Coastguard Worker binder::Status removeDevicesRoleForStrategy( 268*ec779b8eSAndroid Build Coastguard Worker int32_t strategy, media::DeviceRole role, 269*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 270*ec779b8eSAndroid Build Coastguard Worker binder::Status clearDevicesRoleForStrategy( 271*ec779b8eSAndroid Build Coastguard Worker int32_t strategy, 272*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole role) override; 273*ec779b8eSAndroid Build Coastguard Worker binder::Status getDevicesForRoleAndStrategy( 274*ec779b8eSAndroid Build Coastguard Worker int32_t strategy, media::DeviceRole role, 275*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice>* _aidl_return) override; 276*ec779b8eSAndroid Build Coastguard Worker binder::Status setDevicesRoleForCapturePreset( 277*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSource, 278*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole role, 279*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 280*ec779b8eSAndroid Build Coastguard Worker binder::Status addDevicesRoleForCapturePreset( 281*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSource, 282*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole role, 283*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 284*ec779b8eSAndroid Build Coastguard Worker binder::Status removeDevicesRoleForCapturePreset( 285*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSource, 286*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole role, 287*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices) override; 288*ec779b8eSAndroid Build Coastguard Worker binder::Status clearDevicesRoleForCapturePreset(AudioSource audioSource, 289*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole role) override; 290*ec779b8eSAndroid Build Coastguard Worker binder::Status getDevicesForRoleAndCapturePreset( 291*ec779b8eSAndroid Build Coastguard Worker AudioSource audioSource, 292*ec779b8eSAndroid Build Coastguard Worker media::DeviceRole role, 293*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioDevice>* _aidl_return) override; 294*ec779b8eSAndroid Build Coastguard Worker binder::Status registerSoundTriggerCaptureStateListener( 295*ec779b8eSAndroid Build Coastguard Worker const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) override; 296*ec779b8eSAndroid Build Coastguard Worker 297*ec779b8eSAndroid Build Coastguard Worker binder::Status getSpatializer(const sp<media::INativeSpatializerCallback>& callback, 298*ec779b8eSAndroid Build Coastguard Worker media::GetSpatializerResponse* _aidl_return) override; 299*ec779b8eSAndroid Build Coastguard Worker binder::Status canBeSpatialized( 300*ec779b8eSAndroid Build Coastguard Worker const std::optional<media::audio::common::AudioAttributes>& attr, 301*ec779b8eSAndroid Build Coastguard Worker const std::optional<AudioConfig>& config, 302*ec779b8eSAndroid Build Coastguard Worker const std::vector<AudioDevice>& devices, 303*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 304*ec779b8eSAndroid Build Coastguard Worker 305*ec779b8eSAndroid Build Coastguard Worker binder::Status getDirectPlaybackSupport(const media::audio::common::AudioAttributes& attr, 306*ec779b8eSAndroid Build Coastguard Worker const AudioConfig& config, 307*ec779b8eSAndroid Build Coastguard Worker media::AudioDirectMode* _aidl_return) override; 308*ec779b8eSAndroid Build Coastguard Worker 309*ec779b8eSAndroid Build Coastguard Worker binder::Status getDirectProfilesForAttributes(const media::audio::common::AudioAttributes& attr, 310*ec779b8eSAndroid Build Coastguard Worker std::vector<media::audio::common::AudioProfile>* _aidl_return) override; 311*ec779b8eSAndroid Build Coastguard Worker 312*ec779b8eSAndroid Build Coastguard Worker binder::Status getSupportedMixerAttributes( 313*ec779b8eSAndroid Build Coastguard Worker int32_t portId, 314*ec779b8eSAndroid Build Coastguard Worker std::vector<media::AudioMixerAttributesInternal>* _aidl_return) override; 315*ec779b8eSAndroid Build Coastguard Worker binder::Status setPreferredMixerAttributes( 316*ec779b8eSAndroid Build Coastguard Worker const media::audio::common::AudioAttributes& attr, 317*ec779b8eSAndroid Build Coastguard Worker int32_t portId, 318*ec779b8eSAndroid Build Coastguard Worker int32_t uid, 319*ec779b8eSAndroid Build Coastguard Worker const media::AudioMixerAttributesInternal& mixerAttr) override; 320*ec779b8eSAndroid Build Coastguard Worker binder::Status getPreferredMixerAttributes( 321*ec779b8eSAndroid Build Coastguard Worker const media::audio::common::AudioAttributes& attr, 322*ec779b8eSAndroid Build Coastguard Worker int32_t portId, 323*ec779b8eSAndroid Build Coastguard Worker std::optional<media::AudioMixerAttributesInternal>* _aidl_return) override; 324*ec779b8eSAndroid Build Coastguard Worker binder::Status clearPreferredMixerAttributes(const media::audio::common::AudioAttributes& attr, 325*ec779b8eSAndroid Build Coastguard Worker int32_t portId, 326*ec779b8eSAndroid Build Coastguard Worker int32_t uid) override; 327*ec779b8eSAndroid Build Coastguard Worker binder::Status getRegisteredPolicyMixes( 328*ec779b8eSAndroid Build Coastguard Worker std::vector <::android::media::AudioMix>* mixes) override; 329*ec779b8eSAndroid Build Coastguard Worker 330*ec779b8eSAndroid Build Coastguard Worker // Should only be called by AudioService to push permission data down to audioserver 331*ec779b8eSAndroid Build Coastguard Worker binder::Status getPermissionController(sp<INativePermissionController>* out) override; 332*ec779b8eSAndroid Build Coastguard Worker 333*ec779b8eSAndroid Build Coastguard Worker binder::Status getMmapPolicyInfos( 334*ec779b8eSAndroid Build Coastguard Worker AudioMMapPolicyType policyType, 335*ec779b8eSAndroid Build Coastguard Worker std::vector<AudioMMapPolicyInfo>* _aidl_return) override; 336*ec779b8eSAndroid Build Coastguard Worker binder::Status getMmapPolicyForDevice( 337*ec779b8eSAndroid Build Coastguard Worker AudioMMapPolicyType policyType, 338*ec779b8eSAndroid Build Coastguard Worker AudioMMapPolicyInfo* policyInfo) override; 339*ec779b8eSAndroid Build Coastguard Worker 340*ec779b8eSAndroid Build Coastguard Worker status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override; 341*ec779b8eSAndroid Build Coastguard Worker 342*ec779b8eSAndroid Build Coastguard Worker // -- IAudioPolicyLocal methods 343*ec779b8eSAndroid Build Coastguard Worker const IPermissionProvider& getPermissionProvider() const override; 344*ec779b8eSAndroid Build Coastguard Worker 345*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient 346*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who); 347*ec779b8eSAndroid Build Coastguard Worker 348*ec779b8eSAndroid Build Coastguard Worker // RefBase 349*ec779b8eSAndroid Build Coastguard Worker virtual void onFirstRef(); 350*ec779b8eSAndroid Build Coastguard Worker 351*ec779b8eSAndroid Build Coastguard Worker // Commence initialization when AudioSystem is ready. 352*ec779b8eSAndroid Build Coastguard Worker void onAudioSystemReady(); 353*ec779b8eSAndroid Build Coastguard Worker 354*ec779b8eSAndroid Build Coastguard Worker // 355*ec779b8eSAndroid Build Coastguard Worker // Helpers for the struct audio_policy_service_ops implementation. 356*ec779b8eSAndroid Build Coastguard Worker // This is used by the audio policy manager for certain operations that 357*ec779b8eSAndroid Build Coastguard Worker // are implemented by the policy service. 358*ec779b8eSAndroid Build Coastguard Worker // 359*ec779b8eSAndroid Build Coastguard Worker virtual void setParameters(audio_io_handle_t ioHandle, 360*ec779b8eSAndroid Build Coastguard Worker const char *keyValuePairs, 361*ec779b8eSAndroid Build Coastguard Worker int delayMs); 362*ec779b8eSAndroid Build Coastguard Worker 363*ec779b8eSAndroid Build Coastguard Worker virtual status_t setStreamVolume(audio_stream_type_t stream, 364*ec779b8eSAndroid Build Coastguard Worker float volume, 365*ec779b8eSAndroid Build Coastguard Worker bool muted, 366*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, 367*ec779b8eSAndroid Build Coastguard Worker int delayMs = 0); 368*ec779b8eSAndroid Build Coastguard Worker 369*ec779b8eSAndroid Build Coastguard Worker /** 370*ec779b8eSAndroid Build Coastguard Worker * Set a volume on AudioTrack port id(s) for a particular output. 371*ec779b8eSAndroid Build Coastguard Worker * For the same user setting, a volume group (and associated given port of the 372*ec779b8eSAndroid Build Coastguard Worker * client's track) can have different volumes for each output destination device 373*ec779b8eSAndroid Build Coastguard Worker * it is attached to. 374*ec779b8eSAndroid Build Coastguard Worker * 375*ec779b8eSAndroid Build Coastguard Worker * @param ports to consider 376*ec779b8eSAndroid Build Coastguard Worker * @param volume to set 377*ec779b8eSAndroid Build Coastguard Worker * @param muted to set 378*ec779b8eSAndroid Build Coastguard Worker * @param output to consider 379*ec779b8eSAndroid Build Coastguard Worker * @param delayMs to use 380*ec779b8eSAndroid Build Coastguard Worker * @return NO_ERROR if successful 381*ec779b8eSAndroid Build Coastguard Worker */ 382*ec779b8eSAndroid Build Coastguard Worker virtual status_t setPortsVolume(const std::vector<audio_port_handle_t> &ports, float volume, 383*ec779b8eSAndroid Build Coastguard Worker bool muted, audio_io_handle_t output, int delayMs = 0); 384*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVoiceVolume(float volume, int delayMs = 0); 385*ec779b8eSAndroid Build Coastguard Worker 386*ec779b8eSAndroid Build Coastguard Worker void doOnNewAudioModulesAvailable(); 387*ec779b8eSAndroid Build Coastguard Worker status_t doStopOutput(audio_port_handle_t portId); 388*ec779b8eSAndroid Build Coastguard Worker void doReleaseOutput(audio_port_handle_t portId); 389*ec779b8eSAndroid Build Coastguard Worker 390*ec779b8eSAndroid Build Coastguard Worker status_t clientCreateAudioPatch(const struct audio_patch *patch, 391*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t *handle, 392*ec779b8eSAndroid Build Coastguard Worker int delayMs); 393*ec779b8eSAndroid Build Coastguard Worker status_t clientReleaseAudioPatch(audio_patch_handle_t handle, 394*ec779b8eSAndroid Build Coastguard Worker int delayMs); 395*ec779b8eSAndroid Build Coastguard Worker virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config, 396*ec779b8eSAndroid Build Coastguard Worker int delayMs); 397*ec779b8eSAndroid Build Coastguard Worker 398*ec779b8eSAndroid Build Coastguard Worker void removeNotificationClient(uid_t uid, pid_t pid); 399*ec779b8eSAndroid Build Coastguard Worker void onAudioPortListUpdate(); 400*ec779b8eSAndroid Build Coastguard Worker void doOnAudioPortListUpdate(); 401*ec779b8eSAndroid Build Coastguard Worker void onAudioPatchListUpdate(); 402*ec779b8eSAndroid Build Coastguard Worker void doOnAudioPatchListUpdate(); 403*ec779b8eSAndroid Build Coastguard Worker 404*ec779b8eSAndroid Build Coastguard Worker void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 405*ec779b8eSAndroid Build Coastguard Worker void doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state); 406*ec779b8eSAndroid Build Coastguard Worker void onRecordingConfigurationUpdate(int event, 407*ec779b8eSAndroid Build Coastguard Worker const record_client_info_t *clientInfo, 408*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *clientConfig, 409*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> clientEffects, 410*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *deviceConfig, 411*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> effects, 412*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t patchHandle, 413*ec779b8eSAndroid Build Coastguard Worker audio_source_t source); 414*ec779b8eSAndroid Build Coastguard Worker void doOnRecordingConfigurationUpdate(int event, 415*ec779b8eSAndroid Build Coastguard Worker const record_client_info_t *clientInfo, 416*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *clientConfig, 417*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> clientEffects, 418*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *deviceConfig, 419*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> effects, 420*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t patchHandle, 421*ec779b8eSAndroid Build Coastguard Worker audio_source_t source); 422*ec779b8eSAndroid Build Coastguard Worker 423*ec779b8eSAndroid Build Coastguard Worker void onAudioVolumeGroupChanged(volume_group_t group, int flags); 424*ec779b8eSAndroid Build Coastguard Worker void doOnAudioVolumeGroupChanged(volume_group_t group, int flags); 425*ec779b8eSAndroid Build Coastguard Worker 426*ec779b8eSAndroid Build Coastguard Worker void onRoutingUpdated(); 427*ec779b8eSAndroid Build Coastguard Worker void doOnRoutingUpdated(); 428*ec779b8eSAndroid Build Coastguard Worker 429*ec779b8eSAndroid Build Coastguard Worker void onVolumeRangeInitRequest(); 430*ec779b8eSAndroid Build Coastguard Worker void doOnVolumeRangeInitRequest(); 431*ec779b8eSAndroid Build Coastguard Worker 432*ec779b8eSAndroid Build Coastguard Worker /** 433*ec779b8eSAndroid Build Coastguard Worker * Spatializer SpatializerPolicyCallback implementation. 434*ec779b8eSAndroid Build Coastguard Worker * onCheckSpatializer() sends an event on mOutputCommandThread which executes 435*ec779b8eSAndroid Build Coastguard Worker * doOnCheckSpatializer() to check if a Spatializer output must be opened or closed 436*ec779b8eSAndroid Build Coastguard Worker * by audio policy manager and attach/detach the spatializer effect accordingly. 437*ec779b8eSAndroid Build Coastguard Worker */ 438*ec779b8eSAndroid Build Coastguard Worker void onCheckSpatializer() override; 439*ec779b8eSAndroid Build Coastguard Worker void onCheckSpatializer_l() REQUIRES(mMutex); 440*ec779b8eSAndroid Build Coastguard Worker void doOnCheckSpatializer(); 441*ec779b8eSAndroid Build Coastguard Worker 442*ec779b8eSAndroid Build Coastguard Worker void onUpdateActiveSpatializerTracks_l() REQUIRES(mMutex); 443*ec779b8eSAndroid Build Coastguard Worker void doOnUpdateActiveSpatializerTracks(); 444*ec779b8eSAndroid Build Coastguard Worker 445*ec779b8eSAndroid Build Coastguard Worker 446*ec779b8eSAndroid Build Coastguard Worker void setEffectSuspended(int effectId, 447*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 448*ec779b8eSAndroid Build Coastguard Worker bool suspended); 449*ec779b8eSAndroid Build Coastguard Worker 450*ec779b8eSAndroid Build Coastguard Worker private: 451*ec779b8eSAndroid Build Coastguard Worker AudioPolicyService() ANDROID_API; 452*ec779b8eSAndroid Build Coastguard Worker virtual ~AudioPolicyService(); 453*ec779b8eSAndroid Build Coastguard Worker 454*ec779b8eSAndroid Build Coastguard Worker status_t dumpInternals(int fd) REQUIRES(mMutex); 455*ec779b8eSAndroid Build Coastguard Worker 456*ec779b8eSAndroid Build Coastguard Worker // Handles binder shell commands 457*ec779b8eSAndroid Build Coastguard Worker virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args); 458*ec779b8eSAndroid Build Coastguard Worker 459*ec779b8eSAndroid Build Coastguard Worker 460*ec779b8eSAndroid Build Coastguard Worker // Sets whether the given UID records only silence 461*ec779b8eSAndroid Build Coastguard Worker virtual void setAppState_l(sp<AudioRecordClient> client, app_state_t state) REQUIRES(mMutex); 462*ec779b8eSAndroid Build Coastguard Worker 463*ec779b8eSAndroid Build Coastguard Worker // Overrides the UID state as if it is idle 464*ec779b8eSAndroid Build Coastguard Worker status_t handleSetUidState(Vector<String16>& args, int err); 465*ec779b8eSAndroid Build Coastguard Worker 466*ec779b8eSAndroid Build Coastguard Worker // Clears the override for the UID state 467*ec779b8eSAndroid Build Coastguard Worker status_t handleResetUidState(Vector<String16>& args, int err); 468*ec779b8eSAndroid Build Coastguard Worker 469*ec779b8eSAndroid Build Coastguard Worker // Gets the UID state 470*ec779b8eSAndroid Build Coastguard Worker status_t handleGetUidState(Vector<String16>& args, int out, int err); 471*ec779b8eSAndroid Build Coastguard Worker 472*ec779b8eSAndroid Build Coastguard Worker // Prints the shell command help 473*ec779b8eSAndroid Build Coastguard Worker status_t printHelp(int out); 474*ec779b8eSAndroid Build Coastguard Worker 475*ec779b8eSAndroid Build Coastguard Worker std::string getDeviceTypeStrForPortId(audio_port_handle_t portId); 476*ec779b8eSAndroid Build Coastguard Worker 477*ec779b8eSAndroid Build Coastguard Worker std::string getDeviceTypeStrForPortIds(DeviceIdVector portIds); 478*ec779b8eSAndroid Build Coastguard Worker 479*ec779b8eSAndroid Build Coastguard Worker status_t getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects); 480*ec779b8eSAndroid Build Coastguard Worker 481*ec779b8eSAndroid Build Coastguard Worker app_state_t apmStatFromAmState(int amState); 482*ec779b8eSAndroid Build Coastguard Worker 483*ec779b8eSAndroid Build Coastguard Worker bool isSupportedSystemUsage(audio_usage_t usage); 484*ec779b8eSAndroid Build Coastguard Worker binder::Status validateUsage(const audio_attributes_t& attr); 485*ec779b8eSAndroid Build Coastguard Worker binder::Status validateUsage(const audio_attributes_t& attr, 486*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource); 487*ec779b8eSAndroid Build Coastguard Worker 488*ec779b8eSAndroid Build Coastguard Worker void updateUidStates(); 489*ec779b8eSAndroid Build Coastguard Worker void updateUidStates_l() REQUIRES(mMutex); 490*ec779b8eSAndroid Build Coastguard Worker 491*ec779b8eSAndroid Build Coastguard Worker void silenceAllRecordings_l() REQUIRES(mMutex); 492*ec779b8eSAndroid Build Coastguard Worker 493*ec779b8eSAndroid Build Coastguard Worker static bool isVirtualSource(audio_source_t source); 494*ec779b8eSAndroid Build Coastguard Worker 495*ec779b8eSAndroid Build Coastguard Worker /** returns true if the audio source must be silenced when the corresponding app op is denied. 496*ec779b8eSAndroid Build Coastguard Worker * false if the audio source does not actually capture from the microphone while still 497*ec779b8eSAndroid Build Coastguard Worker * being mapped to app op OP_RECORD_AUDIO and not a specialized op tracked separately. 498*ec779b8eSAndroid Build Coastguard Worker * See getOpForSource(). 499*ec779b8eSAndroid Build Coastguard Worker */ 500*ec779b8eSAndroid Build Coastguard Worker static bool isAppOpSource(audio_source_t source); 501*ec779b8eSAndroid Build Coastguard Worker 502*ec779b8eSAndroid Build Coastguard Worker status_t registerOutput(audio_io_handle_t output, 503*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t& config, 504*ec779b8eSAndroid Build Coastguard Worker const audio_output_flags_t flags); 505*ec779b8eSAndroid Build Coastguard Worker status_t unregisterOutput(audio_io_handle_t output); 506*ec779b8eSAndroid Build Coastguard Worker 507*ec779b8eSAndroid Build Coastguard Worker // If recording we need to make sure the UID is allowed to do that. If the UID is idle 508*ec779b8eSAndroid Build Coastguard Worker // then it cannot record and gets buffers with zeros - silence. As soon as the UID 509*ec779b8eSAndroid Build Coastguard Worker // transitions to an active state we will start reporting buffers with data. This approach 510*ec779b8eSAndroid Build Coastguard Worker // transparently handles recording while the UID transitions between idle/active state 511*ec779b8eSAndroid Build Coastguard Worker // avoiding to get stuck in a state receiving non-empty buffers while idle or in a state 512*ec779b8eSAndroid Build Coastguard Worker // receiving empty buffers while active. 513*ec779b8eSAndroid Build Coastguard Worker class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient { 514*ec779b8eSAndroid Build Coastguard Worker public: UidPolicy(wp<AudioPolicyService> service)515*ec779b8eSAndroid Build Coastguard Worker explicit UidPolicy(wp<AudioPolicyService> service) 516*ec779b8eSAndroid Build Coastguard Worker : mService(service), mObserverRegistered(false), 517*ec779b8eSAndroid Build Coastguard Worker mCurrentImeUid(0), 518*ec779b8eSAndroid Build Coastguard Worker mRttEnabled(false) {} 519*ec779b8eSAndroid Build Coastguard Worker 520*ec779b8eSAndroid Build Coastguard Worker void registerSelf(); 521*ec779b8eSAndroid Build Coastguard Worker void unregisterSelf(); 522*ec779b8eSAndroid Build Coastguard Worker 523*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient implementation 524*ec779b8eSAndroid Build Coastguard Worker void binderDied(const wp<IBinder> &who) override; 525*ec779b8eSAndroid Build Coastguard Worker 526*ec779b8eSAndroid Build Coastguard Worker bool isUidActive(uid_t uid); 527*ec779b8eSAndroid Build Coastguard Worker int getUidState(uid_t uid); 528*ec779b8eSAndroid Build Coastguard Worker void setAssistantUids(const std::vector<uid_t>& uids); 529*ec779b8eSAndroid Build Coastguard Worker bool isAssistantUid(uid_t uid); 530*ec779b8eSAndroid Build Coastguard Worker void setActiveAssistantUids(const std::vector<uid_t>& activeUids); 531*ec779b8eSAndroid Build Coastguard Worker bool isActiveAssistantUid(uid_t uid); setA11yUids(const std::vector<uid_t> & uids)532*ec779b8eSAndroid Build Coastguard Worker void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; } 533*ec779b8eSAndroid Build Coastguard Worker bool isA11yUid(uid_t uid); 534*ec779b8eSAndroid Build Coastguard Worker bool isA11yOnTop(); setCurrentImeUid(uid_t uid)535*ec779b8eSAndroid Build Coastguard Worker void setCurrentImeUid(uid_t uid) { mCurrentImeUid = uid; } isCurrentImeUid(uid_t uid)536*ec779b8eSAndroid Build Coastguard Worker bool isCurrentImeUid(uid_t uid) { return uid == mCurrentImeUid; } setRttEnabled(bool enabled)537*ec779b8eSAndroid Build Coastguard Worker void setRttEnabled(bool enabled) { mRttEnabled = enabled; } isRttEnabled()538*ec779b8eSAndroid Build Coastguard Worker bool isRttEnabled() { return mRttEnabled; } 539*ec779b8eSAndroid Build Coastguard Worker 540*ec779b8eSAndroid Build Coastguard Worker // BnUidObserver implementation 541*ec779b8eSAndroid Build Coastguard Worker void onUidActive(uid_t uid) override; 542*ec779b8eSAndroid Build Coastguard Worker void onUidGone(uid_t uid, bool disabled) override; 543*ec779b8eSAndroid Build Coastguard Worker void onUidIdle(uid_t uid, bool disabled) override; 544*ec779b8eSAndroid Build Coastguard Worker void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq, 545*ec779b8eSAndroid Build Coastguard Worker int32_t capability) override; 546*ec779b8eSAndroid Build Coastguard Worker void onUidProcAdjChanged(uid_t uid, int32_t adj) override; 547*ec779b8eSAndroid Build Coastguard Worker 548*ec779b8eSAndroid Build Coastguard Worker 549*ec779b8eSAndroid Build Coastguard Worker void updateUid(std::unordered_map<uid_t, std::pair<bool, int>> *uids, 550*ec779b8eSAndroid Build Coastguard Worker uid_t uid, bool active, int state, bool insert); 551*ec779b8eSAndroid Build Coastguard Worker 552*ec779b8eSAndroid Build Coastguard Worker void dumpInternals(int fd); 553*ec779b8eSAndroid Build Coastguard Worker 554*ec779b8eSAndroid Build Coastguard Worker private: 555*ec779b8eSAndroid Build Coastguard Worker void notifyService(); 556*ec779b8eSAndroid Build Coastguard Worker void updateUidLocked(std::unordered_map<uid_t, std::pair<bool, int>> *uids, 557*ec779b8eSAndroid Build Coastguard Worker uid_t uid, bool active, int state, bool insert); 558*ec779b8eSAndroid Build Coastguard Worker void checkRegistered(); 559*ec779b8eSAndroid Build Coastguard Worker 560*ec779b8eSAndroid Build Coastguard Worker wp<AudioPolicyService> mService; 561*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex mMutex{audio_utils::MutexOrder::kUidPolicy_Mutex}; 562*ec779b8eSAndroid Build Coastguard Worker ActivityManager mAm; 563*ec779b8eSAndroid Build Coastguard Worker bool mObserverRegistered = false; 564*ec779b8eSAndroid Build Coastguard Worker std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids GUARDED_BY(mMutex); 565*ec779b8eSAndroid Build Coastguard Worker std::vector<uid_t> mAssistantUids; 566*ec779b8eSAndroid Build Coastguard Worker std::vector<uid_t> mActiveAssistantUids; 567*ec779b8eSAndroid Build Coastguard Worker std::vector<uid_t> mA11yUids; 568*ec779b8eSAndroid Build Coastguard Worker uid_t mCurrentImeUid = -1; 569*ec779b8eSAndroid Build Coastguard Worker bool mRttEnabled = false; 570*ec779b8eSAndroid Build Coastguard Worker }; 571*ec779b8eSAndroid Build Coastguard Worker 572*ec779b8eSAndroid Build Coastguard Worker // If sensor privacy is enabled then all apps, including those that are active, should be 573*ec779b8eSAndroid Build Coastguard Worker // prevented from recording. This is handled similar to idle UIDs, any app that attempts 574*ec779b8eSAndroid Build Coastguard Worker // to record while sensor privacy is enabled will receive buffers with zeros. As soon as 575*ec779b8eSAndroid Build Coastguard Worker // sensor privacy is disabled active apps will receive the expected data when recording. 576*ec779b8eSAndroid Build Coastguard Worker class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener { 577*ec779b8eSAndroid Build Coastguard Worker public: SensorPrivacyPolicy(wp<AudioPolicyService> service)578*ec779b8eSAndroid Build Coastguard Worker explicit SensorPrivacyPolicy(wp<AudioPolicyService> service) 579*ec779b8eSAndroid Build Coastguard Worker : mService(service) {} 580*ec779b8eSAndroid Build Coastguard Worker 581*ec779b8eSAndroid Build Coastguard Worker void registerSelf(); 582*ec779b8eSAndroid Build Coastguard Worker void unregisterSelf(); 583*ec779b8eSAndroid Build Coastguard Worker 584*ec779b8eSAndroid Build Coastguard Worker bool isSensorPrivacyEnabled(); 585*ec779b8eSAndroid Build Coastguard Worker 586*ec779b8eSAndroid Build Coastguard Worker binder::Status onSensorPrivacyChanged(int toggleType, int sensor, 587*ec779b8eSAndroid Build Coastguard Worker bool enabled); 588*ec779b8eSAndroid Build Coastguard Worker onSensorPrivacyStateChanged(int,int,int)589*ec779b8eSAndroid Build Coastguard Worker binder::Status onSensorPrivacyStateChanged(int, int, int) { 590*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok(); 591*ec779b8eSAndroid Build Coastguard Worker } 592*ec779b8eSAndroid Build Coastguard Worker 593*ec779b8eSAndroid Build Coastguard Worker private: 594*ec779b8eSAndroid Build Coastguard Worker wp<AudioPolicyService> mService; 595*ec779b8eSAndroid Build Coastguard Worker std::atomic_bool mSensorPrivacyEnabled = false; 596*ec779b8eSAndroid Build Coastguard Worker }; 597*ec779b8eSAndroid Build Coastguard Worker 598*ec779b8eSAndroid Build Coastguard Worker // Thread used to send audio config commands to audio flinger 599*ec779b8eSAndroid Build Coastguard Worker // For audio config commands, it is necessary because audio flinger requires that the calling 600*ec779b8eSAndroid Build Coastguard Worker // process (user) has permission to modify audio settings. 601*ec779b8eSAndroid Build Coastguard Worker public: 602*ec779b8eSAndroid Build Coastguard Worker class AudioCommandThread : public Thread { 603*ec779b8eSAndroid Build Coastguard Worker class AudioCommand; 604*ec779b8eSAndroid Build Coastguard Worker public: 605*ec779b8eSAndroid Build Coastguard Worker 606*ec779b8eSAndroid Build Coastguard Worker // commands for tone AudioCommand 607*ec779b8eSAndroid Build Coastguard Worker enum { 608*ec779b8eSAndroid Build Coastguard Worker SET_VOLUME, 609*ec779b8eSAndroid Build Coastguard Worker SET_PORTS_VOLUME, 610*ec779b8eSAndroid Build Coastguard Worker SET_PARAMETERS, 611*ec779b8eSAndroid Build Coastguard Worker SET_VOICE_VOLUME, 612*ec779b8eSAndroid Build Coastguard Worker STOP_OUTPUT, 613*ec779b8eSAndroid Build Coastguard Worker RELEASE_OUTPUT, 614*ec779b8eSAndroid Build Coastguard Worker CREATE_AUDIO_PATCH, 615*ec779b8eSAndroid Build Coastguard Worker RELEASE_AUDIO_PATCH, 616*ec779b8eSAndroid Build Coastguard Worker UPDATE_AUDIOPORT_LIST, 617*ec779b8eSAndroid Build Coastguard Worker UPDATE_AUDIOPATCH_LIST, 618*ec779b8eSAndroid Build Coastguard Worker CHANGED_AUDIOVOLUMEGROUP, 619*ec779b8eSAndroid Build Coastguard Worker SET_AUDIOPORT_CONFIG, 620*ec779b8eSAndroid Build Coastguard Worker DYN_POLICY_MIX_STATE_UPDATE, 621*ec779b8eSAndroid Build Coastguard Worker RECORDING_CONFIGURATION_UPDATE, 622*ec779b8eSAndroid Build Coastguard Worker SET_EFFECT_SUSPENDED, 623*ec779b8eSAndroid Build Coastguard Worker AUDIO_MODULES_UPDATE, 624*ec779b8eSAndroid Build Coastguard Worker ROUTING_UPDATED, 625*ec779b8eSAndroid Build Coastguard Worker UPDATE_UID_STATES, 626*ec779b8eSAndroid Build Coastguard Worker CHECK_SPATIALIZER_OUTPUT, // verify if spatializer effect should be created or moved 627*ec779b8eSAndroid Build Coastguard Worker UPDATE_ACTIVE_SPATIALIZER_TRACKS, // Update active track counts on spalializer output 628*ec779b8eSAndroid Build Coastguard Worker VOL_RANGE_INIT_REQUEST, // request to reset the volume range indices 629*ec779b8eSAndroid Build Coastguard Worker }; 630*ec779b8eSAndroid Build Coastguard Worker 631*ec779b8eSAndroid Build Coastguard Worker AudioCommandThread (String8 name, const wp<AudioPolicyService>& service); 632*ec779b8eSAndroid Build Coastguard Worker virtual ~AudioCommandThread(); 633*ec779b8eSAndroid Build Coastguard Worker 634*ec779b8eSAndroid Build Coastguard Worker status_t dump(int fd); 635*ec779b8eSAndroid Build Coastguard Worker 636*ec779b8eSAndroid Build Coastguard Worker // Thread virtuals 637*ec779b8eSAndroid Build Coastguard Worker virtual void onFirstRef(); 638*ec779b8eSAndroid Build Coastguard Worker virtual bool threadLoop(); 639*ec779b8eSAndroid Build Coastguard Worker 640*ec779b8eSAndroid Build Coastguard Worker void exit(); 641*ec779b8eSAndroid Build Coastguard Worker status_t volumeCommand(audio_stream_type_t stream, float volume, bool muted, 642*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, int delayMs = 0); 643*ec779b8eSAndroid Build Coastguard Worker status_t volumePortsCommand(const std::vector<audio_port_handle_t> &ports, 644*ec779b8eSAndroid Build Coastguard Worker float volume, bool muted, audio_io_handle_t output, int delayMs = 0); 645*ec779b8eSAndroid Build Coastguard Worker status_t parametersCommand(audio_io_handle_t ioHandle, 646*ec779b8eSAndroid Build Coastguard Worker const char *keyValuePairs, int delayMs = 0); 647*ec779b8eSAndroid Build Coastguard Worker status_t voiceVolumeCommand(float volume, int delayMs = 0); 648*ec779b8eSAndroid Build Coastguard Worker void stopOutputCommand(audio_port_handle_t portId); 649*ec779b8eSAndroid Build Coastguard Worker void releaseOutputCommand(audio_port_handle_t portId); 650*ec779b8eSAndroid Build Coastguard Worker status_t sendCommand(sp<AudioCommand>& command, int delayMs = 0); 651*ec779b8eSAndroid Build Coastguard Worker void insertCommand_l(sp<AudioCommand>& command, int delayMs = 0); 652*ec779b8eSAndroid Build Coastguard Worker status_t createAudioPatchCommand(const struct audio_patch *patch, 653*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t *handle, 654*ec779b8eSAndroid Build Coastguard Worker int delayMs); 655*ec779b8eSAndroid Build Coastguard Worker status_t releaseAudioPatchCommand(audio_patch_handle_t handle, 656*ec779b8eSAndroid Build Coastguard Worker int delayMs); 657*ec779b8eSAndroid Build Coastguard Worker void updateAudioPortListCommand(); 658*ec779b8eSAndroid Build Coastguard Worker void updateAudioPatchListCommand(); 659*ec779b8eSAndroid Build Coastguard Worker void changeAudioVolumeGroupCommand(volume_group_t group, int flags); 660*ec779b8eSAndroid Build Coastguard Worker status_t setAudioPortConfigCommand(const struct audio_port_config *config, 661*ec779b8eSAndroid Build Coastguard Worker int delayMs); 662*ec779b8eSAndroid Build Coastguard Worker void dynamicPolicyMixStateUpdateCommand(const String8& regId, 663*ec779b8eSAndroid Build Coastguard Worker int32_t state); 664*ec779b8eSAndroid Build Coastguard Worker void recordingConfigurationUpdateCommand( 665*ec779b8eSAndroid Build Coastguard Worker int event, 666*ec779b8eSAndroid Build Coastguard Worker const record_client_info_t *clientInfo, 667*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *clientConfig, 668*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> clientEffects, 669*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *deviceConfig, 670*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> effects, 671*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t patchHandle, 672*ec779b8eSAndroid Build Coastguard Worker audio_source_t source); 673*ec779b8eSAndroid Build Coastguard Worker void setEffectSuspendedCommand(int effectId, 674*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 675*ec779b8eSAndroid Build Coastguard Worker bool suspended); 676*ec779b8eSAndroid Build Coastguard Worker void audioModulesUpdateCommand(); 677*ec779b8eSAndroid Build Coastguard Worker void routingChangedCommand(); 678*ec779b8eSAndroid Build Coastguard Worker void updateUidStatesCommand(); 679*ec779b8eSAndroid Build Coastguard Worker void checkSpatializerCommand(); 680*ec779b8eSAndroid Build Coastguard Worker void updateActiveSpatializerTracksCommand(); 681*ec779b8eSAndroid Build Coastguard Worker void volRangeInitReqCommand(); 682*ec779b8eSAndroid Build Coastguard Worker 683*ec779b8eSAndroid Build Coastguard Worker void insertCommand_l(AudioCommand *command, int delayMs = 0); 684*ec779b8eSAndroid Build Coastguard Worker private: 685*ec779b8eSAndroid Build Coastguard Worker class AudioCommandData; 686*ec779b8eSAndroid Build Coastguard Worker 687*ec779b8eSAndroid Build Coastguard Worker // descriptor for requested tone playback event 688*ec779b8eSAndroid Build Coastguard Worker class AudioCommand: public RefBase { 689*ec779b8eSAndroid Build Coastguard Worker 690*ec779b8eSAndroid Build Coastguard Worker public: AudioCommand()691*ec779b8eSAndroid Build Coastguard Worker AudioCommand() 692*ec779b8eSAndroid Build Coastguard Worker : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {} 693*ec779b8eSAndroid Build Coastguard Worker 694*ec779b8eSAndroid Build Coastguard Worker void dump(char* buffer, size_t size); 695*ec779b8eSAndroid Build Coastguard Worker 696*ec779b8eSAndroid Build Coastguard Worker int mCommand; // SET_VOLUME, SET_PARAMETERS... 697*ec779b8eSAndroid Build Coastguard Worker nsecs_t mTime; // time stamp 698*ec779b8eSAndroid Build Coastguard Worker audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioCommand_Mutex}; 699*ec779b8eSAndroid Build Coastguard Worker audio_utils::condition_variable mCond; // condition for status return 700*ec779b8eSAndroid Build Coastguard Worker status_t mStatus; // command status 701*ec779b8eSAndroid Build Coastguard Worker bool mWaitStatus; // true if caller is waiting for status 702*ec779b8eSAndroid Build Coastguard Worker sp<AudioCommandData> mParam; // command specific parameter data 703*ec779b8eSAndroid Build Coastguard Worker }; 704*ec779b8eSAndroid Build Coastguard Worker 705*ec779b8eSAndroid Build Coastguard Worker class AudioCommandData: public RefBase { 706*ec779b8eSAndroid Build Coastguard Worker public: ~AudioCommandData()707*ec779b8eSAndroid Build Coastguard Worker virtual ~AudioCommandData() {} 708*ec779b8eSAndroid Build Coastguard Worker protected: AudioCommandData()709*ec779b8eSAndroid Build Coastguard Worker AudioCommandData() {} 710*ec779b8eSAndroid Build Coastguard Worker }; 711*ec779b8eSAndroid Build Coastguard Worker 712*ec779b8eSAndroid Build Coastguard Worker class VolumeData : public AudioCommandData { 713*ec779b8eSAndroid Build Coastguard Worker public: 714*ec779b8eSAndroid Build Coastguard Worker audio_stream_type_t mStream; 715*ec779b8eSAndroid Build Coastguard Worker float mVolume; 716*ec779b8eSAndroid Build Coastguard Worker bool mIsMuted; 717*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t mIO; 718*ec779b8eSAndroid Build Coastguard Worker }; 719*ec779b8eSAndroid Build Coastguard Worker 720*ec779b8eSAndroid Build Coastguard Worker class VolumePortsData : public AudioCommandData { 721*ec779b8eSAndroid Build Coastguard Worker public: 722*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_port_handle_t> mPorts; 723*ec779b8eSAndroid Build Coastguard Worker float mVolume; 724*ec779b8eSAndroid Build Coastguard Worker bool mMuted; 725*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t mIO; dumpPorts()726*ec779b8eSAndroid Build Coastguard Worker std::string dumpPorts() { 727*ec779b8eSAndroid Build Coastguard Worker return std::string("volume ") + std::to_string(mVolume) + std::string("muted ") + 728*ec779b8eSAndroid Build Coastguard Worker std::to_string(mMuted) + " on IO " + std::to_string(mIO) + " and ports " + 729*ec779b8eSAndroid Build Coastguard Worker std::accumulate(std::begin(mPorts), std::end(mPorts), std::string{}, 730*ec779b8eSAndroid Build Coastguard Worker [](const std::string &ls, int rs) { 731*ec779b8eSAndroid Build Coastguard Worker return ls + std::to_string(rs) + " "; 732*ec779b8eSAndroid Build Coastguard Worker }); 733*ec779b8eSAndroid Build Coastguard Worker } 734*ec779b8eSAndroid Build Coastguard Worker }; 735*ec779b8eSAndroid Build Coastguard Worker 736*ec779b8eSAndroid Build Coastguard Worker class ParametersData : public AudioCommandData { 737*ec779b8eSAndroid Build Coastguard Worker public: 738*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t mIO; 739*ec779b8eSAndroid Build Coastguard Worker String8 mKeyValuePairs; 740*ec779b8eSAndroid Build Coastguard Worker }; 741*ec779b8eSAndroid Build Coastguard Worker 742*ec779b8eSAndroid Build Coastguard Worker class VoiceVolumeData : public AudioCommandData { 743*ec779b8eSAndroid Build Coastguard Worker public: 744*ec779b8eSAndroid Build Coastguard Worker float mVolume; 745*ec779b8eSAndroid Build Coastguard Worker }; 746*ec779b8eSAndroid Build Coastguard Worker 747*ec779b8eSAndroid Build Coastguard Worker class StopOutputData : public AudioCommandData { 748*ec779b8eSAndroid Build Coastguard Worker public: 749*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t mPortId; 750*ec779b8eSAndroid Build Coastguard Worker }; 751*ec779b8eSAndroid Build Coastguard Worker 752*ec779b8eSAndroid Build Coastguard Worker class ReleaseOutputData : public AudioCommandData { 753*ec779b8eSAndroid Build Coastguard Worker public: 754*ec779b8eSAndroid Build Coastguard Worker audio_port_handle_t mPortId; 755*ec779b8eSAndroid Build Coastguard Worker }; 756*ec779b8eSAndroid Build Coastguard Worker 757*ec779b8eSAndroid Build Coastguard Worker class CreateAudioPatchData : public AudioCommandData { 758*ec779b8eSAndroid Build Coastguard Worker public: 759*ec779b8eSAndroid Build Coastguard Worker struct audio_patch mPatch; 760*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t mHandle; 761*ec779b8eSAndroid Build Coastguard Worker }; 762*ec779b8eSAndroid Build Coastguard Worker 763*ec779b8eSAndroid Build Coastguard Worker class ReleaseAudioPatchData : public AudioCommandData { 764*ec779b8eSAndroid Build Coastguard Worker public: 765*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t mHandle; 766*ec779b8eSAndroid Build Coastguard Worker }; 767*ec779b8eSAndroid Build Coastguard Worker 768*ec779b8eSAndroid Build Coastguard Worker class AudioVolumeGroupData : public AudioCommandData { 769*ec779b8eSAndroid Build Coastguard Worker public: 770*ec779b8eSAndroid Build Coastguard Worker volume_group_t mGroup; 771*ec779b8eSAndroid Build Coastguard Worker int mFlags; 772*ec779b8eSAndroid Build Coastguard Worker }; 773*ec779b8eSAndroid Build Coastguard Worker 774*ec779b8eSAndroid Build Coastguard Worker class SetAudioPortConfigData : public AudioCommandData { 775*ec779b8eSAndroid Build Coastguard Worker public: 776*ec779b8eSAndroid Build Coastguard Worker struct audio_port_config mConfig; 777*ec779b8eSAndroid Build Coastguard Worker }; 778*ec779b8eSAndroid Build Coastguard Worker 779*ec779b8eSAndroid Build Coastguard Worker class DynPolicyMixStateUpdateData : public AudioCommandData { 780*ec779b8eSAndroid Build Coastguard Worker public: 781*ec779b8eSAndroid Build Coastguard Worker String8 mRegId; 782*ec779b8eSAndroid Build Coastguard Worker int32_t mState; 783*ec779b8eSAndroid Build Coastguard Worker }; 784*ec779b8eSAndroid Build Coastguard Worker 785*ec779b8eSAndroid Build Coastguard Worker class RecordingConfigurationUpdateData : public AudioCommandData { 786*ec779b8eSAndroid Build Coastguard Worker public: 787*ec779b8eSAndroid Build Coastguard Worker int mEvent; 788*ec779b8eSAndroid Build Coastguard Worker record_client_info_t mClientInfo; 789*ec779b8eSAndroid Build Coastguard Worker struct audio_config_base mClientConfig; 790*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> mClientEffects; 791*ec779b8eSAndroid Build Coastguard Worker struct audio_config_base mDeviceConfig; 792*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> mEffects; 793*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t mPatchHandle; 794*ec779b8eSAndroid Build Coastguard Worker audio_source_t mSource; 795*ec779b8eSAndroid Build Coastguard Worker }; 796*ec779b8eSAndroid Build Coastguard Worker 797*ec779b8eSAndroid Build Coastguard Worker class SetEffectSuspendedData : public AudioCommandData { 798*ec779b8eSAndroid Build Coastguard Worker public: 799*ec779b8eSAndroid Build Coastguard Worker int mEffectId; 800*ec779b8eSAndroid Build Coastguard Worker audio_session_t mSessionId; 801*ec779b8eSAndroid Build Coastguard Worker bool mSuspended; 802*ec779b8eSAndroid Build Coastguard Worker }; 803*ec779b8eSAndroid Build Coastguard Worker 804*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kCommandThread_Mutex}; 805*ec779b8eSAndroid Build Coastguard Worker audio_utils::condition_variable mWaitWorkCV; 806*ec779b8eSAndroid Build Coastguard Worker Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands 807*ec779b8eSAndroid Build Coastguard Worker sp<AudioCommand> mLastCommand; // last processed command (used by dump) 808*ec779b8eSAndroid Build Coastguard Worker String8 mName; // string used by wake lock fo delayed commands 809*ec779b8eSAndroid Build Coastguard Worker wp<AudioPolicyService> mService; 810*ec779b8eSAndroid Build Coastguard Worker }; 811*ec779b8eSAndroid Build Coastguard Worker 812*ec779b8eSAndroid Build Coastguard Worker private: 813*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyClient : public AudioPolicyClientInterface 814*ec779b8eSAndroid Build Coastguard Worker { 815*ec779b8eSAndroid Build Coastguard Worker public: AudioPolicyClient(AudioPolicyService * service)816*ec779b8eSAndroid Build Coastguard Worker explicit AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {} ~AudioPolicyClient()817*ec779b8eSAndroid Build Coastguard Worker virtual ~AudioPolicyClient() {} 818*ec779b8eSAndroid Build Coastguard Worker 819*ec779b8eSAndroid Build Coastguard Worker virtual status_t getAudioPolicyConfig(media::AudioPolicyConfig *config); 820*ec779b8eSAndroid Build Coastguard Worker 821*ec779b8eSAndroid Build Coastguard Worker // 822*ec779b8eSAndroid Build Coastguard Worker // Audio HW module functions 823*ec779b8eSAndroid Build Coastguard Worker // 824*ec779b8eSAndroid Build Coastguard Worker 825*ec779b8eSAndroid Build Coastguard Worker // loads a HW module. 826*ec779b8eSAndroid Build Coastguard Worker virtual audio_module_handle_t loadHwModule(const char *name); 827*ec779b8eSAndroid Build Coastguard Worker 828*ec779b8eSAndroid Build Coastguard Worker // 829*ec779b8eSAndroid Build Coastguard Worker // Audio output Control functions 830*ec779b8eSAndroid Build Coastguard Worker // 831*ec779b8eSAndroid Build Coastguard Worker 832*ec779b8eSAndroid Build Coastguard Worker // opens an audio output with the requested parameters. The parameter values can indicate to use the default values 833*ec779b8eSAndroid Build Coastguard Worker // in case the audio policy manager has no specific requirements for the output being opened. 834*ec779b8eSAndroid Build Coastguard Worker // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream. 835*ec779b8eSAndroid Build Coastguard Worker // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly. 836*ec779b8eSAndroid Build Coastguard Worker virtual status_t openOutput(audio_module_handle_t module, 837*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t *output, 838*ec779b8eSAndroid Build Coastguard Worker audio_config_t *halConfig, 839*ec779b8eSAndroid Build Coastguard Worker audio_config_base_t *mixerConfig, 840*ec779b8eSAndroid Build Coastguard Worker const sp<DeviceDescriptorBase>& device, 841*ec779b8eSAndroid Build Coastguard Worker uint32_t *latencyMs, 842*ec779b8eSAndroid Build Coastguard Worker audio_output_flags_t *flags, 843*ec779b8eSAndroid Build Coastguard Worker audio_attributes_t attributes); 844*ec779b8eSAndroid Build Coastguard Worker // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by 845*ec779b8eSAndroid Build Coastguard Worker // a special mixer thread in the AudioFlinger. 846*ec779b8eSAndroid Build Coastguard Worker virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2); 847*ec779b8eSAndroid Build Coastguard Worker // closes the output stream 848*ec779b8eSAndroid Build Coastguard Worker virtual status_t closeOutput(audio_io_handle_t output); 849*ec779b8eSAndroid Build Coastguard Worker // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in 850*ec779b8eSAndroid Build Coastguard Worker // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded. 851*ec779b8eSAndroid Build Coastguard Worker virtual status_t suspendOutput(audio_io_handle_t output); 852*ec779b8eSAndroid Build Coastguard Worker // restores a suspended output. 853*ec779b8eSAndroid Build Coastguard Worker virtual status_t restoreOutput(audio_io_handle_t output); 854*ec779b8eSAndroid Build Coastguard Worker 855*ec779b8eSAndroid Build Coastguard Worker // 856*ec779b8eSAndroid Build Coastguard Worker // Audio input Control functions 857*ec779b8eSAndroid Build Coastguard Worker // 858*ec779b8eSAndroid Build Coastguard Worker 859*ec779b8eSAndroid Build Coastguard Worker // opens an audio input 860*ec779b8eSAndroid Build Coastguard Worker virtual audio_io_handle_t openInput(audio_module_handle_t module, 861*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t *input, 862*ec779b8eSAndroid Build Coastguard Worker audio_config_t *config, 863*ec779b8eSAndroid Build Coastguard Worker audio_devices_t *devices, 864*ec779b8eSAndroid Build Coastguard Worker const String8& address, 865*ec779b8eSAndroid Build Coastguard Worker audio_source_t source, 866*ec779b8eSAndroid Build Coastguard Worker audio_input_flags_t flags); 867*ec779b8eSAndroid Build Coastguard Worker // closes an audio input 868*ec779b8eSAndroid Build Coastguard Worker virtual status_t closeInput(audio_io_handle_t input); 869*ec779b8eSAndroid Build Coastguard Worker // 870*ec779b8eSAndroid Build Coastguard Worker // misc control functions 871*ec779b8eSAndroid Build Coastguard Worker // 872*ec779b8eSAndroid Build Coastguard Worker 873*ec779b8eSAndroid Build Coastguard Worker // set a stream volume for a particular output. For the same user setting, a given stream 874*ec779b8eSAndroid Build Coastguard Worker // type can have different volumes for each output (destination device) it is attached to. 875*ec779b8eSAndroid Build Coastguard Worker virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, bool muted, 876*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, int delayMs = 0); 877*ec779b8eSAndroid Build Coastguard Worker /** 878*ec779b8eSAndroid Build Coastguard Worker * Set a volume on port(s) for a particular output. For the same user setting, a volume 879*ec779b8eSAndroid Build Coastguard Worker * group (and associated given port of the client's track) can have different volumes for 880*ec779b8eSAndroid Build Coastguard Worker * each output (destination device) it is attached to. 881*ec779b8eSAndroid Build Coastguard Worker * 882*ec779b8eSAndroid Build Coastguard Worker * @param ports to consider 883*ec779b8eSAndroid Build Coastguard Worker * @param volume to set 884*ec779b8eSAndroid Build Coastguard Worker * @param muted to set 885*ec779b8eSAndroid Build Coastguard Worker * @param output to consider 886*ec779b8eSAndroid Build Coastguard Worker * @param delayMs to use 887*ec779b8eSAndroid Build Coastguard Worker * @return NO_ERROR if successful 888*ec779b8eSAndroid Build Coastguard Worker */ 889*ec779b8eSAndroid Build Coastguard Worker status_t setPortsVolume(const std::vector<audio_port_handle_t> &ports, float volume, 890*ec779b8eSAndroid Build Coastguard Worker bool muted, audio_io_handle_t output, int delayMs = 0) override; 891*ec779b8eSAndroid Build Coastguard Worker 892*ec779b8eSAndroid Build Coastguard Worker // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface. 893*ec779b8eSAndroid Build Coastguard Worker virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0); 894*ec779b8eSAndroid Build Coastguard Worker // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager. 895*ec779b8eSAndroid Build Coastguard Worker virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys); 896*ec779b8eSAndroid Build Coastguard Worker 897*ec779b8eSAndroid Build Coastguard Worker // set down link audio volume. 898*ec779b8eSAndroid Build Coastguard Worker virtual status_t setVoiceVolume(float volume, int delayMs = 0); 899*ec779b8eSAndroid Build Coastguard Worker 900*ec779b8eSAndroid Build Coastguard Worker // move effect to the specified output 901*ec779b8eSAndroid Build Coastguard Worker virtual status_t moveEffects(audio_session_t session, 902*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t srcOutput, 903*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t dstOutput); 904*ec779b8eSAndroid Build Coastguard Worker 905*ec779b8eSAndroid Build Coastguard Worker void setEffectSuspended(int effectId, 906*ec779b8eSAndroid Build Coastguard Worker audio_session_t sessionId, 907*ec779b8eSAndroid Build Coastguard Worker bool suspended) override; 908*ec779b8eSAndroid Build Coastguard Worker 909*ec779b8eSAndroid Build Coastguard Worker /* Create a patch between several source and sink ports */ 910*ec779b8eSAndroid Build Coastguard Worker virtual status_t createAudioPatch(const struct audio_patch *patch, 911*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t *handle, 912*ec779b8eSAndroid Build Coastguard Worker int delayMs); 913*ec779b8eSAndroid Build Coastguard Worker 914*ec779b8eSAndroid Build Coastguard Worker /* Release a patch */ 915*ec779b8eSAndroid Build Coastguard Worker virtual status_t releaseAudioPatch(audio_patch_handle_t handle, 916*ec779b8eSAndroid Build Coastguard Worker int delayMs); 917*ec779b8eSAndroid Build Coastguard Worker 918*ec779b8eSAndroid Build Coastguard Worker /* Set audio port configuration */ 919*ec779b8eSAndroid Build Coastguard Worker virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs); 920*ec779b8eSAndroid Build Coastguard Worker 921*ec779b8eSAndroid Build Coastguard Worker virtual void onAudioPortListUpdate(); 922*ec779b8eSAndroid Build Coastguard Worker virtual void onAudioPatchListUpdate(); 923*ec779b8eSAndroid Build Coastguard Worker virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); 924*ec779b8eSAndroid Build Coastguard Worker virtual void onRecordingConfigurationUpdate(int event, 925*ec779b8eSAndroid Build Coastguard Worker const record_client_info_t *clientInfo, 926*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *clientConfig, 927*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> clientEffects, 928*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *deviceConfig, 929*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> effects, 930*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t patchHandle, 931*ec779b8eSAndroid Build Coastguard Worker audio_source_t source); 932*ec779b8eSAndroid Build Coastguard Worker 933*ec779b8eSAndroid Build Coastguard Worker virtual void onAudioVolumeGroupChanged(volume_group_t group, int flags); 934*ec779b8eSAndroid Build Coastguard Worker 935*ec779b8eSAndroid Build Coastguard Worker virtual void onRoutingUpdated(); 936*ec779b8eSAndroid Build Coastguard Worker 937*ec779b8eSAndroid Build Coastguard Worker virtual void onVolumeRangeInitRequest(); 938*ec779b8eSAndroid Build Coastguard Worker 939*ec779b8eSAndroid Build Coastguard Worker virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use); 940*ec779b8eSAndroid Build Coastguard Worker 941*ec779b8eSAndroid Build Coastguard Worker void setSoundTriggerCaptureState(bool active) override; 942*ec779b8eSAndroid Build Coastguard Worker 943*ec779b8eSAndroid Build Coastguard Worker status_t getAudioPort(struct audio_port_v7 *port) override; 944*ec779b8eSAndroid Build Coastguard Worker 945*ec779b8eSAndroid Build Coastguard Worker status_t updateSecondaryOutputs( 946*ec779b8eSAndroid Build Coastguard Worker const TrackSecondaryOutputsMap& trackSecondaryOutputs) override; 947*ec779b8eSAndroid Build Coastguard Worker 948*ec779b8eSAndroid Build Coastguard Worker status_t setDeviceConnectedState( 949*ec779b8eSAndroid Build Coastguard Worker const struct audio_port_v7 *port, media::DeviceConnectedState state) override; 950*ec779b8eSAndroid Build Coastguard Worker 951*ec779b8eSAndroid Build Coastguard Worker status_t invalidateTracks(const std::vector<audio_port_handle_t>& portIds) override; 952*ec779b8eSAndroid Build Coastguard Worker 953*ec779b8eSAndroid Build Coastguard Worker status_t getAudioMixPort(const struct audio_port_v7 *devicePort, 954*ec779b8eSAndroid Build Coastguard Worker struct audio_port_v7 *port) override; 955*ec779b8eSAndroid Build Coastguard Worker 956*ec779b8eSAndroid Build Coastguard Worker status_t setTracksInternalMute( 957*ec779b8eSAndroid Build Coastguard Worker const std::vector<media::TrackInternalMuteInfo>& tracksInternalMute) override; 958*ec779b8eSAndroid Build Coastguard Worker 959*ec779b8eSAndroid Build Coastguard Worker status_t getMmapPolicyInfos( 960*ec779b8eSAndroid Build Coastguard Worker media::audio::common::AudioMMapPolicyType policyType, 961*ec779b8eSAndroid Build Coastguard Worker std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos) override; 962*ec779b8eSAndroid Build Coastguard Worker 963*ec779b8eSAndroid Build Coastguard Worker error::BinderResult<bool> checkPermissionForInput(const AttributionSourceState& attr, 964*ec779b8eSAndroid Build Coastguard Worker const PermissionReqs& req) override; 965*ec779b8eSAndroid Build Coastguard Worker 966*ec779b8eSAndroid Build Coastguard Worker private: 967*ec779b8eSAndroid Build Coastguard Worker AudioPolicyService *mAudioPolicyService; 968*ec779b8eSAndroid Build Coastguard Worker }; 969*ec779b8eSAndroid Build Coastguard Worker 970*ec779b8eSAndroid Build Coastguard Worker // --- Notification Client --- 971*ec779b8eSAndroid Build Coastguard Worker class NotificationClient : public IBinder::DeathRecipient { 972*ec779b8eSAndroid Build Coastguard Worker public: 973*ec779b8eSAndroid Build Coastguard Worker NotificationClient(const sp<AudioPolicyService>& service, 974*ec779b8eSAndroid Build Coastguard Worker const sp<media::IAudioPolicyServiceClient>& client, 975*ec779b8eSAndroid Build Coastguard Worker uid_t uid, pid_t pid); 976*ec779b8eSAndroid Build Coastguard Worker virtual ~NotificationClient(); 977*ec779b8eSAndroid Build Coastguard Worker 978*ec779b8eSAndroid Build Coastguard Worker void onAudioPortListUpdate(); 979*ec779b8eSAndroid Build Coastguard Worker void onAudioPatchListUpdate(); 980*ec779b8eSAndroid Build Coastguard Worker void onDynamicPolicyMixStateUpdate(const String8& regId, 981*ec779b8eSAndroid Build Coastguard Worker int32_t state); 982*ec779b8eSAndroid Build Coastguard Worker void onAudioVolumeGroupChanged(volume_group_t group, int flags); 983*ec779b8eSAndroid Build Coastguard Worker void onRecordingConfigurationUpdate( 984*ec779b8eSAndroid Build Coastguard Worker int event, 985*ec779b8eSAndroid Build Coastguard Worker const record_client_info_t *clientInfo, 986*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *clientConfig, 987*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> clientEffects, 988*ec779b8eSAndroid Build Coastguard Worker const audio_config_base_t *deviceConfig, 989*ec779b8eSAndroid Build Coastguard Worker std::vector<effect_descriptor_t> effects, 990*ec779b8eSAndroid Build Coastguard Worker audio_patch_handle_t patchHandle, 991*ec779b8eSAndroid Build Coastguard Worker audio_source_t source); 992*ec779b8eSAndroid Build Coastguard Worker void onRoutingUpdated(); 993*ec779b8eSAndroid Build Coastguard Worker void onVolumeRangeInitRequest(); 994*ec779b8eSAndroid Build Coastguard Worker void setAudioPortCallbacksEnabled(bool enabled); 995*ec779b8eSAndroid Build Coastguard Worker void setAudioVolumeGroupCallbacksEnabled(bool enabled); 996*ec779b8eSAndroid Build Coastguard Worker uid()997*ec779b8eSAndroid Build Coastguard Worker uid_t uid() { 998*ec779b8eSAndroid Build Coastguard Worker return mUid; 999*ec779b8eSAndroid Build Coastguard Worker } 1000*ec779b8eSAndroid Build Coastguard Worker 1001*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient 1002*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who); 1003*ec779b8eSAndroid Build Coastguard Worker 1004*ec779b8eSAndroid Build Coastguard Worker private: 1005*ec779b8eSAndroid Build Coastguard Worker NotificationClient(const NotificationClient&); 1006*ec779b8eSAndroid Build Coastguard Worker NotificationClient& operator = (const NotificationClient&); 1007*ec779b8eSAndroid Build Coastguard Worker 1008*ec779b8eSAndroid Build Coastguard Worker const wp<AudioPolicyService> mService; 1009*ec779b8eSAndroid Build Coastguard Worker const uid_t mUid; 1010*ec779b8eSAndroid Build Coastguard Worker const pid_t mPid; 1011*ec779b8eSAndroid Build Coastguard Worker const sp<media::IAudioPolicyServiceClient> mAudioPolicyServiceClient; 1012*ec779b8eSAndroid Build Coastguard Worker bool mAudioPortCallbacksEnabled; 1013*ec779b8eSAndroid Build Coastguard Worker bool mAudioVolumeGroupCallbacksEnabled; 1014*ec779b8eSAndroid Build Coastguard Worker }; 1015*ec779b8eSAndroid Build Coastguard Worker 1016*ec779b8eSAndroid Build Coastguard Worker public: 1017*ec779b8eSAndroid Build Coastguard Worker class AudioClient : public virtual RefBase { 1018*ec779b8eSAndroid Build Coastguard Worker public: AudioClient(const audio_attributes_t attributes,const audio_io_handle_t io,const AttributionSourceState & attributionSource,const audio_session_t session,audio_port_handle_t portId,const DeviceIdVector deviceIds)1019*ec779b8eSAndroid Build Coastguard Worker AudioClient(const audio_attributes_t attributes, 1020*ec779b8eSAndroid Build Coastguard Worker const audio_io_handle_t io, 1021*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState& attributionSource, 1022*ec779b8eSAndroid Build Coastguard Worker const audio_session_t session, audio_port_handle_t portId, 1023*ec779b8eSAndroid Build Coastguard Worker const DeviceIdVector deviceIds) : 1024*ec779b8eSAndroid Build Coastguard Worker attributes(attributes), io(io), attributionSource( 1025*ec779b8eSAndroid Build Coastguard Worker attributionSource), session(session), portId(portId), 1026*ec779b8eSAndroid Build Coastguard Worker deviceIds(deviceIds), active(false) {} 1027*ec779b8eSAndroid Build Coastguard Worker ~AudioClient() override = default; 1028*ec779b8eSAndroid Build Coastguard Worker 1029*ec779b8eSAndroid Build Coastguard Worker 1030*ec779b8eSAndroid Build Coastguard Worker const audio_attributes_t attributes; // source, flags ... 1031*ec779b8eSAndroid Build Coastguard Worker const audio_io_handle_t io; // audio HAL stream IO handle 1032*ec779b8eSAndroid Build Coastguard Worker const AttributionSourceState attributionSource; //client attributionsource 1033*ec779b8eSAndroid Build Coastguard Worker const audio_session_t session; // audio session ID 1034*ec779b8eSAndroid Build Coastguard Worker const audio_port_handle_t portId; 1035*ec779b8eSAndroid Build Coastguard Worker const DeviceIdVector deviceIds; // selected input device port IDs 1036*ec779b8eSAndroid Build Coastguard Worker bool active; // Playback/Capture is active or inactive 1037*ec779b8eSAndroid Build Coastguard Worker }; 1038*ec779b8eSAndroid Build Coastguard Worker private: 1039*ec779b8eSAndroid Build Coastguard Worker 1040*ec779b8eSAndroid Build Coastguard Worker 1041*ec779b8eSAndroid Build Coastguard Worker 1042*ec779b8eSAndroid Build Coastguard Worker // --- AudioPlaybackClient --- 1043*ec779b8eSAndroid Build Coastguard Worker // Information about each registered AudioTrack client 1044*ec779b8eSAndroid Build Coastguard Worker // (between calls to getOutputForAttr() and releaseOutput()) 1045*ec779b8eSAndroid Build Coastguard Worker class AudioPlaybackClient : public AudioClient { 1046*ec779b8eSAndroid Build Coastguard Worker public: AudioPlaybackClient(const audio_attributes_t attributes,const audio_io_handle_t io,AttributionSourceState attributionSource,const audio_session_t session,audio_port_handle_t portId,DeviceIdVector deviceIds,audio_stream_type_t stream,bool isSpatialized,audio_channel_mask_t channelMask)1047*ec779b8eSAndroid Build Coastguard Worker AudioPlaybackClient(const audio_attributes_t attributes, 1048*ec779b8eSAndroid Build Coastguard Worker const audio_io_handle_t io, AttributionSourceState attributionSource, 1049*ec779b8eSAndroid Build Coastguard Worker const audio_session_t session, audio_port_handle_t portId, 1050*ec779b8eSAndroid Build Coastguard Worker DeviceIdVector deviceIds, audio_stream_type_t stream, 1051*ec779b8eSAndroid Build Coastguard Worker bool isSpatialized, audio_channel_mask_t channelMask) : 1052*ec779b8eSAndroid Build Coastguard Worker AudioClient(attributes, io, attributionSource, session, portId, 1053*ec779b8eSAndroid Build Coastguard Worker deviceIds), stream(stream), isSpatialized(isSpatialized), 1054*ec779b8eSAndroid Build Coastguard Worker channelMask(channelMask) {} 1055*ec779b8eSAndroid Build Coastguard Worker ~AudioPlaybackClient() override = default; 1056*ec779b8eSAndroid Build Coastguard Worker 1057*ec779b8eSAndroid Build Coastguard Worker const audio_stream_type_t stream; 1058*ec779b8eSAndroid Build Coastguard Worker const bool isSpatialized; 1059*ec779b8eSAndroid Build Coastguard Worker const audio_channel_mask_t channelMask; 1060*ec779b8eSAndroid Build Coastguard Worker }; 1061*ec779b8eSAndroid Build Coastguard Worker 1062*ec779b8eSAndroid Build Coastguard Worker void getPlaybackClientAndEffects(audio_port_handle_t portId, 1063*ec779b8eSAndroid Build Coastguard Worker sp<AudioPlaybackClient>& client, 1064*ec779b8eSAndroid Build Coastguard Worker sp<AudioPolicyEffects>& effects, 1065*ec779b8eSAndroid Build Coastguard Worker const char *context); 1066*ec779b8eSAndroid Build Coastguard Worker 1067*ec779b8eSAndroid Build Coastguard Worker 1068*ec779b8eSAndroid Build Coastguard Worker // A class automatically clearing and restoring binder caller identity inside 1069*ec779b8eSAndroid Build Coastguard Worker // a code block (scoped variable) 1070*ec779b8eSAndroid Build Coastguard Worker // Declare one systematically before calling AudioPolicyManager methods so that they are 1071*ec779b8eSAndroid Build Coastguard Worker // executed with the same level of privilege as audioserver process. 1072*ec779b8eSAndroid Build Coastguard Worker class AutoCallerClear { 1073*ec779b8eSAndroid Build Coastguard Worker public: AutoCallerClear()1074*ec779b8eSAndroid Build Coastguard Worker AutoCallerClear() : 1075*ec779b8eSAndroid Build Coastguard Worker mToken(IPCThreadState::self()->clearCallingIdentity()) {} ~AutoCallerClear()1076*ec779b8eSAndroid Build Coastguard Worker ~AutoCallerClear() { 1077*ec779b8eSAndroid Build Coastguard Worker IPCThreadState::self()->restoreCallingIdentity(mToken); 1078*ec779b8eSAndroid Build Coastguard Worker } 1079*ec779b8eSAndroid Build Coastguard Worker 1080*ec779b8eSAndroid Build Coastguard Worker private: 1081*ec779b8eSAndroid Build Coastguard Worker const int64_t mToken; 1082*ec779b8eSAndroid Build Coastguard Worker }; 1083*ec779b8eSAndroid Build Coastguard Worker 1084*ec779b8eSAndroid Build Coastguard Worker // Internal dump utilities. 1085*ec779b8eSAndroid Build Coastguard Worker status_t dumpPermissionDenial(int fd); 1086*ec779b8eSAndroid Build Coastguard Worker void loadAudioPolicyManager(); 1087*ec779b8eSAndroid Build Coastguard Worker void unloadAudioPolicyManager(); 1088*ec779b8eSAndroid Build Coastguard Worker 1089*ec779b8eSAndroid Build Coastguard Worker /** 1090*ec779b8eSAndroid Build Coastguard Worker * Returns the channel masks for active audio tracks on the specified output mixer. 1091*ec779b8eSAndroid Build Coastguard Worker * The query can be specified to only include spatialized audio tracks or consider 1092*ec779b8eSAndroid Build Coastguard Worker * all tracks. 1093*ec779b8eSAndroid Build Coastguard Worker * @param output the I/O handle of the output mixer to consider 1094*ec779b8eSAndroid Build Coastguard Worker * @param spatializedOnly true if only spatialized tracks should be considered 1095*ec779b8eSAndroid Build Coastguard Worker * @return a list of channel masks for all active tracks matching the condition. 1096*ec779b8eSAndroid Build Coastguard Worker */ 1097*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_channel_mask_t> getActiveTracksMasks_l( 1098*ec779b8eSAndroid Build Coastguard Worker audio_io_handle_t output, bool spatializedOnly = true) REQUIRES(mMutex); 1099*ec779b8eSAndroid Build Coastguard Worker 1100*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioPolicyService_Mutex}; 1101*ec779b8eSAndroid Build Coastguard Worker // prevents concurrent access to AudioPolicy manager functions changing 1102*ec779b8eSAndroid Build Coastguard Worker // device connection state or routing. 1103*ec779b8eSAndroid Build Coastguard Worker // mMutex protects AudioPolicyManager methods that can call into audio flinger 1104*ec779b8eSAndroid Build Coastguard Worker // and possibly back in to audio policy service and acquire mEffectsLock. 1105*ec779b8eSAndroid Build Coastguard Worker sp<AudioCommandThread> mAudioCommandThread; // audio commands thread 1106*ec779b8eSAndroid Build Coastguard Worker sp<AudioCommandThread> mOutputCommandThread; // process stop and release output 1107*ec779b8eSAndroid Build Coastguard Worker AudioPolicyInterface *mAudioPolicyManager; 1108*ec779b8eSAndroid Build Coastguard Worker AudioPolicyClient *mAudioPolicyClient; 1109*ec779b8eSAndroid Build Coastguard Worker std::vector<audio_usage_t> mSupportedSystemUsages; 1110*ec779b8eSAndroid Build Coastguard Worker 1111*ec779b8eSAndroid Build Coastguard Worker mutable audio_utils::mutex mNotificationClientsMutex{ 1112*ec779b8eSAndroid Build Coastguard Worker audio_utils::MutexOrder::kAudioPolicyService_NotificationClientsMutex}; 1113*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<int64_t, sp<NotificationClient>> mNotificationClients 1114*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mNotificationClientsMutex); 1115*ec779b8eSAndroid Build Coastguard Worker // Manage all effects configured in audio_effects.conf 1116*ec779b8eSAndroid Build Coastguard Worker // never hold AudioPolicyService::mMutex when calling AudioPolicyEffects methods as 1117*ec779b8eSAndroid Build Coastguard Worker // those can call back into AudioPolicyService methods and try to acquire the mutex 1118*ec779b8eSAndroid Build Coastguard Worker sp<AudioPolicyEffects> mAudioPolicyEffects GUARDED_BY(mMutex); 1119*ec779b8eSAndroid Build Coastguard Worker audio_mode_t mPhoneState GUARDED_BY(mMutex); 1120*ec779b8eSAndroid Build Coastguard Worker uid_t mPhoneStateOwnerUid GUARDED_BY(mMutex); 1121*ec779b8eSAndroid Build Coastguard Worker 1122*ec779b8eSAndroid Build Coastguard Worker sp<UidPolicy> mUidPolicy GUARDED_BY(mMutex); 1123*ec779b8eSAndroid Build Coastguard Worker sp<SensorPrivacyPolicy> mSensorPrivacyPolicy GUARDED_BY(mMutex); 1124*ec779b8eSAndroid Build Coastguard Worker 1125*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_port_handle_t, sp<AudioRecordClient>> mAudioRecordClients 1126*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mMutex); 1127*ec779b8eSAndroid Build Coastguard Worker DefaultKeyedVector<audio_port_handle_t, sp<AudioPlaybackClient>> mAudioPlaybackClients 1128*ec779b8eSAndroid Build Coastguard Worker GUARDED_BY(mMutex); 1129*ec779b8eSAndroid Build Coastguard Worker 1130*ec779b8eSAndroid Build Coastguard Worker MediaPackageManager mPackageManager; // To check allowPlaybackCapture 1131*ec779b8eSAndroid Build Coastguard Worker 1132*ec779b8eSAndroid Build Coastguard Worker CaptureStateNotifier mCaptureStateNotifier; 1133*ec779b8eSAndroid Build Coastguard Worker 1134*ec779b8eSAndroid Build Coastguard Worker // created in onFirstRef() and never cleared: does not need to be guarded by mMutex 1135*ec779b8eSAndroid Build Coastguard Worker sp<Spatializer> mSpatializer; 1136*ec779b8eSAndroid Build Coastguard Worker 1137*ec779b8eSAndroid Build Coastguard Worker void *mLibraryHandle = nullptr; 1138*ec779b8eSAndroid Build Coastguard Worker CreateAudioPolicyManagerInstance mCreateAudioPolicyManager; 1139*ec779b8eSAndroid Build Coastguard Worker DestroyAudioPolicyManagerInstance mDestroyAudioPolicyManager; 1140*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<media::UsecaseValidator> mUsecaseValidator; 1141*ec779b8eSAndroid Build Coastguard Worker const sp<NativePermissionController> mPermissionController; 1142*ec779b8eSAndroid Build Coastguard Worker }; 1143*ec779b8eSAndroid Build Coastguard Worker 1144*ec779b8eSAndroid Build Coastguard Worker } // namespace android 1145*ec779b8eSAndroid Build Coastguard Worker 1146*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_AUDIOPOLICYSERVICE_H 1147