• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "AudioPolicyService"
18 //#define LOG_NDEBUG 0
19 
20 #include "Configuration.h"
21 #undef __STRICT_ANSI__
22 #define __STDINT_LIMITS
23 #define __STDC_LIMIT_MACROS
24 #include <stdint.h>
25 #include <sys/time.h>
26 #include <dlfcn.h>
27 
28 #include <android/content/pm/IPackageManagerNative.h>
29 #include <audio_utils/clock.h>
30 #include <binder/IServiceManager.h>
31 #include <utils/Log.h>
32 #include <cutils/properties.h>
33 #include <binder/IPCThreadState.h>
34 #include <binder/PermissionController.h>
35 #include <binder/IResultReceiver.h>
36 #include <utils/String16.h>
37 #include <utils/threads.h>
38 #include "AudioPolicyService.h"
39 #include <hardware_legacy/power.h>
40 #include <media/AidlConversion.h>
41 #include <media/AudioEffect.h>
42 #include <media/AudioParameter.h>
43 #include <mediautils/MethodStatistics.h>
44 #include <mediautils/ServiceUtilities.h>
45 #include <mediautils/TimeCheck.h>
46 #include <sensorprivacy/SensorPrivacyManager.h>
47 
48 #include <system/audio.h>
49 #include <system/audio_policy.h>
50 #include <AudioPolicyConfig.h>
51 #include <AudioPolicyManager.h>
52 
53 namespace android {
54 using binder::Status;
55 
56 static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n";
57 static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n";
58 static const char kAudioPolicyManagerCustomPath[] = "libaudiopolicymanagercustom.so";
59 
60 static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
61 
62 static const nsecs_t kAudioCommandTimeoutNs = seconds(3); // 3 seconds
63 
64 static const String16 sManageAudioPolicyPermission("android.permission.MANAGE_AUDIO_POLICY");
65 
66 // Creates an association between Binder code to name for IAudioPolicyService.
67 #define IAUDIOPOLICYSERVICE_BINDER_METHOD_MACRO_LIST \
68 BINDER_METHOD_ENTRY(onNewAudioModulesAvailable) \
69 BINDER_METHOD_ENTRY(setDeviceConnectionState) \
70 BINDER_METHOD_ENTRY(getDeviceConnectionState) \
71 BINDER_METHOD_ENTRY(handleDeviceConfigChange) \
72 BINDER_METHOD_ENTRY(setPhoneState) \
73 BINDER_METHOD_ENTRY(setForceUse) \
74 BINDER_METHOD_ENTRY(getForceUse) \
75 BINDER_METHOD_ENTRY(getOutput) \
76 BINDER_METHOD_ENTRY(getOutputForAttr) \
77 BINDER_METHOD_ENTRY(startOutput) \
78 BINDER_METHOD_ENTRY(stopOutput) \
79 BINDER_METHOD_ENTRY(releaseOutput) \
80 BINDER_METHOD_ENTRY(getInputForAttr) \
81 BINDER_METHOD_ENTRY(startInput) \
82 BINDER_METHOD_ENTRY(stopInput) \
83 BINDER_METHOD_ENTRY(releaseInput) \
84 BINDER_METHOD_ENTRY(initStreamVolume) \
85 BINDER_METHOD_ENTRY(setStreamVolumeIndex) \
86 BINDER_METHOD_ENTRY(getStreamVolumeIndex) \
87 BINDER_METHOD_ENTRY(setVolumeIndexForAttributes) \
88 BINDER_METHOD_ENTRY(getVolumeIndexForAttributes) \
89 BINDER_METHOD_ENTRY(getMaxVolumeIndexForAttributes) \
90 BINDER_METHOD_ENTRY(getMinVolumeIndexForAttributes) \
91 BINDER_METHOD_ENTRY(getStrategyForStream) \
92 BINDER_METHOD_ENTRY(getDevicesForAttributes) \
93 BINDER_METHOD_ENTRY(getOutputForEffect) \
94 BINDER_METHOD_ENTRY(registerEffect) \
95 BINDER_METHOD_ENTRY(unregisterEffect) \
96 BINDER_METHOD_ENTRY(setEffectEnabled) \
97 BINDER_METHOD_ENTRY(moveEffectsToIo) \
98 BINDER_METHOD_ENTRY(isStreamActive) \
99 BINDER_METHOD_ENTRY(isStreamActiveRemotely) \
100 BINDER_METHOD_ENTRY(isSourceActive) \
101 BINDER_METHOD_ENTRY(queryDefaultPreProcessing) \
102 BINDER_METHOD_ENTRY(addSourceDefaultEffect) \
103 BINDER_METHOD_ENTRY(addStreamDefaultEffect) \
104 BINDER_METHOD_ENTRY(removeSourceDefaultEffect) \
105 BINDER_METHOD_ENTRY(removeStreamDefaultEffect) \
106 BINDER_METHOD_ENTRY(setSupportedSystemUsages) \
107 BINDER_METHOD_ENTRY(setAllowedCapturePolicy) \
108 BINDER_METHOD_ENTRY(getOffloadSupport) \
109 BINDER_METHOD_ENTRY(isDirectOutputSupported) \
110 BINDER_METHOD_ENTRY(listAudioPorts) \
111 BINDER_METHOD_ENTRY(getAudioPort) \
112 BINDER_METHOD_ENTRY(createAudioPatch) \
113 BINDER_METHOD_ENTRY(releaseAudioPatch) \
114 BINDER_METHOD_ENTRY(listAudioPatches) \
115 BINDER_METHOD_ENTRY(setAudioPortConfig) \
116 BINDER_METHOD_ENTRY(registerClient) \
117 BINDER_METHOD_ENTRY(setAudioPortCallbacksEnabled) \
118 BINDER_METHOD_ENTRY(setAudioVolumeGroupCallbacksEnabled) \
119 BINDER_METHOD_ENTRY(acquireSoundTriggerSession) \
120 BINDER_METHOD_ENTRY(releaseSoundTriggerSession) \
121 BINDER_METHOD_ENTRY(getPhoneState) \
122 BINDER_METHOD_ENTRY(registerPolicyMixes) \
123 BINDER_METHOD_ENTRY(setUidDeviceAffinities) \
124 BINDER_METHOD_ENTRY(removeUidDeviceAffinities) \
125 BINDER_METHOD_ENTRY(setUserIdDeviceAffinities) \
126 BINDER_METHOD_ENTRY(removeUserIdDeviceAffinities) \
127 BINDER_METHOD_ENTRY(startAudioSource) \
128 BINDER_METHOD_ENTRY(stopAudioSource) \
129 BINDER_METHOD_ENTRY(setMasterMono) \
130 BINDER_METHOD_ENTRY(getMasterMono) \
131 BINDER_METHOD_ENTRY(getStreamVolumeDB) \
132 BINDER_METHOD_ENTRY(getSurroundFormats) \
133 BINDER_METHOD_ENTRY(getReportedSurroundFormats) \
134 BINDER_METHOD_ENTRY(getHwOffloadFormatsSupportedForBluetoothMedia) \
135 BINDER_METHOD_ENTRY(setSurroundFormatEnabled) \
136 BINDER_METHOD_ENTRY(setAssistantServicesUids) \
137 BINDER_METHOD_ENTRY(setActiveAssistantServicesUids) \
138 BINDER_METHOD_ENTRY(setA11yServicesUids) \
139 BINDER_METHOD_ENTRY(setCurrentImeUid) \
140 BINDER_METHOD_ENTRY(isHapticPlaybackSupported) \
141 BINDER_METHOD_ENTRY(isUltrasoundSupported) \
142 BINDER_METHOD_ENTRY(isHotwordStreamSupported) \
143 BINDER_METHOD_ENTRY(listAudioProductStrategies) \
144 BINDER_METHOD_ENTRY(getProductStrategyFromAudioAttributes) \
145 BINDER_METHOD_ENTRY(listAudioVolumeGroups) \
146 BINDER_METHOD_ENTRY(getVolumeGroupFromAudioAttributes) \
147 BINDER_METHOD_ENTRY(setRttEnabled) \
148 BINDER_METHOD_ENTRY(isCallScreenModeSupported) \
149 BINDER_METHOD_ENTRY(setDevicesRoleForStrategy) \
150 BINDER_METHOD_ENTRY(removeDevicesRoleForStrategy) \
151 BINDER_METHOD_ENTRY(clearDevicesRoleForStrategy) \
152 BINDER_METHOD_ENTRY(getDevicesForRoleAndStrategy) \
153 BINDER_METHOD_ENTRY(setDevicesRoleForCapturePreset) \
154 BINDER_METHOD_ENTRY(addDevicesRoleForCapturePreset) \
155 BINDER_METHOD_ENTRY(removeDevicesRoleForCapturePreset) \
156 BINDER_METHOD_ENTRY(clearDevicesRoleForCapturePreset) \
157 BINDER_METHOD_ENTRY(getDevicesForRoleAndCapturePreset) \
158 BINDER_METHOD_ENTRY(registerSoundTriggerCaptureStateListener) \
159 BINDER_METHOD_ENTRY(getSpatializer) \
160 BINDER_METHOD_ENTRY(canBeSpatialized) \
161 BINDER_METHOD_ENTRY(getDirectPlaybackSupport) \
162 BINDER_METHOD_ENTRY(getDirectProfilesForAttributes)  \
163 BINDER_METHOD_ENTRY(getSupportedMixerAttributes) \
164 BINDER_METHOD_ENTRY(setPreferredMixerAttributes) \
165 BINDER_METHOD_ENTRY(getPreferredMixerAttributes) \
166 BINDER_METHOD_ENTRY(clearPreferredMixerAttributes) \
167 
168 // singleton for Binder Method Statistics for IAudioPolicyService
getIAudioPolicyServiceStatistics()169 static auto& getIAudioPolicyServiceStatistics() {
170     using Code = int;
171 
172 #pragma push_macro("BINDER_METHOD_ENTRY")
173 #undef BINDER_METHOD_ENTRY
174 #define BINDER_METHOD_ENTRY(ENTRY) \
175         {(Code)media::BnAudioPolicyService::TRANSACTION_##ENTRY, #ENTRY},
176 
177     static mediautils::MethodStatistics<Code> methodStatistics{
178         IAUDIOPOLICYSERVICE_BINDER_METHOD_MACRO_LIST
179         METHOD_STATISTICS_BINDER_CODE_NAMES(Code)
180     };
181 #pragma pop_macro("BINDER_METHOD_ENTRY")
182 
183     return methodStatistics;
184 }
185 
186 // ----------------------------------------------------------------------------
187 
createAudioPolicyManager(AudioPolicyClientInterface * clientInterface)188 static AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
189 {
190     AudioPolicyManager *apm = nullptr;
191     media::AudioPolicyConfig apmConfig;
192     if (status_t status = clientInterface->getAudioPolicyConfig(&apmConfig); status == OK) {
193         auto config = AudioPolicyConfig::loadFromApmAidlConfigWithFallback(apmConfig);
194         LOG_ALWAYS_FATAL_IF(config->getEngineLibraryNameSuffix() !=
195                 AudioPolicyConfig::kDefaultEngineLibraryNameSuffix,
196                 "Only default engine is currently supported with the AIDL HAL");
197         apm = new AudioPolicyManager(config,
198                 loadApmEngineLibraryAndCreateEngine(
199                         config->getEngineLibraryNameSuffix(), apmConfig.engineConfig),
200                 clientInterface);
201     } else {
202         auto config = AudioPolicyConfig::loadFromApmXmlConfigWithFallback();  // This can't fail.
203         apm = new AudioPolicyManager(config,
204                 loadApmEngineLibraryAndCreateEngine(config->getEngineLibraryNameSuffix()),
205                 clientInterface);
206     }
207     status_t status = apm->initialize();
208     if (status != NO_ERROR) {
209         delete apm;
210         apm = nullptr;
211     }
212     return apm;
213 }
214 
destroyAudioPolicyManager(AudioPolicyInterface * interface)215 static void destroyAudioPolicyManager(AudioPolicyInterface *interface)
216 {
217     delete interface;
218 }
219 
220 namespace {
getTargetSdkForPackageName(std::string_view packageName)221 int getTargetSdkForPackageName(std::string_view packageName) {
222     const auto binder = defaultServiceManager()->checkService(String16{"package_native"});
223     int targetSdk = -1;
224     if (binder != nullptr) {
225         const auto pm = interface_cast<content::pm::IPackageManagerNative>(binder);
226         if (pm != nullptr) {
227             const auto status = pm->getTargetSdkVersionForPackage(
228                     String16{packageName.data(), packageName.size()}, &targetSdk);
229             return status.isOk() ? targetSdk : -1;
230         }
231     }
232     return targetSdk;
233 }
234 
doesPackageTargetAtLeastU(std::string_view packageName)235 bool doesPackageTargetAtLeastU(std::string_view packageName) {
236     return getTargetSdkForPackageName(packageName) >= __ANDROID_API_U__;
237 }
238 } // anonymous
239 // ----------------------------------------------------------------------------
240 
AudioPolicyService()241 AudioPolicyService::AudioPolicyService()
242     : BnAudioPolicyService(),
243       mAudioPolicyManager(NULL),
244       mAudioPolicyClient(NULL),
245       mPhoneState(AUDIO_MODE_INVALID),
246       mCaptureStateNotifier(false),
247       mCreateAudioPolicyManager(createAudioPolicyManager),
248       mDestroyAudioPolicyManager(destroyAudioPolicyManager),
249       mUsecaseValidator(media::createUsecaseValidator()) {
250       setMinSchedulerPolicy(SCHED_NORMAL, ANDROID_PRIORITY_AUDIO);
251 }
252 
loadAudioPolicyManager()253 void AudioPolicyService::loadAudioPolicyManager()
254 {
255     mLibraryHandle = dlopen(kAudioPolicyManagerCustomPath, RTLD_NOW);
256     if (mLibraryHandle != nullptr) {
257         ALOGI("%s loading %s", __func__, kAudioPolicyManagerCustomPath);
258         mCreateAudioPolicyManager = reinterpret_cast<CreateAudioPolicyManagerInstance>
259                                             (dlsym(mLibraryHandle, "createAudioPolicyManager"));
260         const char *lastError = dlerror();
261         ALOGW_IF(mCreateAudioPolicyManager == nullptr, "%s createAudioPolicyManager is null %s",
262                     __func__, lastError != nullptr ? lastError : "no error");
263 
264         mDestroyAudioPolicyManager = reinterpret_cast<DestroyAudioPolicyManagerInstance>(
265                                         dlsym(mLibraryHandle, "destroyAudioPolicyManager"));
266         lastError = dlerror();
267         ALOGW_IF(mDestroyAudioPolicyManager == nullptr, "%s destroyAudioPolicyManager is null %s",
268                     __func__, lastError != nullptr ? lastError : "no error");
269         if (mCreateAudioPolicyManager == nullptr || mDestroyAudioPolicyManager == nullptr){
270             unloadAudioPolicyManager();
271             LOG_ALWAYS_FATAL("could not find audiopolicymanager interface methods");
272         }
273     }
274 }
275 
onFirstRef()276 void AudioPolicyService::onFirstRef()
277 {
278     // Log an AudioPolicy "constructor" mediametrics event on first ref.
279     // This records the time it takes to load the audio modules and devices.
280     mediametrics::Defer defer([beginNs = systemTime()] {
281         mediametrics::LogItem(AMEDIAMETRICS_KEY_AUDIO_POLICY)
282             .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_CTOR)
283             .set(AMEDIAMETRICS_PROP_EXECUTIONTIMENS, (int64_t)(systemTime() - beginNs))
284             .record(); });
285     {
286         Mutex::Autolock _l(mLock);
287 
288         // start audio commands thread
289         mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
290         // start output activity command thread
291         mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
292 
293         mAudioPolicyClient = new AudioPolicyClient(this);
294 
295         loadAudioPolicyManager();
296         mAudioPolicyManager = mCreateAudioPolicyManager(mAudioPolicyClient);
297     }
298 
299     // load audio processing modules
300     const sp<EffectsFactoryHalInterface> effectsFactoryHal = EffectsFactoryHalInterface::create();
301     sp<AudioPolicyEffects> audioPolicyEffects = new AudioPolicyEffects(effectsFactoryHal);
302     sp<UidPolicy> uidPolicy = new UidPolicy(this);
303     sp<SensorPrivacyPolicy> sensorPrivacyPolicy = new SensorPrivacyPolicy(this);
304     {
305         Mutex::Autolock _l(mLock);
306         mAudioPolicyEffects = audioPolicyEffects;
307         mUidPolicy = uidPolicy;
308         mSensorPrivacyPolicy = sensorPrivacyPolicy;
309     }
310     uidPolicy->registerSelf();
311     sensorPrivacyPolicy->registerSelf();
312 
313     // Create spatializer if supported
314     if (mAudioPolicyManager != nullptr) {
315         Mutex::Autolock _l(mLock);
316         const audio_attributes_t attr = attributes_initializer(AUDIO_USAGE_MEDIA);
317         AudioDeviceTypeAddrVector devices;
318         bool hasSpatializer = mAudioPolicyManager->canBeSpatialized(&attr, nullptr, devices);
319         if (hasSpatializer) {
320             mSpatializer = Spatializer::create(this, effectsFactoryHal);
321         }
322         if (mSpatializer == nullptr) {
323             // No spatializer created, signal the reason: NO_INIT a failure, OK means intended.
324             const status_t createStatus = hasSpatializer ? NO_INIT : OK;
325             Spatializer::sendEmptyCreateSpatializerMetricWithStatus(createStatus);
326         }
327     }
328     AudioSystem::audioPolicyReady();
329 }
330 
unloadAudioPolicyManager()331 void AudioPolicyService::unloadAudioPolicyManager()
332 {
333     ALOGV("%s ", __func__);
334     if (mLibraryHandle != nullptr) {
335         dlclose(mLibraryHandle);
336     }
337     mLibraryHandle = nullptr;
338     mCreateAudioPolicyManager = nullptr;
339     mDestroyAudioPolicyManager = nullptr;
340 }
341 
~AudioPolicyService()342 AudioPolicyService::~AudioPolicyService()
343 {
344     mAudioCommandThread->exit();
345     mOutputCommandThread->exit();
346 
347     mDestroyAudioPolicyManager(mAudioPolicyManager);
348     unloadAudioPolicyManager();
349 
350     delete mAudioPolicyClient;
351 
352     mNotificationClients.clear();
353     mAudioPolicyEffects.clear();
354 
355     mUidPolicy->unregisterSelf();
356     mSensorPrivacyPolicy->unregisterSelf();
357 
358     mUidPolicy.clear();
359     mSensorPrivacyPolicy.clear();
360 }
361 
362 // A notification client is always registered by AudioSystem when the client process
363 // connects to AudioPolicyService.
registerClient(const sp<media::IAudioPolicyServiceClient> & client)364 Status AudioPolicyService::registerClient(const sp<media::IAudioPolicyServiceClient>& client)
365 {
366     if (client == 0) {
367         ALOGW("%s got NULL client", __FUNCTION__);
368         return Status::ok();
369     }
370     Mutex::Autolock _l(mNotificationClientsLock);
371 
372     uid_t uid = IPCThreadState::self()->getCallingUid();
373     pid_t pid = IPCThreadState::self()->getCallingPid();
374     int64_t token = ((int64_t)uid<<32) | pid;
375 
376     if (mNotificationClients.indexOfKey(token) < 0) {
377         sp<NotificationClient> notificationClient = new NotificationClient(this,
378                                                                            client,
379                                                                            uid,
380                                                                            pid);
381         ALOGV("registerClient() client %p, uid %d pid %d", client.get(), uid, pid);
382 
383         mNotificationClients.add(token, notificationClient);
384 
385         sp<IBinder> binder = IInterface::asBinder(client);
386         binder->linkToDeath(notificationClient);
387     }
388         return Status::ok();
389 }
390 
setAudioPortCallbacksEnabled(bool enabled)391 Status AudioPolicyService::setAudioPortCallbacksEnabled(bool enabled)
392 {
393     Mutex::Autolock _l(mNotificationClientsLock);
394 
395     uid_t uid = IPCThreadState::self()->getCallingUid();
396     pid_t pid = IPCThreadState::self()->getCallingPid();
397     int64_t token = ((int64_t)uid<<32) | pid;
398 
399     if (mNotificationClients.indexOfKey(token) < 0) {
400         return Status::ok();
401     }
402     mNotificationClients.valueFor(token)->setAudioPortCallbacksEnabled(enabled);
403     return Status::ok();
404 }
405 
setAudioVolumeGroupCallbacksEnabled(bool enabled)406 Status AudioPolicyService::setAudioVolumeGroupCallbacksEnabled(bool enabled)
407 {
408     Mutex::Autolock _l(mNotificationClientsLock);
409 
410     uid_t uid = IPCThreadState::self()->getCallingUid();
411     pid_t pid = IPCThreadState::self()->getCallingPid();
412     int64_t token = ((int64_t)uid<<32) | pid;
413 
414     if (mNotificationClients.indexOfKey(token) < 0) {
415         return Status::ok();
416     }
417     mNotificationClients.valueFor(token)->setAudioVolumeGroupCallbacksEnabled(enabled);
418     return Status::ok();
419 }
420 
421 // removeNotificationClient() is called when the client process dies.
removeNotificationClient(uid_t uid,pid_t pid)422 void AudioPolicyService::removeNotificationClient(uid_t uid, pid_t pid)
423 {
424     bool hasSameUid = false;
425     {
426         Mutex::Autolock _l(mNotificationClientsLock);
427         int64_t token = ((int64_t)uid<<32) | pid;
428         mNotificationClients.removeItem(token);
429         for (size_t i = 0; i < mNotificationClients.size(); i++) {
430             if (mNotificationClients.valueAt(i)->uid() == uid) {
431                 hasSameUid = true;
432                 break;
433             }
434         }
435     }
436     {
437         Mutex::Autolock _l(mLock);
438         if (mAudioPolicyManager && !hasSameUid) {
439             // called from binder death notification: no need to clear caller identity
440             mAudioPolicyManager->releaseResourcesForUid(uid);
441         }
442     }
443 }
444 
onAudioPortListUpdate()445 void AudioPolicyService::onAudioPortListUpdate()
446 {
447     mOutputCommandThread->updateAudioPortListCommand();
448 }
449 
doOnAudioPortListUpdate()450 void AudioPolicyService::doOnAudioPortListUpdate()
451 {
452     Mutex::Autolock _l(mNotificationClientsLock);
453     for (size_t i = 0; i < mNotificationClients.size(); i++) {
454         mNotificationClients.valueAt(i)->onAudioPortListUpdate();
455     }
456 }
457 
onAudioPatchListUpdate()458 void AudioPolicyService::onAudioPatchListUpdate()
459 {
460     mOutputCommandThread->updateAudioPatchListCommand();
461 }
462 
doOnAudioPatchListUpdate()463 void AudioPolicyService::doOnAudioPatchListUpdate()
464 {
465     Mutex::Autolock _l(mNotificationClientsLock);
466     for (size_t i = 0; i < mNotificationClients.size(); i++) {
467         mNotificationClients.valueAt(i)->onAudioPatchListUpdate();
468     }
469 }
470 
onAudioVolumeGroupChanged(volume_group_t group,int flags)471 void AudioPolicyService::onAudioVolumeGroupChanged(volume_group_t group, int flags)
472 {
473     mOutputCommandThread->changeAudioVolumeGroupCommand(group, flags);
474 }
475 
doOnAudioVolumeGroupChanged(volume_group_t group,int flags)476 void AudioPolicyService::doOnAudioVolumeGroupChanged(volume_group_t group, int flags)
477 {
478     Mutex::Autolock _l(mNotificationClientsLock);
479     for (size_t i = 0; i < mNotificationClients.size(); i++) {
480         mNotificationClients.valueAt(i)->onAudioVolumeGroupChanged(group, flags);
481     }
482 }
483 
onDynamicPolicyMixStateUpdate(const String8 & regId,int32_t state)484 void AudioPolicyService::onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state)
485 {
486     ALOGV("AudioPolicyService::onDynamicPolicyMixStateUpdate(%s, %d)",
487             regId.string(), state);
488     mOutputCommandThread->dynamicPolicyMixStateUpdateCommand(regId, state);
489 }
490 
doOnDynamicPolicyMixStateUpdate(const String8 & regId,int32_t state)491 void AudioPolicyService::doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state)
492 {
493     Mutex::Autolock _l(mNotificationClientsLock);
494     for (size_t i = 0; i < mNotificationClients.size(); i++) {
495         mNotificationClients.valueAt(i)->onDynamicPolicyMixStateUpdate(regId, state);
496     }
497 }
498 
onRecordingConfigurationUpdate(int event,const record_client_info_t * clientInfo,const audio_config_base_t * clientConfig,std::vector<effect_descriptor_t> clientEffects,const audio_config_base_t * deviceConfig,std::vector<effect_descriptor_t> effects,audio_patch_handle_t patchHandle,audio_source_t source)499 void AudioPolicyService::onRecordingConfigurationUpdate(
500                                                     int event,
501                                                     const record_client_info_t *clientInfo,
502                                                     const audio_config_base_t *clientConfig,
503                                                     std::vector<effect_descriptor_t> clientEffects,
504                                                     const audio_config_base_t *deviceConfig,
505                                                     std::vector<effect_descriptor_t> effects,
506                                                     audio_patch_handle_t patchHandle,
507                                                     audio_source_t source)
508 {
509     mOutputCommandThread->recordingConfigurationUpdateCommand(event, clientInfo,
510             clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
511 }
512 
doOnRecordingConfigurationUpdate(int event,const record_client_info_t * clientInfo,const audio_config_base_t * clientConfig,std::vector<effect_descriptor_t> clientEffects,const audio_config_base_t * deviceConfig,std::vector<effect_descriptor_t> effects,audio_patch_handle_t patchHandle,audio_source_t source)513 void AudioPolicyService::doOnRecordingConfigurationUpdate(
514                                                   int event,
515                                                   const record_client_info_t *clientInfo,
516                                                   const audio_config_base_t *clientConfig,
517                                                   std::vector<effect_descriptor_t> clientEffects,
518                                                   const audio_config_base_t *deviceConfig,
519                                                   std::vector<effect_descriptor_t> effects,
520                                                   audio_patch_handle_t patchHandle,
521                                                   audio_source_t source)
522 {
523     Mutex::Autolock _l(mNotificationClientsLock);
524     for (size_t i = 0; i < mNotificationClients.size(); i++) {
525         mNotificationClients.valueAt(i)->onRecordingConfigurationUpdate(event, clientInfo,
526                 clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
527     }
528 }
529 
onRoutingUpdated()530 void AudioPolicyService::onRoutingUpdated()
531 {
532     mOutputCommandThread->routingChangedCommand();
533 }
534 
doOnRoutingUpdated()535 void AudioPolicyService::doOnRoutingUpdated()
536 {
537   Mutex::Autolock _l(mNotificationClientsLock);
538     for (size_t i = 0; i < mNotificationClients.size(); i++) {
539         mNotificationClients.valueAt(i)->onRoutingUpdated();
540     }
541 }
542 
onVolumeRangeInitRequest()543 void AudioPolicyService::onVolumeRangeInitRequest()
544 {
545     mOutputCommandThread->volRangeInitReqCommand();
546 }
547 
doOnVolumeRangeInitRequest()548 void AudioPolicyService::doOnVolumeRangeInitRequest()
549 {
550     Mutex::Autolock _l(mNotificationClientsLock);
551     for (size_t i = 0; i < mNotificationClients.size(); i++) {
552         mNotificationClients.valueAt(i)->onVolumeRangeInitRequest();
553     }
554 }
555 
onCheckSpatializer()556 void AudioPolicyService::onCheckSpatializer()
557 {
558     Mutex::Autolock _l(mLock);
559     onCheckSpatializer_l();
560 }
561 
onCheckSpatializer_l()562 void AudioPolicyService::onCheckSpatializer_l()
563 {
564     if (mSpatializer != nullptr) {
565         mOutputCommandThread->checkSpatializerCommand();
566     }
567 }
568 
doOnCheckSpatializer()569 void AudioPolicyService::doOnCheckSpatializer()
570 {
571     ALOGV("%s mSpatializer %p level %d",
572         __func__, mSpatializer.get(), (int)mSpatializer->getLevel());
573 
574     if (mSpatializer != nullptr) {
575         // Note: mSpatializer != nullptr =>  mAudioPolicyManager != nullptr
576         if (mSpatializer->getLevel() != media::SpatializationLevel::NONE) {
577             audio_io_handle_t currentOutput = mSpatializer->getOutput();
578             audio_io_handle_t newOutput;
579             const audio_attributes_t attr = attributes_initializer(AUDIO_USAGE_MEDIA);
580             audio_config_base_t config = mSpatializer->getAudioInConfig();
581 
582             Mutex::Autolock _l(mLock);
583             status_t status =
584                     mAudioPolicyManager->getSpatializerOutput(&config, &attr, &newOutput);
585             ALOGV("%s currentOutput %d newOutput %d channel_mask %#x",
586                     __func__, currentOutput, newOutput, config.channel_mask);
587             if (status == NO_ERROR && currentOutput == newOutput) {
588                 return;
589             }
590             size_t numActiveTracks = countActiveClientsOnOutput_l(newOutput);
591             mLock.unlock();
592             // It is OK to call detachOutput() is none is already attached.
593             mSpatializer->detachOutput();
594             if (status == NO_ERROR && newOutput != AUDIO_IO_HANDLE_NONE) {
595                 status = mSpatializer->attachOutput(newOutput, numActiveTracks);
596             }
597             mLock.lock();
598             if (status != NO_ERROR) {
599                 mAudioPolicyManager->releaseSpatializerOutput(newOutput);
600             }
601         } else if (mSpatializer->getLevel() == media::SpatializationLevel::NONE
602                                && mSpatializer->getOutput() != AUDIO_IO_HANDLE_NONE) {
603             audio_io_handle_t output = mSpatializer->detachOutput();
604 
605             if (output != AUDIO_IO_HANDLE_NONE) {
606                 Mutex::Autolock _l(mLock);
607                 mAudioPolicyManager->releaseSpatializerOutput(output);
608             }
609         }
610     }
611 }
612 
countActiveClientsOnOutput_l(audio_io_handle_t output,bool spatializedOnly)613 size_t AudioPolicyService::countActiveClientsOnOutput_l(
614         audio_io_handle_t output, bool spatializedOnly) {
615     size_t count = 0;
616     for (size_t i = 0; i < mAudioPlaybackClients.size(); i++) {
617         auto client = mAudioPlaybackClients.valueAt(i);
618         if (client->io == output && client->active
619                 && (!spatializedOnly || client->isSpatialized)) {
620             count++;
621         }
622     }
623     return count;
624 }
625 
onUpdateActiveSpatializerTracks_l()626 void AudioPolicyService::onUpdateActiveSpatializerTracks_l() {
627     if (mSpatializer == nullptr) {
628         return;
629     }
630     mOutputCommandThread->updateActiveSpatializerTracksCommand();
631 }
632 
doOnUpdateActiveSpatializerTracks()633 void AudioPolicyService::doOnUpdateActiveSpatializerTracks()
634 {
635     if (mSpatializer == nullptr) {
636         return;
637     }
638     audio_io_handle_t output = mSpatializer->getOutput();
639     size_t activeClients;
640     {
641         Mutex::Autolock _l(mLock);
642         activeClients = countActiveClientsOnOutput_l(output);
643     }
644     mSpatializer->updateActiveTracks(activeClients);
645 }
646 
clientCreateAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle,int delayMs)647 status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch,
648                                                 audio_patch_handle_t *handle,
649                                                 int delayMs)
650 {
651     return mAudioCommandThread->createAudioPatchCommand(patch, handle, delayMs);
652 }
653 
clientReleaseAudioPatch(audio_patch_handle_t handle,int delayMs)654 status_t AudioPolicyService::clientReleaseAudioPatch(audio_patch_handle_t handle,
655                                                  int delayMs)
656 {
657     return mAudioCommandThread->releaseAudioPatchCommand(handle, delayMs);
658 }
659 
clientSetAudioPortConfig(const struct audio_port_config * config,int delayMs)660 status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_config *config,
661                                                       int delayMs)
662 {
663     return mAudioCommandThread->setAudioPortConfigCommand(config, delayMs);
664 }
665 
NotificationClient(const sp<AudioPolicyService> & service,const sp<media::IAudioPolicyServiceClient> & client,uid_t uid,pid_t pid)666 AudioPolicyService::NotificationClient::NotificationClient(
667         const sp<AudioPolicyService>& service,
668         const sp<media::IAudioPolicyServiceClient>& client,
669         uid_t uid,
670         pid_t pid)
671     : mService(service), mUid(uid), mPid(pid), mAudioPolicyServiceClient(client),
672       mAudioPortCallbacksEnabled(false), mAudioVolumeGroupCallbacksEnabled(false)
673 {
674 }
675 
~NotificationClient()676 AudioPolicyService::NotificationClient::~NotificationClient()
677 {
678 }
679 
binderDied(const wp<IBinder> & who __unused)680 void AudioPolicyService::NotificationClient::binderDied(const wp<IBinder>& who __unused)
681 {
682     sp<NotificationClient> keep(this);
683     sp<AudioPolicyService> service = mService.promote();
684     if (service != 0) {
685         service->removeNotificationClient(mUid, mPid);
686     }
687 }
688 
onAudioPortListUpdate()689 void AudioPolicyService::NotificationClient::onAudioPortListUpdate()
690 {
691     if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) {
692         mAudioPolicyServiceClient->onAudioPortListUpdate();
693     }
694 }
695 
onAudioPatchListUpdate()696 void AudioPolicyService::NotificationClient::onAudioPatchListUpdate()
697 {
698     if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) {
699         mAudioPolicyServiceClient->onAudioPatchListUpdate();
700     }
701 }
702 
onAudioVolumeGroupChanged(volume_group_t group,int flags)703 void AudioPolicyService::NotificationClient::onAudioVolumeGroupChanged(volume_group_t group,
704                                                                       int flags)
705 {
706     if (mAudioPolicyServiceClient != 0 && mAudioVolumeGroupCallbacksEnabled) {
707         mAudioPolicyServiceClient->onAudioVolumeGroupChanged(group, flags);
708     }
709 }
710 
711 
onDynamicPolicyMixStateUpdate(const String8 & regId,int32_t state)712 void AudioPolicyService::NotificationClient::onDynamicPolicyMixStateUpdate(
713         const String8& regId, int32_t state)
714 {
715     if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
716         mAudioPolicyServiceClient->onDynamicPolicyMixStateUpdate(
717                 legacy2aidl_String8_string(regId).value(), state);
718     }
719 }
720 
onRecordingConfigurationUpdate(int event,const record_client_info_t * clientInfo,const audio_config_base_t * clientConfig,std::vector<effect_descriptor_t> clientEffects,const audio_config_base_t * deviceConfig,std::vector<effect_descriptor_t> effects,audio_patch_handle_t patchHandle,audio_source_t source)721 void AudioPolicyService::NotificationClient::onRecordingConfigurationUpdate(
722                                             int event,
723                                             const record_client_info_t *clientInfo,
724                                             const audio_config_base_t *clientConfig,
725                                             std::vector<effect_descriptor_t> clientEffects,
726                                             const audio_config_base_t *deviceConfig,
727                                             std::vector<effect_descriptor_t> effects,
728                                             audio_patch_handle_t patchHandle,
729                                             audio_source_t source)
730 {
731     if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
732         status_t status = [&]() -> status_t {
733             int32_t eventAidl = VALUE_OR_RETURN_STATUS(convertIntegral<int32_t>(event));
734             media::RecordClientInfo clientInfoAidl = VALUE_OR_RETURN_STATUS(
735                     legacy2aidl_record_client_info_t_RecordClientInfo(*clientInfo));
736             AudioConfigBase clientConfigAidl = VALUE_OR_RETURN_STATUS(
737                     legacy2aidl_audio_config_base_t_AudioConfigBase(
738                             *clientConfig, true /*isInput*/));
739             std::vector<media::EffectDescriptor> clientEffectsAidl = VALUE_OR_RETURN_STATUS(
740                     convertContainer<std::vector<media::EffectDescriptor>>(
741                             clientEffects,
742                             legacy2aidl_effect_descriptor_t_EffectDescriptor));
743             AudioConfigBase deviceConfigAidl = VALUE_OR_RETURN_STATUS(
744                     legacy2aidl_audio_config_base_t_AudioConfigBase(
745                             *deviceConfig, true /*isInput*/));
746             std::vector<media::EffectDescriptor> effectsAidl = VALUE_OR_RETURN_STATUS(
747                     convertContainer<std::vector<media::EffectDescriptor>>(
748                             effects,
749                             legacy2aidl_effect_descriptor_t_EffectDescriptor));
750             int32_t patchHandleAidl = VALUE_OR_RETURN_STATUS(
751                     legacy2aidl_audio_patch_handle_t_int32_t(patchHandle));
752             media::audio::common::AudioSource sourceAidl = VALUE_OR_RETURN_STATUS(
753                     legacy2aidl_audio_source_t_AudioSource(source));
754             return aidl_utils::statusTFromBinderStatus(
755                     mAudioPolicyServiceClient->onRecordingConfigurationUpdate(eventAidl,
756                                                                               clientInfoAidl,
757                                                                               clientConfigAidl,
758                                                                               clientEffectsAidl,
759                                                                               deviceConfigAidl,
760                                                                               effectsAidl,
761                                                                               patchHandleAidl,
762                                                                               sourceAidl));
763         }();
764         ALOGW_IF(status != OK, "onRecordingConfigurationUpdate() failed: %d", status);
765     }
766 }
767 
setAudioPortCallbacksEnabled(bool enabled)768 void AudioPolicyService::NotificationClient::setAudioPortCallbacksEnabled(bool enabled)
769 {
770     mAudioPortCallbacksEnabled = enabled;
771 }
772 
setAudioVolumeGroupCallbacksEnabled(bool enabled)773 void AudioPolicyService::NotificationClient::setAudioVolumeGroupCallbacksEnabled(bool enabled)
774 {
775     mAudioVolumeGroupCallbacksEnabled = enabled;
776 }
777 
onRoutingUpdated()778 void AudioPolicyService::NotificationClient::onRoutingUpdated()
779 {
780     if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
781         mAudioPolicyServiceClient->onRoutingUpdated();
782     }
783 }
784 
onVolumeRangeInitRequest()785 void AudioPolicyService::NotificationClient::onVolumeRangeInitRequest()
786 {
787     if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
788         mAudioPolicyServiceClient->onVolumeRangeInitRequest();
789     }
790 }
791 
binderDied(const wp<IBinder> & who)792 void AudioPolicyService::binderDied(const wp<IBinder>& who) {
793     ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(),
794             IPCThreadState::self()->getCallingPid());
795 }
796 
dumpTryLock(Mutex & mutex)797 static bool dumpTryLock(Mutex& mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
798 {
799     return mutex.timedLock(kDumpLockTimeoutNs) == NO_ERROR;
800 }
801 
dumpReleaseLock(Mutex & mutex,bool locked)802 static void dumpReleaseLock(Mutex& mutex, bool locked) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
803 {
804     if (locked) mutex.unlock();
805 }
806 
dumpInternals(int fd)807 status_t AudioPolicyService::dumpInternals(int fd)
808 {
809     const size_t SIZE = 256;
810     char buffer[SIZE];
811     String8 result;
812 
813     snprintf(buffer, SIZE, "Supported System Usages:\n  ");
814     result.append(buffer);
815     std::stringstream msg;
816     size_t i = 0;
817     for (auto usage : mSupportedSystemUsages) {
818         if (i++ != 0) msg << ", ";
819         if (const char* strUsage = audio_usage_to_string(usage); strUsage) {
820             msg << strUsage;
821         } else {
822             msg << usage << " (unknown)";
823         }
824     }
825     if (i == 0) {
826         msg << "None";
827     }
828     msg << std::endl;
829     result.append(msg.str().c_str());
830 
831     write(fd, result.string(), result.size());
832 
833     mUidPolicy->dumpInternals(fd);
834     return NO_ERROR;
835 }
836 
updateUidStates()837 void AudioPolicyService::updateUidStates()
838 {
839     Mutex::Autolock _l(mLock);
840     updateUidStates_l();
841 }
842 
updateUidStates_l()843 void AudioPolicyService::updateUidStates_l()
844 {
845 //    Go over all active clients and allow capture (does not force silence) in the
846 //    following cases:
847 //    The client is in the active assistant list
848 //         AND is TOP
849 //               AND an accessibility service is TOP
850 //                  AND source is either VOICE_RECOGNITION OR HOTWORD
851 //               OR there is no active privacy sensitive capture or call
852 //                          OR client has CAPTURE_AUDIO_OUTPUT privileged permission
853 //                  AND source is VOICE_RECOGNITION OR HOTWORD
854 //    The client is an assistant AND active assistant is not being used
855 //        AND an accessibility service is on TOP or a RTT call is active
856 //                AND the source is VOICE_RECOGNITION or HOTWORD
857 //        OR there is no active privacy sensitive capture or call
858 //                OR client has CAPTURE_AUDIO_OUTPUT privileged permission
859 //            AND is TOP most recent assistant and uses VOICE_RECOGNITION or HOTWORD
860 //                OR there is no top recent assistant and source is HOTWORD
861 //    OR The client is an accessibility service
862 //        AND Is on TOP
863 //                AND the source is VOICE_RECOGNITION or HOTWORD
864 //            OR The assistant is not on TOP
865 //                AND there is no active privacy sensitive capture or call
866 //                    OR client has CAPTURE_AUDIO_OUTPUT privileged permission
867 //        AND is on TOP
868 //        AND the source is VOICE_RECOGNITION or HOTWORD
869 //    OR the client source is virtual (remote submix, call audio TX or RX...)
870 //    OR the client source is HOTWORD
871 //        AND is on TOP
872 //            OR all active clients are using HOTWORD source
873 //        AND no call is active
874 //            OR client has CAPTURE_AUDIO_OUTPUT privileged permission
875 //    OR the client is the current InputMethodService
876 //        AND a RTT call is active AND the source is VOICE_RECOGNITION
877 //    OR Any client
878 //        AND The assistant is not on TOP
879 //        AND is on TOP or latest started
880 //        AND there is no active privacy sensitive capture or call
881 //            OR client has CAPTURE_AUDIO_OUTPUT privileged permission
882 
883 
884     sp<AudioRecordClient> topActive;
885     sp<AudioRecordClient> latestActive;
886     sp<AudioRecordClient> topSensitiveActive;
887     sp<AudioRecordClient> latestSensitiveActiveOrComm;
888     sp<AudioRecordClient> latestActiveAssistant;
889 
890     nsecs_t topStartNs = 0;
891     nsecs_t latestStartNs = 0;
892     nsecs_t topSensitiveStartNs = 0;
893     nsecs_t latestSensitiveStartNs = 0;
894     nsecs_t latestAssistantStartNs = 0;
895     bool isA11yOnTop = mUidPolicy->isA11yOnTop();
896     bool isAssistantOnTop = false;
897     bool useActiveAssistantList = false;
898     bool isSensitiveActive = false;
899     bool isInCall = mPhoneState == AUDIO_MODE_IN_CALL;
900     bool isInCommunication = mPhoneState == AUDIO_MODE_IN_COMMUNICATION;
901     bool rttCallActive = (isInCall || isInCommunication)
902             && mUidPolicy->isRttEnabled();
903     bool onlyHotwordActive = true;
904     bool isPhoneStateOwnerActive = false;
905 
906     // if Sensor Privacy is enabled then all recordings should be silenced.
907     if (mSensorPrivacyPolicy->isSensorPrivacyEnabled()) {
908         silenceAllRecordings_l();
909         return;
910     }
911 
912     for (size_t i =0; i < mAudioRecordClients.size(); i++) {
913         sp<AudioRecordClient> current = mAudioRecordClients[i];
914         uid_t currentUid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(
915                 current->attributionSource.uid));
916         if (!current->active) {
917             continue;
918         }
919 
920         app_state_t appState = apmStatFromAmState(mUidPolicy->getUidState(currentUid));
921         // clients which app is in IDLE state are not eligible for top active or
922         // latest active
923         if (appState == APP_STATE_IDLE) {
924             continue;
925         }
926 
927         bool isAccessibility = mUidPolicy->isA11yUid(currentUid);
928         // Clients capturing for Accessibility services or virtual sources are not considered
929         // for top or latest active to avoid masking regular clients started before
930         if (!isAccessibility && !isVirtualSource(current->attributes.source)) {
931             bool isAssistant = mUidPolicy->isAssistantUid(currentUid);
932             bool isActiveAssistant = mUidPolicy->isActiveAssistantUid(currentUid);
933             bool isPrivacySensitive =
934                     (current->attributes.flags & AUDIO_FLAG_CAPTURE_PRIVATE) != 0;
935 
936             if (appState == APP_STATE_TOP) {
937                 if (isPrivacySensitive) {
938                     if (current->startTimeNs > topSensitiveStartNs) {
939                         topSensitiveActive = current;
940                         topSensitiveStartNs = current->startTimeNs;
941                     }
942                 } else {
943                     if (current->startTimeNs > topStartNs) {
944                         topActive = current;
945                         topStartNs = current->startTimeNs;
946                     }
947                 }
948                 if (isAssistant) {
949                     isAssistantOnTop = true;
950                     if (isActiveAssistant) {
951                         useActiveAssistantList = true;
952                     } else if (!useActiveAssistantList) {
953                         if (current->startTimeNs > latestAssistantStartNs) {
954                             latestActiveAssistant = current;
955                             latestAssistantStartNs = current->startTimeNs;
956                         }
957                     }
958                 }
959             }
960             // Clients capturing for HOTWORD are not considered
961             // for latest active to avoid masking regular clients started before
962             if (!(current->attributes.source == AUDIO_SOURCE_HOTWORD
963                     || ((isA11yOnTop || rttCallActive) && isAssistant))) {
964                 if (isPrivacySensitive) {
965                     // if audio mode is IN_COMMUNICATION, make sure the audio mode owner
966                     // is marked latest sensitive active even if another app qualifies.
967                     if (current->startTimeNs > latestSensitiveStartNs
968                             || (isInCommunication && currentUid == mPhoneStateOwnerUid)) {
969                         if (!isInCommunication || latestSensitiveActiveOrComm == nullptr
970                                 || VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(
971                                     latestSensitiveActiveOrComm->attributionSource.uid))
972                                         != mPhoneStateOwnerUid) {
973                             latestSensitiveActiveOrComm = current;
974                             latestSensitiveStartNs = current->startTimeNs;
975                         }
976                     }
977                     isSensitiveActive = true;
978                 } else {
979                     if (current->startTimeNs > latestStartNs) {
980                         latestActive = current;
981                         latestStartNs = current->startTimeNs;
982                     }
983                 }
984             }
985         }
986         if (current->attributes.source != AUDIO_SOURCE_HOTWORD) {
987             onlyHotwordActive = false;
988         }
989         if (currentUid == mPhoneStateOwnerUid &&
990                 !isVirtualSource(current->attributes.source)) {
991             isPhoneStateOwnerActive = true;
992         }
993     }
994 
995     // if no active client with UI on Top, consider latest active as top
996     if (topActive == nullptr) {
997         topActive = latestActive;
998         topStartNs = latestStartNs;
999     }
1000     if (topSensitiveActive == nullptr) {
1001         topSensitiveActive = latestSensitiveActiveOrComm;
1002         topSensitiveStartNs = latestSensitiveStartNs;
1003     } else if (latestSensitiveActiveOrComm != nullptr) {
1004         // if audio mode is IN_COMMUNICATION, favor audio mode owner over an app with
1005         // foreground UI in case both are capturing with privacy sensitive flag.
1006         uid_t latestActiveUid = VALUE_OR_FATAL(
1007             aidl2legacy_int32_t_uid_t(latestSensitiveActiveOrComm->attributionSource.uid));
1008         if (isInCommunication && latestActiveUid == mPhoneStateOwnerUid) {
1009             topSensitiveActive = latestSensitiveActiveOrComm;
1010             topSensitiveStartNs = latestSensitiveStartNs;
1011         }
1012     }
1013 
1014     // If both privacy sensitive and regular capture are active:
1015     //  if the regular capture is privileged
1016     //    allow concurrency
1017     //  else
1018     //    favor the privacy sensitive case
1019     if (topActive != nullptr && topSensitiveActive != nullptr
1020             && !topActive->canCaptureOutput) {
1021         topActive = nullptr;
1022     }
1023 
1024     for (size_t i =0; i < mAudioRecordClients.size(); i++) {
1025         sp<AudioRecordClient> current = mAudioRecordClients[i];
1026         uid_t currentUid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(
1027             current->attributionSource.uid));
1028         if (!current->active) {
1029             continue;
1030         }
1031 
1032         audio_source_t source = current->attributes.source;
1033         bool isTopOrLatestActive = topActive == nullptr ? false :
1034             current->attributionSource.uid == topActive->attributionSource.uid;
1035         bool isTopOrLatestSensitive = topSensitiveActive == nullptr ? false :
1036             current->attributionSource.uid == topSensitiveActive->attributionSource.uid;
1037         bool isTopOrLatestAssistant = latestActiveAssistant == nullptr ? false :
1038             current->attributionSource.uid == latestActiveAssistant->attributionSource.uid;
1039 
1040         auto canCaptureIfInCallOrCommunication = [&](const auto &recordClient) REQUIRES(mLock) {
1041             uid_t recordUid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(
1042                 recordClient->attributionSource.uid));
1043             bool canCaptureCall = recordClient->canCaptureOutput;
1044             bool canCaptureCommunication = recordClient->canCaptureOutput
1045                 || !isPhoneStateOwnerActive
1046                 || recordUid == mPhoneStateOwnerUid;
1047             return !(isInCall && !canCaptureCall)
1048                 && !(isInCommunication && !canCaptureCommunication);
1049         };
1050 
1051         // By default allow capture if:
1052         //     The assistant is not on TOP
1053         //     AND is on TOP or latest started
1054         //     AND there is no active privacy sensitive capture or call
1055         //             OR client has CAPTURE_AUDIO_OUTPUT privileged permission
1056         bool allowSensitiveCapture =
1057             !isSensitiveActive || isTopOrLatestSensitive || current->canCaptureOutput;
1058         bool allowCapture = !isAssistantOnTop
1059                 && (isTopOrLatestActive || isTopOrLatestSensitive)
1060                 && allowSensitiveCapture
1061                 && canCaptureIfInCallOrCommunication(current);
1062 
1063         if (!current->hasOp()) {
1064             // Never allow capture if app op is denied
1065             allowCapture = false;
1066         } else if (isVirtualSource(source)) {
1067             // Allow capture for virtual (remote submix, call audio TX or RX...) sources
1068             allowCapture = true;
1069         } else if (!useActiveAssistantList && mUidPolicy->isAssistantUid(currentUid)) {
1070             // For assistant allow capture if:
1071             //     Active assistant list is not being used
1072             //     AND accessibility service is on TOP or a RTT call is active
1073             //            AND the source is VOICE_RECOGNITION or HOTWORD
1074             //     OR there is no active privacy sensitive capture or call
1075             //          OR client has CAPTURE_AUDIO_OUTPUT privileged permission
1076             //            AND is latest TOP assistant AND
1077             //               uses VOICE_RECOGNITION OR uses HOTWORD
1078             //            OR there is no TOP assistant and uses HOTWORD
1079             if (isA11yOnTop || rttCallActive) {
1080                 if (source == AUDIO_SOURCE_HOTWORD || source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1081                     allowCapture = true;
1082                 }
1083             } else if (allowSensitiveCapture
1084                     && canCaptureIfInCallOrCommunication(current)) {
1085                 if (isTopOrLatestAssistant
1086                     && (source == AUDIO_SOURCE_VOICE_RECOGNITION
1087                         || source == AUDIO_SOURCE_HOTWORD)) {
1088                         allowCapture = true;
1089                 } else if (!isAssistantOnTop && (source == AUDIO_SOURCE_HOTWORD)) {
1090                     allowCapture = true;
1091                 }
1092             }
1093         } else if (useActiveAssistantList && mUidPolicy->isActiveAssistantUid(currentUid)) {
1094             // For assistant on active list and on top allow capture if:
1095             //     An accessibility service is on TOP
1096             //         AND the source is VOICE_RECOGNITION or HOTWORD
1097             //     OR there is no active privacy sensitive capture or call
1098             //             OR client has CAPTURE_AUDIO_OUTPUT privileged permission
1099             //         AND uses VOICE_RECOGNITION OR uses HOTWORD
1100             if (isA11yOnTop) {
1101                 if (source == AUDIO_SOURCE_HOTWORD || source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1102                     allowCapture = true;
1103                 }
1104             } else if (allowSensitiveCapture
1105                         && canCaptureIfInCallOrCommunication(current)) {
1106                 if ((source == AUDIO_SOURCE_VOICE_RECOGNITION) || (source == AUDIO_SOURCE_HOTWORD))
1107                 {
1108                     allowCapture = true;
1109                 }
1110             }
1111         } else if (mUidPolicy->isA11yUid(currentUid)) {
1112             // For accessibility service allow capture if:
1113             //     The assistant is not on TOP
1114             //         AND there is no active privacy sensitive capture or call
1115             //             OR client has CAPTURE_AUDIO_OUTPUT privileged permission
1116             //     OR
1117             //         Is on TOP AND the source is VOICE_RECOGNITION or HOTWORD
1118             if (!isAssistantOnTop
1119                     && allowSensitiveCapture
1120                     && canCaptureIfInCallOrCommunication(current)) {
1121                 allowCapture = true;
1122             }
1123             if (isA11yOnTop) {
1124                 if (source == AUDIO_SOURCE_VOICE_RECOGNITION || source == AUDIO_SOURCE_HOTWORD) {
1125                     allowCapture = true;
1126                 }
1127             }
1128         } else if (source == AUDIO_SOURCE_HOTWORD) {
1129             // For HOTWORD source allow capture when not on TOP if:
1130             //     All active clients are using HOTWORD source
1131             //     AND no call is active
1132             //         OR client has CAPTURE_AUDIO_OUTPUT privileged permission
1133             if (onlyHotwordActive
1134                     && canCaptureIfInCallOrCommunication(current)) {
1135                 allowCapture = true;
1136             }
1137         } else if (mUidPolicy->isCurrentImeUid(currentUid)) {
1138             // For current InputMethodService allow capture if:
1139             //     A RTT call is active AND the source is VOICE_RECOGNITION
1140             if (rttCallActive && source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1141                 allowCapture = true;
1142             }
1143         }
1144         setAppState_l(current,
1145                       allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(currentUid)) :
1146                                 APP_STATE_IDLE);
1147     }
1148 }
1149 
silenceAllRecordings_l()1150 void AudioPolicyService::silenceAllRecordings_l() {
1151     for (size_t i = 0; i < mAudioRecordClients.size(); i++) {
1152         sp<AudioRecordClient> current = mAudioRecordClients[i];
1153         if (!isVirtualSource(current->attributes.source)) {
1154             setAppState_l(current, APP_STATE_IDLE);
1155         }
1156     }
1157 }
1158 
1159 /* static */
apmStatFromAmState(int amState)1160 app_state_t AudioPolicyService::apmStatFromAmState(int amState) {
1161 
1162     if (amState == ActivityManager::PROCESS_STATE_UNKNOWN) {
1163         return APP_STATE_IDLE;
1164     } else if (amState <= ActivityManager::PROCESS_STATE_TOP) {
1165       // include persistent services
1166       return APP_STATE_TOP;
1167     }
1168     return APP_STATE_FOREGROUND;
1169 }
1170 
1171 /* static */
isVirtualSource(audio_source_t source)1172 bool AudioPolicyService::isVirtualSource(audio_source_t source)
1173 {
1174     switch (source) {
1175         case AUDIO_SOURCE_VOICE_UPLINK:
1176         case AUDIO_SOURCE_VOICE_DOWNLINK:
1177         case AUDIO_SOURCE_VOICE_CALL:
1178         case AUDIO_SOURCE_REMOTE_SUBMIX:
1179         case AUDIO_SOURCE_FM_TUNER:
1180         case AUDIO_SOURCE_ECHO_REFERENCE:
1181             return true;
1182         default:
1183             break;
1184     }
1185     return false;
1186 }
1187 
1188 /* static */
isAppOpSource(audio_source_t source)1189 bool AudioPolicyService::isAppOpSource(audio_source_t source)
1190 {
1191     switch (source) {
1192         case AUDIO_SOURCE_FM_TUNER:
1193         case AUDIO_SOURCE_ECHO_REFERENCE:
1194         case AUDIO_SOURCE_REMOTE_SUBMIX:
1195             return false;
1196         default:
1197             break;
1198     }
1199     return true;
1200 }
1201 
setAppState_l(sp<AudioRecordClient> client,app_state_t state)1202 void AudioPolicyService::setAppState_l(sp<AudioRecordClient> client, app_state_t state)
1203 {
1204     AutoCallerClear acc;
1205 
1206     if (mAudioPolicyManager) {
1207         mAudioPolicyManager->setAppState(client->portId, state);
1208     }
1209     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
1210     if (af) {
1211         bool silenced = state == APP_STATE_IDLE;
1212         if (client->silenced != silenced) {
1213             if (client->active) {
1214                 if (silenced) {
1215                     finishRecording(client->attributionSource, client->attributes.source);
1216                 } else {
1217                     std::stringstream msg;
1218                     msg << "Audio recording un-silenced on session " << client->session;
1219                     if (!startRecording(client->attributionSource, String16(msg.str().c_str()),
1220                             client->attributes.source)) {
1221                         silenced = true;
1222                     }
1223                 }
1224             }
1225             af->setRecordSilenced(client->portId, silenced);
1226             client->silenced = silenced;
1227         }
1228     }
1229 }
1230 
dump(int fd,const Vector<String16> & args __unused)1231 status_t AudioPolicyService::dump(int fd, const Vector<String16>& args __unused)
1232 {
1233     if (!dumpAllowed()) {
1234         dumpPermissionDenial(fd);
1235     } else {
1236         const bool locked = dumpTryLock(mLock);
1237         if (!locked) {
1238             String8 result(kDeadlockedString);
1239             write(fd, result.string(), result.size());
1240         }
1241 
1242         dumpInternals(fd);
1243 
1244         String8 actPtr = String8::format("AudioCommandThread: %p\n", mAudioCommandThread.get());
1245         write(fd, actPtr.string(), actPtr.size());
1246         if (mAudioCommandThread != 0) {
1247             mAudioCommandThread->dump(fd);
1248         }
1249 
1250         String8 octPtr = String8::format("OutputCommandThread: %p\n", mOutputCommandThread.get());
1251         write(fd, octPtr.string(), octPtr.size());
1252         if (mOutputCommandThread != 0) {
1253             mOutputCommandThread->dump(fd);
1254         }
1255 
1256         if (mAudioPolicyManager) {
1257             mAudioPolicyManager->dump(fd);
1258         } else {
1259             String8 apmPtr = String8::format("AudioPolicyManager: %p\n", mAudioPolicyManager);
1260             write(fd, apmPtr.string(), apmPtr.size());
1261         }
1262 
1263         mPackageManager.dump(fd);
1264 
1265         dumpReleaseLock(mLock, locked);
1266 
1267         if (mSpatializer != nullptr) {
1268             std::string dumpString = mSpatializer->toString(1 /* level */);
1269             write(fd, dumpString.c_str(), dumpString.size());
1270         } else {
1271             String8 spatializerPtr = String8::format("Spatializer no supportted on this device\n");
1272             write(fd, spatializerPtr.c_str(), spatializerPtr.size());
1273         }
1274 
1275         {
1276             std::string timeCheckStats = getIAudioPolicyServiceStatistics().dump();
1277             dprintf(fd, "\nIAudioPolicyService binder call profile\n");
1278             write(fd, timeCheckStats.c_str(), timeCheckStats.size());
1279         }
1280     }
1281     return NO_ERROR;
1282 }
1283 
dumpPermissionDenial(int fd)1284 status_t AudioPolicyService::dumpPermissionDenial(int fd)
1285 {
1286     const size_t SIZE = 256;
1287     char buffer[SIZE];
1288     String8 result;
1289     snprintf(buffer, SIZE, "Permission Denial: "
1290             "can't dump AudioPolicyService from pid=%d, uid=%d\n",
1291             IPCThreadState::self()->getCallingPid(),
1292             IPCThreadState::self()->getCallingUid());
1293     result.append(buffer);
1294     write(fd, result.string(), result.size());
1295     return NO_ERROR;
1296 }
1297 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)1298 status_t AudioPolicyService::onTransact(
1299         uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
1300     // make sure transactions reserved to AudioFlinger do not come from other processes
1301     switch (code) {
1302         case TRANSACTION_startOutput:
1303         case TRANSACTION_stopOutput:
1304         case TRANSACTION_releaseOutput:
1305         case TRANSACTION_getInputForAttr:
1306         case TRANSACTION_startInput:
1307         case TRANSACTION_stopInput:
1308         case TRANSACTION_releaseInput:
1309         case TRANSACTION_getOutputForEffect:
1310         case TRANSACTION_registerEffect:
1311         case TRANSACTION_unregisterEffect:
1312         case TRANSACTION_setEffectEnabled:
1313         case TRANSACTION_getStrategyForStream:
1314         case TRANSACTION_getOutputForAttr:
1315         case TRANSACTION_moveEffectsToIo:
1316             ALOGW("%s: transaction %d received from PID %d",
1317                   __func__, code, IPCThreadState::self()->getCallingPid());
1318             return INVALID_OPERATION;
1319         default:
1320             break;
1321     }
1322 
1323     // make sure the following transactions come from system components
1324     switch (code) {
1325         case TRANSACTION_setDeviceConnectionState:
1326         case TRANSACTION_handleDeviceConfigChange:
1327         case TRANSACTION_setPhoneState:
1328 //FIXME: Allow setForceUse calls from system apps until a better use case routing API is available
1329 //      case TRANSACTION_setForceUse:
1330         case TRANSACTION_initStreamVolume:
1331         case TRANSACTION_setStreamVolumeIndex:
1332         case TRANSACTION_setVolumeIndexForAttributes:
1333         case TRANSACTION_getStreamVolumeIndex:
1334         case TRANSACTION_getVolumeIndexForAttributes:
1335         case TRANSACTION_getMinVolumeIndexForAttributes:
1336         case TRANSACTION_getMaxVolumeIndexForAttributes:
1337         case TRANSACTION_isStreamActive:
1338         case TRANSACTION_isStreamActiveRemotely:
1339         case TRANSACTION_isSourceActive:
1340         case TRANSACTION_registerPolicyMixes:
1341         case TRANSACTION_setMasterMono:
1342         case TRANSACTION_getSurroundFormats:
1343         case TRANSACTION_getReportedSurroundFormats:
1344         case TRANSACTION_setSurroundFormatEnabled:
1345         case TRANSACTION_setAssistantServicesUids:
1346         case TRANSACTION_setActiveAssistantServicesUids:
1347         case TRANSACTION_setA11yServicesUids:
1348         case TRANSACTION_setUidDeviceAffinities:
1349         case TRANSACTION_removeUidDeviceAffinities:
1350         case TRANSACTION_setUserIdDeviceAffinities:
1351         case TRANSACTION_removeUserIdDeviceAffinities:
1352         case TRANSACTION_getHwOffloadFormatsSupportedForBluetoothMedia:
1353         case TRANSACTION_listAudioVolumeGroups:
1354         case TRANSACTION_getVolumeGroupFromAudioAttributes:
1355         case TRANSACTION_acquireSoundTriggerSession:
1356         case TRANSACTION_releaseSoundTriggerSession:
1357         case TRANSACTION_isHotwordStreamSupported:
1358         case TRANSACTION_setRttEnabled:
1359         case TRANSACTION_isCallScreenModeSupported:
1360         case TRANSACTION_setDevicesRoleForStrategy:
1361         case TRANSACTION_setSupportedSystemUsages:
1362         case TRANSACTION_removeDevicesRoleForStrategy:
1363         case TRANSACTION_clearDevicesRoleForStrategy:
1364         case TRANSACTION_getDevicesForRoleAndStrategy:
1365         case TRANSACTION_getDevicesForAttributes:
1366         case TRANSACTION_setAllowedCapturePolicy:
1367         case TRANSACTION_onNewAudioModulesAvailable:
1368         case TRANSACTION_setCurrentImeUid:
1369         case TRANSACTION_registerSoundTriggerCaptureStateListener:
1370         case TRANSACTION_setDevicesRoleForCapturePreset:
1371         case TRANSACTION_addDevicesRoleForCapturePreset:
1372         case TRANSACTION_removeDevicesRoleForCapturePreset:
1373         case TRANSACTION_clearDevicesRoleForCapturePreset:
1374         case TRANSACTION_getDevicesForRoleAndCapturePreset:
1375         case TRANSACTION_getSpatializer:
1376         case TRANSACTION_setPreferredMixerAttributes:
1377         case TRANSACTION_clearPreferredMixerAttributes: {
1378             if (!isServiceUid(IPCThreadState::self()->getCallingUid())) {
1379                 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d",
1380                       __func__, code, IPCThreadState::self()->getCallingPid(),
1381                       IPCThreadState::self()->getCallingUid());
1382                 return INVALID_OPERATION;
1383             }
1384         } break;
1385         default:
1386             break;
1387     }
1388 
1389     const std::string methodName = getIAudioPolicyServiceStatistics().getMethodForCode(code);
1390     mediautils::TimeCheck check(
1391             std::string("IAudioPolicyService::").append(methodName),
1392             [code, methodName](bool timeout, float elapsedMs) { // don't move methodName.
1393         if (timeout) {
1394             mediametrics::LogItem(AMEDIAMETRICS_KEY_AUDIO_POLICY)
1395                 .set(AMEDIAMETRICS_PROP_EVENT, AMEDIAMETRICS_PROP_EVENT_VALUE_TIMEOUT)
1396                 .set(AMEDIAMETRICS_PROP_METHODCODE, int64_t(code))
1397                 .set(AMEDIAMETRICS_PROP_METHODNAME, methodName.c_str())
1398                 .record();
1399         } else {
1400             getIAudioPolicyServiceStatistics().event(code, elapsedMs);
1401         }
1402     }, mediautils::TimeCheck::kDefaultTimeoutDuration,
1403     mediautils::TimeCheck::kDefaultSecondChanceDuration,
1404     true /* crashOnTimeout */);
1405 
1406     switch (code) {
1407         case SHELL_COMMAND_TRANSACTION: {
1408             int in = data.readFileDescriptor();
1409             int out = data.readFileDescriptor();
1410             int err = data.readFileDescriptor();
1411             int argc = data.readInt32();
1412             Vector<String16> args;
1413             for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
1414                args.add(data.readString16());
1415             }
1416             sp<IBinder> unusedCallback;
1417             sp<IResultReceiver> resultReceiver;
1418             status_t status;
1419             if ((status = data.readNullableStrongBinder(&unusedCallback)) != NO_ERROR) {
1420                 return status;
1421             }
1422             if ((status = data.readNullableStrongBinder(&resultReceiver)) != NO_ERROR) {
1423                 return status;
1424             }
1425             status = shellCommand(in, out, err, args);
1426             if (resultReceiver != nullptr) {
1427                 resultReceiver->send(status);
1428             }
1429             return NO_ERROR;
1430         }
1431     }
1432 
1433     return BnAudioPolicyService::onTransact(code, data, reply, flags);
1434 }
1435 
1436 // ------------------- Shell command implementation -------------------
1437 
1438 // NOTE: This is a remote API - make sure all args are validated
shellCommand(int in,int out,int err,Vector<String16> & args)1439 status_t AudioPolicyService::shellCommand(int in, int out, int err, Vector<String16>& args) {
1440     if (!checkCallingPermission(sManageAudioPolicyPermission, nullptr, nullptr)) {
1441         return PERMISSION_DENIED;
1442     }
1443     if (in == BAD_TYPE || out == BAD_TYPE || err == BAD_TYPE) {
1444         return BAD_VALUE;
1445     }
1446     if (args.size() >= 3 && args[0] == String16("set-uid-state")) {
1447         return handleSetUidState(args, err);
1448     } else if (args.size() >= 2 && args[0] == String16("reset-uid-state")) {
1449         return handleResetUidState(args, err);
1450     } else if (args.size() >= 2 && args[0] == String16("get-uid-state")) {
1451         return handleGetUidState(args, out, err);
1452     } else if (args.size() >= 1 && args[0] == String16("purge_permission-cache")) {
1453         purgePermissionCache();
1454         return NO_ERROR;
1455     } else if (args.size() == 1 && args[0] == String16("help")) {
1456         printHelp(out);
1457         return NO_ERROR;
1458     }
1459     printHelp(err);
1460     return BAD_VALUE;
1461 }
1462 
getUidForPackage(String16 packageName,int userId,uid_t & uid,int err)1463 static status_t getUidForPackage(String16 packageName, int userId, /*inout*/uid_t& uid, int err) {
1464     if (userId < 0) {
1465         ALOGE("Invalid user: %d", userId);
1466         dprintf(err, "Invalid user: %d\n", userId);
1467         return BAD_VALUE;
1468     }
1469 
1470     PermissionController pc;
1471     uid = pc.getPackageUid(packageName, 0);
1472     if (uid <= 0) {
1473         ALOGE("Unknown package: '%s'", String8(packageName).string());
1474         dprintf(err, "Unknown package: '%s'\n", String8(packageName).string());
1475         return BAD_VALUE;
1476     }
1477 
1478     uid = multiuser_get_uid(userId, uid);
1479     return NO_ERROR;
1480 }
1481 
handleSetUidState(Vector<String16> & args,int err)1482 status_t AudioPolicyService::handleSetUidState(Vector<String16>& args, int err) {
1483     // Valid arg.size() is 3 or 5, args.size() is 5 with --user option.
1484     if (!(args.size() == 3 || args.size() == 5)) {
1485         printHelp(err);
1486         return BAD_VALUE;
1487     }
1488 
1489     bool active = false;
1490     if (args[2] == String16("active")) {
1491         active = true;
1492     } else if ((args[2] != String16("idle"))) {
1493         ALOGE("Expected active or idle but got: '%s'", String8(args[2]).string());
1494         return BAD_VALUE;
1495     }
1496 
1497     int userId = 0;
1498     if (args.size() >= 5 && args[3] == String16("--user")) {
1499         userId = atoi(String8(args[4]));
1500     }
1501 
1502     uid_t uid;
1503     if (getUidForPackage(args[1], userId, uid, err) == BAD_VALUE) {
1504         return BAD_VALUE;
1505     }
1506 
1507     sp<UidPolicy> uidPolicy;
1508     {
1509         Mutex::Autolock _l(mLock);
1510         uidPolicy = mUidPolicy;
1511     }
1512     if (uidPolicy) {
1513         uidPolicy->addOverrideUid(uid, active);
1514         return NO_ERROR;
1515     }
1516     return NO_INIT;
1517 }
1518 
handleResetUidState(Vector<String16> & args,int err)1519 status_t AudioPolicyService::handleResetUidState(Vector<String16>& args, int err) {
1520     // Valid arg.size() is 2 or 4, args.size() is 4 with --user option.
1521     if (!(args.size() == 2 || args.size() == 4)) {
1522         printHelp(err);
1523         return BAD_VALUE;
1524     }
1525 
1526     int userId = 0;
1527     if (args.size() >= 4 && args[2] == String16("--user")) {
1528         userId = atoi(String8(args[3]));
1529     }
1530 
1531     uid_t uid;
1532     if (getUidForPackage(args[1], userId, uid, err) == BAD_VALUE) {
1533         return BAD_VALUE;
1534     }
1535 
1536     sp<UidPolicy> uidPolicy;
1537     {
1538         Mutex::Autolock _l(mLock);
1539         uidPolicy = mUidPolicy;
1540     }
1541     if (uidPolicy) {
1542         uidPolicy->removeOverrideUid(uid);
1543         return NO_ERROR;
1544     }
1545     return NO_INIT;
1546 }
1547 
handleGetUidState(Vector<String16> & args,int out,int err)1548 status_t AudioPolicyService::handleGetUidState(Vector<String16>& args, int out, int err) {
1549     // Valid arg.size() is 2 or 4, args.size() is 4 with --user option.
1550     if (!(args.size() == 2 || args.size() == 4)) {
1551         printHelp(err);
1552         return BAD_VALUE;
1553     }
1554 
1555     int userId = 0;
1556     if (args.size() >= 4 && args[2] == String16("--user")) {
1557         userId = atoi(String8(args[3]));
1558     }
1559 
1560     uid_t uid;
1561     if (getUidForPackage(args[1], userId, uid, err) == BAD_VALUE) {
1562         return BAD_VALUE;
1563     }
1564 
1565     sp<UidPolicy> uidPolicy;
1566     {
1567         Mutex::Autolock _l(mLock);
1568         uidPolicy = mUidPolicy;
1569     }
1570     if (uidPolicy) {
1571         return dprintf(out, uidPolicy->isUidActive(uid) ? "active\n" : "idle\n");
1572     }
1573     return NO_INIT;
1574 }
1575 
printHelp(int out)1576 status_t AudioPolicyService::printHelp(int out) {
1577     return dprintf(out, "Audio policy service commands:\n"
1578         "  get-uid-state <PACKAGE> [--user USER_ID] gets the uid state\n"
1579         "  set-uid-state <PACKAGE> <active|idle> [--user USER_ID] overrides the uid state\n"
1580         "  reset-uid-state <PACKAGE> [--user USER_ID] clears the uid state override\n"
1581         "  help print this message\n");
1582 }
1583 
registerOutput(audio_io_handle_t output,const audio_config_base_t & config,const audio_output_flags_t flags)1584 status_t AudioPolicyService::registerOutput(audio_io_handle_t output,
1585                         const audio_config_base_t& config,
1586                         const audio_output_flags_t flags) {
1587     return mUsecaseValidator->registerStream(output, config, flags);
1588 }
1589 
unregisterOutput(audio_io_handle_t output)1590 status_t AudioPolicyService::unregisterOutput(audio_io_handle_t output) {
1591     return mUsecaseValidator->unregisterStream(output);
1592 }
1593 
1594 // -----------  AudioPolicyService::UidPolicy implementation ----------
1595 
registerSelf()1596 void AudioPolicyService::UidPolicy::registerSelf() {
1597     status_t res = mAm.linkToDeath(this);
1598     mAm.registerUidObserver(this, ActivityManager::UID_OBSERVER_GONE
1599             | ActivityManager::UID_OBSERVER_IDLE
1600             | ActivityManager::UID_OBSERVER_ACTIVE
1601             | ActivityManager::UID_OBSERVER_PROCSTATE,
1602             ActivityManager::PROCESS_STATE_UNKNOWN,
1603             String16("audioserver"));
1604     if (!res) {
1605         Mutex::Autolock _l(mLock);
1606         mObserverRegistered = true;
1607     } else {
1608         ALOGE("UidPolicy::registerSelf linkToDeath failed: %d", res);
1609 
1610         mAm.unregisterUidObserver(this);
1611     }
1612 }
1613 
unregisterSelf()1614 void AudioPolicyService::UidPolicy::unregisterSelf() {
1615     mAm.unlinkToDeath(this);
1616     mAm.unregisterUidObserver(this);
1617     Mutex::Autolock _l(mLock);
1618     mObserverRegistered = false;
1619 }
1620 
binderDied(__unused const wp<IBinder> & who)1621 void AudioPolicyService::UidPolicy::binderDied(__unused const wp<IBinder> &who) {
1622     Mutex::Autolock _l(mLock);
1623     mCachedUids.clear();
1624     mObserverRegistered = false;
1625 }
1626 
checkRegistered()1627 void AudioPolicyService::UidPolicy::checkRegistered() {
1628     bool needToReregister = false;
1629     {
1630         Mutex::Autolock _l(mLock);
1631         needToReregister = !mObserverRegistered;
1632     }
1633     if (needToReregister) {
1634         // Looks like ActivityManager has died previously, attempt to re-register.
1635         registerSelf();
1636     }
1637 }
1638 
isUidActive(uid_t uid)1639 bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) {
1640     if (isServiceUid(uid)) return true;
1641     checkRegistered();
1642     {
1643         Mutex::Autolock _l(mLock);
1644         auto overrideIter = mOverrideUids.find(uid);
1645         if (overrideIter != mOverrideUids.end()) {
1646             return overrideIter->second.first;
1647         }
1648         // In an absense of the ActivityManager, assume everything to be active.
1649         if (!mObserverRegistered) return true;
1650         auto cacheIter = mCachedUids.find(uid);
1651         if (cacheIter != mCachedUids.end()) {
1652             return cacheIter->second.first;
1653         }
1654     }
1655     ActivityManager am;
1656     bool active = am.isUidActive(uid, String16("audioserver"));
1657     {
1658         Mutex::Autolock _l(mLock);
1659         mCachedUids.insert(std::pair<uid_t,
1660                            std::pair<bool, int>>(uid, std::pair<bool, int>(active,
1661                                                       ActivityManager::PROCESS_STATE_UNKNOWN)));
1662     }
1663     return active;
1664 }
1665 
getUidState(uid_t uid)1666 int AudioPolicyService::UidPolicy::getUidState(uid_t uid) {
1667     if (isServiceUid(uid)) {
1668         return ActivityManager::PROCESS_STATE_TOP;
1669     }
1670     checkRegistered();
1671     {
1672         Mutex::Autolock _l(mLock);
1673         auto overrideIter = mOverrideUids.find(uid);
1674         if (overrideIter != mOverrideUids.end()) {
1675             if (overrideIter->second.first) {
1676                 if (overrideIter->second.second != ActivityManager::PROCESS_STATE_UNKNOWN) {
1677                     return overrideIter->second.second;
1678                 } else {
1679                     auto cacheIter = mCachedUids.find(uid);
1680                     if (cacheIter != mCachedUids.end()) {
1681                         return cacheIter->second.second;
1682                     }
1683                 }
1684             }
1685             return ActivityManager::PROCESS_STATE_UNKNOWN;
1686         }
1687         // In an absense of the ActivityManager, assume everything to be active.
1688         if (!mObserverRegistered) {
1689             return ActivityManager::PROCESS_STATE_TOP;
1690         }
1691         auto cacheIter = mCachedUids.find(uid);
1692         if (cacheIter != mCachedUids.end()) {
1693             if (cacheIter->second.first) {
1694                 return cacheIter->second.second;
1695             } else {
1696                 return ActivityManager::PROCESS_STATE_UNKNOWN;
1697             }
1698         }
1699     }
1700     ActivityManager am;
1701     bool active = am.isUidActive(uid, String16("audioserver"));
1702     int state = ActivityManager::PROCESS_STATE_UNKNOWN;
1703     if (active) {
1704         state = am.getUidProcessState(uid, String16("audioserver"));
1705     }
1706     {
1707         Mutex::Autolock _l(mLock);
1708         mCachedUids.insert(std::pair<uid_t,
1709                            std::pair<bool, int>>(uid, std::pair<bool, int>(active, state)));
1710     }
1711 
1712     return state;
1713 }
1714 
onUidActive(uid_t uid)1715 void AudioPolicyService::UidPolicy::onUidActive(uid_t uid) {
1716     updateUid(&mCachedUids, uid, true, ActivityManager::PROCESS_STATE_UNKNOWN, true);
1717 }
1718 
onUidGone(uid_t uid,__unused bool disabled)1719 void AudioPolicyService::UidPolicy::onUidGone(uid_t uid, __unused bool disabled) {
1720     updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, false);
1721 }
1722 
onUidIdle(uid_t uid,__unused bool disabled)1723 void AudioPolicyService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
1724     updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, true);
1725 }
1726 
onUidStateChanged(uid_t uid,int32_t procState,int64_t procStateSeq __unused,int32_t capability __unused)1727 void AudioPolicyService::UidPolicy::onUidStateChanged(uid_t uid,
1728                                                       int32_t procState,
1729                                                       int64_t procStateSeq __unused,
1730                                                       int32_t capability __unused) {
1731     if (procState != ActivityManager::PROCESS_STATE_UNKNOWN) {
1732         updateUid(&mCachedUids, uid, true, procState, true);
1733     }
1734 }
1735 
onUidProcAdjChanged(uid_t uid __unused,int32_t adj __unused)1736 void AudioPolicyService::UidPolicy::onUidProcAdjChanged(uid_t uid __unused, int32_t adj __unused) {
1737 }
1738 
updateOverrideUid(uid_t uid,bool active,bool insert)1739 void AudioPolicyService::UidPolicy::updateOverrideUid(uid_t uid, bool active, bool insert) {
1740     updateUid(&mOverrideUids, uid, active, ActivityManager::PROCESS_STATE_UNKNOWN, insert);
1741 }
1742 
notifyService()1743 void AudioPolicyService::UidPolicy::notifyService() {
1744     sp<AudioPolicyService> service = mService.promote();
1745     if (service != nullptr) {
1746         service->updateUidStates();
1747     }
1748 }
1749 
updateUid(std::unordered_map<uid_t,std::pair<bool,int>> * uids,uid_t uid,bool active,int state,bool insert)1750 void AudioPolicyService::UidPolicy::updateUid(std::unordered_map<uid_t,
1751                                               std::pair<bool, int>> *uids,
1752                                               uid_t uid,
1753                                               bool active,
1754                                               int state,
1755                                               bool insert) {
1756     if (isServiceUid(uid)) {
1757         return;
1758     }
1759     bool wasActive = isUidActive(uid);
1760     int previousState = getUidState(uid);
1761     {
1762         Mutex::Autolock _l(mLock);
1763         updateUidLocked(uids, uid, active, state, insert);
1764     }
1765     if (wasActive != isUidActive(uid) || state != previousState) {
1766         notifyService();
1767     }
1768 }
1769 
updateUidLocked(std::unordered_map<uid_t,std::pair<bool,int>> * uids,uid_t uid,bool active,int state,bool insert)1770 void AudioPolicyService::UidPolicy::updateUidLocked(std::unordered_map<uid_t,
1771                                                     std::pair<bool, int>> *uids,
1772                                                     uid_t uid,
1773                                                     bool active,
1774                                                     int state,
1775                                                     bool insert) {
1776     auto it = uids->find(uid);
1777     if (it != uids->end()) {
1778         if (insert) {
1779             if (state == ActivityManager::PROCESS_STATE_UNKNOWN) {
1780                 it->second.first = active;
1781             }
1782             if (it->second.first) {
1783                 it->second.second = state;
1784             } else {
1785                 it->second.second = ActivityManager::PROCESS_STATE_UNKNOWN;
1786             }
1787         } else {
1788             uids->erase(it);
1789         }
1790     } else if (insert && (state == ActivityManager::PROCESS_STATE_UNKNOWN)) {
1791         uids->insert(std::pair<uid_t, std::pair<bool, int>>(uid,
1792                                       std::pair<bool, int>(active, state)));
1793     }
1794 }
1795 
isA11yOnTop()1796 bool AudioPolicyService::UidPolicy::isA11yOnTop() {
1797     Mutex::Autolock _l(mLock);
1798     for (const auto &uid : mCachedUids) {
1799         if (!isA11yUid(uid.first)) {
1800             continue;
1801         }
1802         if (uid.second.second >= ActivityManager::PROCESS_STATE_TOP
1803                 && uid.second.second <= ActivityManager::PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
1804             return true;
1805         }
1806     }
1807     return false;
1808 }
1809 
isA11yUid(uid_t uid)1810 bool AudioPolicyService::UidPolicy::isA11yUid(uid_t uid)
1811 {
1812     std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid);
1813     return it != mA11yUids.end();
1814 }
1815 
setAssistantUids(const std::vector<uid_t> & uids)1816 void AudioPolicyService::UidPolicy::setAssistantUids(const std::vector<uid_t>& uids) {
1817     mAssistantUids.clear();
1818     mAssistantUids = uids;
1819 }
1820 
isAssistantUid(uid_t uid)1821 bool AudioPolicyService::UidPolicy::isAssistantUid(uid_t uid)
1822 {
1823     std::vector<uid_t>::iterator it = find(mAssistantUids.begin(), mAssistantUids.end(), uid);
1824     return it != mAssistantUids.end();
1825 }
1826 
setActiveAssistantUids(const std::vector<uid_t> & activeUids)1827 void AudioPolicyService::UidPolicy::setActiveAssistantUids(const std::vector<uid_t>& activeUids) {
1828     mActiveAssistantUids = activeUids;
1829 }
1830 
isActiveAssistantUid(uid_t uid)1831 bool AudioPolicyService::UidPolicy::isActiveAssistantUid(uid_t uid)
1832 {
1833     std::vector<uid_t>::iterator it = find(mActiveAssistantUids.begin(),
1834             mActiveAssistantUids.end(), uid);
1835     return it != mActiveAssistantUids.end();
1836 }
1837 
dumpInternals(int fd)1838 void AudioPolicyService::UidPolicy::dumpInternals(int fd) {
1839     const size_t SIZE = 256;
1840     char buffer[SIZE];
1841     String8 result;
1842     auto appendUidsToResult = [&](const char* title, const std::vector<uid_t> &uids) {
1843         snprintf(buffer, SIZE, "\t%s: \n", title);
1844         result.append(buffer);
1845         int counter = 0;
1846         if (uids.empty()) {
1847             snprintf(buffer, SIZE, "\t\tNo UIDs present.\n");
1848             result.append(buffer);
1849             return;
1850         }
1851         for (const auto &uid : uids) {
1852             snprintf(buffer, SIZE, "\t\tUID[%d]=%d\n", counter++, uid);
1853             result.append(buffer);
1854         }
1855     };
1856 
1857     snprintf(buffer, SIZE, "UID Policy:\n");
1858     result.append(buffer);
1859     snprintf(buffer, SIZE, "\tmObserverRegistered=%s\n",(mObserverRegistered ? "True":"False"));
1860     result.append(buffer);
1861 
1862     appendUidsToResult("Assistants UIDs", mAssistantUids);
1863     appendUidsToResult("Active Assistants UIDs", mActiveAssistantUids);
1864 
1865     appendUidsToResult("Accessibility UIDs", mA11yUids);
1866 
1867     snprintf(buffer, SIZE, "\tInput Method Service UID=%d\n", mCurrentImeUid);
1868     result.append(buffer);
1869 
1870     snprintf(buffer, SIZE, "\tIs RTT Enabled: %s\n", (mRttEnabled ? "True":"False"));
1871     result.append(buffer);
1872 
1873     write(fd, result.string(), result.size());
1874 }
1875 
1876 // -----------  AudioPolicyService::SensorPrivacyService implementation ----------
registerSelf()1877 void AudioPolicyService::SensorPrivacyPolicy::registerSelf() {
1878     SensorPrivacyManager spm;
1879     mSensorPrivacyEnabled = spm.isSensorPrivacyEnabled();
1880     spm.addSensorPrivacyListener(this);
1881 }
1882 
unregisterSelf()1883 void AudioPolicyService::SensorPrivacyPolicy::unregisterSelf() {
1884     SensorPrivacyManager spm;
1885     spm.removeSensorPrivacyListener(this);
1886 }
1887 
isSensorPrivacyEnabled()1888 bool AudioPolicyService::SensorPrivacyPolicy::isSensorPrivacyEnabled() {
1889     return mSensorPrivacyEnabled;
1890 }
1891 
onSensorPrivacyChanged(int toggleType __unused,int sensor __unused,bool enabled)1892 binder::Status AudioPolicyService::SensorPrivacyPolicy::onSensorPrivacyChanged(
1893     int toggleType __unused, int sensor __unused, bool enabled) {
1894     mSensorPrivacyEnabled = enabled;
1895     sp<AudioPolicyService> service = mService.promote();
1896     if (service != nullptr) {
1897         service->updateUidStates();
1898     }
1899     return binder::Status::ok();
1900 }
1901 
1902 // -----------  AudioPolicyService::OpRecordAudioMonitor implementation ----------
1903 
1904 // static
1905 sp<AudioPolicyService::OpRecordAudioMonitor>
createIfNeeded(const AttributionSourceState & attributionSource,const audio_attributes_t & attr,wp<AudioCommandThread> commandThread)1906 AudioPolicyService::OpRecordAudioMonitor::createIfNeeded(
1907             const AttributionSourceState& attributionSource, const audio_attributes_t& attr,
1908             wp<AudioCommandThread> commandThread)
1909 {
1910     if (isAudioServerOrRootUid(attributionSource.uid)) {
1911         ALOGV("not silencing record for audio or root source %s",
1912                 attributionSource.toString().c_str());
1913         return nullptr;
1914     }
1915 
1916     if (!AudioPolicyService::isAppOpSource(attr.source)) {
1917         ALOGD("not monitoring app op for uid %d and source %d",
1918                 attributionSource.uid, attr.source);
1919         return nullptr;
1920     }
1921 
1922     if (!attributionSource.packageName.has_value()
1923             || attributionSource.packageName.value().size() == 0) {
1924         return nullptr;
1925     }
1926     return new OpRecordAudioMonitor(attributionSource, getOpForSource(attr.source), commandThread);
1927 }
1928 
OpRecordAudioMonitor(const AttributionSourceState & attributionSource,int32_t appOp,wp<AudioCommandThread> commandThread)1929 AudioPolicyService::OpRecordAudioMonitor::OpRecordAudioMonitor(
1930         const AttributionSourceState& attributionSource, int32_t appOp,
1931         wp<AudioCommandThread> commandThread) :
1932             mHasOp(true), mAttributionSource(attributionSource), mAppOp(appOp),
1933             mCommandThread(commandThread)
1934 {
1935 }
1936 
~OpRecordAudioMonitor()1937 AudioPolicyService::OpRecordAudioMonitor::~OpRecordAudioMonitor()
1938 {
1939     if (mOpCallback != 0) {
1940         mAppOpsManager.stopWatchingMode(mOpCallback);
1941     }
1942     mOpCallback.clear();
1943 }
1944 
onFirstRef()1945 void AudioPolicyService::OpRecordAudioMonitor::onFirstRef()
1946 {
1947     checkOp();
1948     mOpCallback = new RecordAudioOpCallback(this);
1949     ALOGV("start watching op %d for %s", mAppOp, mAttributionSource.toString().c_str());
1950     int flags = doesPackageTargetAtLeastU(
1951             mAttributionSource.packageName.value_or("")) ?
1952             AppOpsManager::WATCH_FOREGROUND_CHANGES : 0;
1953     // TODO: We need to always watch AppOpsManager::OP_RECORD_AUDIO too
1954     // since it controls the mic permission for legacy apps.
1955     mAppOpsManager.startWatchingMode(mAppOp, VALUE_OR_FATAL(aidl2legacy_string_view_String16(
1956         mAttributionSource.packageName.value_or(""))),
1957         flags,
1958         mOpCallback);
1959 }
1960 
hasOp() const1961 bool AudioPolicyService::OpRecordAudioMonitor::hasOp() const {
1962     return mHasOp.load();
1963 }
1964 
1965 // Called by RecordAudioOpCallback when the app op corresponding to this OpRecordAudioMonitor
1966 // is updated in AppOp callback and in onFirstRef()
1967 // Note this method is never called (and never to be) for audio server / root track
1968 // due to the UID in createIfNeeded(). As a result for those record track, it's:
1969 // - not called from constructor,
1970 // - not called from RecordAudioOpCallback because the callback is not installed in this case
checkOp(bool updateUidStates)1971 void AudioPolicyService::OpRecordAudioMonitor::checkOp(bool updateUidStates)
1972 {
1973     // TODO: We need to always check AppOpsManager::OP_RECORD_AUDIO too
1974     // since it controls the mic permission for legacy apps.
1975     const int32_t mode = mAppOpsManager.checkOp(mAppOp,
1976             mAttributionSource.uid, VALUE_OR_FATAL(aidl2legacy_string_view_String16(
1977                 mAttributionSource.packageName.value_or(""))));
1978     const bool hasIt = (mode == AppOpsManager::MODE_ALLOWED);
1979     // verbose logging only log when appOp changed
1980     ALOGI_IF(hasIt != mHasOp.load(),
1981             "App op %d missing, %ssilencing record %s",
1982             mAppOp, hasIt ? "un" : "", mAttributionSource.toString().c_str());
1983     mHasOp.store(hasIt);
1984 
1985     if (updateUidStates) {
1986           sp<AudioCommandThread> commandThread = mCommandThread.promote();
1987           if (commandThread != nullptr) {
1988               commandThread->updateUidStatesCommand();
1989           }
1990     }
1991 }
1992 
RecordAudioOpCallback(const wp<OpRecordAudioMonitor> & monitor)1993 AudioPolicyService::OpRecordAudioMonitor::RecordAudioOpCallback::RecordAudioOpCallback(
1994         const wp<OpRecordAudioMonitor>& monitor) : mMonitor(monitor)
1995 { }
1996 
opChanged(int32_t op,const String16 & packageName __unused)1997 void AudioPolicyService::OpRecordAudioMonitor::RecordAudioOpCallback::opChanged(int32_t op,
1998             const String16& packageName __unused) {
1999     sp<OpRecordAudioMonitor> monitor = mMonitor.promote();
2000     if (monitor != NULL) {
2001         if (op != monitor->getOp()) {
2002             return;
2003         }
2004         monitor->checkOp(true);
2005     }
2006 }
2007 
2008 
2009 // -----------  AudioPolicyService::AudioCommandThread implementation ----------
2010 
AudioCommandThread(String8 name,const wp<AudioPolicyService> & service)2011 AudioPolicyService::AudioCommandThread::AudioCommandThread(String8 name,
2012                                                            const wp<AudioPolicyService>& service)
2013     : Thread(false), mName(name), mService(service)
2014 {
2015 }
2016 
2017 
~AudioCommandThread()2018 AudioPolicyService::AudioCommandThread::~AudioCommandThread()
2019 {
2020     if (!mAudioCommands.isEmpty()) {
2021         release_wake_lock(mName.string());
2022     }
2023     mAudioCommands.clear();
2024 }
2025 
onFirstRef()2026 void AudioPolicyService::AudioCommandThread::onFirstRef()
2027 {
2028     run(mName.string(), ANDROID_PRIORITY_AUDIO);
2029 }
2030 
threadLoop()2031 bool AudioPolicyService::AudioCommandThread::threadLoop()
2032 {
2033     nsecs_t waitTime = -1;
2034 
2035     mLock.lock();
2036     while (!exitPending())
2037     {
2038         sp<AudioPolicyService> svc;
2039         int numTimesBecameEmpty = 0;
2040         while (!mAudioCommands.isEmpty() && !exitPending()) {
2041             nsecs_t curTime = systemTime();
2042             // commands are sorted by increasing time stamp: execute them from index 0 and up
2043             if (mAudioCommands[0]->mTime <= curTime) {
2044                 sp<AudioCommand> command = mAudioCommands[0];
2045                 mAudioCommands.removeAt(0);
2046                 if (mAudioCommands.isEmpty()) {
2047                   ++numTimesBecameEmpty;
2048                 }
2049                 mLastCommand = command;
2050 
2051                 switch (command->mCommand) {
2052                 case SET_VOLUME: {
2053                     VolumeData *data = (VolumeData *)command->mParam.get();
2054                     ALOGV("AudioCommandThread() processing set volume stream %d, \
2055                             volume %f, output %d", data->mStream, data->mVolume, data->mIO);
2056                     mLock.unlock();
2057                     command->mStatus = AudioSystem::setStreamVolume(data->mStream,
2058                                                                     data->mVolume,
2059                                                                     data->mIO);
2060                     mLock.lock();
2061                     }break;
2062                 case SET_PARAMETERS: {
2063                     ParametersData *data = (ParametersData *)command->mParam.get();
2064                     ALOGV("AudioCommandThread() processing set parameters string %s, io %d",
2065                             data->mKeyValuePairs.string(), data->mIO);
2066                     mLock.unlock();
2067                     command->mStatus = AudioSystem::setParameters(data->mIO, data->mKeyValuePairs);
2068                     mLock.lock();
2069                     }break;
2070                 case SET_VOICE_VOLUME: {
2071                     VoiceVolumeData *data = (VoiceVolumeData *)command->mParam.get();
2072                     ALOGV("AudioCommandThread() processing set voice volume volume %f",
2073                             data->mVolume);
2074                     mLock.unlock();
2075                     command->mStatus = AudioSystem::setVoiceVolume(data->mVolume);
2076                     mLock.lock();
2077                     }break;
2078                 case STOP_OUTPUT: {
2079                     StopOutputData *data = (StopOutputData *)command->mParam.get();
2080                     ALOGV("AudioCommandThread() processing stop output portId %d",
2081                             data->mPortId);
2082                     svc = mService.promote();
2083                     if (svc == 0) {
2084                         break;
2085                     }
2086                     mLock.unlock();
2087                     svc->doStopOutput(data->mPortId);
2088                     mLock.lock();
2089                     }break;
2090                 case RELEASE_OUTPUT: {
2091                     ReleaseOutputData *data = (ReleaseOutputData *)command->mParam.get();
2092                     ALOGV("AudioCommandThread() processing release output portId %d",
2093                             data->mPortId);
2094                     svc = mService.promote();
2095                     if (svc == 0) {
2096                         break;
2097                     }
2098                     mLock.unlock();
2099                     svc->doReleaseOutput(data->mPortId);
2100                     mLock.lock();
2101                     }break;
2102                 case CREATE_AUDIO_PATCH: {
2103                     CreateAudioPatchData *data = (CreateAudioPatchData *)command->mParam.get();
2104                     ALOGV("AudioCommandThread() processing create audio patch");
2105                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
2106                     if (af == 0) {
2107                         command->mStatus = PERMISSION_DENIED;
2108                     } else {
2109                         mLock.unlock();
2110                         command->mStatus = af->createAudioPatch(&data->mPatch, &data->mHandle);
2111                         mLock.lock();
2112                     }
2113                     } break;
2114                 case RELEASE_AUDIO_PATCH: {
2115                     ReleaseAudioPatchData *data = (ReleaseAudioPatchData *)command->mParam.get();
2116                     ALOGV("AudioCommandThread() processing release audio patch");
2117                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
2118                     if (af == 0) {
2119                         command->mStatus = PERMISSION_DENIED;
2120                     } else {
2121                         mLock.unlock();
2122                         command->mStatus = af->releaseAudioPatch(data->mHandle);
2123                         mLock.lock();
2124                     }
2125                     } break;
2126                 case UPDATE_AUDIOPORT_LIST: {
2127                     ALOGV("AudioCommandThread() processing update audio port list");
2128                     svc = mService.promote();
2129                     if (svc == 0) {
2130                         break;
2131                     }
2132                     mLock.unlock();
2133                     svc->doOnAudioPortListUpdate();
2134                     mLock.lock();
2135                     }break;
2136                 case UPDATE_AUDIOPATCH_LIST: {
2137                     ALOGV("AudioCommandThread() processing update audio patch list");
2138                     svc = mService.promote();
2139                     if (svc == 0) {
2140                         break;
2141                     }
2142                     mLock.unlock();
2143                     svc->doOnAudioPatchListUpdate();
2144                     mLock.lock();
2145                     }break;
2146                 case CHANGED_AUDIOVOLUMEGROUP: {
2147                     AudioVolumeGroupData *data =
2148                             static_cast<AudioVolumeGroupData *>(command->mParam.get());
2149                     ALOGV("AudioCommandThread() processing update audio volume group");
2150                     svc = mService.promote();
2151                     if (svc == 0) {
2152                         break;
2153                     }
2154                     mLock.unlock();
2155                     svc->doOnAudioVolumeGroupChanged(data->mGroup, data->mFlags);
2156                     mLock.lock();
2157                     }break;
2158                 case SET_AUDIOPORT_CONFIG: {
2159                     SetAudioPortConfigData *data = (SetAudioPortConfigData *)command->mParam.get();
2160                     ALOGV("AudioCommandThread() processing set port config");
2161                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
2162                     if (af == 0) {
2163                         command->mStatus = PERMISSION_DENIED;
2164                     } else {
2165                         mLock.unlock();
2166                         command->mStatus = af->setAudioPortConfig(&data->mConfig);
2167                         mLock.lock();
2168                     }
2169                     } break;
2170                 case DYN_POLICY_MIX_STATE_UPDATE: {
2171                     DynPolicyMixStateUpdateData *data =
2172                             (DynPolicyMixStateUpdateData *)command->mParam.get();
2173                     ALOGV("AudioCommandThread() processing dyn policy mix state update %s %d",
2174                             data->mRegId.string(), data->mState);
2175                     svc = mService.promote();
2176                     if (svc == 0) {
2177                         break;
2178                     }
2179                     mLock.unlock();
2180                     svc->doOnDynamicPolicyMixStateUpdate(data->mRegId, data->mState);
2181                     mLock.lock();
2182                     } break;
2183                 case RECORDING_CONFIGURATION_UPDATE: {
2184                     RecordingConfigurationUpdateData *data =
2185                             (RecordingConfigurationUpdateData *)command->mParam.get();
2186                     ALOGV("AudioCommandThread() processing recording configuration update");
2187                     svc = mService.promote();
2188                     if (svc == 0) {
2189                         break;
2190                     }
2191                     mLock.unlock();
2192                     svc->doOnRecordingConfigurationUpdate(data->mEvent, &data->mClientInfo,
2193                             &data->mClientConfig, data->mClientEffects,
2194                             &data->mDeviceConfig, data->mEffects,
2195                             data->mPatchHandle, data->mSource);
2196                     mLock.lock();
2197                     } break;
2198                 case SET_EFFECT_SUSPENDED: {
2199                     SetEffectSuspendedData *data = (SetEffectSuspendedData *)command->mParam.get();
2200                     ALOGV("AudioCommandThread() processing set effect suspended");
2201                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
2202                     if (af != 0) {
2203                         mLock.unlock();
2204                         af->setEffectSuspended(data->mEffectId, data->mSessionId, data->mSuspended);
2205                         mLock.lock();
2206                     }
2207                     } break;
2208                 case AUDIO_MODULES_UPDATE: {
2209                     ALOGV("AudioCommandThread() processing audio modules update");
2210                     svc = mService.promote();
2211                     if (svc == 0) {
2212                         break;
2213                     }
2214                     mLock.unlock();
2215                     svc->doOnNewAudioModulesAvailable();
2216                     mLock.lock();
2217                     } break;
2218                 case ROUTING_UPDATED: {
2219                     ALOGV("AudioCommandThread() processing routing update");
2220                     svc = mService.promote();
2221                     if (svc == 0) {
2222                         break;
2223                     }
2224                     mLock.unlock();
2225                     svc->doOnRoutingUpdated();
2226                     mLock.lock();
2227                     } break;
2228 
2229                 case UPDATE_UID_STATES: {
2230                     ALOGV("AudioCommandThread() processing updateUID states");
2231                     svc = mService.promote();
2232                     if (svc == 0) {
2233                         break;
2234                     }
2235                     mLock.unlock();
2236                     svc->updateUidStates();
2237                     mLock.lock();
2238                     } break;
2239 
2240                 case CHECK_SPATIALIZER_OUTPUT: {
2241                     ALOGV("AudioCommandThread() processing check spatializer");
2242                     svc = mService.promote();
2243                     if (svc == 0) {
2244                         break;
2245                     }
2246                     mLock.unlock();
2247                     svc->doOnCheckSpatializer();
2248                     mLock.lock();
2249                     } break;
2250 
2251                 case UPDATE_ACTIVE_SPATIALIZER_TRACKS: {
2252                     ALOGV("AudioCommandThread() processing update spatializer tracks");
2253                     svc = mService.promote();
2254                     if (svc == 0) {
2255                         break;
2256                     }
2257                     mLock.unlock();
2258                     svc->doOnUpdateActiveSpatializerTracks();
2259                     mLock.lock();
2260                     } break;
2261 
2262                 case VOL_RANGE_INIT_REQUEST: {
2263                     ALOGV("AudioCommandThread() processing volume range init request");
2264                     svc = mService.promote();
2265                     if (svc == 0) {
2266                         break;
2267                     }
2268                     mLock.unlock();
2269                     svc->doOnVolumeRangeInitRequest();
2270                     mLock.lock();
2271                     } break;
2272 
2273                 default:
2274                     ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
2275                 }
2276                 {
2277                     Mutex::Autolock _l(command->mLock);
2278                     if (command->mWaitStatus) {
2279                         command->mWaitStatus = false;
2280                         command->mCond.signal();
2281                     }
2282                 }
2283                 waitTime = -1;
2284                 // release mLock before releasing strong reference on the service as
2285                 // AudioPolicyService destructor calls AudioCommandThread::exit() which
2286                 // acquires mLock.
2287                 mLock.unlock();
2288                 svc.clear();
2289                 mLock.lock();
2290             } else {
2291                 waitTime = mAudioCommands[0]->mTime - curTime;
2292                 break;
2293             }
2294         }
2295 
2296         // release delayed commands wake lock as many times as we made the  queue is
2297         // empty during popping.
2298         while (numTimesBecameEmpty--) {
2299             release_wake_lock(mName.string());
2300         }
2301 
2302         // At this stage we have either an empty command queue or the first command in the queue
2303         // has a finite delay. So unless we are exiting it is safe to wait.
2304         if (!exitPending()) {
2305             ALOGV("AudioCommandThread() going to sleep");
2306             if (waitTime == -1) {
2307                 mWaitWorkCV.wait(mLock);
2308             } else {
2309                 mWaitWorkCV.waitRelative(mLock, waitTime);
2310             }
2311         }
2312     }
2313     // release delayed commands wake lock before quitting
2314     if (!mAudioCommands.isEmpty()) {
2315         release_wake_lock(mName.string());
2316     }
2317     mLock.unlock();
2318     return false;
2319 }
2320 
dump(int fd)2321 status_t AudioPolicyService::AudioCommandThread::dump(int fd)
2322 {
2323     const size_t SIZE = 256;
2324     char buffer[SIZE];
2325     String8 result;
2326 
2327     const bool locked = dumpTryLock(mLock);
2328     if (!locked) {
2329         String8 result2(kCmdDeadlockedString);
2330         write(fd, result2.string(), result2.size());
2331     }
2332 
2333     snprintf(buffer, SIZE, "- Commands:\n");
2334     result = String8(buffer);
2335     result.append("   Command Time        Wait pParam\n");
2336     for (size_t i = 0; i < mAudioCommands.size(); i++) {
2337         mAudioCommands[i]->dump(buffer, SIZE);
2338         result.append(buffer);
2339     }
2340     result.append("  Last Command\n");
2341     if (mLastCommand != 0) {
2342         mLastCommand->dump(buffer, SIZE);
2343         result.append(buffer);
2344     } else {
2345         result.append("     none\n");
2346     }
2347 
2348     write(fd, result.string(), result.size());
2349 
2350     dumpReleaseLock(mLock, locked);
2351 
2352     return NO_ERROR;
2353 }
2354 
volumeCommand(audio_stream_type_t stream,float volume,audio_io_handle_t output,int delayMs)2355 status_t AudioPolicyService::AudioCommandThread::volumeCommand(audio_stream_type_t stream,
2356                                                                float volume,
2357                                                                audio_io_handle_t output,
2358                                                                int delayMs)
2359 {
2360     sp<AudioCommand> command = new AudioCommand();
2361     command->mCommand = SET_VOLUME;
2362     sp<VolumeData> data = new VolumeData();
2363     data->mStream = stream;
2364     data->mVolume = volume;
2365     data->mIO = output;
2366     command->mParam = data;
2367     command->mWaitStatus = true;
2368     ALOGV("AudioCommandThread() adding set volume stream %d, volume %f, output %d",
2369             stream, volume, output);
2370     return sendCommand(command, delayMs);
2371 }
2372 
parametersCommand(audio_io_handle_t ioHandle,const char * keyValuePairs,int delayMs)2373 status_t AudioPolicyService::AudioCommandThread::parametersCommand(audio_io_handle_t ioHandle,
2374                                                                    const char *keyValuePairs,
2375                                                                    int delayMs)
2376 {
2377     sp<AudioCommand> command = new AudioCommand();
2378     command->mCommand = SET_PARAMETERS;
2379     sp<ParametersData> data = new ParametersData();
2380     data->mIO = ioHandle;
2381     data->mKeyValuePairs = String8(keyValuePairs);
2382     command->mParam = data;
2383     command->mWaitStatus = true;
2384     ALOGV("AudioCommandThread() adding set parameter string %s, io %d ,delay %d",
2385             keyValuePairs, ioHandle, delayMs);
2386     return sendCommand(command, delayMs);
2387 }
2388 
voiceVolumeCommand(float volume,int delayMs)2389 status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand(float volume, int delayMs)
2390 {
2391     sp<AudioCommand> command = new AudioCommand();
2392     command->mCommand = SET_VOICE_VOLUME;
2393     sp<VoiceVolumeData> data = new VoiceVolumeData();
2394     data->mVolume = volume;
2395     command->mParam = data;
2396     command->mWaitStatus = true;
2397     ALOGV("AudioCommandThread() adding set voice volume volume %f", volume);
2398     return sendCommand(command, delayMs);
2399 }
2400 
setEffectSuspendedCommand(int effectId,audio_session_t sessionId,bool suspended)2401 void AudioPolicyService::AudioCommandThread::setEffectSuspendedCommand(int effectId,
2402                                                                        audio_session_t sessionId,
2403                                                                        bool suspended)
2404 {
2405     sp<AudioCommand> command = new AudioCommand();
2406     command->mCommand = SET_EFFECT_SUSPENDED;
2407     sp<SetEffectSuspendedData> data = new SetEffectSuspendedData();
2408     data->mEffectId = effectId;
2409     data->mSessionId = sessionId;
2410     data->mSuspended = suspended;
2411     command->mParam = data;
2412     ALOGV("AudioCommandThread() adding set suspended effectId %d sessionId %d suspended %d",
2413         effectId, sessionId, suspended);
2414     sendCommand(command);
2415 }
2416 
2417 
stopOutputCommand(audio_port_handle_t portId)2418 void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_port_handle_t portId)
2419 {
2420     sp<AudioCommand> command = new AudioCommand();
2421     command->mCommand = STOP_OUTPUT;
2422     sp<StopOutputData> data = new StopOutputData();
2423     data->mPortId = portId;
2424     command->mParam = data;
2425     ALOGV("AudioCommandThread() adding stop output portId %d", portId);
2426     sendCommand(command);
2427 }
2428 
releaseOutputCommand(audio_port_handle_t portId)2429 void AudioPolicyService::AudioCommandThread::releaseOutputCommand(audio_port_handle_t portId)
2430 {
2431     sp<AudioCommand> command = new AudioCommand();
2432     command->mCommand = RELEASE_OUTPUT;
2433     sp<ReleaseOutputData> data = new ReleaseOutputData();
2434     data->mPortId = portId;
2435     command->mParam = data;
2436     ALOGV("AudioCommandThread() adding release output portId %d", portId);
2437     sendCommand(command);
2438 }
2439 
createAudioPatchCommand(const struct audio_patch * patch,audio_patch_handle_t * handle,int delayMs)2440 status_t AudioPolicyService::AudioCommandThread::createAudioPatchCommand(
2441                                                 const struct audio_patch *patch,
2442                                                 audio_patch_handle_t *handle,
2443                                                 int delayMs)
2444 {
2445     status_t status = NO_ERROR;
2446 
2447     sp<AudioCommand> command = new AudioCommand();
2448     command->mCommand = CREATE_AUDIO_PATCH;
2449     CreateAudioPatchData *data = new CreateAudioPatchData();
2450     data->mPatch = *patch;
2451     data->mHandle = *handle;
2452     command->mParam = data;
2453     command->mWaitStatus = true;
2454     ALOGV("AudioCommandThread() adding create patch delay %d", delayMs);
2455     status = sendCommand(command, delayMs);
2456     if (status == NO_ERROR) {
2457         *handle = data->mHandle;
2458     }
2459     return status;
2460 }
2461 
releaseAudioPatchCommand(audio_patch_handle_t handle,int delayMs)2462 status_t AudioPolicyService::AudioCommandThread::releaseAudioPatchCommand(audio_patch_handle_t handle,
2463                                                  int delayMs)
2464 {
2465     sp<AudioCommand> command = new AudioCommand();
2466     command->mCommand = RELEASE_AUDIO_PATCH;
2467     ReleaseAudioPatchData *data = new ReleaseAudioPatchData();
2468     data->mHandle = handle;
2469     command->mParam = data;
2470     command->mWaitStatus = true;
2471     ALOGV("AudioCommandThread() adding release patch delay %d", delayMs);
2472     return sendCommand(command, delayMs);
2473 }
2474 
updateAudioPortListCommand()2475 void AudioPolicyService::AudioCommandThread::updateAudioPortListCommand()
2476 {
2477     sp<AudioCommand> command = new AudioCommand();
2478     command->mCommand = UPDATE_AUDIOPORT_LIST;
2479     ALOGV("AudioCommandThread() adding update audio port list");
2480     sendCommand(command);
2481 }
2482 
updateUidStatesCommand()2483 void AudioPolicyService::AudioCommandThread::updateUidStatesCommand()
2484 {
2485     sp<AudioCommand> command = new AudioCommand();
2486     command->mCommand = UPDATE_UID_STATES;
2487     ALOGV("AudioCommandThread() adding update UID states");
2488     sendCommand(command);
2489 }
2490 
updateAudioPatchListCommand()2491 void AudioPolicyService::AudioCommandThread::updateAudioPatchListCommand()
2492 {
2493     sp<AudioCommand>command = new AudioCommand();
2494     command->mCommand = UPDATE_AUDIOPATCH_LIST;
2495     ALOGV("AudioCommandThread() adding update audio patch list");
2496     sendCommand(command);
2497 }
2498 
changeAudioVolumeGroupCommand(volume_group_t group,int flags)2499 void AudioPolicyService::AudioCommandThread::changeAudioVolumeGroupCommand(volume_group_t group,
2500                                                                            int flags)
2501 {
2502     sp<AudioCommand>command = new AudioCommand();
2503     command->mCommand = CHANGED_AUDIOVOLUMEGROUP;
2504     AudioVolumeGroupData *data= new AudioVolumeGroupData();
2505     data->mGroup = group;
2506     data->mFlags = flags;
2507     command->mParam = data;
2508     ALOGV("AudioCommandThread() adding audio volume group changed");
2509     sendCommand(command);
2510 }
2511 
setAudioPortConfigCommand(const struct audio_port_config * config,int delayMs)2512 status_t AudioPolicyService::AudioCommandThread::setAudioPortConfigCommand(
2513                                             const struct audio_port_config *config, int delayMs)
2514 {
2515     sp<AudioCommand> command = new AudioCommand();
2516     command->mCommand = SET_AUDIOPORT_CONFIG;
2517     SetAudioPortConfigData *data = new SetAudioPortConfigData();
2518     data->mConfig = *config;
2519     command->mParam = data;
2520     command->mWaitStatus = true;
2521     ALOGV("AudioCommandThread() adding set port config delay %d", delayMs);
2522     return sendCommand(command, delayMs);
2523 }
2524 
dynamicPolicyMixStateUpdateCommand(const String8 & regId,int32_t state)2525 void AudioPolicyService::AudioCommandThread::dynamicPolicyMixStateUpdateCommand(
2526         const String8& regId, int32_t state)
2527 {
2528     sp<AudioCommand> command = new AudioCommand();
2529     command->mCommand = DYN_POLICY_MIX_STATE_UPDATE;
2530     DynPolicyMixStateUpdateData *data = new DynPolicyMixStateUpdateData();
2531     data->mRegId = regId;
2532     data->mState = state;
2533     command->mParam = data;
2534     ALOGV("AudioCommandThread() sending dynamic policy mix (id=%s) state update to %d",
2535             regId.string(), state);
2536     sendCommand(command);
2537 }
2538 
recordingConfigurationUpdateCommand(int event,const record_client_info_t * clientInfo,const audio_config_base_t * clientConfig,std::vector<effect_descriptor_t> clientEffects,const audio_config_base_t * deviceConfig,std::vector<effect_descriptor_t> effects,audio_patch_handle_t patchHandle,audio_source_t source)2539 void AudioPolicyService::AudioCommandThread::recordingConfigurationUpdateCommand(
2540                                                 int event,
2541                                                 const record_client_info_t *clientInfo,
2542                                                 const audio_config_base_t *clientConfig,
2543                                                 std::vector<effect_descriptor_t> clientEffects,
2544                                                 const audio_config_base_t *deviceConfig,
2545                                                 std::vector<effect_descriptor_t> effects,
2546                                                 audio_patch_handle_t patchHandle,
2547                                                 audio_source_t source)
2548 {
2549     sp<AudioCommand>command = new AudioCommand();
2550     command->mCommand = RECORDING_CONFIGURATION_UPDATE;
2551     RecordingConfigurationUpdateData *data = new RecordingConfigurationUpdateData();
2552     data->mEvent = event;
2553     data->mClientInfo = *clientInfo;
2554     data->mClientConfig = *clientConfig;
2555     data->mClientEffects = clientEffects;
2556     data->mDeviceConfig = *deviceConfig;
2557     data->mEffects = effects;
2558     data->mPatchHandle = patchHandle;
2559     data->mSource = source;
2560     command->mParam = data;
2561     ALOGV("AudioCommandThread() adding recording configuration update event %d, source %d uid %u",
2562             event, clientInfo->source, clientInfo->uid);
2563     sendCommand(command);
2564 }
2565 
audioModulesUpdateCommand()2566 void AudioPolicyService::AudioCommandThread::audioModulesUpdateCommand()
2567 {
2568     sp<AudioCommand> command = new AudioCommand();
2569     command->mCommand = AUDIO_MODULES_UPDATE;
2570     sendCommand(command);
2571 }
2572 
routingChangedCommand()2573 void AudioPolicyService::AudioCommandThread::routingChangedCommand()
2574 {
2575     sp<AudioCommand>command = new AudioCommand();
2576     command->mCommand = ROUTING_UPDATED;
2577     ALOGV("AudioCommandThread() adding routing update");
2578     sendCommand(command);
2579 }
2580 
checkSpatializerCommand()2581 void AudioPolicyService::AudioCommandThread::checkSpatializerCommand()
2582 {
2583     sp<AudioCommand>command = new AudioCommand();
2584     command->mCommand = CHECK_SPATIALIZER_OUTPUT;
2585     ALOGV("AudioCommandThread() adding check spatializer");
2586     sendCommand(command);
2587 }
2588 
updateActiveSpatializerTracksCommand()2589 void AudioPolicyService::AudioCommandThread::updateActiveSpatializerTracksCommand()
2590 {
2591     sp<AudioCommand>command = new AudioCommand();
2592     command->mCommand = UPDATE_ACTIVE_SPATIALIZER_TRACKS;
2593     ALOGV("AudioCommandThread() adding update active spatializer tracks");
2594     sendCommand(command);
2595 }
2596 
volRangeInitReqCommand()2597 void AudioPolicyService::AudioCommandThread::volRangeInitReqCommand()
2598 {
2599     sp<AudioCommand>command = new AudioCommand();
2600     command->mCommand = VOL_RANGE_INIT_REQUEST;
2601     ALOGV("AudioCommandThread() adding volume range init request");
2602     sendCommand(command);
2603 }
2604 
sendCommand(sp<AudioCommand> & command,int delayMs)2605 status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs)
2606 {
2607     {
2608         Mutex::Autolock _l(mLock);
2609         insertCommand_l(command, delayMs);
2610         mWaitWorkCV.signal();
2611     }
2612     Mutex::Autolock _l(command->mLock);
2613     while (command->mWaitStatus) {
2614         nsecs_t timeOutNs = kAudioCommandTimeoutNs + milliseconds(delayMs);
2615         if (command->mCond.waitRelative(command->mLock, timeOutNs) != NO_ERROR) {
2616             command->mStatus = TIMED_OUT;
2617             command->mWaitStatus = false;
2618         }
2619     }
2620     return command->mStatus;
2621 }
2622 
2623 // insertCommand_l() must be called with mLock held
insertCommand_l(sp<AudioCommand> & command,int delayMs)2624 void AudioPolicyService::AudioCommandThread::insertCommand_l(sp<AudioCommand>& command, int delayMs)
2625 {
2626     ssize_t i;  // not size_t because i will count down to -1
2627     Vector < sp<AudioCommand> > removedCommands;
2628     command->mTime = systemTime() + milliseconds(delayMs);
2629 
2630     // acquire wake lock to make sure delayed commands are processed
2631     if (mAudioCommands.isEmpty()) {
2632         acquire_wake_lock(PARTIAL_WAKE_LOCK, mName.string());
2633     }
2634 
2635     // check same pending commands with later time stamps and eliminate them
2636     for (i = (ssize_t)mAudioCommands.size()-1; i >= 0; i--) {
2637         sp<AudioCommand> command2 = mAudioCommands[i];
2638         // commands are sorted by increasing time stamp: no need to scan the rest of mAudioCommands
2639         if (command2->mTime <= command->mTime) break;
2640 
2641         // create audio patch or release audio patch commands are equivalent
2642         // with regard to filtering
2643         if ((command->mCommand == CREATE_AUDIO_PATCH) ||
2644                 (command->mCommand == RELEASE_AUDIO_PATCH)) {
2645             if ((command2->mCommand != CREATE_AUDIO_PATCH) &&
2646                     (command2->mCommand != RELEASE_AUDIO_PATCH)) {
2647                 continue;
2648             }
2649         } else if (command2->mCommand != command->mCommand) continue;
2650 
2651         switch (command->mCommand) {
2652         case SET_PARAMETERS: {
2653             ParametersData *data = (ParametersData *)command->mParam.get();
2654             ParametersData *data2 = (ParametersData *)command2->mParam.get();
2655             if (data->mIO != data2->mIO) break;
2656             ALOGV("Comparing parameter command %s to new command %s",
2657                     data2->mKeyValuePairs.string(), data->mKeyValuePairs.string());
2658             AudioParameter param = AudioParameter(data->mKeyValuePairs);
2659             AudioParameter param2 = AudioParameter(data2->mKeyValuePairs);
2660             for (size_t j = 0; j < param.size(); j++) {
2661                 String8 key;
2662                 String8 value;
2663                 param.getAt(j, key, value);
2664                 for (size_t k = 0; k < param2.size(); k++) {
2665                     String8 key2;
2666                     String8 value2;
2667                     param2.getAt(k, key2, value2);
2668                     if (key2 == key) {
2669                         param2.remove(key2);
2670                         ALOGV("Filtering out parameter %s", key2.string());
2671                         break;
2672                     }
2673                 }
2674             }
2675             // if all keys have been filtered out, remove the command.
2676             // otherwise, update the key value pairs
2677             if (param2.size() == 0) {
2678                 removedCommands.add(command2);
2679             } else {
2680                 data2->mKeyValuePairs = param2.toString();
2681             }
2682             command->mTime = command2->mTime;
2683             // force delayMs to non 0 so that code below does not request to wait for
2684             // command status as the command is now delayed
2685             delayMs = 1;
2686         } break;
2687 
2688         case SET_VOLUME: {
2689             VolumeData *data = (VolumeData *)command->mParam.get();
2690             VolumeData *data2 = (VolumeData *)command2->mParam.get();
2691             if (data->mIO != data2->mIO) break;
2692             if (data->mStream != data2->mStream) break;
2693             ALOGV("Filtering out volume command on output %d for stream %d",
2694                     data->mIO, data->mStream);
2695             removedCommands.add(command2);
2696             command->mTime = command2->mTime;
2697             // force delayMs to non 0 so that code below does not request to wait for
2698             // command status as the command is now delayed
2699             delayMs = 1;
2700         } break;
2701 
2702         case SET_VOICE_VOLUME: {
2703             VoiceVolumeData *data = (VoiceVolumeData *)command->mParam.get();
2704             VoiceVolumeData *data2 = (VoiceVolumeData *)command2->mParam.get();
2705             ALOGV("Filtering out voice volume command value %f replaced by %f",
2706                   data2->mVolume, data->mVolume);
2707             removedCommands.add(command2);
2708             command->mTime = command2->mTime;
2709             // force delayMs to non 0 so that code below does not request to wait for
2710             // command status as the command is now delayed
2711             delayMs = 1;
2712         } break;
2713 
2714         case CREATE_AUDIO_PATCH:
2715         case RELEASE_AUDIO_PATCH: {
2716             audio_patch_handle_t handle;
2717             struct audio_patch patch;
2718             if (command->mCommand == CREATE_AUDIO_PATCH) {
2719                 handle = ((CreateAudioPatchData *)command->mParam.get())->mHandle;
2720                 patch = ((CreateAudioPatchData *)command->mParam.get())->mPatch;
2721             } else {
2722                 handle = ((ReleaseAudioPatchData *)command->mParam.get())->mHandle;
2723                 memset(&patch, 0, sizeof(patch));
2724             }
2725             audio_patch_handle_t handle2;
2726             struct audio_patch patch2;
2727             if (command2->mCommand == CREATE_AUDIO_PATCH) {
2728                 handle2 = ((CreateAudioPatchData *)command2->mParam.get())->mHandle;
2729                 patch2 = ((CreateAudioPatchData *)command2->mParam.get())->mPatch;
2730             } else {
2731                 handle2 = ((ReleaseAudioPatchData *)command2->mParam.get())->mHandle;
2732                 memset(&patch2, 0, sizeof(patch2));
2733             }
2734             if (handle != handle2) break;
2735             /* Filter CREATE_AUDIO_PATCH commands only when they are issued for
2736                same output. */
2737             if( (command->mCommand == CREATE_AUDIO_PATCH) &&
2738                 (command2->mCommand == CREATE_AUDIO_PATCH) ) {
2739                 bool isOutputDiff = false;
2740                 if (patch.num_sources == patch2.num_sources) {
2741                     for (unsigned count = 0; count < patch.num_sources; count++) {
2742                         if (patch.sources[count].id != patch2.sources[count].id) {
2743                             isOutputDiff = true;
2744                             break;
2745                         }
2746                     }
2747                     if (isOutputDiff)
2748                        break;
2749                 }
2750             }
2751             ALOGV("Filtering out %s audio patch command for handle %d",
2752                   (command->mCommand == CREATE_AUDIO_PATCH) ? "create" : "release", handle);
2753             removedCommands.add(command2);
2754             command->mTime = command2->mTime;
2755             // force delayMs to non 0 so that code below does not request to wait for
2756             // command status as the command is now delayed
2757             delayMs = 1;
2758         } break;
2759 
2760         case DYN_POLICY_MIX_STATE_UPDATE: {
2761 
2762         } break;
2763 
2764         case RECORDING_CONFIGURATION_UPDATE: {
2765 
2766         } break;
2767 
2768         case ROUTING_UPDATED: {
2769 
2770         } break;
2771 
2772         case VOL_RANGE_INIT_REQUEST: {
2773             // command may come from different requests, do not filter
2774         } break;
2775 
2776         default:
2777             break;
2778         }
2779     }
2780 
2781     // remove filtered commands
2782     for (size_t j = 0; j < removedCommands.size(); j++) {
2783         // removed commands always have time stamps greater than current command
2784         for (size_t k = i + 1; k < mAudioCommands.size(); k++) {
2785             if (mAudioCommands[k].get() == removedCommands[j].get()) {
2786                 ALOGV("suppressing command: %d", mAudioCommands[k]->mCommand);
2787                 mAudioCommands.removeAt(k);
2788                 break;
2789             }
2790         }
2791     }
2792     removedCommands.clear();
2793 
2794     // Disable wait for status if delay is not 0.
2795     // Except for create audio patch command because the returned patch handle
2796     // is needed by audio policy manager
2797     if (delayMs != 0 && command->mCommand != CREATE_AUDIO_PATCH) {
2798         command->mWaitStatus = false;
2799     }
2800 
2801     // insert command at the right place according to its time stamp
2802     ALOGV("inserting command: %d at index %zd, num commands %zu",
2803             command->mCommand, i+1, mAudioCommands.size());
2804     mAudioCommands.insertAt(command, i + 1);
2805 }
2806 
exit()2807 void AudioPolicyService::AudioCommandThread::exit()
2808 {
2809     ALOGV("AudioCommandThread::exit");
2810     {
2811         AutoMutex _l(mLock);
2812         requestExit();
2813         mWaitWorkCV.signal();
2814     }
2815     // Note that we can call it from the thread loop if all other references have been released
2816     // but it will safely return WOULD_BLOCK in this case
2817     requestExitAndWait();
2818 }
2819 
dump(char * buffer,size_t size)2820 void AudioPolicyService::AudioCommandThread::AudioCommand::dump(char* buffer, size_t size)
2821 {
2822     snprintf(buffer, size, "   %02d      %06d.%03d  %01u    %p\n",
2823             mCommand,
2824             (int)ns2s(mTime),
2825             (int)ns2ms(mTime)%1000,
2826             mWaitStatus,
2827             mParam.get());
2828 }
2829 
2830 /******* helpers for the service_ops callbacks defined below *********/
setParameters(audio_io_handle_t ioHandle,const char * keyValuePairs,int delayMs)2831 void AudioPolicyService::setParameters(audio_io_handle_t ioHandle,
2832                                        const char *keyValuePairs,
2833                                        int delayMs)
2834 {
2835     mAudioCommandThread->parametersCommand(ioHandle, keyValuePairs,
2836                                            delayMs);
2837 }
2838 
setStreamVolume(audio_stream_type_t stream,float volume,audio_io_handle_t output,int delayMs)2839 int AudioPolicyService::setStreamVolume(audio_stream_type_t stream,
2840                                         float volume,
2841                                         audio_io_handle_t output,
2842                                         int delayMs)
2843 {
2844     return (int)mAudioCommandThread->volumeCommand(stream, volume,
2845                                                    output, delayMs);
2846 }
2847 
setVoiceVolume(float volume,int delayMs)2848 int AudioPolicyService::setVoiceVolume(float volume, int delayMs)
2849 {
2850     return (int)mAudioCommandThread->voiceVolumeCommand(volume, delayMs);
2851 }
2852 
setEffectSuspended(int effectId,audio_session_t sessionId,bool suspended)2853 void AudioPolicyService::setEffectSuspended(int effectId,
2854                                             audio_session_t sessionId,
2855                                             bool suspended)
2856 {
2857     mAudioCommandThread->setEffectSuspendedCommand(effectId, sessionId, suspended);
2858 }
2859 
onNewAudioModulesAvailable()2860 Status AudioPolicyService::onNewAudioModulesAvailable()
2861 {
2862     mOutputCommandThread->audioModulesUpdateCommand();
2863     return Status::ok();
2864 }
2865 
2866 
2867 extern "C" {
2868 audio_module_handle_t aps_load_hw_module(void *service __unused,
2869                                              const char *name);
2870 audio_io_handle_t aps_open_output(void *service __unused,
2871                                          audio_devices_t *pDevices,
2872                                          uint32_t *pSamplingRate,
2873                                          audio_format_t *pFormat,
2874                                          audio_channel_mask_t *pChannelMask,
2875                                          uint32_t *pLatencyMs,
2876                                          audio_output_flags_t flags);
2877 
2878 audio_io_handle_t aps_open_output_on_module(void *service __unused,
2879                                                    audio_module_handle_t module,
2880                                                    audio_devices_t *pDevices,
2881                                                    uint32_t *pSamplingRate,
2882                                                    audio_format_t *pFormat,
2883                                                    audio_channel_mask_t *pChannelMask,
2884                                                    uint32_t *pLatencyMs,
2885                                                    audio_output_flags_t flags,
2886                                                    const audio_offload_info_t *offloadInfo);
2887 audio_io_handle_t aps_open_dup_output(void *service __unused,
2888                                                  audio_io_handle_t output1,
2889                                                  audio_io_handle_t output2);
2890 int aps_close_output(void *service __unused, audio_io_handle_t output);
2891 int aps_suspend_output(void *service __unused, audio_io_handle_t output);
2892 int aps_restore_output(void *service __unused, audio_io_handle_t output);
2893 audio_io_handle_t aps_open_input(void *service __unused,
2894                                         audio_devices_t *pDevices,
2895                                         uint32_t *pSamplingRate,
2896                                         audio_format_t *pFormat,
2897                                         audio_channel_mask_t *pChannelMask,
2898                                         audio_in_acoustics_t acoustics __unused);
2899 audio_io_handle_t aps_open_input_on_module(void *service __unused,
2900                                                   audio_module_handle_t module,
2901                                                   audio_devices_t *pDevices,
2902                                                   uint32_t *pSamplingRate,
2903                                                   audio_format_t *pFormat,
2904                                                   audio_channel_mask_t *pChannelMask);
2905 int aps_close_input(void *service __unused, audio_io_handle_t input);
2906 int aps_invalidate_stream(void *service __unused, audio_stream_type_t stream);
2907 int aps_move_effects(void *service __unused, audio_session_t session,
2908                                 audio_io_handle_t src_output,
2909                                 audio_io_handle_t dst_output);
2910 char * aps_get_parameters(void *service __unused, audio_io_handle_t io_handle,
2911                                      const char *keys);
2912 void aps_set_parameters(void *service, audio_io_handle_t io_handle,
2913                                    const char *kv_pairs, int delay_ms);
2914 int aps_set_stream_volume(void *service, audio_stream_type_t stream,
2915                                      float volume, audio_io_handle_t output,
2916                                      int delay_ms);
2917 int aps_set_voice_volume(void *service, float volume, int delay_ms);
2918 };
2919 
2920 } // namespace android
2921