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