Home | History | Annotate | Download | only in service
      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 
     27 #include <audio_utils/clock.h>
     28 #include <binder/IServiceManager.h>
     29 #include <utils/Log.h>
     30 #include <cutils/properties.h>
     31 #include <binder/IPCThreadState.h>
     32 #include <binder/ActivityManager.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/AudioEffect.h>
     40 #include <media/AudioParameter.h>
     41 #include <mediautils/ServiceUtilities.h>
     42 #include <sensorprivacy/SensorPrivacyManager.h>
     43 
     44 #include <system/audio.h>
     45 #include <system/audio_policy.h>
     46 
     47 namespace android {
     48 
     49 static const char kDeadlockedString[] = "AudioPolicyService may be deadlocked\n";
     50 static const char kCmdDeadlockedString[] = "AudioPolicyService command thread may be deadlocked\n";
     51 
     52 static const int kDumpLockTimeoutNs = 1 * NANOS_PER_SECOND;
     53 
     54 static const nsecs_t kAudioCommandTimeoutNs = seconds(3); // 3 seconds
     55 
     56 static const String16 sManageAudioPolicyPermission("android.permission.MANAGE_AUDIO_POLICY");
     57 
     58 // ----------------------------------------------------------------------------
     59 
     60 AudioPolicyService::AudioPolicyService()
     61     : BnAudioPolicyService(), mpAudioPolicyDev(NULL), mpAudioPolicy(NULL),
     62       mAudioPolicyManager(NULL), mAudioPolicyClient(NULL), mPhoneState(AUDIO_MODE_INVALID)
     63 {
     64 }
     65 
     66 void AudioPolicyService::onFirstRef()
     67 {
     68     {
     69         Mutex::Autolock _l(mLock);
     70 
     71         // start audio commands thread
     72         mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
     73         // start output activity command thread
     74         mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
     75 
     76         mAudioPolicyClient = new AudioPolicyClient(this);
     77         mAudioPolicyManager = createAudioPolicyManager(mAudioPolicyClient);
     78     }
     79     // load audio processing modules
     80     sp<AudioPolicyEffects>audioPolicyEffects = new AudioPolicyEffects();
     81     {
     82         Mutex::Autolock _l(mLock);
     83         mAudioPolicyEffects = audioPolicyEffects;
     84     }
     85 
     86     mUidPolicy = new UidPolicy(this);
     87     mUidPolicy->registerSelf();
     88 
     89     mSensorPrivacyPolicy = new SensorPrivacyPolicy(this);
     90     mSensorPrivacyPolicy->registerSelf();
     91 }
     92 
     93 AudioPolicyService::~AudioPolicyService()
     94 {
     95     mAudioCommandThread->exit();
     96     mOutputCommandThread->exit();
     97 
     98     destroyAudioPolicyManager(mAudioPolicyManager);
     99     delete mAudioPolicyClient;
    100 
    101     mNotificationClients.clear();
    102     mAudioPolicyEffects.clear();
    103 
    104     mUidPolicy->unregisterSelf();
    105     mUidPolicy.clear();
    106 
    107     mSensorPrivacyPolicy->unregisterSelf();
    108     mSensorPrivacyPolicy.clear();
    109 }
    110 
    111 // A notification client is always registered by AudioSystem when the client process
    112 // connects to AudioPolicyService.
    113 void AudioPolicyService::registerClient(const sp<IAudioPolicyServiceClient>& client)
    114 {
    115     if (client == 0) {
    116         ALOGW("%s got NULL client", __FUNCTION__);
    117         return;
    118     }
    119     Mutex::Autolock _l(mNotificationClientsLock);
    120 
    121     uid_t uid = IPCThreadState::self()->getCallingUid();
    122     pid_t pid = IPCThreadState::self()->getCallingPid();
    123     int64_t token = ((int64_t)uid<<32) | pid;
    124 
    125     if (mNotificationClients.indexOfKey(token) < 0) {
    126         sp<NotificationClient> notificationClient = new NotificationClient(this,
    127                                                                            client,
    128                                                                            uid,
    129                                                                            pid);
    130         ALOGV("registerClient() client %p, uid %d pid %d", client.get(), uid, pid);
    131 
    132         mNotificationClients.add(token, notificationClient);
    133 
    134         sp<IBinder> binder = IInterface::asBinder(client);
    135         binder->linkToDeath(notificationClient);
    136     }
    137 }
    138 
    139 void AudioPolicyService::setAudioPortCallbacksEnabled(bool enabled)
    140 {
    141     Mutex::Autolock _l(mNotificationClientsLock);
    142 
    143     uid_t uid = IPCThreadState::self()->getCallingUid();
    144     pid_t pid = IPCThreadState::self()->getCallingPid();
    145     int64_t token = ((int64_t)uid<<32) | pid;
    146 
    147     if (mNotificationClients.indexOfKey(token) < 0) {
    148         return;
    149     }
    150     mNotificationClients.valueFor(token)->setAudioPortCallbacksEnabled(enabled);
    151 }
    152 
    153 void AudioPolicyService::setAudioVolumeGroupCallbacksEnabled(bool enabled)
    154 {
    155     Mutex::Autolock _l(mNotificationClientsLock);
    156 
    157     uid_t uid = IPCThreadState::self()->getCallingUid();
    158     pid_t pid = IPCThreadState::self()->getCallingPid();
    159     int64_t token = ((int64_t)uid<<32) | pid;
    160 
    161     if (mNotificationClients.indexOfKey(token) < 0) {
    162         return;
    163     }
    164     mNotificationClients.valueFor(token)->setAudioVolumeGroupCallbacksEnabled(enabled);
    165 }
    166 
    167 // removeNotificationClient() is called when the client process dies.
    168 void AudioPolicyService::removeNotificationClient(uid_t uid, pid_t pid)
    169 {
    170     {
    171         Mutex::Autolock _l(mNotificationClientsLock);
    172         int64_t token = ((int64_t)uid<<32) | pid;
    173         mNotificationClients.removeItem(token);
    174     }
    175     {
    176         Mutex::Autolock _l(mLock);
    177         bool hasSameUid = false;
    178         for (size_t i = 0; i < mNotificationClients.size(); i++) {
    179             if (mNotificationClients.valueAt(i)->uid() == uid) {
    180                 hasSameUid = true;
    181                 break;
    182             }
    183         }
    184         if (mAudioPolicyManager && !hasSameUid) {
    185             // called from binder death notification: no need to clear caller identity
    186             mAudioPolicyManager->releaseResourcesForUid(uid);
    187         }
    188     }
    189 }
    190 
    191 void AudioPolicyService::onAudioPortListUpdate()
    192 {
    193     mOutputCommandThread->updateAudioPortListCommand();
    194 }
    195 
    196 void AudioPolicyService::doOnAudioPortListUpdate()
    197 {
    198     Mutex::Autolock _l(mNotificationClientsLock);
    199     for (size_t i = 0; i < mNotificationClients.size(); i++) {
    200         mNotificationClients.valueAt(i)->onAudioPortListUpdate();
    201     }
    202 }
    203 
    204 void AudioPolicyService::onAudioPatchListUpdate()
    205 {
    206     mOutputCommandThread->updateAudioPatchListCommand();
    207 }
    208 
    209 void AudioPolicyService::doOnAudioPatchListUpdate()
    210 {
    211     Mutex::Autolock _l(mNotificationClientsLock);
    212     for (size_t i = 0; i < mNotificationClients.size(); i++) {
    213         mNotificationClients.valueAt(i)->onAudioPatchListUpdate();
    214     }
    215 }
    216 
    217 void AudioPolicyService::onAudioVolumeGroupChanged(volume_group_t group, int flags)
    218 {
    219     mOutputCommandThread->changeAudioVolumeGroupCommand(group, flags);
    220 }
    221 
    222 void AudioPolicyService::doOnAudioVolumeGroupChanged(volume_group_t group, int flags)
    223 {
    224     Mutex::Autolock _l(mNotificationClientsLock);
    225     for (size_t i = 0; i < mNotificationClients.size(); i++) {
    226         mNotificationClients.valueAt(i)->onAudioVolumeGroupChanged(group, flags);
    227     }
    228 }
    229 
    230 void AudioPolicyService::onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state)
    231 {
    232     ALOGV("AudioPolicyService::onDynamicPolicyMixStateUpdate(%s, %d)",
    233             regId.string(), state);
    234     mOutputCommandThread->dynamicPolicyMixStateUpdateCommand(regId, state);
    235 }
    236 
    237 void AudioPolicyService::doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state)
    238 {
    239     Mutex::Autolock _l(mNotificationClientsLock);
    240     for (size_t i = 0; i < mNotificationClients.size(); i++) {
    241         mNotificationClients.valueAt(i)->onDynamicPolicyMixStateUpdate(regId, state);
    242     }
    243 }
    244 
    245 void AudioPolicyService::onRecordingConfigurationUpdate(
    246                                                     int event,
    247                                                     const record_client_info_t *clientInfo,
    248                                                     const audio_config_base_t *clientConfig,
    249                                                     std::vector<effect_descriptor_t> clientEffects,
    250                                                     const audio_config_base_t *deviceConfig,
    251                                                     std::vector<effect_descriptor_t> effects,
    252                                                     audio_patch_handle_t patchHandle,
    253                                                     audio_source_t source)
    254 {
    255     mOutputCommandThread->recordingConfigurationUpdateCommand(event, clientInfo,
    256             clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
    257 }
    258 
    259 void AudioPolicyService::doOnRecordingConfigurationUpdate(
    260                                                   int event,
    261                                                   const record_client_info_t *clientInfo,
    262                                                   const audio_config_base_t *clientConfig,
    263                                                   std::vector<effect_descriptor_t> clientEffects,
    264                                                   const audio_config_base_t *deviceConfig,
    265                                                   std::vector<effect_descriptor_t> effects,
    266                                                   audio_patch_handle_t patchHandle,
    267                                                   audio_source_t source)
    268 {
    269     Mutex::Autolock _l(mNotificationClientsLock);
    270     for (size_t i = 0; i < mNotificationClients.size(); i++) {
    271         mNotificationClients.valueAt(i)->onRecordingConfigurationUpdate(event, clientInfo,
    272                 clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
    273     }
    274 }
    275 
    276 status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch,
    277                                                 audio_patch_handle_t *handle,
    278                                                 int delayMs)
    279 {
    280     return mAudioCommandThread->createAudioPatchCommand(patch, handle, delayMs);
    281 }
    282 
    283 status_t AudioPolicyService::clientReleaseAudioPatch(audio_patch_handle_t handle,
    284                                                  int delayMs)
    285 {
    286     return mAudioCommandThread->releaseAudioPatchCommand(handle, delayMs);
    287 }
    288 
    289 status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_config *config,
    290                                                       int delayMs)
    291 {
    292     return mAudioCommandThread->setAudioPortConfigCommand(config, delayMs);
    293 }
    294 
    295 AudioPolicyService::NotificationClient::NotificationClient(const sp<AudioPolicyService>& service,
    296                                                      const sp<IAudioPolicyServiceClient>& client,
    297                                                      uid_t uid,
    298                                                      pid_t pid)
    299     : mService(service), mUid(uid), mPid(pid), mAudioPolicyServiceClient(client),
    300       mAudioPortCallbacksEnabled(false), mAudioVolumeGroupCallbacksEnabled(false)
    301 {
    302 }
    303 
    304 AudioPolicyService::NotificationClient::~NotificationClient()
    305 {
    306 }
    307 
    308 void AudioPolicyService::NotificationClient::binderDied(const wp<IBinder>& who __unused)
    309 {
    310     sp<NotificationClient> keep(this);
    311     sp<AudioPolicyService> service = mService.promote();
    312     if (service != 0) {
    313         service->removeNotificationClient(mUid, mPid);
    314     }
    315 }
    316 
    317 void AudioPolicyService::NotificationClient::onAudioPortListUpdate()
    318 {
    319     if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) {
    320         mAudioPolicyServiceClient->onAudioPortListUpdate();
    321     }
    322 }
    323 
    324 void AudioPolicyService::NotificationClient::onAudioPatchListUpdate()
    325 {
    326     if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) {
    327         mAudioPolicyServiceClient->onAudioPatchListUpdate();
    328     }
    329 }
    330 
    331 void AudioPolicyService::NotificationClient::onAudioVolumeGroupChanged(volume_group_t group,
    332                                                                       int flags)
    333 {
    334     if (mAudioPolicyServiceClient != 0 && mAudioVolumeGroupCallbacksEnabled) {
    335         mAudioPolicyServiceClient->onAudioVolumeGroupChanged(group, flags);
    336     }
    337 }
    338 
    339 
    340 void AudioPolicyService::NotificationClient::onDynamicPolicyMixStateUpdate(
    341         const String8& regId, int32_t state)
    342 {
    343     if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
    344         mAudioPolicyServiceClient->onDynamicPolicyMixStateUpdate(regId, state);
    345     }
    346 }
    347 
    348 void AudioPolicyService::NotificationClient::onRecordingConfigurationUpdate(
    349                                             int event,
    350                                             const record_client_info_t *clientInfo,
    351                                             const audio_config_base_t *clientConfig,
    352                                             std::vector<effect_descriptor_t> clientEffects,
    353                                             const audio_config_base_t *deviceConfig,
    354                                             std::vector<effect_descriptor_t> effects,
    355                                             audio_patch_handle_t patchHandle,
    356                                             audio_source_t source)
    357 {
    358     if (mAudioPolicyServiceClient != 0 && isServiceUid(mUid)) {
    359         mAudioPolicyServiceClient->onRecordingConfigurationUpdate(event, clientInfo,
    360                 clientConfig, clientEffects, deviceConfig, effects, patchHandle, source);
    361     }
    362 }
    363 
    364 void AudioPolicyService::NotificationClient::setAudioPortCallbacksEnabled(bool enabled)
    365 {
    366     mAudioPortCallbacksEnabled = enabled;
    367 }
    368 
    369 void AudioPolicyService::NotificationClient::setAudioVolumeGroupCallbacksEnabled(bool enabled)
    370 {
    371     mAudioVolumeGroupCallbacksEnabled = enabled;
    372 }
    373 
    374 void AudioPolicyService::binderDied(const wp<IBinder>& who) {
    375     ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(),
    376             IPCThreadState::self()->getCallingPid());
    377 }
    378 
    379 static bool dumpTryLock(Mutex& mutex)
    380 {
    381     status_t err = mutex.timedLock(kDumpLockTimeoutNs);
    382     return err == NO_ERROR;
    383 }
    384 
    385 status_t AudioPolicyService::dumpInternals(int fd)
    386 {
    387     const size_t SIZE = 256;
    388     char buffer[SIZE];
    389     String8 result;
    390 
    391     snprintf(buffer, SIZE, "AudioPolicyManager: %p\n", mAudioPolicyManager);
    392     result.append(buffer);
    393     snprintf(buffer, SIZE, "Command Thread: %p\n", mAudioCommandThread.get());
    394     result.append(buffer);
    395 
    396     write(fd, result.string(), result.size());
    397     return NO_ERROR;
    398 }
    399 
    400 void AudioPolicyService::updateUidStates()
    401 {
    402     Mutex::Autolock _l(mLock);
    403     updateUidStates_l();
    404 }
    405 
    406 void AudioPolicyService::updateUidStates_l()
    407 {
    408 //    Go over all active clients and allow capture (does not force silence) in the
    409 //    following cases:
    410 //    Another client in the same UID has already been allowed to capture
    411 //    OR The client is the assistant
    412 //        AND an accessibility service is on TOP or a RTT call is active
    413 //               AND the source is VOICE_RECOGNITION or HOTWORD
    414 //        OR uses VOICE_RECOGNITION AND is on TOP
    415 //               OR uses HOTWORD
    416 //            AND there is no active privacy sensitive capture or call
    417 //                OR client has CAPTURE_AUDIO_OUTPUT privileged permission
    418 //    OR The client is an accessibility service
    419 //        AND is on TOP
    420 //        AND the source is VOICE_RECOGNITION or HOTWORD
    421 //    OR the client source is virtual (remote submix, call audio TX or RX...)
    422 //    OR Any client
    423 //        AND The assistant is not on TOP
    424 //        AND is on TOP or latest started
    425 //        AND there is no active privacy sensitive capture or call
    426 //                OR client has CAPTURE_AUDIO_OUTPUT privileged permission
    427 
    428     sp<AudioRecordClient> topActive;
    429     sp<AudioRecordClient> latestActive;
    430     sp<AudioRecordClient> latestSensitiveActive;
    431 
    432     nsecs_t topStartNs = 0;
    433     nsecs_t latestStartNs = 0;
    434     nsecs_t latestSensitiveStartNs = 0;
    435     bool isA11yOnTop = mUidPolicy->isA11yOnTop();
    436     bool isAssistantOnTop = false;
    437     bool isSensitiveActive = false;
    438     bool isInCall = mPhoneState == AUDIO_MODE_IN_CALL;
    439     bool rttCallActive =
    440             (mPhoneState == AUDIO_MODE_IN_CALL || mPhoneState == AUDIO_MODE_IN_COMMUNICATION)
    441             && mUidPolicy->isRttEnabled();
    442 
    443     // if Sensor Privacy is enabled then all recordings should be silenced.
    444     if (mSensorPrivacyPolicy->isSensorPrivacyEnabled()) {
    445         silenceAllRecordings_l();
    446         return;
    447     }
    448 
    449     for (size_t i =0; i < mAudioRecordClients.size(); i++) {
    450         sp<AudioRecordClient> current = mAudioRecordClients[i];
    451         if (!current->active) {
    452             continue;
    453         }
    454 
    455         app_state_t appState = apmStatFromAmState(mUidPolicy->getUidState(current->uid));
    456         // clients which app is in IDLE state are not eligible for top active or
    457         // latest active
    458         if (appState == APP_STATE_IDLE) {
    459             continue;
    460         }
    461 
    462         if (appState == APP_STATE_TOP) {
    463             if (current->startTimeNs > topStartNs) {
    464                 topActive = current;
    465                 topStartNs = current->startTimeNs;
    466             }
    467             if (mUidPolicy->isAssistantUid(current->uid)) {
    468                 isAssistantOnTop = true;
    469             }
    470         }
    471         if (current->startTimeNs > latestStartNs) {
    472             latestActive = current;
    473             latestStartNs = current->startTimeNs;
    474         }
    475         if (isPrivacySensitiveSource(current->attributes.source)) {
    476             if (current->startTimeNs > latestSensitiveStartNs) {
    477                 latestSensitiveActive = current;
    478                 latestSensitiveStartNs = current->startTimeNs;
    479             }
    480             isSensitiveActive = true;
    481         }
    482     }
    483 
    484     // if no active client with UI on Top, consider latest active as top
    485     if (topActive == nullptr) {
    486         topActive = latestActive;
    487     }
    488 
    489     std::vector<uid_t> enabledUids;
    490 
    491     for (size_t i =0; i < mAudioRecordClients.size(); i++) {
    492         sp<AudioRecordClient> current = mAudioRecordClients[i];
    493         if (!current->active) {
    494             continue;
    495         }
    496 
    497         // keep capture allowed if another client with the same UID has already
    498         // been allowed to capture
    499         if (std::find(enabledUids.begin(), enabledUids.end(), current->uid)
    500                 != enabledUids.end()) {
    501             continue;
    502         }
    503 
    504         audio_source_t source = current->attributes.source;
    505         bool isTopOrLatestActive = topActive == nullptr ? false : current->uid == topActive->uid;
    506         bool isLatestSensitive = latestSensitiveActive == nullptr ?
    507                                  false : current->uid == latestSensitiveActive->uid;
    508 
    509         // By default allow capture if:
    510         //     The assistant is not on TOP
    511         //     AND is on TOP or latest started
    512         //     AND there is no active privacy sensitive capture or call
    513         //             OR client has CAPTURE_AUDIO_OUTPUT privileged permission
    514         bool allowCapture = !isAssistantOnTop
    515                 && ((isTopOrLatestActive && !isLatestSensitive) || isLatestSensitive)
    516                 && !(isSensitiveActive && !(isLatestSensitive || current->canCaptureOutput))
    517                 && !(isInCall && !current->canCaptureOutput);
    518 
    519         if (isVirtualSource(source)) {
    520             // Allow capture for virtual (remote submix, call audio TX or RX...) sources
    521             allowCapture = true;
    522         } else if (mUidPolicy->isAssistantUid(current->uid)) {
    523             // For assistant allow capture if:
    524             //     An accessibility service is on TOP or a RTT call is active
    525             //            AND the source is VOICE_RECOGNITION or HOTWORD
    526             //     OR is on TOP AND uses VOICE_RECOGNITION
    527             //            OR uses HOTWORD
    528             //         AND there is no active privacy sensitive capture or call
    529             //             OR client has CAPTURE_AUDIO_OUTPUT privileged permission
    530             if (isA11yOnTop || rttCallActive) {
    531                 if (source == AUDIO_SOURCE_HOTWORD || source == AUDIO_SOURCE_VOICE_RECOGNITION) {
    532                     allowCapture = true;
    533                 }
    534             } else {
    535                 if (((isAssistantOnTop && source == AUDIO_SOURCE_VOICE_RECOGNITION) ||
    536                         source == AUDIO_SOURCE_HOTWORD) &&
    537                         (!(isSensitiveActive || isInCall) || current->canCaptureOutput)) {
    538                     allowCapture = true;
    539                 }
    540             }
    541         } else if (mUidPolicy->isA11yUid(current->uid)) {
    542             // For accessibility service allow capture if:
    543             //     Is on TOP
    544             //     AND the source is VOICE_RECOGNITION or HOTWORD
    545             if (isA11yOnTop &&
    546                     (source == AUDIO_SOURCE_VOICE_RECOGNITION || source == AUDIO_SOURCE_HOTWORD)) {
    547                 allowCapture = true;
    548             }
    549         }
    550         setAppState_l(current->uid,
    551                       allowCapture ? apmStatFromAmState(mUidPolicy->getUidState(current->uid)) :
    552                                 APP_STATE_IDLE);
    553         if (allowCapture) {
    554             enabledUids.push_back(current->uid);
    555         }
    556     }
    557 }
    558 
    559 void AudioPolicyService::silenceAllRecordings_l() {
    560     for (size_t i = 0; i < mAudioRecordClients.size(); i++) {
    561         sp<AudioRecordClient> current = mAudioRecordClients[i];
    562         if (!isVirtualSource(current->attributes.source)) {
    563             setAppState_l(current->uid, APP_STATE_IDLE);
    564         }
    565     }
    566 }
    567 
    568 /* static */
    569 app_state_t AudioPolicyService::apmStatFromAmState(int amState) {
    570 
    571     if (amState == ActivityManager::PROCESS_STATE_UNKNOWN) {
    572         return APP_STATE_IDLE;
    573     } else if (amState <= ActivityManager::PROCESS_STATE_TOP) {
    574       // include persistent services
    575       return APP_STATE_TOP;
    576     }
    577     return APP_STATE_FOREGROUND;
    578 }
    579 
    580 /* static */
    581 bool AudioPolicyService::isPrivacySensitiveSource(audio_source_t source)
    582 {
    583     switch (source) {
    584         case AUDIO_SOURCE_CAMCORDER:
    585         case AUDIO_SOURCE_VOICE_COMMUNICATION:
    586             return true;
    587         default:
    588             break;
    589     }
    590     return false;
    591 }
    592 
    593 /* static */
    594 bool AudioPolicyService::isVirtualSource(audio_source_t source)
    595 {
    596     switch (source) {
    597         case AUDIO_SOURCE_VOICE_UPLINK:
    598         case AUDIO_SOURCE_VOICE_DOWNLINK:
    599         case AUDIO_SOURCE_VOICE_CALL:
    600         case AUDIO_SOURCE_REMOTE_SUBMIX:
    601         case AUDIO_SOURCE_FM_TUNER:
    602             return true;
    603         default:
    604             break;
    605     }
    606     return false;
    607 }
    608 
    609 void AudioPolicyService::setAppState_l(uid_t uid, app_state_t state)
    610 {
    611     AutoCallerClear acc;
    612 
    613     if (mAudioPolicyManager) {
    614         mAudioPolicyManager->setAppState(uid, state);
    615     }
    616     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
    617     if (af) {
    618         bool silenced = state == APP_STATE_IDLE;
    619         af->setRecordSilenced(uid, silenced);
    620     }
    621 }
    622 
    623 status_t AudioPolicyService::dump(int fd, const Vector<String16>& args __unused)
    624 {
    625     if (!dumpAllowed()) {
    626         dumpPermissionDenial(fd);
    627     } else {
    628         bool locked = dumpTryLock(mLock);
    629         if (!locked) {
    630             String8 result(kDeadlockedString);
    631             write(fd, result.string(), result.size());
    632         }
    633 
    634         dumpInternals(fd);
    635         if (mAudioCommandThread != 0) {
    636             mAudioCommandThread->dump(fd);
    637         }
    638 
    639         if (mAudioPolicyManager) {
    640             mAudioPolicyManager->dump(fd);
    641         }
    642 
    643         mPackageManager.dump(fd);
    644 
    645         if (locked) mLock.unlock();
    646     }
    647     return NO_ERROR;
    648 }
    649 
    650 status_t AudioPolicyService::dumpPermissionDenial(int fd)
    651 {
    652     const size_t SIZE = 256;
    653     char buffer[SIZE];
    654     String8 result;
    655     snprintf(buffer, SIZE, "Permission Denial: "
    656             "can't dump AudioPolicyService from pid=%d, uid=%d\n",
    657             IPCThreadState::self()->getCallingPid(),
    658             IPCThreadState::self()->getCallingUid());
    659     result.append(buffer);
    660     write(fd, result.string(), result.size());
    661     return NO_ERROR;
    662 }
    663 
    664 status_t AudioPolicyService::onTransact(
    665         uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {
    666     switch (code) {
    667         case SHELL_COMMAND_TRANSACTION: {
    668             int in = data.readFileDescriptor();
    669             int out = data.readFileDescriptor();
    670             int err = data.readFileDescriptor();
    671             int argc = data.readInt32();
    672             Vector<String16> args;
    673             for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
    674                args.add(data.readString16());
    675             }
    676             sp<IBinder> unusedCallback;
    677             sp<IResultReceiver> resultReceiver;
    678             status_t status;
    679             if ((status = data.readNullableStrongBinder(&unusedCallback)) != NO_ERROR) {
    680                 return status;
    681             }
    682             if ((status = data.readNullableStrongBinder(&resultReceiver)) != NO_ERROR) {
    683                 return status;
    684             }
    685             status = shellCommand(in, out, err, args);
    686             if (resultReceiver != nullptr) {
    687                 resultReceiver->send(status);
    688             }
    689             return NO_ERROR;
    690         }
    691     }
    692 
    693     return BnAudioPolicyService::onTransact(code, data, reply, flags);
    694 }
    695 
    696 // ------------------- Shell command implementation -------------------
    697 
    698 // NOTE: This is a remote API - make sure all args are validated
    699 status_t AudioPolicyService::shellCommand(int in, int out, int err, Vector<String16>& args) {
    700     if (!checkCallingPermission(sManageAudioPolicyPermission, nullptr, nullptr)) {
    701         return PERMISSION_DENIED;
    702     }
    703     if (in == BAD_TYPE || out == BAD_TYPE || err == BAD_TYPE) {
    704         return BAD_VALUE;
    705     }
    706     if (args.size() == 3 && args[0] == String16("set-uid-state")) {
    707         return handleSetUidState(args, err);
    708     } else if (args.size() == 2 && args[0] == String16("reset-uid-state")) {
    709         return handleResetUidState(args, err);
    710     } else if (args.size() == 2 && args[0] == String16("get-uid-state")) {
    711         return handleGetUidState(args, out, err);
    712     } else if (args.size() == 1 && args[0] == String16("help")) {
    713         printHelp(out);
    714         return NO_ERROR;
    715     }
    716     printHelp(err);
    717     return BAD_VALUE;
    718 }
    719 
    720 status_t AudioPolicyService::handleSetUidState(Vector<String16>& args, int err) {
    721     PermissionController pc;
    722     int uid = pc.getPackageUid(args[1], 0);
    723     if (uid <= 0) {
    724         ALOGE("Unknown package: '%s'", String8(args[1]).string());
    725         dprintf(err, "Unknown package: '%s'\n", String8(args[1]).string());
    726         return BAD_VALUE;
    727     }
    728     bool active = false;
    729     if (args[2] == String16("active")) {
    730         active = true;
    731     } else if ((args[2] != String16("idle"))) {
    732         ALOGE("Expected active or idle but got: '%s'", String8(args[2]).string());
    733         return BAD_VALUE;
    734     }
    735     mUidPolicy->addOverrideUid(uid, active);
    736     return NO_ERROR;
    737 }
    738 
    739 status_t AudioPolicyService::handleResetUidState(Vector<String16>& args, int err) {
    740     PermissionController pc;
    741     int uid = pc.getPackageUid(args[1], 0);
    742     if (uid < 0) {
    743         ALOGE("Unknown package: '%s'", String8(args[1]).string());
    744         dprintf(err, "Unknown package: '%s'\n", String8(args[1]).string());
    745         return BAD_VALUE;
    746     }
    747     mUidPolicy->removeOverrideUid(uid);
    748     return NO_ERROR;
    749 }
    750 
    751 status_t AudioPolicyService::handleGetUidState(Vector<String16>& args, int out, int err) {
    752     PermissionController pc;
    753     int uid = pc.getPackageUid(args[1], 0);
    754     if (uid < 0) {
    755         ALOGE("Unknown package: '%s'", String8(args[1]).string());
    756         dprintf(err, "Unknown package: '%s'\n", String8(args[1]).string());
    757         return BAD_VALUE;
    758     }
    759     if (mUidPolicy->isUidActive(uid)) {
    760         return dprintf(out, "active\n");
    761     } else {
    762         return dprintf(out, "idle\n");
    763     }
    764 }
    765 
    766 status_t AudioPolicyService::printHelp(int out) {
    767     return dprintf(out, "Audio policy service commands:\n"
    768         "  get-uid-state <PACKAGE> gets the uid state\n"
    769         "  set-uid-state <PACKAGE> <active|idle> overrides the uid state\n"
    770         "  reset-uid-state <PACKAGE> clears the uid state override\n"
    771         "  help print this message\n");
    772 }
    773 
    774 // -----------  AudioPolicyService::UidPolicy implementation ----------
    775 
    776 void AudioPolicyService::UidPolicy::registerSelf() {
    777     ActivityManager am;
    778     am.registerUidObserver(this, ActivityManager::UID_OBSERVER_GONE
    779             | ActivityManager::UID_OBSERVER_IDLE
    780             | ActivityManager::UID_OBSERVER_ACTIVE
    781             | ActivityManager::UID_OBSERVER_PROCSTATE,
    782             ActivityManager::PROCESS_STATE_UNKNOWN,
    783             String16("audioserver"));
    784     status_t res = am.linkToDeath(this);
    785     if (!res) {
    786         Mutex::Autolock _l(mLock);
    787         mObserverRegistered = true;
    788     } else {
    789         ALOGE("UidPolicy::registerSelf linkToDeath failed: %d", res);
    790 
    791         am.unregisterUidObserver(this);
    792     }
    793 }
    794 
    795 void AudioPolicyService::UidPolicy::unregisterSelf() {
    796     ActivityManager am;
    797     am.unlinkToDeath(this);
    798     am.unregisterUidObserver(this);
    799     Mutex::Autolock _l(mLock);
    800     mObserverRegistered = false;
    801 }
    802 
    803 void AudioPolicyService::UidPolicy::binderDied(__unused const wp<IBinder> &who) {
    804     Mutex::Autolock _l(mLock);
    805     mCachedUids.clear();
    806     mObserverRegistered = false;
    807 }
    808 
    809 void AudioPolicyService::UidPolicy::checkRegistered() {
    810     bool needToReregister = false;
    811     {
    812         Mutex::Autolock _l(mLock);
    813         needToReregister = !mObserverRegistered;
    814     }
    815     if (needToReregister) {
    816         // Looks like ActivityManager has died previously, attempt to re-register.
    817         registerSelf();
    818     }
    819 }
    820 
    821 bool AudioPolicyService::UidPolicy::isUidActive(uid_t uid) {
    822     if (isServiceUid(uid)) return true;
    823     checkRegistered();
    824     {
    825         Mutex::Autolock _l(mLock);
    826         auto overrideIter = mOverrideUids.find(uid);
    827         if (overrideIter != mOverrideUids.end()) {
    828             return overrideIter->second.first;
    829         }
    830         // In an absense of the ActivityManager, assume everything to be active.
    831         if (!mObserverRegistered) return true;
    832         auto cacheIter = mCachedUids.find(uid);
    833         if (cacheIter != mCachedUids.end()) {
    834             return cacheIter->second.first;
    835         }
    836     }
    837     ActivityManager am;
    838     bool active = am.isUidActive(uid, String16("audioserver"));
    839     {
    840         Mutex::Autolock _l(mLock);
    841         mCachedUids.insert(std::pair<uid_t,
    842                            std::pair<bool, int>>(uid, std::pair<bool, int>(active,
    843                                                       ActivityManager::PROCESS_STATE_UNKNOWN)));
    844     }
    845     return active;
    846 }
    847 
    848 int AudioPolicyService::UidPolicy::getUidState(uid_t uid) {
    849     if (isServiceUid(uid)) {
    850         return ActivityManager::PROCESS_STATE_TOP;
    851     }
    852     checkRegistered();
    853     {
    854         Mutex::Autolock _l(mLock);
    855         auto overrideIter = mOverrideUids.find(uid);
    856         if (overrideIter != mOverrideUids.end()) {
    857             if (overrideIter->second.first) {
    858                 if (overrideIter->second.second != ActivityManager::PROCESS_STATE_UNKNOWN) {
    859                     return overrideIter->second.second;
    860                 } else {
    861                     auto cacheIter = mCachedUids.find(uid);
    862                     if (cacheIter != mCachedUids.end()) {
    863                         return cacheIter->second.second;
    864                     }
    865                 }
    866             }
    867             return ActivityManager::PROCESS_STATE_UNKNOWN;
    868         }
    869         // In an absense of the ActivityManager, assume everything to be active.
    870         if (!mObserverRegistered) {
    871             return ActivityManager::PROCESS_STATE_TOP;
    872         }
    873         auto cacheIter = mCachedUids.find(uid);
    874         if (cacheIter != mCachedUids.end()) {
    875             if (cacheIter->second.first) {
    876                 return cacheIter->second.second;
    877             } else {
    878                 return ActivityManager::PROCESS_STATE_UNKNOWN;
    879             }
    880         }
    881     }
    882     ActivityManager am;
    883     bool active = am.isUidActive(uid, String16("audioserver"));
    884     int state = ActivityManager::PROCESS_STATE_UNKNOWN;
    885     if (active) {
    886         state = am.getUidProcessState(uid, String16("audioserver"));
    887     }
    888     {
    889         Mutex::Autolock _l(mLock);
    890         mCachedUids.insert(std::pair<uid_t,
    891                            std::pair<bool, int>>(uid, std::pair<bool, int>(active, state)));
    892     }
    893 
    894     return state;
    895 }
    896 
    897 void AudioPolicyService::UidPolicy::onUidActive(uid_t uid) {
    898     updateUid(&mCachedUids, uid, true, ActivityManager::PROCESS_STATE_UNKNOWN, true);
    899 }
    900 
    901 void AudioPolicyService::UidPolicy::onUidGone(uid_t uid, __unused bool disabled) {
    902     updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, false);
    903 }
    904 
    905 void AudioPolicyService::UidPolicy::onUidIdle(uid_t uid, __unused bool disabled) {
    906     updateUid(&mCachedUids, uid, false, ActivityManager::PROCESS_STATE_UNKNOWN, true);
    907 }
    908 
    909 void AudioPolicyService::UidPolicy::onUidStateChanged(uid_t uid,
    910                                                       int32_t procState,
    911                                                       int64_t procStateSeq __unused) {
    912     if (procState != ActivityManager::PROCESS_STATE_UNKNOWN) {
    913         updateUid(&mCachedUids, uid, true, procState, true);
    914     }
    915 }
    916 
    917 void AudioPolicyService::UidPolicy::updateOverrideUid(uid_t uid, bool active, bool insert) {
    918     updateUid(&mOverrideUids, uid, active, ActivityManager::PROCESS_STATE_UNKNOWN, insert);
    919 }
    920 
    921 void AudioPolicyService::UidPolicy::notifyService() {
    922     sp<AudioPolicyService> service = mService.promote();
    923     if (service != nullptr) {
    924         service->updateUidStates();
    925     }
    926 }
    927 
    928 void AudioPolicyService::UidPolicy::updateUid(std::unordered_map<uid_t,
    929                                               std::pair<bool, int>> *uids,
    930                                               uid_t uid,
    931                                               bool active,
    932                                               int state,
    933                                               bool insert) {
    934     if (isServiceUid(uid)) {
    935         return;
    936     }
    937     bool wasActive = isUidActive(uid);
    938     int previousState = getUidState(uid);
    939     {
    940         Mutex::Autolock _l(mLock);
    941         updateUidLocked(uids, uid, active, state, insert);
    942     }
    943     if (wasActive != isUidActive(uid) || state != previousState) {
    944         notifyService();
    945     }
    946 }
    947 
    948 void AudioPolicyService::UidPolicy::updateUidLocked(std::unordered_map<uid_t,
    949                                                     std::pair<bool, int>> *uids,
    950                                                     uid_t uid,
    951                                                     bool active,
    952                                                     int state,
    953                                                     bool insert) {
    954     auto it = uids->find(uid);
    955     if (it != uids->end()) {
    956         if (insert) {
    957             if (state == ActivityManager::PROCESS_STATE_UNKNOWN) {
    958                 it->second.first = active;
    959             }
    960             if (it->second.first) {
    961                 it->second.second = state;
    962             } else {
    963                 it->second.second = ActivityManager::PROCESS_STATE_UNKNOWN;
    964             }
    965         } else {
    966             uids->erase(it);
    967         }
    968     } else if (insert && (state == ActivityManager::PROCESS_STATE_UNKNOWN)) {
    969         uids->insert(std::pair<uid_t, std::pair<bool, int>>(uid,
    970                                       std::pair<bool, int>(active, state)));
    971     }
    972 }
    973 
    974 bool AudioPolicyService::UidPolicy::isA11yOnTop() {
    975     for (const auto &uid : mCachedUids) {
    976         std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid.first);
    977         if (it == mA11yUids.end()) {
    978             continue;
    979         }
    980         if (uid.second.second >= ActivityManager::PROCESS_STATE_TOP
    981                 && uid.second.second <= ActivityManager::PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
    982             return true;
    983         }
    984     }
    985     return false;
    986 }
    987 
    988 bool AudioPolicyService::UidPolicy::isA11yUid(uid_t uid)
    989 {
    990     std::vector<uid_t>::iterator it = find(mA11yUids.begin(), mA11yUids.end(), uid);
    991     return it != mA11yUids.end();
    992 }
    993 
    994 // -----------  AudioPolicyService::SensorPrivacyService implementation ----------
    995 void AudioPolicyService::SensorPrivacyPolicy::registerSelf() {
    996     SensorPrivacyManager spm;
    997     mSensorPrivacyEnabled = spm.isSensorPrivacyEnabled();
    998     spm.addSensorPrivacyListener(this);
    999 }
   1000 
   1001 void AudioPolicyService::SensorPrivacyPolicy::unregisterSelf() {
   1002     SensorPrivacyManager spm;
   1003     spm.removeSensorPrivacyListener(this);
   1004 }
   1005 
   1006 bool AudioPolicyService::SensorPrivacyPolicy::isSensorPrivacyEnabled() {
   1007     return mSensorPrivacyEnabled;
   1008 }
   1009 
   1010 binder::Status AudioPolicyService::SensorPrivacyPolicy::onSensorPrivacyChanged(bool enabled) {
   1011     mSensorPrivacyEnabled = enabled;
   1012     sp<AudioPolicyService> service = mService.promote();
   1013     if (service != nullptr) {
   1014         service->updateUidStates();
   1015     }
   1016     return binder::Status::ok();
   1017 }
   1018 
   1019 // -----------  AudioPolicyService::AudioCommandThread implementation ----------
   1020 
   1021 AudioPolicyService::AudioCommandThread::AudioCommandThread(String8 name,
   1022                                                            const wp<AudioPolicyService>& service)
   1023     : Thread(false), mName(name), mService(service)
   1024 {
   1025 }
   1026 
   1027 
   1028 AudioPolicyService::AudioCommandThread::~AudioCommandThread()
   1029 {
   1030     if (!mAudioCommands.isEmpty()) {
   1031         release_wake_lock(mName.string());
   1032     }
   1033     mAudioCommands.clear();
   1034 }
   1035 
   1036 void AudioPolicyService::AudioCommandThread::onFirstRef()
   1037 {
   1038     run(mName.string(), ANDROID_PRIORITY_AUDIO);
   1039 }
   1040 
   1041 bool AudioPolicyService::AudioCommandThread::threadLoop()
   1042 {
   1043     nsecs_t waitTime = -1;
   1044 
   1045     mLock.lock();
   1046     while (!exitPending())
   1047     {
   1048         sp<AudioPolicyService> svc;
   1049         while (!mAudioCommands.isEmpty() && !exitPending()) {
   1050             nsecs_t curTime = systemTime();
   1051             // commands are sorted by increasing time stamp: execute them from index 0 and up
   1052             if (mAudioCommands[0]->mTime <= curTime) {
   1053                 sp<AudioCommand> command = mAudioCommands[0];
   1054                 mAudioCommands.removeAt(0);
   1055                 mLastCommand = command;
   1056 
   1057                 switch (command->mCommand) {
   1058                 case SET_VOLUME: {
   1059                     VolumeData *data = (VolumeData *)command->mParam.get();
   1060                     ALOGV("AudioCommandThread() processing set volume stream %d, \
   1061                             volume %f, output %d", data->mStream, data->mVolume, data->mIO);
   1062                     mLock.unlock();
   1063                     command->mStatus = AudioSystem::setStreamVolume(data->mStream,
   1064                                                                     data->mVolume,
   1065                                                                     data->mIO);
   1066                     mLock.lock();
   1067                     }break;
   1068                 case SET_PARAMETERS: {
   1069                     ParametersData *data = (ParametersData *)command->mParam.get();
   1070                     ALOGV("AudioCommandThread() processing set parameters string %s, io %d",
   1071                             data->mKeyValuePairs.string(), data->mIO);
   1072                     mLock.unlock();
   1073                     command->mStatus = AudioSystem::setParameters(data->mIO, data->mKeyValuePairs);
   1074                     mLock.lock();
   1075                     }break;
   1076                 case SET_VOICE_VOLUME: {
   1077                     VoiceVolumeData *data = (VoiceVolumeData *)command->mParam.get();
   1078                     ALOGV("AudioCommandThread() processing set voice volume volume %f",
   1079                             data->mVolume);
   1080                     mLock.unlock();
   1081                     command->mStatus = AudioSystem::setVoiceVolume(data->mVolume);
   1082                     mLock.lock();
   1083                     }break;
   1084                 case STOP_OUTPUT: {
   1085                     StopOutputData *data = (StopOutputData *)command->mParam.get();
   1086                     ALOGV("AudioCommandThread() processing stop output portId %d",
   1087                             data->mPortId);
   1088                     svc = mService.promote();
   1089                     if (svc == 0) {
   1090                         break;
   1091                     }
   1092                     mLock.unlock();
   1093                     svc->doStopOutput(data->mPortId);
   1094                     mLock.lock();
   1095                     }break;
   1096                 case RELEASE_OUTPUT: {
   1097                     ReleaseOutputData *data = (ReleaseOutputData *)command->mParam.get();
   1098                     ALOGV("AudioCommandThread() processing release output portId %d",
   1099                             data->mPortId);
   1100                     svc = mService.promote();
   1101                     if (svc == 0) {
   1102                         break;
   1103                     }
   1104                     mLock.unlock();
   1105                     svc->doReleaseOutput(data->mPortId);
   1106                     mLock.lock();
   1107                     }break;
   1108                 case CREATE_AUDIO_PATCH: {
   1109                     CreateAudioPatchData *data = (CreateAudioPatchData *)command->mParam.get();
   1110                     ALOGV("AudioCommandThread() processing create audio patch");
   1111                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
   1112                     if (af == 0) {
   1113                         command->mStatus = PERMISSION_DENIED;
   1114                     } else {
   1115                         mLock.unlock();
   1116                         command->mStatus = af->createAudioPatch(&data->mPatch, &data->mHandle);
   1117                         mLock.lock();
   1118                     }
   1119                     } break;
   1120                 case RELEASE_AUDIO_PATCH: {
   1121                     ReleaseAudioPatchData *data = (ReleaseAudioPatchData *)command->mParam.get();
   1122                     ALOGV("AudioCommandThread() processing release audio patch");
   1123                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
   1124                     if (af == 0) {
   1125                         command->mStatus = PERMISSION_DENIED;
   1126                     } else {
   1127                         mLock.unlock();
   1128                         command->mStatus = af->releaseAudioPatch(data->mHandle);
   1129                         mLock.lock();
   1130                     }
   1131                     } break;
   1132                 case UPDATE_AUDIOPORT_LIST: {
   1133                     ALOGV("AudioCommandThread() processing update audio port list");
   1134                     svc = mService.promote();
   1135                     if (svc == 0) {
   1136                         break;
   1137                     }
   1138                     mLock.unlock();
   1139                     svc->doOnAudioPortListUpdate();
   1140                     mLock.lock();
   1141                     }break;
   1142                 case UPDATE_AUDIOPATCH_LIST: {
   1143                     ALOGV("AudioCommandThread() processing update audio patch list");
   1144                     svc = mService.promote();
   1145                     if (svc == 0) {
   1146                         break;
   1147                     }
   1148                     mLock.unlock();
   1149                     svc->doOnAudioPatchListUpdate();
   1150                     mLock.lock();
   1151                     }break;
   1152                 case CHANGED_AUDIOVOLUMEGROUP: {
   1153                     AudioVolumeGroupData *data =
   1154                             static_cast<AudioVolumeGroupData *>(command->mParam.get());
   1155                     ALOGV("AudioCommandThread() processing update audio volume group");
   1156                     svc = mService.promote();
   1157                     if (svc == 0) {
   1158                         break;
   1159                     }
   1160                     mLock.unlock();
   1161                     svc->doOnAudioVolumeGroupChanged(data->mGroup, data->mFlags);
   1162                     mLock.lock();
   1163                     }break;
   1164                 case SET_AUDIOPORT_CONFIG: {
   1165                     SetAudioPortConfigData *data = (SetAudioPortConfigData *)command->mParam.get();
   1166                     ALOGV("AudioCommandThread() processing set port config");
   1167                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
   1168                     if (af == 0) {
   1169                         command->mStatus = PERMISSION_DENIED;
   1170                     } else {
   1171                         mLock.unlock();
   1172                         command->mStatus = af->setAudioPortConfig(&data->mConfig);
   1173                         mLock.lock();
   1174                     }
   1175                     } break;
   1176                 case DYN_POLICY_MIX_STATE_UPDATE: {
   1177                     DynPolicyMixStateUpdateData *data =
   1178                             (DynPolicyMixStateUpdateData *)command->mParam.get();
   1179                     ALOGV("AudioCommandThread() processing dyn policy mix state update %s %d",
   1180                             data->mRegId.string(), data->mState);
   1181                     svc = mService.promote();
   1182                     if (svc == 0) {
   1183                         break;
   1184                     }
   1185                     mLock.unlock();
   1186                     svc->doOnDynamicPolicyMixStateUpdate(data->mRegId, data->mState);
   1187                     mLock.lock();
   1188                     } break;
   1189                 case RECORDING_CONFIGURATION_UPDATE: {
   1190                     RecordingConfigurationUpdateData *data =
   1191                             (RecordingConfigurationUpdateData *)command->mParam.get();
   1192                     ALOGV("AudioCommandThread() processing recording configuration update");
   1193                     svc = mService.promote();
   1194                     if (svc == 0) {
   1195                         break;
   1196                     }
   1197                     mLock.unlock();
   1198                     svc->doOnRecordingConfigurationUpdate(data->mEvent, &data->mClientInfo,
   1199                             &data->mClientConfig, data->mClientEffects,
   1200                             &data->mDeviceConfig, data->mEffects,
   1201                             data->mPatchHandle, data->mSource);
   1202                     mLock.lock();
   1203                     } break;
   1204                 case SET_EFFECT_SUSPENDED: {
   1205                     SetEffectSuspendedData *data = (SetEffectSuspendedData *)command->mParam.get();
   1206                     ALOGV("AudioCommandThread() processing set effect suspended");
   1207                     sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
   1208                     if (af != 0) {
   1209                         mLock.unlock();
   1210                         af->setEffectSuspended(data->mEffectId, data->mSessionId, data->mSuspended);
   1211                         mLock.lock();
   1212                     }
   1213                     } break;
   1214 
   1215                 default:
   1216                     ALOGW("AudioCommandThread() unknown command %d", command->mCommand);
   1217                 }
   1218                 {
   1219                     Mutex::Autolock _l(command->mLock);
   1220                     if (command->mWaitStatus) {
   1221                         command->mWaitStatus = false;
   1222                         command->mCond.signal();
   1223                     }
   1224                 }
   1225                 waitTime = -1;
   1226                 // release mLock before releasing strong reference on the service as
   1227                 // AudioPolicyService destructor calls AudioCommandThread::exit() which
   1228                 // acquires mLock.
   1229                 mLock.unlock();
   1230                 svc.clear();
   1231                 mLock.lock();
   1232             } else {
   1233                 waitTime = mAudioCommands[0]->mTime - curTime;
   1234                 break;
   1235             }
   1236         }
   1237 
   1238         // release delayed commands wake lock if the queue is empty
   1239         if (mAudioCommands.isEmpty()) {
   1240             release_wake_lock(mName.string());
   1241         }
   1242 
   1243         // At this stage we have either an empty command queue or the first command in the queue
   1244         // has a finite delay. So unless we are exiting it is safe to wait.
   1245         if (!exitPending()) {
   1246             ALOGV("AudioCommandThread() going to sleep");
   1247             if (waitTime == -1) {
   1248                 mWaitWorkCV.wait(mLock);
   1249             } else {
   1250                 mWaitWorkCV.waitRelative(mLock, waitTime);
   1251             }
   1252         }
   1253     }
   1254     // release delayed commands wake lock before quitting
   1255     if (!mAudioCommands.isEmpty()) {
   1256         release_wake_lock(mName.string());
   1257     }
   1258     mLock.unlock();
   1259     return false;
   1260 }
   1261 
   1262 status_t AudioPolicyService::AudioCommandThread::dump(int fd)
   1263 {
   1264     const size_t SIZE = 256;
   1265     char buffer[SIZE];
   1266     String8 result;
   1267 
   1268     snprintf(buffer, SIZE, "AudioCommandThread %p Dump\n", this);
   1269     result.append(buffer);
   1270     write(fd, result.string(), result.size());
   1271 
   1272     bool locked = dumpTryLock(mLock);
   1273     if (!locked) {
   1274         String8 result2(kCmdDeadlockedString);
   1275         write(fd, result2.string(), result2.size());
   1276     }
   1277 
   1278     snprintf(buffer, SIZE, "- Commands:\n");
   1279     result = String8(buffer);
   1280     result.append("   Command Time        Wait pParam\n");
   1281     for (size_t i = 0; i < mAudioCommands.size(); i++) {
   1282         mAudioCommands[i]->dump(buffer, SIZE);
   1283         result.append(buffer);
   1284     }
   1285     result.append("  Last Command\n");
   1286     if (mLastCommand != 0) {
   1287         mLastCommand->dump(buffer, SIZE);
   1288         result.append(buffer);
   1289     } else {
   1290         result.append("     none\n");
   1291     }
   1292 
   1293     write(fd, result.string(), result.size());
   1294 
   1295     if (locked) mLock.unlock();
   1296 
   1297     return NO_ERROR;
   1298 }
   1299 
   1300 status_t AudioPolicyService::AudioCommandThread::volumeCommand(audio_stream_type_t stream,
   1301                                                                float volume,
   1302                                                                audio_io_handle_t output,
   1303                                                                int delayMs)
   1304 {
   1305     sp<AudioCommand> command = new AudioCommand();
   1306     command->mCommand = SET_VOLUME;
   1307     sp<VolumeData> data = new VolumeData();
   1308     data->mStream = stream;
   1309     data->mVolume = volume;
   1310     data->mIO = output;
   1311     command->mParam = data;
   1312     command->mWaitStatus = true;
   1313     ALOGV("AudioCommandThread() adding set volume stream %d, volume %f, output %d",
   1314             stream, volume, output);
   1315     return sendCommand(command, delayMs);
   1316 }
   1317 
   1318 status_t AudioPolicyService::AudioCommandThread::parametersCommand(audio_io_handle_t ioHandle,
   1319                                                                    const char *keyValuePairs,
   1320                                                                    int delayMs)
   1321 {
   1322     sp<AudioCommand> command = new AudioCommand();
   1323     command->mCommand = SET_PARAMETERS;
   1324     sp<ParametersData> data = new ParametersData();
   1325     data->mIO = ioHandle;
   1326     data->mKeyValuePairs = String8(keyValuePairs);
   1327     command->mParam = data;
   1328     command->mWaitStatus = true;
   1329     ALOGV("AudioCommandThread() adding set parameter string %s, io %d ,delay %d",
   1330             keyValuePairs, ioHandle, delayMs);
   1331     return sendCommand(command, delayMs);
   1332 }
   1333 
   1334 status_t AudioPolicyService::AudioCommandThread::voiceVolumeCommand(float volume, int delayMs)
   1335 {
   1336     sp<AudioCommand> command = new AudioCommand();
   1337     command->mCommand = SET_VOICE_VOLUME;
   1338     sp<VoiceVolumeData> data = new VoiceVolumeData();
   1339     data->mVolume = volume;
   1340     command->mParam = data;
   1341     command->mWaitStatus = true;
   1342     ALOGV("AudioCommandThread() adding set voice volume volume %f", volume);
   1343     return sendCommand(command, delayMs);
   1344 }
   1345 
   1346 void AudioPolicyService::AudioCommandThread::setEffectSuspendedCommand(int effectId,
   1347                                                                        audio_session_t sessionId,
   1348                                                                        bool suspended)
   1349 {
   1350     sp<AudioCommand> command = new AudioCommand();
   1351     command->mCommand = SET_EFFECT_SUSPENDED;
   1352     sp<SetEffectSuspendedData> data = new SetEffectSuspendedData();
   1353     data->mEffectId = effectId;
   1354     data->mSessionId = sessionId;
   1355     data->mSuspended = suspended;
   1356     command->mParam = data;
   1357     ALOGV("AudioCommandThread() adding set suspended effectId %d sessionId %d suspended %d",
   1358         effectId, sessionId, suspended);
   1359     sendCommand(command);
   1360 }
   1361 
   1362 
   1363 void AudioPolicyService::AudioCommandThread::stopOutputCommand(audio_port_handle_t portId)
   1364 {
   1365     sp<AudioCommand> command = new AudioCommand();
   1366     command->mCommand = STOP_OUTPUT;
   1367     sp<StopOutputData> data = new StopOutputData();
   1368     data->mPortId = portId;
   1369     command->mParam = data;
   1370     ALOGV("AudioCommandThread() adding stop output portId %d", portId);
   1371     sendCommand(command);
   1372 }
   1373 
   1374 void AudioPolicyService::AudioCommandThread::releaseOutputCommand(audio_port_handle_t portId)
   1375 {
   1376     sp<AudioCommand> command = new AudioCommand();
   1377     command->mCommand = RELEASE_OUTPUT;
   1378     sp<ReleaseOutputData> data = new ReleaseOutputData();
   1379     data->mPortId = portId;
   1380     command->mParam = data;
   1381     ALOGV("AudioCommandThread() adding release output portId %d", portId);
   1382     sendCommand(command);
   1383 }
   1384 
   1385 status_t AudioPolicyService::AudioCommandThread::createAudioPatchCommand(
   1386                                                 const struct audio_patch *patch,
   1387                                                 audio_patch_handle_t *handle,
   1388                                                 int delayMs)
   1389 {
   1390     status_t status = NO_ERROR;
   1391 
   1392     sp<AudioCommand> command = new AudioCommand();
   1393     command->mCommand = CREATE_AUDIO_PATCH;
   1394     CreateAudioPatchData *data = new CreateAudioPatchData();
   1395     data->mPatch = *patch;
   1396     data->mHandle = *handle;
   1397     command->mParam = data;
   1398     command->mWaitStatus = true;
   1399     ALOGV("AudioCommandThread() adding create patch delay %d", delayMs);
   1400     status = sendCommand(command, delayMs);
   1401     if (status == NO_ERROR) {
   1402         *handle = data->mHandle;
   1403     }
   1404     return status;
   1405 }
   1406 
   1407 status_t AudioPolicyService::AudioCommandThread::releaseAudioPatchCommand(audio_patch_handle_t handle,
   1408                                                  int delayMs)
   1409 {
   1410     sp<AudioCommand> command = new AudioCommand();
   1411     command->mCommand = RELEASE_AUDIO_PATCH;
   1412     ReleaseAudioPatchData *data = new ReleaseAudioPatchData();
   1413     data->mHandle = handle;
   1414     command->mParam = data;
   1415     command->mWaitStatus = true;
   1416     ALOGV("AudioCommandThread() adding release patch delay %d", delayMs);
   1417     return sendCommand(command, delayMs);
   1418 }
   1419 
   1420 void AudioPolicyService::AudioCommandThread::updateAudioPortListCommand()
   1421 {
   1422     sp<AudioCommand> command = new AudioCommand();
   1423     command->mCommand = UPDATE_AUDIOPORT_LIST;
   1424     ALOGV("AudioCommandThread() adding update audio port list");
   1425     sendCommand(command);
   1426 }
   1427 
   1428 void AudioPolicyService::AudioCommandThread::updateAudioPatchListCommand()
   1429 {
   1430     sp<AudioCommand>command = new AudioCommand();
   1431     command->mCommand = UPDATE_AUDIOPATCH_LIST;
   1432     ALOGV("AudioCommandThread() adding update audio patch list");
   1433     sendCommand(command);
   1434 }
   1435 
   1436 void AudioPolicyService::AudioCommandThread::changeAudioVolumeGroupCommand(volume_group_t group,
   1437                                                                            int flags)
   1438 {
   1439     sp<AudioCommand>command = new AudioCommand();
   1440     command->mCommand = CHANGED_AUDIOVOLUMEGROUP;
   1441     AudioVolumeGroupData *data= new AudioVolumeGroupData();
   1442     data->mGroup = group;
   1443     data->mFlags = flags;
   1444     command->mParam = data;
   1445     ALOGV("AudioCommandThread() adding audio volume group changed");
   1446     sendCommand(command);
   1447 }
   1448 
   1449 status_t AudioPolicyService::AudioCommandThread::setAudioPortConfigCommand(
   1450                                             const struct audio_port_config *config, int delayMs)
   1451 {
   1452     sp<AudioCommand> command = new AudioCommand();
   1453     command->mCommand = SET_AUDIOPORT_CONFIG;
   1454     SetAudioPortConfigData *data = new SetAudioPortConfigData();
   1455     data->mConfig = *config;
   1456     command->mParam = data;
   1457     command->mWaitStatus = true;
   1458     ALOGV("AudioCommandThread() adding set port config delay %d", delayMs);
   1459     return sendCommand(command, delayMs);
   1460 }
   1461 
   1462 void AudioPolicyService::AudioCommandThread::dynamicPolicyMixStateUpdateCommand(
   1463         const String8& regId, int32_t state)
   1464 {
   1465     sp<AudioCommand> command = new AudioCommand();
   1466     command->mCommand = DYN_POLICY_MIX_STATE_UPDATE;
   1467     DynPolicyMixStateUpdateData *data = new DynPolicyMixStateUpdateData();
   1468     data->mRegId = regId;
   1469     data->mState = state;
   1470     command->mParam = data;
   1471     ALOGV("AudioCommandThread() sending dynamic policy mix (id=%s) state update to %d",
   1472             regId.string(), state);
   1473     sendCommand(command);
   1474 }
   1475 
   1476 void AudioPolicyService::AudioCommandThread::recordingConfigurationUpdateCommand(
   1477                                                 int event,
   1478                                                 const record_client_info_t *clientInfo,
   1479                                                 const audio_config_base_t *clientConfig,
   1480                                                 std::vector<effect_descriptor_t> clientEffects,
   1481                                                 const audio_config_base_t *deviceConfig,
   1482                                                 std::vector<effect_descriptor_t> effects,
   1483                                                 audio_patch_handle_t patchHandle,
   1484                                                 audio_source_t source)
   1485 {
   1486     sp<AudioCommand>command = new AudioCommand();
   1487     command->mCommand = RECORDING_CONFIGURATION_UPDATE;
   1488     RecordingConfigurationUpdateData *data = new RecordingConfigurationUpdateData();
   1489     data->mEvent = event;
   1490     data->mClientInfo = *clientInfo;
   1491     data->mClientConfig = *clientConfig;
   1492     data->mClientEffects = clientEffects;
   1493     data->mDeviceConfig = *deviceConfig;
   1494     data->mEffects = effects;
   1495     data->mPatchHandle = patchHandle;
   1496     data->mSource = source;
   1497     command->mParam = data;
   1498     ALOGV("AudioCommandThread() adding recording configuration update event %d, source %d uid %u",
   1499             event, clientInfo->source, clientInfo->uid);
   1500     sendCommand(command);
   1501 }
   1502 
   1503 status_t AudioPolicyService::AudioCommandThread::sendCommand(sp<AudioCommand>& command, int delayMs)
   1504 {
   1505     {
   1506         Mutex::Autolock _l(mLock);
   1507         insertCommand_l(command, delayMs);
   1508         mWaitWorkCV.signal();
   1509     }
   1510     Mutex::Autolock _l(command->mLock);
   1511     while (command->mWaitStatus) {
   1512         nsecs_t timeOutNs = kAudioCommandTimeoutNs + milliseconds(delayMs);
   1513         if (command->mCond.waitRelative(command->mLock, timeOutNs) != NO_ERROR) {
   1514             command->mStatus = TIMED_OUT;
   1515             command->mWaitStatus = false;
   1516         }
   1517     }
   1518     return command->mStatus;
   1519 }
   1520 
   1521 // insertCommand_l() must be called with mLock held
   1522 void AudioPolicyService::AudioCommandThread::insertCommand_l(sp<AudioCommand>& command, int delayMs)
   1523 {
   1524     ssize_t i;  // not size_t because i will count down to -1
   1525     Vector < sp<AudioCommand> > removedCommands;
   1526     command->mTime = systemTime() + milliseconds(delayMs);
   1527 
   1528     // acquire wake lock to make sure delayed commands are processed
   1529     if (mAudioCommands.isEmpty()) {
   1530         acquire_wake_lock(PARTIAL_WAKE_LOCK, mName.string());
   1531     }
   1532 
   1533     // check same pending commands with later time stamps and eliminate them
   1534     for (i = (ssize_t)mAudioCommands.size()-1; i >= 0; i--) {
   1535         sp<AudioCommand> command2 = mAudioCommands[i];
   1536         // commands are sorted by increasing time stamp: no need to scan the rest of mAudioCommands
   1537         if (command2->mTime <= command->mTime) break;
   1538 
   1539         // create audio patch or release audio patch commands are equivalent
   1540         // with regard to filtering
   1541         if ((command->mCommand == CREATE_AUDIO_PATCH) ||
   1542                 (command->mCommand == RELEASE_AUDIO_PATCH)) {
   1543             if ((command2->mCommand != CREATE_AUDIO_PATCH) &&
   1544                     (command2->mCommand != RELEASE_AUDIO_PATCH)) {
   1545                 continue;
   1546             }
   1547         } else if (command2->mCommand != command->mCommand) continue;
   1548 
   1549         switch (command->mCommand) {
   1550         case SET_PARAMETERS: {
   1551             ParametersData *data = (ParametersData *)command->mParam.get();
   1552             ParametersData *data2 = (ParametersData *)command2->mParam.get();
   1553             if (data->mIO != data2->mIO) break;
   1554             ALOGV("Comparing parameter command %s to new command %s",
   1555                     data2->mKeyValuePairs.string(), data->mKeyValuePairs.string());
   1556             AudioParameter param = AudioParameter(data->mKeyValuePairs);
   1557             AudioParameter param2 = AudioParameter(data2->mKeyValuePairs);
   1558             for (size_t j = 0; j < param.size(); j++) {
   1559                 String8 key;
   1560                 String8 value;
   1561                 param.getAt(j, key, value);
   1562                 for (size_t k = 0; k < param2.size(); k++) {
   1563                     String8 key2;
   1564                     String8 value2;
   1565                     param2.getAt(k, key2, value2);
   1566                     if (key2 == key) {
   1567                         param2.remove(key2);
   1568                         ALOGV("Filtering out parameter %s", key2.string());
   1569                         break;
   1570                     }
   1571                 }
   1572             }
   1573             // if all keys have been filtered out, remove the command.
   1574             // otherwise, update the key value pairs
   1575             if (param2.size() == 0) {
   1576                 removedCommands.add(command2);
   1577             } else {
   1578                 data2->mKeyValuePairs = param2.toString();
   1579             }
   1580             command->mTime = command2->mTime;
   1581             // force delayMs to non 0 so that code below does not request to wait for
   1582             // command status as the command is now delayed
   1583             delayMs = 1;
   1584         } break;
   1585 
   1586         case SET_VOLUME: {
   1587             VolumeData *data = (VolumeData *)command->mParam.get();
   1588             VolumeData *data2 = (VolumeData *)command2->mParam.get();
   1589             if (data->mIO != data2->mIO) break;
   1590             if (data->mStream != data2->mStream) break;
   1591             ALOGV("Filtering out volume command on output %d for stream %d",
   1592                     data->mIO, data->mStream);
   1593             removedCommands.add(command2);
   1594             command->mTime = command2->mTime;
   1595             // force delayMs to non 0 so that code below does not request to wait for
   1596             // command status as the command is now delayed
   1597             delayMs = 1;
   1598         } break;
   1599 
   1600         case SET_VOICE_VOLUME: {
   1601             VoiceVolumeData *data = (VoiceVolumeData *)command->mParam.get();
   1602             VoiceVolumeData *data2 = (VoiceVolumeData *)command2->mParam.get();
   1603             ALOGV("Filtering out voice volume command value %f replaced by %f",
   1604                   data2->mVolume, data->mVolume);
   1605             removedCommands.add(command2);
   1606             command->mTime = command2->mTime;
   1607             // force delayMs to non 0 so that code below does not request to wait for
   1608             // command status as the command is now delayed
   1609             delayMs = 1;
   1610         } break;
   1611 
   1612         case CREATE_AUDIO_PATCH:
   1613         case RELEASE_AUDIO_PATCH: {
   1614             audio_patch_handle_t handle;
   1615             struct audio_patch patch;
   1616             if (command->mCommand == CREATE_AUDIO_PATCH) {
   1617                 handle = ((CreateAudioPatchData *)command->mParam.get())->mHandle;
   1618                 patch = ((CreateAudioPatchData *)command->mParam.get())->mPatch;
   1619             } else {
   1620                 handle = ((ReleaseAudioPatchData *)command->mParam.get())->mHandle;
   1621                 memset(&patch, 0, sizeof(patch));
   1622             }
   1623             audio_patch_handle_t handle2;
   1624             struct audio_patch patch2;
   1625             if (command2->mCommand == CREATE_AUDIO_PATCH) {
   1626                 handle2 = ((CreateAudioPatchData *)command2->mParam.get())->mHandle;
   1627                 patch2 = ((CreateAudioPatchData *)command2->mParam.get())->mPatch;
   1628             } else {
   1629                 handle2 = ((ReleaseAudioPatchData *)command2->mParam.get())->mHandle;
   1630                 memset(&patch2, 0, sizeof(patch2));
   1631             }
   1632             if (handle != handle2) break;
   1633             /* Filter CREATE_AUDIO_PATCH commands only when they are issued for
   1634                same output. */
   1635             if( (command->mCommand == CREATE_AUDIO_PATCH) &&
   1636                 (command2->mCommand == CREATE_AUDIO_PATCH) ) {
   1637                 bool isOutputDiff = false;
   1638                 if (patch.num_sources == patch2.num_sources) {
   1639                     for (unsigned count = 0; count < patch.num_sources; count++) {
   1640                         if (patch.sources[count].id != patch2.sources[count].id) {
   1641                             isOutputDiff = true;
   1642                             break;
   1643                         }
   1644                     }
   1645                     if (isOutputDiff)
   1646                        break;
   1647                 }
   1648             }
   1649             ALOGV("Filtering out %s audio patch command for handle %d",
   1650                   (command->mCommand == CREATE_AUDIO_PATCH) ? "create" : "release", handle);
   1651             removedCommands.add(command2);
   1652             command->mTime = command2->mTime;
   1653             // force delayMs to non 0 so that code below does not request to wait for
   1654             // command status as the command is now delayed
   1655             delayMs = 1;
   1656         } break;
   1657 
   1658         case DYN_POLICY_MIX_STATE_UPDATE: {
   1659 
   1660         } break;
   1661 
   1662         case RECORDING_CONFIGURATION_UPDATE: {
   1663 
   1664         } break;
   1665 
   1666         default:
   1667             break;
   1668         }
   1669     }
   1670 
   1671     // remove filtered commands
   1672     for (size_t j = 0; j < removedCommands.size(); j++) {
   1673         // removed commands always have time stamps greater than current command
   1674         for (size_t k = i + 1; k < mAudioCommands.size(); k++) {
   1675             if (mAudioCommands[k].get() == removedCommands[j].get()) {
   1676                 ALOGV("suppressing command: %d", mAudioCommands[k]->mCommand);
   1677                 mAudioCommands.removeAt(k);
   1678                 break;
   1679             }
   1680         }
   1681     }
   1682     removedCommands.clear();
   1683 
   1684     // Disable wait for status if delay is not 0.
   1685     // Except for create audio patch command because the returned patch handle
   1686     // is needed by audio policy manager
   1687     if (delayMs != 0 && command->mCommand != CREATE_AUDIO_PATCH) {
   1688         command->mWaitStatus = false;
   1689     }
   1690 
   1691     // insert command at the right place according to its time stamp
   1692     ALOGV("inserting command: %d at index %zd, num commands %zu",
   1693             command->mCommand, i+1, mAudioCommands.size());
   1694     mAudioCommands.insertAt(command, i + 1);
   1695 }
   1696 
   1697 void AudioPolicyService::AudioCommandThread::exit()
   1698 {
   1699     ALOGV("AudioCommandThread::exit");
   1700     {
   1701         AutoMutex _l(mLock);
   1702         requestExit();
   1703         mWaitWorkCV.signal();
   1704     }
   1705     // Note that we can call it from the thread loop if all other references have been released
   1706     // but it will safely return WOULD_BLOCK in this case
   1707     requestExitAndWait();
   1708 }
   1709 
   1710 void AudioPolicyService::AudioCommandThread::AudioCommand::dump(char* buffer, size_t size)
   1711 {
   1712     snprintf(buffer, size, "   %02d      %06d.%03d  %01u    %p\n",
   1713             mCommand,
   1714             (int)ns2s(mTime),
   1715             (int)ns2ms(mTime)%1000,
   1716             mWaitStatus,
   1717             mParam.get());
   1718 }
   1719 
   1720 /******* helpers for the service_ops callbacks defined below *********/
   1721 void AudioPolicyService::setParameters(audio_io_handle_t ioHandle,
   1722                                        const char *keyValuePairs,
   1723                                        int delayMs)
   1724 {
   1725     mAudioCommandThread->parametersCommand(ioHandle, keyValuePairs,
   1726                                            delayMs);
   1727 }
   1728 
   1729 int AudioPolicyService::setStreamVolume(audio_stream_type_t stream,
   1730                                         float volume,
   1731                                         audio_io_handle_t output,
   1732                                         int delayMs)
   1733 {
   1734     return (int)mAudioCommandThread->volumeCommand(stream, volume,
   1735                                                    output, delayMs);
   1736 }
   1737 
   1738 int AudioPolicyService::setVoiceVolume(float volume, int delayMs)
   1739 {
   1740     return (int)mAudioCommandThread->voiceVolumeCommand(volume, delayMs);
   1741 }
   1742 
   1743 void AudioPolicyService::setEffectSuspended(int effectId,
   1744                                             audio_session_t sessionId,
   1745                                             bool suspended)
   1746 {
   1747     mAudioCommandThread->setEffectSuspendedCommand(effectId, sessionId, suspended);
   1748 }
   1749 
   1750 
   1751 extern "C" {
   1752 audio_module_handle_t aps_load_hw_module(void *service __unused,
   1753                                              const char *name);
   1754 audio_io_handle_t aps_open_output(void *service __unused,
   1755                                          audio_devices_t *pDevices,
   1756                                          uint32_t *pSamplingRate,
   1757                                          audio_format_t *pFormat,
   1758                                          audio_channel_mask_t *pChannelMask,
   1759                                          uint32_t *pLatencyMs,
   1760                                          audio_output_flags_t flags);
   1761 
   1762 audio_io_handle_t aps_open_output_on_module(void *service __unused,
   1763                                                    audio_module_handle_t module,
   1764                                                    audio_devices_t *pDevices,
   1765                                                    uint32_t *pSamplingRate,
   1766                                                    audio_format_t *pFormat,
   1767                                                    audio_channel_mask_t *pChannelMask,
   1768                                                    uint32_t *pLatencyMs,
   1769                                                    audio_output_flags_t flags,
   1770                                                    const audio_offload_info_t *offloadInfo);
   1771 audio_io_handle_t aps_open_dup_output(void *service __unused,
   1772                                                  audio_io_handle_t output1,
   1773                                                  audio_io_handle_t output2);
   1774 int aps_close_output(void *service __unused, audio_io_handle_t output);
   1775 int aps_suspend_output(void *service __unused, audio_io_handle_t output);
   1776 int aps_restore_output(void *service __unused, audio_io_handle_t output);
   1777 audio_io_handle_t aps_open_input(void *service __unused,
   1778                                         audio_devices_t *pDevices,
   1779                                         uint32_t *pSamplingRate,
   1780                                         audio_format_t *pFormat,
   1781                                         audio_channel_mask_t *pChannelMask,
   1782                                         audio_in_acoustics_t acoustics __unused);
   1783 audio_io_handle_t aps_open_input_on_module(void *service __unused,
   1784                                                   audio_module_handle_t module,
   1785                                                   audio_devices_t *pDevices,
   1786                                                   uint32_t *pSamplingRate,
   1787                                                   audio_format_t *pFormat,
   1788                                                   audio_channel_mask_t *pChannelMask);
   1789 int aps_close_input(void *service __unused, audio_io_handle_t input);
   1790 int aps_invalidate_stream(void *service __unused, audio_stream_type_t stream);
   1791 int aps_move_effects(void *service __unused, audio_session_t session,
   1792                                 audio_io_handle_t src_output,
   1793                                 audio_io_handle_t dst_output);
   1794 char * aps_get_parameters(void *service __unused, audio_io_handle_t io_handle,
   1795                                      const char *keys);
   1796 void aps_set_parameters(void *service, audio_io_handle_t io_handle,
   1797                                    const char *kv_pairs, int delay_ms);
   1798 int aps_set_stream_volume(void *service, audio_stream_type_t stream,
   1799                                      float volume, audio_io_handle_t output,
   1800                                      int delay_ms);
   1801 int aps_set_voice_volume(void *service, float volume, int delay_ms);
   1802 };
   1803 
   1804 } // namespace android
   1805