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 "AudioPolicyIntefaceImpl" 18 //#define LOG_NDEBUG 0 19 20 #include "AudioPolicyService.h" 21 #include "TypeConverter.h" 22 #include <media/MediaAnalyticsItem.h> 23 #include <media/AudioPolicy.h> 24 #include <utils/Log.h> 25 26 namespace android { 27 28 29 // ---------------------------------------------------------------------------- 30 31 status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device, 32 audio_policy_dev_state_t state, 33 const char *device_address, 34 const char *device_name, 35 audio_format_t encodedFormat) 36 { 37 if (mAudioPolicyManager == NULL) { 38 return NO_INIT; 39 } 40 if (!settingsAllowed()) { 41 return PERMISSION_DENIED; 42 } 43 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE && 44 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) { 45 return BAD_VALUE; 46 } 47 48 ALOGV("setDeviceConnectionState()"); 49 Mutex::Autolock _l(mLock); 50 AutoCallerClear acc; 51 return mAudioPolicyManager->setDeviceConnectionState(device, state, 52 device_address, device_name, encodedFormat); 53 } 54 55 audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState( 56 audio_devices_t device, 57 const char *device_address) 58 { 59 if (mAudioPolicyManager == NULL) { 60 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 61 } 62 AutoCallerClear acc; 63 return mAudioPolicyManager->getDeviceConnectionState(device, 64 device_address); 65 } 66 67 status_t AudioPolicyService::handleDeviceConfigChange(audio_devices_t device, 68 const char *device_address, 69 const char *device_name, 70 audio_format_t encodedFormat) 71 { 72 if (mAudioPolicyManager == NULL) { 73 return NO_INIT; 74 } 75 if (!settingsAllowed()) { 76 return PERMISSION_DENIED; 77 } 78 79 ALOGV("handleDeviceConfigChange()"); 80 Mutex::Autolock _l(mLock); 81 AutoCallerClear acc; 82 return mAudioPolicyManager->handleDeviceConfigChange(device, device_address, 83 device_name, encodedFormat); 84 } 85 86 status_t AudioPolicyService::setPhoneState(audio_mode_t state) 87 { 88 if (mAudioPolicyManager == NULL) { 89 return NO_INIT; 90 } 91 if (!settingsAllowed()) { 92 return PERMISSION_DENIED; 93 } 94 if (uint32_t(state) >= AUDIO_MODE_CNT) { 95 return BAD_VALUE; 96 } 97 98 ALOGV("setPhoneState()"); 99 100 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic 101 // operation from policy manager standpoint (no other operation (e.g track start or stop) 102 // can be interleaved). 103 Mutex::Autolock _l(mLock); 104 // TODO: check if it is more appropriate to do it in platform specific policy manager 105 AudioSystem::setMode(state); 106 107 AutoCallerClear acc; 108 mAudioPolicyManager->setPhoneState(state); 109 mPhoneState = state; 110 return NO_ERROR; 111 } 112 113 audio_mode_t AudioPolicyService::getPhoneState() 114 { 115 Mutex::Autolock _l(mLock); 116 return mPhoneState; 117 } 118 119 status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, 120 audio_policy_forced_cfg_t config) 121 { 122 if (mAudioPolicyManager == NULL) { 123 return NO_INIT; 124 } 125 126 if (!modifyAudioRoutingAllowed()) { 127 return PERMISSION_DENIED; 128 } 129 130 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 131 return BAD_VALUE; 132 } 133 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) { 134 return BAD_VALUE; 135 } 136 ALOGV("setForceUse()"); 137 Mutex::Autolock _l(mLock); 138 AutoCallerClear acc; 139 mAudioPolicyManager->setForceUse(usage, config); 140 return NO_ERROR; 141 } 142 143 audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage) 144 { 145 if (mAudioPolicyManager == NULL) { 146 return AUDIO_POLICY_FORCE_NONE; 147 } 148 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 149 return AUDIO_POLICY_FORCE_NONE; 150 } 151 AutoCallerClear acc; 152 return mAudioPolicyManager->getForceUse(usage); 153 } 154 155 audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream) 156 { 157 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 158 return AUDIO_IO_HANDLE_NONE; 159 } 160 if (mAudioPolicyManager == NULL) { 161 return AUDIO_IO_HANDLE_NONE; 162 } 163 ALOGV("getOutput()"); 164 Mutex::Autolock _l(mLock); 165 AutoCallerClear acc; 166 return mAudioPolicyManager->getOutput(stream); 167 } 168 169 status_t AudioPolicyService::getOutputForAttr(audio_attributes_t *attr, 170 audio_io_handle_t *output, 171 audio_session_t session, 172 audio_stream_type_t *stream, 173 pid_t pid, 174 uid_t uid, 175 const audio_config_t *config, 176 audio_output_flags_t flags, 177 audio_port_handle_t *selectedDeviceId, 178 audio_port_handle_t *portId, 179 std::vector<audio_io_handle_t> *secondaryOutputs) 180 { 181 if (mAudioPolicyManager == NULL) { 182 return NO_INIT; 183 } 184 ALOGV("getOutputForAttr()"); 185 Mutex::Autolock _l(mLock); 186 187 const uid_t callingUid = IPCThreadState::self()->getCallingUid(); 188 if (!isAudioServerOrMediaServerUid(callingUid) || uid == (uid_t)-1) { 189 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid, 190 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid); 191 uid = callingUid; 192 } 193 if (!mPackageManager.allowPlaybackCapture(uid)) { 194 attr->flags |= AUDIO_FLAG_NO_MEDIA_PROJECTION; 195 } 196 if (((attr->flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0) 197 && !bypassInterruptionPolicyAllowed(pid, uid)) { 198 attr->flags &= ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE); 199 } 200 audio_output_flags_t originalFlags = flags; 201 AutoCallerClear acc; 202 status_t result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, 203 config, 204 &flags, selectedDeviceId, portId, 205 secondaryOutputs); 206 207 // FIXME: Introduce a way to check for the the telephony device before opening the output 208 if ((result == NO_ERROR) && 209 (flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) && 210 !modifyPhoneStateAllowed(pid, uid)) { 211 // If the app tries to play music through the telephony device and doesn't have permission 212 // the fallback to the default output device. 213 mAudioPolicyManager->releaseOutput(*portId); 214 flags = originalFlags; 215 *selectedDeviceId = AUDIO_PORT_HANDLE_NONE; 216 *portId = AUDIO_PORT_HANDLE_NONE; 217 secondaryOutputs->clear(); 218 result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, config, 219 &flags, selectedDeviceId, portId, 220 secondaryOutputs); 221 } 222 223 if (result == NO_ERROR) { 224 sp <AudioPlaybackClient> client = 225 new AudioPlaybackClient(*attr, *output, uid, pid, session, *selectedDeviceId, *stream); 226 mAudioPlaybackClients.add(*portId, client); 227 } 228 return result; 229 } 230 231 void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId, 232 sp<AudioPlaybackClient>& client, 233 sp<AudioPolicyEffects>& effects, 234 const char *context) 235 { 236 Mutex::Autolock _l(mLock); 237 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId); 238 if (index < 0) { 239 ALOGE("%s AudioTrack client not found for portId %d", context, portId); 240 return; 241 } 242 client = mAudioPlaybackClients.valueAt(index); 243 effects = mAudioPolicyEffects; 244 } 245 246 status_t AudioPolicyService::startOutput(audio_port_handle_t portId) 247 { 248 if (mAudioPolicyManager == NULL) { 249 return NO_INIT; 250 } 251 ALOGV("startOutput()"); 252 sp<AudioPlaybackClient> client; 253 sp<AudioPolicyEffects>audioPolicyEffects; 254 255 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__); 256 257 if (audioPolicyEffects != 0) { 258 // create audio processors according to stream 259 status_t status = audioPolicyEffects->addOutputSessionEffects( 260 client->io, client->stream, client->session); 261 if (status != NO_ERROR && status != ALREADY_EXISTS) { 262 ALOGW("Failed to add effects on session %d", client->session); 263 } 264 } 265 Mutex::Autolock _l(mLock); 266 AutoCallerClear acc; 267 status_t status = mAudioPolicyManager->startOutput(portId); 268 if (status == NO_ERROR) { 269 client->active = true; 270 } 271 return status; 272 } 273 274 status_t AudioPolicyService::stopOutput(audio_port_handle_t portId) 275 { 276 if (mAudioPolicyManager == NULL) { 277 return NO_INIT; 278 } 279 ALOGV("stopOutput()"); 280 mOutputCommandThread->stopOutputCommand(portId); 281 return NO_ERROR; 282 } 283 284 status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId) 285 { 286 ALOGV("doStopOutput"); 287 sp<AudioPlaybackClient> client; 288 sp<AudioPolicyEffects>audioPolicyEffects; 289 290 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__); 291 292 if (audioPolicyEffects != 0) { 293 // release audio processors from the stream 294 status_t status = audioPolicyEffects->releaseOutputSessionEffects( 295 client->io, client->stream, client->session); 296 if (status != NO_ERROR && status != ALREADY_EXISTS) { 297 ALOGW("Failed to release effects on session %d", client->session); 298 } 299 } 300 Mutex::Autolock _l(mLock); 301 AutoCallerClear acc; 302 status_t status = mAudioPolicyManager->stopOutput(portId); 303 if (status == NO_ERROR) { 304 client->active = false; 305 } 306 return status; 307 } 308 309 void AudioPolicyService::releaseOutput(audio_port_handle_t portId) 310 { 311 if (mAudioPolicyManager == NULL) { 312 return; 313 } 314 ALOGV("releaseOutput()"); 315 mOutputCommandThread->releaseOutputCommand(portId); 316 } 317 318 void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId) 319 { 320 ALOGV("doReleaseOutput from tid %d", gettid()); 321 sp<AudioPlaybackClient> client; 322 sp<AudioPolicyEffects> audioPolicyEffects; 323 324 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__); 325 326 if (audioPolicyEffects != 0 && client->active) { 327 // clean up effects if output was not stopped before being released 328 audioPolicyEffects->releaseOutputSessionEffects( 329 client->io, client->stream, client->session); 330 } 331 Mutex::Autolock _l(mLock); 332 mAudioPlaybackClients.removeItem(portId); 333 334 // called from internal thread: no need to clear caller identity 335 mAudioPolicyManager->releaseOutput(portId); 336 } 337 338 status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, 339 audio_io_handle_t *input, 340 audio_unique_id_t riid, 341 audio_session_t session, 342 pid_t pid, 343 uid_t uid, 344 const String16& opPackageName, 345 const audio_config_base_t *config, 346 audio_input_flags_t flags, 347 audio_port_handle_t *selectedDeviceId, 348 audio_port_handle_t *portId) 349 { 350 if (mAudioPolicyManager == NULL) { 351 return NO_INIT; 352 } 353 354 // already checked by client, but double-check in case the client wrapper is bypassed 355 if ((attr->source < AUDIO_SOURCE_DEFAULT) 356 || (attr->source >= AUDIO_SOURCE_CNT 357 && attr->source != AUDIO_SOURCE_HOTWORD 358 && attr->source != AUDIO_SOURCE_FM_TUNER 359 && attr->source != AUDIO_SOURCE_ECHO_REFERENCE)) { 360 return BAD_VALUE; 361 } 362 363 bool updatePid = (pid == -1); 364 const uid_t callingUid = IPCThreadState::self()->getCallingUid(); 365 if (!isAudioServerOrMediaServerUid(callingUid)) { 366 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid, 367 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid); 368 uid = callingUid; 369 updatePid = true; 370 } 371 372 if (updatePid) { 373 const pid_t callingPid = IPCThreadState::self()->getCallingPid(); 374 ALOGW_IF(pid != (pid_t)-1 && pid != callingPid, 375 "%s uid %d pid %d tried to pass itself off as pid %d", 376 __func__, callingUid, callingPid, pid); 377 pid = callingPid; 378 } 379 380 // check calling permissions 381 if (!recordingAllowed(opPackageName, pid, uid)) { 382 ALOGE("%s permission denied: recording not allowed for uid %d pid %d", 383 __func__, uid, pid); 384 return PERMISSION_DENIED; 385 } 386 387 bool canCaptureOutput = captureAudioOutputAllowed(pid, uid); 388 if ((attr->source == AUDIO_SOURCE_VOICE_UPLINK || 389 attr->source == AUDIO_SOURCE_VOICE_DOWNLINK || 390 attr->source == AUDIO_SOURCE_VOICE_CALL || 391 attr->source == AUDIO_SOURCE_ECHO_REFERENCE) && 392 !canCaptureOutput) { 393 return PERMISSION_DENIED; 394 } 395 396 bool canCaptureHotword = captureHotwordAllowed(opPackageName, pid, uid); 397 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) { 398 return BAD_VALUE; 399 } 400 401 sp<AudioPolicyEffects>audioPolicyEffects; 402 { 403 status_t status; 404 AudioPolicyInterface::input_type_t inputType; 405 406 Mutex::Autolock _l(mLock); 407 { 408 AutoCallerClear acc; 409 // the audio_in_acoustics_t parameter is ignored by get_input() 410 status = mAudioPolicyManager->getInputForAttr(attr, input, riid, session, uid, 411 config, 412 flags, selectedDeviceId, 413 &inputType, portId); 414 } 415 audioPolicyEffects = mAudioPolicyEffects; 416 417 if (status == NO_ERROR) { 418 // enforce permission (if any) required for each type of input 419 switch (inputType) { 420 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK: 421 // this use case has been validated in audio service with a MediaProjection token, 422 // and doesn't rely on regular permissions 423 case AudioPolicyInterface::API_INPUT_LEGACY: 424 break; 425 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX: 426 // FIXME: use the same permission as for remote submix for now. 427 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE: 428 if (!canCaptureOutput) { 429 ALOGE("getInputForAttr() permission denied: capture not allowed"); 430 status = PERMISSION_DENIED; 431 } 432 break; 433 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: 434 if (!modifyAudioRoutingAllowed()) { 435 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed"); 436 status = PERMISSION_DENIED; 437 } 438 break; 439 case AudioPolicyInterface::API_INPUT_INVALID: 440 default: 441 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d", 442 (int)inputType); 443 } 444 } 445 446 if (status != NO_ERROR) { 447 if (status == PERMISSION_DENIED) { 448 AutoCallerClear acc; 449 mAudioPolicyManager->releaseInput(*portId); 450 } 451 return status; 452 } 453 454 sp<AudioRecordClient> client = new AudioRecordClient(*attr, *input, uid, pid, session, 455 *selectedDeviceId, opPackageName, 456 canCaptureOutput, canCaptureHotword); 457 mAudioRecordClients.add(*portId, client); 458 } 459 460 if (audioPolicyEffects != 0) { 461 // create audio pre processors according to input source 462 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session); 463 if (status != NO_ERROR && status != ALREADY_EXISTS) { 464 ALOGW("Failed to add effects on input %d", *input); 465 } 466 } 467 return NO_ERROR; 468 } 469 470 std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) { 471 struct audio_port port = {}; 472 port.id = portId; 473 status_t status = mAudioPolicyManager->getAudioPort(&port); 474 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) { 475 return toString(port.ext.device.type); 476 } 477 return {}; 478 } 479 480 status_t AudioPolicyService::startInput(audio_port_handle_t portId) 481 { 482 if (mAudioPolicyManager == NULL) { 483 return NO_INIT; 484 } 485 sp<AudioRecordClient> client; 486 { 487 Mutex::Autolock _l(mLock); 488 489 ssize_t index = mAudioRecordClients.indexOfKey(portId); 490 if (index < 0) { 491 return INVALID_OPERATION; 492 } 493 client = mAudioRecordClients.valueAt(index); 494 } 495 496 // check calling permissions 497 if (!startRecording(client->opPackageName, client->pid, client->uid)) { 498 ALOGE("%s permission denied: recording not allowed for uid %d pid %d", 499 __func__, client->uid, client->pid); 500 return PERMISSION_DENIED; 501 } 502 503 Mutex::Autolock _l(mLock); 504 505 client->active = true; 506 client->startTimeNs = systemTime(); 507 updateUidStates_l(); 508 509 status_t status; 510 { 511 AutoCallerClear acc; 512 status = mAudioPolicyManager->startInput(portId); 513 514 } 515 516 // including successes gets very verbose 517 // but once we cut over to westworld, log them all. 518 if (status != NO_ERROR) { 519 520 static constexpr char kAudioPolicy[] = "audiopolicy"; 521 522 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status"; 523 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src"; 524 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg"; 525 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session"; 526 static constexpr char kAudioPolicyRqstDevice[] = 527 "android.media.audiopolicy.rqst.device"; 528 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src"; 529 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg"; 530 static constexpr char kAudioPolicyActiveSession[] = 531 "android.media.audiopolicy.active.session"; 532 static constexpr char kAudioPolicyActiveDevice[] = 533 "android.media.audiopolicy.active.device"; 534 535 MediaAnalyticsItem *item = MediaAnalyticsItem::create(kAudioPolicy); 536 if (item != NULL) { 537 538 item->setInt32(kAudioPolicyStatus, status); 539 540 item->setCString(kAudioPolicyRqstSrc, 541 toString(client->attributes.source).c_str()); 542 item->setInt32(kAudioPolicyRqstSession, client->session); 543 if (client->opPackageName.size() != 0) { 544 item->setCString(kAudioPolicyRqstPkg, 545 std::string(String8(client->opPackageName).string()).c_str()); 546 } else { 547 item->setCString(kAudioPolicyRqstPkg, std::to_string(client->uid).c_str()); 548 } 549 item->setCString( 550 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str()); 551 552 int count = mAudioRecordClients.size(); 553 for (int i = 0; i < count ; i++) { 554 if (portId == mAudioRecordClients.keyAt(i)) { 555 continue; 556 } 557 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i); 558 if (other->active) { 559 // keeps the last of the clients marked active 560 item->setCString(kAudioPolicyActiveSrc, 561 toString(other->attributes.source).c_str()); 562 item->setInt32(kAudioPolicyActiveSession, other->session); 563 if (other->opPackageName.size() != 0) { 564 item->setCString(kAudioPolicyActivePkg, 565 std::string(String8(other->opPackageName).string()).c_str()); 566 } else { 567 item->setCString(kAudioPolicyRqstPkg, 568 std::to_string(other->uid).c_str()); 569 } 570 item->setCString(kAudioPolicyActiveDevice, 571 getDeviceTypeStrForPortId(other->deviceId).c_str()); 572 } 573 } 574 item->selfrecord(); 575 delete item; 576 item = NULL; 577 } 578 } 579 580 if (status != NO_ERROR) { 581 client->active = false; 582 client->startTimeNs = 0; 583 updateUidStates_l(); 584 finishRecording(client->opPackageName, client->uid); 585 } 586 587 return status; 588 } 589 590 status_t AudioPolicyService::stopInput(audio_port_handle_t portId) 591 { 592 if (mAudioPolicyManager == NULL) { 593 return NO_INIT; 594 } 595 596 Mutex::Autolock _l(mLock); 597 598 ssize_t index = mAudioRecordClients.indexOfKey(portId); 599 if (index < 0) { 600 return INVALID_OPERATION; 601 } 602 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index); 603 604 client->active = false; 605 client->startTimeNs = 0; 606 607 updateUidStates_l(); 608 609 // finish the recording app op 610 finishRecording(client->opPackageName, client->uid); 611 AutoCallerClear acc; 612 return mAudioPolicyManager->stopInput(portId); 613 } 614 615 void AudioPolicyService::releaseInput(audio_port_handle_t portId) 616 { 617 if (mAudioPolicyManager == NULL) { 618 return; 619 } 620 sp<AudioPolicyEffects>audioPolicyEffects; 621 sp<AudioRecordClient> client; 622 { 623 Mutex::Autolock _l(mLock); 624 audioPolicyEffects = mAudioPolicyEffects; 625 ssize_t index = mAudioRecordClients.indexOfKey(portId); 626 if (index < 0) { 627 return; 628 } 629 client = mAudioRecordClients.valueAt(index); 630 631 if (client->active) { 632 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId); 633 client->active = false; 634 client->startTimeNs = 0; 635 updateUidStates_l(); 636 } 637 638 mAudioRecordClients.removeItem(portId); 639 } 640 if (client == 0) { 641 return; 642 } 643 if (audioPolicyEffects != 0) { 644 // release audio processors from the input 645 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session); 646 if(status != NO_ERROR) { 647 ALOGW("Failed to release effects on input %d", client->io); 648 } 649 } 650 { 651 Mutex::Autolock _l(mLock); 652 AutoCallerClear acc; 653 mAudioPolicyManager->releaseInput(portId); 654 } 655 } 656 657 status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, 658 int indexMin, 659 int indexMax) 660 { 661 if (mAudioPolicyManager == NULL) { 662 return NO_INIT; 663 } 664 if (!settingsAllowed()) { 665 return PERMISSION_DENIED; 666 } 667 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 668 return BAD_VALUE; 669 } 670 Mutex::Autolock _l(mLock); 671 AutoCallerClear acc; 672 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax); 673 return NO_ERROR; 674 } 675 676 status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, 677 int index, 678 audio_devices_t device) 679 { 680 if (mAudioPolicyManager == NULL) { 681 return NO_INIT; 682 } 683 if (!settingsAllowed()) { 684 return PERMISSION_DENIED; 685 } 686 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 687 return BAD_VALUE; 688 } 689 Mutex::Autolock _l(mLock); 690 AutoCallerClear acc; 691 return mAudioPolicyManager->setStreamVolumeIndex(stream, 692 index, 693 device); 694 } 695 696 status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, 697 int *index, 698 audio_devices_t device) 699 { 700 if (mAudioPolicyManager == NULL) { 701 return NO_INIT; 702 } 703 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 704 return BAD_VALUE; 705 } 706 Mutex::Autolock _l(mLock); 707 AutoCallerClear acc; 708 return mAudioPolicyManager->getStreamVolumeIndex(stream, 709 index, 710 device); 711 } 712 713 status_t AudioPolicyService::setVolumeIndexForAttributes(const audio_attributes_t &attributes, 714 int index, audio_devices_t device) 715 { 716 if (mAudioPolicyManager == NULL) { 717 return NO_INIT; 718 } 719 if (!settingsAllowed()) { 720 return PERMISSION_DENIED; 721 } 722 Mutex::Autolock _l(mLock); 723 AutoCallerClear acc; 724 return mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device); 725 } 726 727 status_t AudioPolicyService::getVolumeIndexForAttributes(const audio_attributes_t &attributes, 728 int &index, audio_devices_t device) 729 { 730 if (mAudioPolicyManager == NULL) { 731 return NO_INIT; 732 } 733 Mutex::Autolock _l(mLock); 734 AutoCallerClear acc; 735 return mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device); 736 } 737 738 status_t AudioPolicyService::getMinVolumeIndexForAttributes(const audio_attributes_t &attributes, 739 int &index) 740 { 741 if (mAudioPolicyManager == NULL) { 742 return NO_INIT; 743 } 744 Mutex::Autolock _l(mLock); 745 AutoCallerClear acc; 746 return mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index); 747 } 748 749 status_t AudioPolicyService::getMaxVolumeIndexForAttributes(const audio_attributes_t &attributes, 750 int &index) 751 { 752 if (mAudioPolicyManager == NULL) { 753 return NO_INIT; 754 } 755 Mutex::Autolock _l(mLock); 756 AutoCallerClear acc; 757 return mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index); 758 } 759 760 uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream) 761 { 762 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 763 return PRODUCT_STRATEGY_NONE; 764 } 765 if (mAudioPolicyManager == NULL) { 766 return PRODUCT_STRATEGY_NONE; 767 } 768 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock 769 AutoCallerClear acc; 770 return mAudioPolicyManager->getStrategyForStream(stream); 771 } 772 773 //audio policy: use audio_device_t appropriately 774 775 audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream) 776 { 777 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 778 return AUDIO_DEVICE_NONE; 779 } 780 if (mAudioPolicyManager == NULL) { 781 return AUDIO_DEVICE_NONE; 782 } 783 Mutex::Autolock _l(mLock); 784 AutoCallerClear acc; 785 return mAudioPolicyManager->getDevicesForStream(stream); 786 } 787 788 audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc) 789 { 790 // FIXME change return type to status_t, and return NO_INIT here 791 if (mAudioPolicyManager == NULL) { 792 return 0; 793 } 794 Mutex::Autolock _l(mLock); 795 AutoCallerClear acc; 796 return mAudioPolicyManager->getOutputForEffect(desc); 797 } 798 799 status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc, 800 audio_io_handle_t io, 801 uint32_t strategy, 802 audio_session_t session, 803 int id) 804 { 805 if (mAudioPolicyManager == NULL) { 806 return NO_INIT; 807 } 808 Mutex::Autolock _l(mLock); 809 AutoCallerClear acc; 810 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id); 811 } 812 813 status_t AudioPolicyService::unregisterEffect(int id) 814 { 815 if (mAudioPolicyManager == NULL) { 816 return NO_INIT; 817 } 818 Mutex::Autolock _l(mLock); 819 AutoCallerClear acc; 820 return mAudioPolicyManager->unregisterEffect(id); 821 } 822 823 status_t AudioPolicyService::setEffectEnabled(int id, bool enabled) 824 { 825 if (mAudioPolicyManager == NULL) { 826 return NO_INIT; 827 } 828 Mutex::Autolock _l(mLock); 829 AutoCallerClear acc; 830 return mAudioPolicyManager->setEffectEnabled(id, enabled); 831 } 832 833 status_t AudioPolicyService::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) 834 { 835 if (mAudioPolicyManager == NULL) { 836 return NO_INIT; 837 } 838 Mutex::Autolock _l(mLock); 839 AutoCallerClear acc; 840 return mAudioPolicyManager->moveEffectsToIo(ids, io); 841 } 842 843 bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 844 { 845 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 846 return false; 847 } 848 if (mAudioPolicyManager == NULL) { 849 return false; 850 } 851 Mutex::Autolock _l(mLock); 852 AutoCallerClear acc; 853 return mAudioPolicyManager->isStreamActive(stream, inPastMs); 854 } 855 856 bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 857 { 858 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 859 return false; 860 } 861 if (mAudioPolicyManager == NULL) { 862 return false; 863 } 864 Mutex::Autolock _l(mLock); 865 AutoCallerClear acc; 866 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs); 867 } 868 869 bool AudioPolicyService::isSourceActive(audio_source_t source) const 870 { 871 if (mAudioPolicyManager == NULL) { 872 return false; 873 } 874 Mutex::Autolock _l(mLock); 875 AutoCallerClear acc; 876 return mAudioPolicyManager->isSourceActive(source); 877 } 878 879 status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects) 880 { 881 if (mAudioPolicyManager == NULL) { 882 return NO_INIT; 883 } 884 { 885 Mutex::Autolock _l(mLock); 886 audioPolicyEffects = mAudioPolicyEffects; 887 } 888 if (audioPolicyEffects == 0) { 889 return NO_INIT; 890 } 891 892 return OK; 893 } 894 895 status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession, 896 effect_descriptor_t *descriptors, 897 uint32_t *count) 898 { 899 sp<AudioPolicyEffects>audioPolicyEffects; 900 status_t status = getAudioPolicyEffects(audioPolicyEffects); 901 if (status != OK) { 902 *count = 0; 903 return status; 904 } 905 return audioPolicyEffects->queryDefaultInputEffects( 906 (audio_session_t)audioSession, descriptors, count); 907 } 908 909 status_t AudioPolicyService::addSourceDefaultEffect(const effect_uuid_t *type, 910 const String16& opPackageName, 911 const effect_uuid_t *uuid, 912 int32_t priority, 913 audio_source_t source, 914 audio_unique_id_t* id) 915 { 916 sp<AudioPolicyEffects>audioPolicyEffects; 917 status_t status = getAudioPolicyEffects(audioPolicyEffects); 918 if (status != OK) { 919 return status; 920 } 921 if (!modifyDefaultAudioEffectsAllowed()) { 922 return PERMISSION_DENIED; 923 } 924 return audioPolicyEffects->addSourceDefaultEffect( 925 type, opPackageName, uuid, priority, source, id); 926 } 927 928 status_t AudioPolicyService::addStreamDefaultEffect(const effect_uuid_t *type, 929 const String16& opPackageName, 930 const effect_uuid_t *uuid, 931 int32_t priority, 932 audio_usage_t usage, 933 audio_unique_id_t* id) 934 { 935 sp<AudioPolicyEffects>audioPolicyEffects; 936 status_t status = getAudioPolicyEffects(audioPolicyEffects); 937 if (status != OK) { 938 return status; 939 } 940 if (!modifyDefaultAudioEffectsAllowed()) { 941 return PERMISSION_DENIED; 942 } 943 return audioPolicyEffects->addStreamDefaultEffect( 944 type, opPackageName, uuid, priority, usage, id); 945 } 946 947 status_t AudioPolicyService::removeSourceDefaultEffect(audio_unique_id_t id) 948 { 949 sp<AudioPolicyEffects>audioPolicyEffects; 950 status_t status = getAudioPolicyEffects(audioPolicyEffects); 951 if (status != OK) { 952 return status; 953 } 954 if (!modifyDefaultAudioEffectsAllowed()) { 955 return PERMISSION_DENIED; 956 } 957 return audioPolicyEffects->removeSourceDefaultEffect(id); 958 } 959 960 status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id) 961 { 962 sp<AudioPolicyEffects>audioPolicyEffects; 963 status_t status = getAudioPolicyEffects(audioPolicyEffects); 964 if (status != OK) { 965 return status; 966 } 967 if (!modifyDefaultAudioEffectsAllowed()) { 968 return PERMISSION_DENIED; 969 } 970 return audioPolicyEffects->removeStreamDefaultEffect(id); 971 } 972 973 status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) { 974 Mutex::Autolock _l(mLock); 975 if (mAudioPolicyManager == NULL) { 976 ALOGV("%s() mAudioPolicyManager == NULL", __func__); 977 return NO_INIT; 978 } 979 uint_t callingUid = IPCThreadState::self()->getCallingUid(); 980 if (uid != callingUid) { 981 ALOGD("%s() uid invalid %d != %d", __func__, uid, callingUid); 982 return PERMISSION_DENIED; 983 } 984 return mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy); 985 } 986 987 bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info) 988 { 989 if (mAudioPolicyManager == NULL) { 990 ALOGV("mAudioPolicyManager == NULL"); 991 return false; 992 } 993 Mutex::Autolock _l(mLock); 994 AutoCallerClear acc; 995 return mAudioPolicyManager->isOffloadSupported(info); 996 } 997 998 bool AudioPolicyService::isDirectOutputSupported(const audio_config_base_t& config, 999 const audio_attributes_t& attributes) { 1000 if (mAudioPolicyManager == NULL) { 1001 ALOGV("mAudioPolicyManager == NULL"); 1002 return false; 1003 } 1004 Mutex::Autolock _l(mLock); 1005 return mAudioPolicyManager->isDirectOutputSupported(config, attributes); 1006 } 1007 1008 1009 status_t AudioPolicyService::listAudioPorts(audio_port_role_t role, 1010 audio_port_type_t type, 1011 unsigned int *num_ports, 1012 struct audio_port *ports, 1013 unsigned int *generation) 1014 { 1015 Mutex::Autolock _l(mLock); 1016 if (mAudioPolicyManager == NULL) { 1017 return NO_INIT; 1018 } 1019 AutoCallerClear acc; 1020 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation); 1021 } 1022 1023 status_t AudioPolicyService::getAudioPort(struct audio_port *port) 1024 { 1025 Mutex::Autolock _l(mLock); 1026 if (mAudioPolicyManager == NULL) { 1027 return NO_INIT; 1028 } 1029 AutoCallerClear acc; 1030 return mAudioPolicyManager->getAudioPort(port); 1031 } 1032 1033 status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch, 1034 audio_patch_handle_t *handle) 1035 { 1036 Mutex::Autolock _l(mLock); 1037 if(!modifyAudioRoutingAllowed()) { 1038 return PERMISSION_DENIED; 1039 } 1040 if (mAudioPolicyManager == NULL) { 1041 return NO_INIT; 1042 } 1043 AutoCallerClear acc; 1044 return mAudioPolicyManager->createAudioPatch(patch, handle, 1045 IPCThreadState::self()->getCallingUid()); 1046 } 1047 1048 status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle) 1049 { 1050 Mutex::Autolock _l(mLock); 1051 if(!modifyAudioRoutingAllowed()) { 1052 return PERMISSION_DENIED; 1053 } 1054 if (mAudioPolicyManager == NULL) { 1055 return NO_INIT; 1056 } 1057 AutoCallerClear acc; 1058 return mAudioPolicyManager->releaseAudioPatch(handle, 1059 IPCThreadState::self()->getCallingUid()); 1060 } 1061 1062 status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches, 1063 struct audio_patch *patches, 1064 unsigned int *generation) 1065 { 1066 Mutex::Autolock _l(mLock); 1067 if (mAudioPolicyManager == NULL) { 1068 return NO_INIT; 1069 } 1070 AutoCallerClear acc; 1071 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation); 1072 } 1073 1074 status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config) 1075 { 1076 Mutex::Autolock _l(mLock); 1077 if(!modifyAudioRoutingAllowed()) { 1078 return PERMISSION_DENIED; 1079 } 1080 if (mAudioPolicyManager == NULL) { 1081 return NO_INIT; 1082 } 1083 AutoCallerClear acc; 1084 return mAudioPolicyManager->setAudioPortConfig(config); 1085 } 1086 1087 status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session, 1088 audio_io_handle_t *ioHandle, 1089 audio_devices_t *device) 1090 { 1091 Mutex::Autolock _l(mLock); 1092 if (mAudioPolicyManager == NULL) { 1093 return NO_INIT; 1094 } 1095 AutoCallerClear acc; 1096 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device); 1097 } 1098 1099 status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session) 1100 { 1101 Mutex::Autolock _l(mLock); 1102 if (mAudioPolicyManager == NULL) { 1103 return NO_INIT; 1104 } 1105 AutoCallerClear acc; 1106 return mAudioPolicyManager->releaseSoundTriggerSession(session); 1107 } 1108 1109 status_t AudioPolicyService::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 1110 { 1111 Mutex::Autolock _l(mLock); 1112 1113 // loopback|render only need a MediaProjection (checked in caller AudioService.java) 1114 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) { 1115 return !is_mix_loopback_render(mix.mRouteFlags); }); 1116 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) { 1117 return PERMISSION_DENIED; 1118 } 1119 1120 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) { 1121 return mix.mAllowPrivilegedPlaybackCapture; }); 1122 const uid_t callingUid = IPCThreadState::self()->getCallingUid(); 1123 const pid_t callingPid = IPCThreadState::self()->getCallingPid(); 1124 if (needCaptureMediaOutput && !captureMediaOutputAllowed(callingPid, callingUid)) { 1125 return PERMISSION_DENIED; 1126 } 1127 1128 if (mAudioPolicyManager == NULL) { 1129 return NO_INIT; 1130 } 1131 AutoCallerClear acc; 1132 if (registration) { 1133 return mAudioPolicyManager->registerPolicyMixes(mixes); 1134 } else { 1135 return mAudioPolicyManager->unregisterPolicyMixes(mixes); 1136 } 1137 } 1138 1139 status_t AudioPolicyService::setUidDeviceAffinities(uid_t uid, 1140 const Vector<AudioDeviceTypeAddr>& devices) { 1141 Mutex::Autolock _l(mLock); 1142 if(!modifyAudioRoutingAllowed()) { 1143 return PERMISSION_DENIED; 1144 } 1145 if (mAudioPolicyManager == NULL) { 1146 return NO_INIT; 1147 } 1148 AutoCallerClear acc; 1149 return mAudioPolicyManager->setUidDeviceAffinities(uid, devices); 1150 } 1151 1152 status_t AudioPolicyService::removeUidDeviceAffinities(uid_t uid) { 1153 Mutex::Autolock _l(mLock); 1154 if(!modifyAudioRoutingAllowed()) { 1155 return PERMISSION_DENIED; 1156 } 1157 if (mAudioPolicyManager == NULL) { 1158 return NO_INIT; 1159 } 1160 AutoCallerClear acc; 1161 return mAudioPolicyManager->removeUidDeviceAffinities(uid); 1162 } 1163 1164 status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source, 1165 const audio_attributes_t *attributes, 1166 audio_port_handle_t *portId) 1167 { 1168 Mutex::Autolock _l(mLock); 1169 if (mAudioPolicyManager == NULL) { 1170 return NO_INIT; 1171 } 1172 // startAudioSource should be created as the calling uid 1173 const uid_t callingUid = IPCThreadState::self()->getCallingUid(); 1174 AutoCallerClear acc; 1175 return mAudioPolicyManager->startAudioSource(source, attributes, portId, callingUid); 1176 } 1177 1178 status_t AudioPolicyService::stopAudioSource(audio_port_handle_t portId) 1179 { 1180 Mutex::Autolock _l(mLock); 1181 if (mAudioPolicyManager == NULL) { 1182 return NO_INIT; 1183 } 1184 AutoCallerClear acc; 1185 return mAudioPolicyManager->stopAudioSource(portId); 1186 } 1187 1188 status_t AudioPolicyService::setMasterMono(bool mono) 1189 { 1190 if (mAudioPolicyManager == NULL) { 1191 return NO_INIT; 1192 } 1193 if (!settingsAllowed()) { 1194 return PERMISSION_DENIED; 1195 } 1196 Mutex::Autolock _l(mLock); 1197 AutoCallerClear acc; 1198 return mAudioPolicyManager->setMasterMono(mono); 1199 } 1200 1201 status_t AudioPolicyService::getMasterMono(bool *mono) 1202 { 1203 if (mAudioPolicyManager == NULL) { 1204 return NO_INIT; 1205 } 1206 Mutex::Autolock _l(mLock); 1207 AutoCallerClear acc; 1208 return mAudioPolicyManager->getMasterMono(mono); 1209 } 1210 1211 1212 float AudioPolicyService::getStreamVolumeDB( 1213 audio_stream_type_t stream, int index, audio_devices_t device) 1214 { 1215 if (mAudioPolicyManager == NULL) { 1216 return NAN; 1217 } 1218 Mutex::Autolock _l(mLock); 1219 AutoCallerClear acc; 1220 return mAudioPolicyManager->getStreamVolumeDB(stream, index, device); 1221 } 1222 1223 status_t AudioPolicyService::getSurroundFormats(unsigned int *numSurroundFormats, 1224 audio_format_t *surroundFormats, 1225 bool *surroundFormatsEnabled, 1226 bool reported) 1227 { 1228 if (mAudioPolicyManager == NULL) { 1229 return NO_INIT; 1230 } 1231 Mutex::Autolock _l(mLock); 1232 AutoCallerClear acc; 1233 return mAudioPolicyManager->getSurroundFormats(numSurroundFormats, surroundFormats, 1234 surroundFormatsEnabled, reported); 1235 } 1236 1237 status_t AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP( 1238 std::vector<audio_format_t> *formats) 1239 { 1240 if (mAudioPolicyManager == NULL) { 1241 return NO_INIT; 1242 } 1243 Mutex::Autolock _l(mLock); 1244 AutoCallerClear acc; 1245 return mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(formats); 1246 } 1247 1248 status_t AudioPolicyService::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) 1249 { 1250 if (mAudioPolicyManager == NULL) { 1251 return NO_INIT; 1252 } 1253 Mutex::Autolock _l(mLock); 1254 AutoCallerClear acc; 1255 return mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled); 1256 } 1257 1258 status_t AudioPolicyService::setAssistantUid(uid_t uid) 1259 { 1260 Mutex::Autolock _l(mLock); 1261 mUidPolicy->setAssistantUid(uid); 1262 return NO_ERROR; 1263 } 1264 1265 status_t AudioPolicyService::setA11yServicesUids(const std::vector<uid_t>& uids) 1266 { 1267 Mutex::Autolock _l(mLock); 1268 mUidPolicy->setA11yUids(uids); 1269 return NO_ERROR; 1270 } 1271 1272 bool AudioPolicyService::isHapticPlaybackSupported() 1273 { 1274 if (mAudioPolicyManager == NULL) { 1275 ALOGW("%s, mAudioPolicyManager == NULL", __func__); 1276 return false; 1277 } 1278 Mutex::Autolock _l(mLock); 1279 AutoCallerClear acc; 1280 return mAudioPolicyManager->isHapticPlaybackSupported(); 1281 } 1282 1283 status_t AudioPolicyService::listAudioProductStrategies(AudioProductStrategyVector &strategies) 1284 { 1285 if (mAudioPolicyManager == NULL) { 1286 return NO_INIT; 1287 } 1288 Mutex::Autolock _l(mLock); 1289 return mAudioPolicyManager->listAudioProductStrategies(strategies); 1290 } 1291 1292 status_t AudioPolicyService::getProductStrategyFromAudioAttributes( 1293 const AudioAttributes &aa, product_strategy_t &productStrategy) 1294 { 1295 if (mAudioPolicyManager == NULL) { 1296 return NO_INIT; 1297 } 1298 Mutex::Autolock _l(mLock); 1299 return mAudioPolicyManager->getProductStrategyFromAudioAttributes(aa, productStrategy); 1300 } 1301 1302 status_t AudioPolicyService::listAudioVolumeGroups(AudioVolumeGroupVector &groups) 1303 { 1304 if (mAudioPolicyManager == NULL) { 1305 return NO_INIT; 1306 } 1307 Mutex::Autolock _l(mLock); 1308 return mAudioPolicyManager->listAudioVolumeGroups(groups); 1309 } 1310 1311 status_t AudioPolicyService::getVolumeGroupFromAudioAttributes(const AudioAttributes &aa, 1312 volume_group_t &volumeGroup) 1313 { 1314 if (mAudioPolicyManager == NULL) { 1315 return NO_INIT; 1316 } 1317 Mutex::Autolock _l(mLock); 1318 return mAudioPolicyManager->getVolumeGroupFromAudioAttributes(aa, volumeGroup); 1319 } 1320 1321 status_t AudioPolicyService::setRttEnabled(bool enabled) 1322 { 1323 Mutex::Autolock _l(mLock); 1324 mUidPolicy->setRttEnabled(enabled); 1325 return NO_ERROR; 1326 } 1327 1328 } // namespace android 1329