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