1 /* 2 ** 3 ** Copyright 2009, The Android Open Source Project 4 ** 5 ** Licensed under the Apache License, Version 2.0 (the "License"); 6 ** you may not use this file except in compliance with the License. 7 ** You may obtain a copy of the License at 8 ** 9 ** http://www.apache.org/licenses/LICENSE-2.0 10 ** 11 ** Unless required by applicable law or agreed to in writing, software 12 ** distributed under the License is distributed on an "AS IS" BASIS, 13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 ** See the License for the specific language governing permissions and 15 ** limitations under the License. 16 */ 17 18 #define LOG_TAG "IAudioPolicyService" 19 #include <utils/Log.h> 20 21 #include <stdint.h> 22 #include <math.h> 23 #include <sys/types.h> 24 25 #include <binder/IPCThreadState.h> 26 #include <binder/Parcel.h> 27 #include <media/AudioEffect.h> 28 #include <media/IAudioPolicyService.h> 29 #include <media/TimeCheck.h> 30 #include <mediautils/ServiceUtilities.h> 31 #include <system/audio.h> 32 33 namespace android { 34 35 enum { 36 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 37 GET_DEVICE_CONNECTION_STATE, 38 HANDLE_DEVICE_CONFIG_CHANGE, 39 SET_PHONE_STATE, 40 SET_RINGER_MODE, // reserved, no longer used 41 SET_FORCE_USE, 42 GET_FORCE_USE, 43 GET_OUTPUT, 44 START_OUTPUT, 45 STOP_OUTPUT, 46 RELEASE_OUTPUT, 47 GET_INPUT_FOR_ATTR, 48 START_INPUT, 49 STOP_INPUT, 50 RELEASE_INPUT, 51 INIT_STREAM_VOLUME, 52 SET_STREAM_VOLUME, 53 GET_STREAM_VOLUME, 54 SET_VOLUME_ATTRIBUTES, 55 GET_VOLUME_ATTRIBUTES, 56 GET_MIN_VOLUME_FOR_ATTRIBUTES, 57 GET_MAX_VOLUME_FOR_ATTRIBUTES, 58 GET_STRATEGY_FOR_STREAM, 59 GET_OUTPUT_FOR_EFFECT, 60 REGISTER_EFFECT, 61 UNREGISTER_EFFECT, 62 IS_STREAM_ACTIVE, 63 IS_SOURCE_ACTIVE, 64 GET_DEVICES_FOR_STREAM, 65 QUERY_DEFAULT_PRE_PROCESSING, 66 SET_EFFECT_ENABLED, 67 IS_STREAM_ACTIVE_REMOTELY, 68 IS_OFFLOAD_SUPPORTED, 69 IS_DIRECT_OUTPUT_SUPPORTED, 70 LIST_AUDIO_PORTS, 71 GET_AUDIO_PORT, 72 CREATE_AUDIO_PATCH, 73 RELEASE_AUDIO_PATCH, 74 LIST_AUDIO_PATCHES, 75 SET_AUDIO_PORT_CONFIG, 76 REGISTER_CLIENT, 77 GET_OUTPUT_FOR_ATTR, 78 ACQUIRE_SOUNDTRIGGER_SESSION, 79 RELEASE_SOUNDTRIGGER_SESSION, 80 GET_PHONE_STATE, 81 REGISTER_POLICY_MIXES, 82 START_AUDIO_SOURCE, 83 STOP_AUDIO_SOURCE, 84 SET_AUDIO_PORT_CALLBACK_ENABLED, 85 SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED, 86 SET_MASTER_MONO, 87 GET_MASTER_MONO, 88 GET_STREAM_VOLUME_DB, 89 GET_SURROUND_FORMATS, 90 SET_SURROUND_FORMAT_ENABLED, 91 ADD_STREAM_DEFAULT_EFFECT, 92 REMOVE_STREAM_DEFAULT_EFFECT, 93 ADD_SOURCE_DEFAULT_EFFECT, 94 REMOVE_SOURCE_DEFAULT_EFFECT, 95 SET_ASSISTANT_UID, 96 SET_A11Y_SERVICES_UIDS, 97 IS_HAPTIC_PLAYBACK_SUPPORTED, 98 SET_UID_DEVICE_AFFINITY, 99 REMOVE_UID_DEVICE_AFFINITY, 100 GET_OFFLOAD_FORMATS_A2DP, 101 LIST_AUDIO_PRODUCT_STRATEGIES, 102 GET_STRATEGY_FOR_ATTRIBUTES, 103 LIST_AUDIO_VOLUME_GROUPS, 104 GET_VOLUME_GROUP_FOR_ATTRIBUTES, 105 SET_ALLOWED_CAPTURE_POLICY, 106 MOVE_EFFECTS_TO_IO, 107 SET_RTT_ENABLED 108 }; 109 110 #define MAX_ITEMS_PER_LIST 1024 111 112 class BpAudioPolicyService : public BpInterface<IAudioPolicyService> 113 { 114 public: 115 explicit BpAudioPolicyService(const sp<IBinder>& impl) 116 : BpInterface<IAudioPolicyService>(impl) 117 { 118 } 119 120 virtual status_t setDeviceConnectionState( 121 audio_devices_t device, 122 audio_policy_dev_state_t state, 123 const char *device_address, 124 const char *device_name, 125 audio_format_t encodedFormat) 126 { 127 Parcel data, reply; 128 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 129 data.writeInt32(static_cast <uint32_t>(device)); 130 data.writeInt32(static_cast <uint32_t>(state)); 131 data.writeCString(device_address); 132 data.writeCString(device_name); 133 data.writeInt32(static_cast <uint32_t>(encodedFormat)); 134 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 135 return static_cast <status_t> (reply.readInt32()); 136 } 137 138 virtual audio_policy_dev_state_t getDeviceConnectionState( 139 audio_devices_t device, 140 const char *device_address) 141 { 142 Parcel data, reply; 143 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 144 data.writeInt32(static_cast <uint32_t>(device)); 145 data.writeCString(device_address); 146 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 147 return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 148 } 149 150 virtual status_t handleDeviceConfigChange(audio_devices_t device, 151 const char *device_address, 152 const char *device_name, 153 audio_format_t encodedFormat) 154 { 155 Parcel data, reply; 156 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 157 data.writeInt32(static_cast <uint32_t>(device)); 158 data.writeCString(device_address); 159 data.writeCString(device_name); 160 data.writeInt32(static_cast <uint32_t>(encodedFormat)); 161 remote()->transact(HANDLE_DEVICE_CONFIG_CHANGE, data, &reply); 162 return static_cast <status_t> (reply.readInt32()); 163 } 164 165 virtual status_t setPhoneState(audio_mode_t state) 166 { 167 Parcel data, reply; 168 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 169 data.writeInt32(state); 170 remote()->transact(SET_PHONE_STATE, data, &reply); 171 return static_cast <status_t> (reply.readInt32()); 172 } 173 174 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 175 { 176 Parcel data, reply; 177 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 178 data.writeInt32(static_cast <uint32_t>(usage)); 179 data.writeInt32(static_cast <uint32_t>(config)); 180 remote()->transact(SET_FORCE_USE, data, &reply); 181 return static_cast <status_t> (reply.readInt32()); 182 } 183 184 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 185 { 186 Parcel data, reply; 187 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 188 data.writeInt32(static_cast <uint32_t>(usage)); 189 remote()->transact(GET_FORCE_USE, data, &reply); 190 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 191 } 192 193 virtual audio_io_handle_t getOutput(audio_stream_type_t stream) 194 { 195 Parcel data, reply; 196 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 197 data.writeInt32(static_cast <uint32_t>(stream)); 198 remote()->transact(GET_OUTPUT, data, &reply); 199 return static_cast <audio_io_handle_t> (reply.readInt32()); 200 } 201 202 status_t getOutputForAttr(audio_attributes_t *attr, 203 audio_io_handle_t *output, 204 audio_session_t session, 205 audio_stream_type_t *stream, 206 pid_t pid, 207 uid_t uid, 208 const audio_config_t *config, 209 audio_output_flags_t flags, 210 audio_port_handle_t *selectedDeviceId, 211 audio_port_handle_t *portId, 212 std::vector<audio_io_handle_t> *secondaryOutputs) override 213 { 214 Parcel data, reply; 215 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 216 if (attr == nullptr) { 217 ALOGE("%s NULL audio attributes", __func__); 218 return BAD_VALUE; 219 } 220 if (output == nullptr) { 221 ALOGE("%s NULL output - shouldn't happen", __func__); 222 return BAD_VALUE; 223 } 224 if (selectedDeviceId == nullptr) { 225 ALOGE("%s NULL selectedDeviceId - shouldn't happen", __func__); 226 return BAD_VALUE; 227 } 228 if (portId == nullptr) { 229 ALOGE("%s NULL portId - shouldn't happen", __func__); 230 return BAD_VALUE; 231 } 232 if (secondaryOutputs == nullptr) { 233 ALOGE("%s NULL secondaryOutputs - shouldn't happen", __func__); 234 return BAD_VALUE; 235 } 236 data.write(attr, sizeof(audio_attributes_t)); 237 data.writeInt32(session); 238 if (stream == NULL) { 239 data.writeInt32(0); 240 } else { 241 data.writeInt32(1); 242 data.writeInt32(*stream); 243 } 244 data.writeInt32(pid); 245 data.writeInt32(uid); 246 data.write(config, sizeof(audio_config_t)); 247 data.writeInt32(static_cast <uint32_t>(flags)); 248 data.writeInt32(*selectedDeviceId); 249 data.writeInt32(*portId); 250 status_t status = remote()->transact(GET_OUTPUT_FOR_ATTR, data, &reply); 251 if (status != NO_ERROR) { 252 return status; 253 } 254 status = (status_t)reply.readInt32(); 255 if (status != NO_ERROR) { 256 return status; 257 } 258 status = (status_t)reply.read(&attr, sizeof(audio_attributes_t)); 259 if (status != NO_ERROR) { 260 return status; 261 } 262 *output = (audio_io_handle_t)reply.readInt32(); 263 audio_stream_type_t lStream = (audio_stream_type_t)reply.readInt32(); 264 if (stream != NULL) { 265 *stream = lStream; 266 } 267 *selectedDeviceId = (audio_port_handle_t)reply.readInt32(); 268 *portId = (audio_port_handle_t)reply.readInt32(); 269 secondaryOutputs->resize(reply.readInt32()); 270 return reply.read(secondaryOutputs->data(), 271 secondaryOutputs->size() * sizeof(audio_io_handle_t)); 272 } 273 274 virtual status_t startOutput(audio_port_handle_t portId) 275 { 276 Parcel data, reply; 277 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 278 data.writeInt32((int32_t)portId); 279 remote()->transact(START_OUTPUT, data, &reply); 280 return static_cast <status_t> (reply.readInt32()); 281 } 282 283 virtual status_t stopOutput(audio_port_handle_t portId) 284 { 285 Parcel data, reply; 286 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 287 data.writeInt32((int32_t)portId); 288 remote()->transact(STOP_OUTPUT, data, &reply); 289 return static_cast <status_t> (reply.readInt32()); 290 } 291 292 virtual void releaseOutput(audio_port_handle_t portId) 293 { 294 Parcel data, reply; 295 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 296 data.writeInt32((int32_t)portId); 297 remote()->transact(RELEASE_OUTPUT, data, &reply); 298 } 299 300 virtual status_t getInputForAttr(const audio_attributes_t *attr, 301 audio_io_handle_t *input, 302 audio_unique_id_t riid, 303 audio_session_t session, 304 pid_t pid, 305 uid_t uid, 306 const String16& opPackageName, 307 const audio_config_base_t *config, 308 audio_input_flags_t flags, 309 audio_port_handle_t *selectedDeviceId, 310 audio_port_handle_t *portId) 311 { 312 Parcel data, reply; 313 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 314 if (attr == NULL) { 315 ALOGE("getInputForAttr NULL attr - shouldn't happen"); 316 return BAD_VALUE; 317 } 318 if (input == NULL) { 319 ALOGE("getInputForAttr NULL input - shouldn't happen"); 320 return BAD_VALUE; 321 } 322 if (selectedDeviceId == NULL) { 323 ALOGE("getInputForAttr NULL selectedDeviceId - shouldn't happen"); 324 return BAD_VALUE; 325 } 326 if (portId == NULL) { 327 ALOGE("getInputForAttr NULL portId - shouldn't happen"); 328 return BAD_VALUE; 329 } 330 data.write(attr, sizeof(audio_attributes_t)); 331 data.writeInt32(*input); 332 data.writeInt32(riid); 333 data.writeInt32(session); 334 data.writeInt32(pid); 335 data.writeInt32(uid); 336 data.writeString16(opPackageName); 337 data.write(config, sizeof(audio_config_base_t)); 338 data.writeInt32(flags); 339 data.writeInt32(*selectedDeviceId); 340 data.writeInt32(*portId); 341 status_t status = remote()->transact(GET_INPUT_FOR_ATTR, data, &reply); 342 if (status != NO_ERROR) { 343 return status; 344 } 345 status = reply.readInt32(); 346 if (status != NO_ERROR) { 347 return status; 348 } 349 *input = (audio_io_handle_t)reply.readInt32(); 350 *selectedDeviceId = (audio_port_handle_t)reply.readInt32(); 351 *portId = (audio_port_handle_t)reply.readInt32(); 352 return NO_ERROR; 353 } 354 355 virtual status_t startInput(audio_port_handle_t portId) 356 { 357 Parcel data, reply; 358 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 359 data.writeInt32(portId); 360 remote()->transact(START_INPUT, data, &reply); 361 status_t status = static_cast <status_t> (reply.readInt32()); 362 return status; 363 } 364 365 virtual status_t stopInput(audio_port_handle_t portId) 366 { 367 Parcel data, reply; 368 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 369 data.writeInt32(portId); 370 remote()->transact(STOP_INPUT, data, &reply); 371 return static_cast <status_t> (reply.readInt32()); 372 } 373 374 virtual void releaseInput(audio_port_handle_t portId) 375 { 376 Parcel data, reply; 377 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 378 data.writeInt32(portId); 379 remote()->transact(RELEASE_INPUT, data, &reply); 380 } 381 382 virtual status_t initStreamVolume(audio_stream_type_t stream, 383 int indexMin, 384 int indexMax) 385 { 386 Parcel data, reply; 387 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 388 data.writeInt32(static_cast <uint32_t>(stream)); 389 data.writeInt32(indexMin); 390 data.writeInt32(indexMax); 391 remote()->transact(INIT_STREAM_VOLUME, data, &reply); 392 return static_cast <status_t> (reply.readInt32()); 393 } 394 395 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 396 int index, 397 audio_devices_t device) 398 { 399 Parcel data, reply; 400 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 401 data.writeInt32(static_cast <uint32_t>(stream)); 402 data.writeInt32(index); 403 data.writeInt32(static_cast <uint32_t>(device)); 404 remote()->transact(SET_STREAM_VOLUME, data, &reply); 405 return static_cast <status_t> (reply.readInt32()); 406 } 407 408 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 409 int *index, 410 audio_devices_t device) 411 { 412 Parcel data, reply; 413 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 414 data.writeInt32(static_cast <uint32_t>(stream)); 415 data.writeInt32(static_cast <uint32_t>(device)); 416 417 remote()->transact(GET_STREAM_VOLUME, data, &reply); 418 int lIndex = reply.readInt32(); 419 if (index) *index = lIndex; 420 return static_cast <status_t> (reply.readInt32()); 421 } 422 423 virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr, int index, 424 audio_devices_t device) 425 { 426 Parcel data, reply; 427 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 428 data.write(&attr, sizeof(audio_attributes_t)); 429 data.writeInt32(index); 430 data.writeInt32(static_cast <uint32_t>(device)); 431 status_t status = remote()->transact(SET_VOLUME_ATTRIBUTES, data, &reply); 432 if (status != NO_ERROR) { 433 return status; 434 } 435 return static_cast <status_t> (reply.readInt32()); 436 } 437 virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr, int &index, 438 audio_devices_t device) 439 { 440 Parcel data, reply; 441 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 442 data.write(&attr, sizeof(audio_attributes_t)); 443 data.writeInt32(static_cast <uint32_t>(device)); 444 status_t status = remote()->transact(GET_VOLUME_ATTRIBUTES, data, &reply); 445 if (status != NO_ERROR) { 446 return status; 447 } 448 status = static_cast <status_t> (reply.readInt32()); 449 if (status != NO_ERROR) { 450 return status; 451 } 452 index = reply.readInt32(); 453 return NO_ERROR; 454 } 455 virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr, int &index) 456 { 457 Parcel data, reply; 458 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 459 data.write(&attr, sizeof(audio_attributes_t)); 460 status_t status = remote()->transact(GET_MIN_VOLUME_FOR_ATTRIBUTES, data, &reply); 461 if (status != NO_ERROR) { 462 return status; 463 } 464 status = static_cast <status_t> (reply.readInt32()); 465 if (status != NO_ERROR) { 466 return status; 467 } 468 index = reply.readInt32(); 469 return NO_ERROR; 470 } 471 virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr, int &index) 472 { 473 Parcel data, reply; 474 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 475 data.write(&attr, sizeof(audio_attributes_t)); 476 status_t status = remote()->transact(GET_MAX_VOLUME_FOR_ATTRIBUTES, data, &reply); 477 if (status != NO_ERROR) { 478 return status; 479 } 480 status = static_cast <status_t> (reply.readInt32()); 481 if (status != NO_ERROR) { 482 return status; 483 } 484 index = reply.readInt32(); 485 return NO_ERROR; 486 } 487 virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 488 { 489 Parcel data, reply; 490 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 491 data.writeInt32(static_cast <uint32_t>(stream)); 492 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 493 return reply.readUint32(); 494 } 495 496 virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream) 497 { 498 Parcel data, reply; 499 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 500 data.writeInt32(static_cast <uint32_t>(stream)); 501 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 502 return (audio_devices_t) reply.readInt32(); 503 } 504 505 virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc) 506 { 507 Parcel data, reply; 508 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 509 data.write(desc, sizeof(effect_descriptor_t)); 510 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 511 return static_cast <audio_io_handle_t> (reply.readInt32()); 512 } 513 514 virtual status_t registerEffect(const effect_descriptor_t *desc, 515 audio_io_handle_t io, 516 uint32_t strategy, 517 audio_session_t session, 518 int id) 519 { 520 Parcel data, reply; 521 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 522 data.write(desc, sizeof(effect_descriptor_t)); 523 data.writeInt32(io); 524 data.writeInt32(strategy); 525 data.writeInt32(session); 526 data.writeInt32(id); 527 remote()->transact(REGISTER_EFFECT, data, &reply); 528 return static_cast <status_t> (reply.readInt32()); 529 } 530 531 virtual status_t unregisterEffect(int id) 532 { 533 Parcel data, reply; 534 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 535 data.writeInt32(id); 536 remote()->transact(UNREGISTER_EFFECT, data, &reply); 537 return static_cast <status_t> (reply.readInt32()); 538 } 539 540 virtual status_t setEffectEnabled(int id, bool enabled) 541 { 542 Parcel data, reply; 543 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 544 data.writeInt32(id); 545 data.writeInt32(enabled); 546 remote()->transact(SET_EFFECT_ENABLED, data, &reply); 547 return static_cast <status_t> (reply.readInt32()); 548 } 549 550 status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override 551 { 552 Parcel data, reply; 553 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 554 data.writeInt32(ids.size()); 555 for (auto id : ids) { 556 data.writeInt32(id); 557 } 558 data.writeInt32(io); 559 status_t status = remote()->transact(MOVE_EFFECTS_TO_IO, data, &reply); 560 if (status != NO_ERROR) { 561 return status; 562 } 563 return static_cast <status_t> (reply.readInt32()); 564 } 565 566 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 567 { 568 Parcel data, reply; 569 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 570 data.writeInt32((int32_t) stream); 571 data.writeInt32(inPastMs); 572 remote()->transact(IS_STREAM_ACTIVE, data, &reply); 573 return reply.readInt32(); 574 } 575 576 virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 577 { 578 Parcel data, reply; 579 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 580 data.writeInt32((int32_t) stream); 581 data.writeInt32(inPastMs); 582 remote()->transact(IS_STREAM_ACTIVE_REMOTELY, data, &reply); 583 return reply.readInt32(); 584 } 585 586 virtual bool isSourceActive(audio_source_t source) const 587 { 588 Parcel data, reply; 589 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 590 data.writeInt32((int32_t) source); 591 remote()->transact(IS_SOURCE_ACTIVE, data, &reply); 592 return reply.readInt32(); 593 } 594 595 virtual status_t queryDefaultPreProcessing(audio_session_t audioSession, 596 effect_descriptor_t *descriptors, 597 uint32_t *count) 598 { 599 if (descriptors == NULL || count == NULL) { 600 return BAD_VALUE; 601 } 602 Parcel data, reply; 603 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 604 data.writeInt32(audioSession); 605 data.writeInt32(*count); 606 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 607 if (status != NO_ERROR) { 608 return status; 609 } 610 status = static_cast <status_t> (reply.readInt32()); 611 uint32_t retCount = reply.readInt32(); 612 if (retCount != 0) { 613 uint32_t numDesc = (retCount < *count) ? retCount : *count; 614 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 615 } 616 *count = retCount; 617 return status; 618 } 619 620 status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override { 621 Parcel data, reply; 622 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 623 data.writeInt32(uid); 624 data.writeInt32(flags); 625 remote()->transact(SET_ALLOWED_CAPTURE_POLICY, data, &reply); 626 return reply.readInt32(); 627 } 628 629 virtual bool isOffloadSupported(const audio_offload_info_t& info) 630 { 631 Parcel data, reply; 632 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 633 data.write(&info, sizeof(audio_offload_info_t)); 634 remote()->transact(IS_OFFLOAD_SUPPORTED, data, &reply); 635 return reply.readInt32(); 636 } 637 638 virtual bool isDirectOutputSupported(const audio_config_base_t& config, 639 const audio_attributes_t& attributes) { 640 Parcel data, reply; 641 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 642 data.write(&config, sizeof(audio_config_base_t)); 643 data.write(&attributes, sizeof(audio_attributes_t)); 644 status_t status = remote()->transact(IS_DIRECT_OUTPUT_SUPPORTED, data, &reply); 645 return status == NO_ERROR ? static_cast<bool>(reply.readInt32()) : false; 646 } 647 648 virtual status_t listAudioPorts(audio_port_role_t role, 649 audio_port_type_t type, 650 unsigned int *num_ports, 651 struct audio_port *ports, 652 unsigned int *generation) 653 { 654 if (num_ports == NULL || (*num_ports != 0 && ports == NULL) || 655 generation == NULL) { 656 return BAD_VALUE; 657 } 658 Parcel data, reply; 659 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 660 unsigned int numPortsReq = (ports == NULL) ? 0 : *num_ports; 661 data.writeInt32(role); 662 data.writeInt32(type); 663 data.writeInt32(numPortsReq); 664 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 665 if (status == NO_ERROR) { 666 status = (status_t)reply.readInt32(); 667 *num_ports = (unsigned int)reply.readInt32(); 668 } 669 if (status == NO_ERROR) { 670 if (numPortsReq > *num_ports) { 671 numPortsReq = *num_ports; 672 } 673 if (numPortsReq > 0) { 674 reply.read(ports, numPortsReq * sizeof(struct audio_port)); 675 } 676 *generation = reply.readInt32(); 677 } 678 return status; 679 } 680 681 virtual status_t getAudioPort(struct audio_port *port) 682 { 683 if (port == NULL) { 684 return BAD_VALUE; 685 } 686 Parcel data, reply; 687 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 688 data.write(port, sizeof(struct audio_port)); 689 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 690 if (status != NO_ERROR || 691 (status = (status_t)reply.readInt32()) != NO_ERROR) { 692 return status; 693 } 694 reply.read(port, sizeof(struct audio_port)); 695 return status; 696 } 697 698 virtual status_t createAudioPatch(const struct audio_patch *patch, 699 audio_patch_handle_t *handle) 700 { 701 if (patch == NULL || handle == NULL) { 702 return BAD_VALUE; 703 } 704 Parcel data, reply; 705 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 706 data.write(patch, sizeof(struct audio_patch)); 707 data.write(handle, sizeof(audio_patch_handle_t)); 708 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 709 if (status != NO_ERROR || 710 (status = (status_t)reply.readInt32()) != NO_ERROR) { 711 return status; 712 } 713 reply.read(handle, sizeof(audio_patch_handle_t)); 714 return status; 715 } 716 717 virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 718 { 719 Parcel data, reply; 720 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 721 data.write(&handle, sizeof(audio_patch_handle_t)); 722 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 723 if (status != NO_ERROR) { 724 status = (status_t)reply.readInt32(); 725 } 726 return status; 727 } 728 729 virtual status_t listAudioPatches(unsigned int *num_patches, 730 struct audio_patch *patches, 731 unsigned int *generation) 732 { 733 if (num_patches == NULL || (*num_patches != 0 && patches == NULL) || 734 generation == NULL) { 735 return BAD_VALUE; 736 } 737 Parcel data, reply; 738 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 739 unsigned int numPatchesReq = (patches == NULL) ? 0 : *num_patches; 740 data.writeInt32(numPatchesReq); 741 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 742 if (status == NO_ERROR) { 743 status = (status_t)reply.readInt32(); 744 *num_patches = (unsigned int)reply.readInt32(); 745 } 746 if (status == NO_ERROR) { 747 if (numPatchesReq > *num_patches) { 748 numPatchesReq = *num_patches; 749 } 750 if (numPatchesReq > 0) { 751 reply.read(patches, numPatchesReq * sizeof(struct audio_patch)); 752 } 753 *generation = reply.readInt32(); 754 } 755 return status; 756 } 757 758 virtual status_t setAudioPortConfig(const struct audio_port_config *config) 759 { 760 if (config == NULL) { 761 return BAD_VALUE; 762 } 763 Parcel data, reply; 764 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 765 data.write(config, sizeof(struct audio_port_config)); 766 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 767 if (status != NO_ERROR) { 768 status = (status_t)reply.readInt32(); 769 } 770 return status; 771 } 772 773 virtual void registerClient(const sp<IAudioPolicyServiceClient>& client) 774 { 775 Parcel data, reply; 776 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 777 data.writeStrongBinder(IInterface::asBinder(client)); 778 remote()->transact(REGISTER_CLIENT, data, &reply); 779 } 780 781 virtual void setAudioPortCallbacksEnabled(bool enabled) 782 { 783 Parcel data, reply; 784 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 785 data.writeInt32(enabled ? 1 : 0); 786 remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply); 787 } 788 789 virtual void setAudioVolumeGroupCallbacksEnabled(bool enabled) 790 { 791 Parcel data, reply; 792 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 793 data.writeInt32(enabled ? 1 : 0); 794 remote()->transact(SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED, data, &reply); 795 } 796 797 virtual status_t acquireSoundTriggerSession(audio_session_t *session, 798 audio_io_handle_t *ioHandle, 799 audio_devices_t *device) 800 { 801 if (session == NULL || ioHandle == NULL || device == NULL) { 802 return BAD_VALUE; 803 } 804 Parcel data, reply; 805 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 806 status_t status = remote()->transact(ACQUIRE_SOUNDTRIGGER_SESSION, data, &reply); 807 if (status != NO_ERROR) { 808 return status; 809 } 810 status = (status_t)reply.readInt32(); 811 if (status == NO_ERROR) { 812 *session = (audio_session_t)reply.readInt32(); 813 *ioHandle = (audio_io_handle_t)reply.readInt32(); 814 *device = (audio_devices_t)reply.readInt32(); 815 } 816 return status; 817 } 818 819 virtual status_t releaseSoundTriggerSession(audio_session_t session) 820 { 821 Parcel data, reply; 822 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 823 data.writeInt32(session); 824 status_t status = remote()->transact(RELEASE_SOUNDTRIGGER_SESSION, data, &reply); 825 if (status != NO_ERROR) { 826 return status; 827 } 828 return (status_t)reply.readInt32(); 829 } 830 831 virtual audio_mode_t getPhoneState() 832 { 833 Parcel data, reply; 834 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 835 status_t status = remote()->transact(GET_PHONE_STATE, data, &reply); 836 if (status != NO_ERROR) { 837 return AUDIO_MODE_INVALID; 838 } 839 return (audio_mode_t)reply.readInt32(); 840 } 841 842 virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration) 843 { 844 Parcel data, reply; 845 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 846 data.writeInt32(registration ? 1 : 0); 847 size_t size = mixes.size(); 848 if (size > MAX_MIXES_PER_POLICY) { 849 size = MAX_MIXES_PER_POLICY; 850 } 851 size_t sizePosition = data.dataPosition(); 852 data.writeInt32(size); 853 size_t finalSize = size; 854 for (size_t i = 0; i < size; i++) { 855 size_t position = data.dataPosition(); 856 if (mixes[i].writeToParcel(&data) != NO_ERROR) { 857 data.setDataPosition(position); 858 finalSize--; 859 } 860 } 861 if (size != finalSize) { 862 size_t position = data.dataPosition(); 863 data.setDataPosition(sizePosition); 864 data.writeInt32(finalSize); 865 data.setDataPosition(position); 866 } 867 status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); 868 if (status == NO_ERROR) { 869 status = (status_t)reply.readInt32(); 870 } 871 return status; 872 } 873 874 virtual status_t startAudioSource(const struct audio_port_config *source, 875 const audio_attributes_t *attributes, 876 audio_port_handle_t *portId) 877 { 878 Parcel data, reply; 879 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 880 if (source == NULL || attributes == NULL || portId == NULL) { 881 return BAD_VALUE; 882 } 883 data.write(source, sizeof(struct audio_port_config)); 884 data.write(attributes, sizeof(audio_attributes_t)); 885 status_t status = remote()->transact(START_AUDIO_SOURCE, data, &reply); 886 if (status != NO_ERROR) { 887 return status; 888 } 889 status = (status_t)reply.readInt32(); 890 if (status != NO_ERROR) { 891 return status; 892 } 893 *portId = (audio_port_handle_t)reply.readInt32(); 894 return status; 895 } 896 897 virtual status_t stopAudioSource(audio_port_handle_t portId) 898 { 899 Parcel data, reply; 900 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 901 data.writeInt32(portId); 902 status_t status = remote()->transact(STOP_AUDIO_SOURCE, data, &reply); 903 if (status != NO_ERROR) { 904 return status; 905 } 906 status = (status_t)reply.readInt32(); 907 return status; 908 } 909 910 virtual status_t setMasterMono(bool mono) 911 { 912 Parcel data, reply; 913 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 914 data.writeInt32(static_cast<int32_t>(mono)); 915 status_t status = remote()->transact(SET_MASTER_MONO, data, &reply); 916 if (status != NO_ERROR) { 917 return status; 918 } 919 return static_cast<status_t>(reply.readInt32()); 920 } 921 922 virtual status_t getMasterMono(bool *mono) 923 { 924 if (mono == nullptr) { 925 return BAD_VALUE; 926 } 927 Parcel data, reply; 928 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 929 930 status_t status = remote()->transact(GET_MASTER_MONO, data, &reply); 931 if (status != NO_ERROR) { 932 return status; 933 } 934 status = static_cast<status_t>(reply.readInt32()); 935 if (status == NO_ERROR) { 936 *mono = static_cast<bool>(reply.readInt32()); 937 } 938 return status; 939 } 940 941 virtual float getStreamVolumeDB(audio_stream_type_t stream, int index, audio_devices_t device) 942 { 943 Parcel data, reply; 944 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 945 data.writeInt32(static_cast <int32_t>(stream)); 946 data.writeInt32(static_cast <int32_t>(index)); 947 data.writeUint32(static_cast <uint32_t>(device)); 948 status_t status = remote()->transact(GET_STREAM_VOLUME_DB, data, &reply); 949 if (status != NO_ERROR) { 950 return NAN; 951 } 952 return reply.readFloat(); 953 } 954 955 virtual status_t getSurroundFormats(unsigned int *numSurroundFormats, 956 audio_format_t *surroundFormats, 957 bool *surroundFormatsEnabled, 958 bool reported) 959 { 960 if (numSurroundFormats == NULL || (*numSurroundFormats != 0 && 961 (surroundFormats == NULL || surroundFormatsEnabled == NULL))) { 962 return BAD_VALUE; 963 } 964 Parcel data, reply; 965 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 966 unsigned int numSurroundFormatsReq = *numSurroundFormats; 967 data.writeUint32(numSurroundFormatsReq); 968 data.writeBool(reported); 969 status_t status = remote()->transact(GET_SURROUND_FORMATS, data, &reply); 970 if (status == NO_ERROR && (status = (status_t)reply.readInt32()) == NO_ERROR) { 971 *numSurroundFormats = reply.readUint32(); 972 } 973 if (status == NO_ERROR) { 974 if (numSurroundFormatsReq > *numSurroundFormats) { 975 numSurroundFormatsReq = *numSurroundFormats; 976 } 977 if (numSurroundFormatsReq > 0) { 978 status = reply.read(surroundFormats, 979 numSurroundFormatsReq * sizeof(audio_format_t)); 980 if (status != NO_ERROR) { 981 return status; 982 } 983 status = reply.read(surroundFormatsEnabled, 984 numSurroundFormatsReq * sizeof(bool)); 985 } 986 } 987 return status; 988 } 989 990 virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) 991 { 992 Parcel data, reply; 993 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 994 data.writeInt32(audioFormat); 995 data.writeBool(enabled); 996 status_t status = remote()->transact(SET_SURROUND_FORMAT_ENABLED, data, &reply); 997 if (status != NO_ERROR) { 998 return status; 999 } 1000 return reply.readInt32(); 1001 } 1002 1003 virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP( 1004 std::vector<audio_format_t> *formats) 1005 { 1006 if (formats == NULL) { 1007 return BAD_VALUE; 1008 } 1009 1010 Parcel data, reply; 1011 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1012 status_t status = remote()->transact(GET_OFFLOAD_FORMATS_A2DP, data, &reply); 1013 if (status != NO_ERROR || (status = (status_t)reply.readInt32()) != NO_ERROR) { 1014 return status; 1015 } 1016 1017 size_t list_size = reply.readUint32(); 1018 1019 for (size_t i = 0; i < list_size; i++) { 1020 formats->push_back(static_cast<audio_format_t>(reply.readInt32())); 1021 } 1022 return NO_ERROR; 1023 } 1024 1025 1026 virtual status_t addStreamDefaultEffect(const effect_uuid_t *type, 1027 const String16& opPackageName, 1028 const effect_uuid_t *uuid, 1029 int32_t priority, 1030 audio_usage_t usage, 1031 audio_unique_id_t* id) 1032 { 1033 Parcel data, reply; 1034 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1035 data.write(type, sizeof(effect_uuid_t)); 1036 data.writeString16(opPackageName); 1037 data.write(uuid, sizeof(effect_uuid_t)); 1038 data.writeInt32(priority); 1039 data.writeInt32((int32_t) usage); 1040 status_t status = remote()->transact(ADD_STREAM_DEFAULT_EFFECT, data, &reply); 1041 if (status != NO_ERROR) { 1042 return status; 1043 } 1044 status = static_cast <status_t> (reply.readInt32()); 1045 *id = reply.readInt32(); 1046 return status; 1047 } 1048 1049 virtual status_t removeStreamDefaultEffect(audio_unique_id_t id) 1050 { 1051 Parcel data, reply; 1052 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1053 data.writeInt32(id); 1054 status_t status = remote()->transact(REMOVE_STREAM_DEFAULT_EFFECT, data, &reply); 1055 if (status != NO_ERROR) { 1056 return status; 1057 } 1058 return static_cast <status_t> (reply.readInt32()); 1059 } 1060 1061 virtual status_t addSourceDefaultEffect(const effect_uuid_t *type, 1062 const String16& opPackageName, 1063 const effect_uuid_t *uuid, 1064 int32_t priority, 1065 audio_source_t source, 1066 audio_unique_id_t* id) 1067 { 1068 Parcel data, reply; 1069 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1070 data.write(type, sizeof(effect_uuid_t)); 1071 data.writeString16(opPackageName); 1072 data.write(uuid, sizeof(effect_uuid_t)); 1073 data.writeInt32(priority); 1074 data.writeInt32((int32_t) source); 1075 status_t status = remote()->transact(ADD_SOURCE_DEFAULT_EFFECT, data, &reply); 1076 if (status != NO_ERROR) { 1077 return status; 1078 } 1079 status = static_cast <status_t> (reply.readInt32()); 1080 *id = reply.readInt32(); 1081 return status; 1082 } 1083 1084 virtual status_t removeSourceDefaultEffect(audio_unique_id_t id) 1085 { 1086 Parcel data, reply; 1087 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1088 data.writeInt32(id); 1089 status_t status = remote()->transact(REMOVE_SOURCE_DEFAULT_EFFECT, data, &reply); 1090 if (status != NO_ERROR) { 1091 return status; 1092 } 1093 return static_cast <status_t> (reply.readInt32()); 1094 } 1095 1096 virtual status_t setAssistantUid(uid_t uid) 1097 { 1098 Parcel data, reply; 1099 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1100 data.writeInt32(uid); 1101 status_t status = remote()->transact(SET_ASSISTANT_UID, data, &reply); 1102 if (status != NO_ERROR) { 1103 return status; 1104 } 1105 return static_cast <status_t> (reply.readInt32()); 1106 } 1107 1108 virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids) 1109 { 1110 Parcel data, reply; 1111 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1112 data.writeInt32(uids.size()); 1113 for (auto uid : uids) { 1114 data.writeInt32(uid); 1115 } 1116 status_t status = remote()->transact(SET_A11Y_SERVICES_UIDS, data, &reply); 1117 if (status != NO_ERROR) { 1118 return status; 1119 } 1120 return static_cast <status_t> (reply.readInt32()); 1121 } 1122 1123 virtual bool isHapticPlaybackSupported() 1124 { 1125 Parcel data, reply; 1126 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1127 status_t status = remote()->transact(IS_HAPTIC_PLAYBACK_SUPPORTED, data, &reply); 1128 if (status != NO_ERROR) { 1129 return false; 1130 } 1131 return reply.readBool(); 1132 } 1133 1134 virtual status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices) 1135 { 1136 Parcel data, reply; 1137 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1138 1139 data.writeInt32((int32_t) uid); 1140 size_t size = devices.size(); 1141 size_t sizePosition = data.dataPosition(); 1142 data.writeInt32((int32_t) size); 1143 size_t finalSize = size; 1144 for (size_t i = 0; i < size; i++) { 1145 size_t position = data.dataPosition(); 1146 if (devices[i].writeToParcel(&data) != NO_ERROR) { 1147 data.setDataPosition(position); 1148 finalSize--; 1149 } 1150 } 1151 if (size != finalSize) { 1152 size_t position = data.dataPosition(); 1153 data.setDataPosition(sizePosition); 1154 data.writeInt32(finalSize); 1155 data.setDataPosition(position); 1156 } 1157 1158 status_t status = remote()->transact(SET_UID_DEVICE_AFFINITY, data, &reply); 1159 if (status == NO_ERROR) { 1160 status = (status_t)reply.readInt32(); 1161 } 1162 return status; 1163 } 1164 1165 virtual status_t removeUidDeviceAffinities(uid_t uid) { 1166 Parcel data, reply; 1167 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1168 1169 data.writeInt32((int32_t) uid); 1170 1171 status_t status = 1172 remote()->transact(REMOVE_UID_DEVICE_AFFINITY, data, &reply); 1173 if (status == NO_ERROR) { 1174 status = (status_t) reply.readInt32(); 1175 } 1176 return status; 1177 } 1178 1179 virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies) 1180 { 1181 Parcel data, reply; 1182 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1183 1184 status_t status = remote()->transact(LIST_AUDIO_PRODUCT_STRATEGIES, data, &reply); 1185 if (status != NO_ERROR) { 1186 ALOGE("%s: permission denied", __func__); 1187 return status; 1188 } 1189 status = static_cast<status_t>(reply.readInt32()); 1190 if (status != NO_ERROR) { 1191 return status; 1192 } 1193 uint32_t numStrategies = static_cast<uint32_t>(reply.readInt32()); 1194 for (size_t i = 0; i < numStrategies; i++) { 1195 AudioProductStrategy strategy; 1196 status = strategy.readFromParcel(&reply); 1197 if (status != NO_ERROR) { 1198 ALOGE("%s: failed to read strategies", __FUNCTION__); 1199 strategies.clear(); 1200 return status; 1201 } 1202 strategies.push_back(strategy); 1203 } 1204 return NO_ERROR; 1205 } 1206 1207 virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa, 1208 product_strategy_t &productStrategy) 1209 { 1210 Parcel data, reply; 1211 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1212 status_t status = aa.writeToParcel(&data); 1213 if (status != NO_ERROR) { 1214 return status; 1215 } 1216 status = remote()->transact(GET_STRATEGY_FOR_ATTRIBUTES, data, &reply); 1217 if (status != NO_ERROR) { 1218 return status; 1219 } 1220 status = static_cast<status_t>(reply.readInt32()); 1221 if (status != NO_ERROR) { 1222 return status; 1223 } 1224 productStrategy = static_cast<product_strategy_t>(reply.readInt32()); 1225 return NO_ERROR; 1226 } 1227 1228 virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups) 1229 { 1230 Parcel data, reply; 1231 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1232 1233 status_t status = remote()->transact(LIST_AUDIO_VOLUME_GROUPS, data, &reply); 1234 if (status != NO_ERROR) { 1235 return status; 1236 } 1237 status = static_cast<status_t>(reply.readInt32()); 1238 if (status != NO_ERROR) { 1239 return status; 1240 } 1241 uint32_t numGroups = static_cast<uint32_t>(reply.readInt32()); 1242 for (size_t i = 0; i < numGroups; i++) { 1243 AudioVolumeGroup group; 1244 status = group.readFromParcel(&reply); 1245 if (status != NO_ERROR) { 1246 ALOGE("%s: failed to read volume groups", __FUNCTION__); 1247 groups.clear(); 1248 return status; 1249 } 1250 groups.push_back(group); 1251 } 1252 return NO_ERROR; 1253 } 1254 1255 virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa, 1256 volume_group_t &volumeGroup) 1257 { 1258 Parcel data, reply; 1259 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1260 status_t status = aa.writeToParcel(&data); 1261 if (status != NO_ERROR) { 1262 return status; 1263 } 1264 status = remote()->transact(GET_VOLUME_GROUP_FOR_ATTRIBUTES, data, &reply); 1265 if (status != NO_ERROR) { 1266 return status; 1267 } 1268 status = static_cast<status_t>(reply.readInt32()); 1269 if (status != NO_ERROR) { 1270 return status; 1271 } 1272 volumeGroup = static_cast<volume_group_t>(reply.readInt32()); 1273 return NO_ERROR; 1274 } 1275 1276 virtual status_t setRttEnabled(bool enabled) 1277 { 1278 Parcel data, reply; 1279 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 1280 data.writeInt32(static_cast<int32_t>(enabled)); 1281 status_t status = remote()->transact(SET_RTT_ENABLED, data, &reply); 1282 if (status != NO_ERROR) { 1283 return status; 1284 } 1285 return static_cast<status_t>(reply.readInt32()); 1286 } 1287 }; 1288 1289 IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 1290 1291 // ---------------------------------------------------------------------- 1292 1293 status_t BnAudioPolicyService::onTransact( 1294 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1295 { 1296 // make sure transactions reserved to AudioFlinger do not come from other processes 1297 switch (code) { 1298 case START_OUTPUT: 1299 case STOP_OUTPUT: 1300 case RELEASE_OUTPUT: 1301 case GET_INPUT_FOR_ATTR: 1302 case START_INPUT: 1303 case STOP_INPUT: 1304 case RELEASE_INPUT: 1305 case GET_OUTPUT_FOR_EFFECT: 1306 case REGISTER_EFFECT: 1307 case UNREGISTER_EFFECT: 1308 case SET_EFFECT_ENABLED: 1309 case GET_OUTPUT_FOR_ATTR: 1310 case ACQUIRE_SOUNDTRIGGER_SESSION: 1311 case RELEASE_SOUNDTRIGGER_SESSION: 1312 case MOVE_EFFECTS_TO_IO: 1313 ALOGW("%s: transaction %d received from PID %d", 1314 __func__, code, IPCThreadState::self()->getCallingPid()); 1315 // return status only for non void methods 1316 switch (code) { 1317 case RELEASE_OUTPUT: 1318 case RELEASE_INPUT: 1319 break; 1320 default: 1321 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 1322 break; 1323 } 1324 return OK; 1325 default: 1326 break; 1327 } 1328 1329 // make sure the following transactions come from system components 1330 switch (code) { 1331 case SET_DEVICE_CONNECTION_STATE: 1332 case HANDLE_DEVICE_CONFIG_CHANGE: 1333 case SET_PHONE_STATE: 1334 //FIXME: Allow SET_FORCE_USE calls from system apps until a better use case routing API is available 1335 // case SET_FORCE_USE: 1336 case INIT_STREAM_VOLUME: 1337 case SET_STREAM_VOLUME: 1338 case REGISTER_POLICY_MIXES: 1339 case SET_MASTER_MONO: 1340 case GET_SURROUND_FORMATS: 1341 case SET_SURROUND_FORMAT_ENABLED: 1342 case SET_ASSISTANT_UID: 1343 case SET_A11Y_SERVICES_UIDS: 1344 case SET_UID_DEVICE_AFFINITY: 1345 case REMOVE_UID_DEVICE_AFFINITY: 1346 case GET_OFFLOAD_FORMATS_A2DP: 1347 case LIST_AUDIO_VOLUME_GROUPS: 1348 case GET_VOLUME_GROUP_FOR_ATTRIBUTES: 1349 case SET_RTT_ENABLED: { 1350 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { 1351 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", 1352 __func__, code, IPCThreadState::self()->getCallingPid(), 1353 IPCThreadState::self()->getCallingUid()); 1354 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 1355 return OK; 1356 } 1357 } break; 1358 default: 1359 break; 1360 } 1361 1362 std::string tag("IAudioPolicyService command " + std::to_string(code)); 1363 TimeCheck check(tag.c_str()); 1364 1365 switch (code) { 1366 case SET_DEVICE_CONNECTION_STATE: { 1367 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1368 audio_devices_t device = 1369 static_cast <audio_devices_t>(data.readInt32()); 1370 audio_policy_dev_state_t state = 1371 static_cast <audio_policy_dev_state_t>(data.readInt32()); 1372 const char *device_address = data.readCString(); 1373 const char *device_name = data.readCString(); 1374 audio_format_t codecFormat = static_cast <audio_format_t>(data.readInt32()); 1375 if (device_address == nullptr || device_name == nullptr) { 1376 ALOGE("Bad Binder transaction: SET_DEVICE_CONNECTION_STATE for device %u", device); 1377 reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 1378 } else { 1379 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 1380 state, 1381 device_address, 1382 device_name, 1383 codecFormat))); 1384 } 1385 return NO_ERROR; 1386 } break; 1387 1388 case GET_DEVICE_CONNECTION_STATE: { 1389 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1390 audio_devices_t device = 1391 static_cast<audio_devices_t> (data.readInt32()); 1392 const char *device_address = data.readCString(); 1393 if (device_address == nullptr) { 1394 ALOGE("Bad Binder transaction: GET_DEVICE_CONNECTION_STATE for device %u", device); 1395 reply->writeInt32(static_cast<int32_t> (AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE)); 1396 } else { 1397 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 1398 device_address))); 1399 } 1400 return NO_ERROR; 1401 } break; 1402 1403 case HANDLE_DEVICE_CONFIG_CHANGE: { 1404 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1405 audio_devices_t device = 1406 static_cast <audio_devices_t>(data.readInt32()); 1407 const char *device_address = data.readCString(); 1408 const char *device_name = data.readCString(); 1409 audio_format_t codecFormat = 1410 static_cast <audio_format_t>(data.readInt32()); 1411 if (device_address == nullptr || device_name == nullptr) { 1412 ALOGE("Bad Binder transaction: HANDLE_DEVICE_CONFIG_CHANGE for device %u", device); 1413 reply->writeInt32(static_cast<int32_t> (BAD_VALUE)); 1414 } else { 1415 reply->writeInt32(static_cast<uint32_t> (handleDeviceConfigChange(device, 1416 device_address, 1417 device_name, 1418 codecFormat))); 1419 } 1420 return NO_ERROR; 1421 } break; 1422 1423 case SET_PHONE_STATE: { 1424 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1425 reply->writeInt32(static_cast <uint32_t>(setPhoneState( 1426 (audio_mode_t) data.readInt32()))); 1427 return NO_ERROR; 1428 } break; 1429 1430 case SET_FORCE_USE: { 1431 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1432 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 1433 data.readInt32()); 1434 audio_policy_forced_cfg_t config = 1435 static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 1436 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 1437 return NO_ERROR; 1438 } break; 1439 1440 case GET_FORCE_USE: { 1441 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1442 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>( 1443 data.readInt32()); 1444 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 1445 return NO_ERROR; 1446 } break; 1447 1448 case GET_OUTPUT: { 1449 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1450 audio_stream_type_t stream = 1451 static_cast <audio_stream_type_t>(data.readInt32()); 1452 audio_io_handle_t output = getOutput(stream); 1453 reply->writeInt32(static_cast <int>(output)); 1454 return NO_ERROR; 1455 } break; 1456 1457 case GET_OUTPUT_FOR_ATTR: { 1458 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1459 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER; 1460 status_t status = data.read(&attr, sizeof(audio_attributes_t)); 1461 if (status != NO_ERROR) { 1462 return status; 1463 } 1464 sanetizeAudioAttributes(&attr); 1465 audio_session_t session = (audio_session_t)data.readInt32(); 1466 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT; 1467 bool hasStream = data.readInt32() != 0; 1468 if (hasStream) { 1469 stream = (audio_stream_type_t)data.readInt32(); 1470 } 1471 pid_t pid = (pid_t)data.readInt32(); 1472 uid_t uid = (uid_t)data.readInt32(); 1473 audio_config_t config; 1474 memset(&config, 0, sizeof(audio_config_t)); 1475 data.read(&config, sizeof(audio_config_t)); 1476 audio_output_flags_t flags = 1477 static_cast <audio_output_flags_t>(data.readInt32()); 1478 audio_port_handle_t selectedDeviceId = data.readInt32(); 1479 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); 1480 audio_io_handle_t output = 0; 1481 std::vector<audio_io_handle_t> secondaryOutputs; 1482 status = getOutputForAttr(&attr, 1483 &output, session, &stream, pid, uid, 1484 &config, 1485 flags, &selectedDeviceId, &portId, &secondaryOutputs); 1486 reply->writeInt32(status); 1487 status = reply->write(&attr, sizeof(audio_attributes_t)); 1488 if (status != NO_ERROR) { 1489 return status; 1490 } 1491 reply->writeInt32(output); 1492 reply->writeInt32(stream); 1493 reply->writeInt32(selectedDeviceId); 1494 reply->writeInt32(portId); 1495 reply->writeInt32(secondaryOutputs.size()); 1496 return reply->write(secondaryOutputs.data(), 1497 secondaryOutputs.size() * sizeof(audio_io_handle_t)); 1498 } break; 1499 1500 case START_OUTPUT: { 1501 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1502 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1503 reply->writeInt32(static_cast <uint32_t>(startOutput(portId))); 1504 return NO_ERROR; 1505 } break; 1506 1507 case STOP_OUTPUT: { 1508 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1509 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1510 reply->writeInt32(static_cast <uint32_t>(stopOutput(portId))); 1511 return NO_ERROR; 1512 } break; 1513 1514 case RELEASE_OUTPUT: { 1515 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1516 const audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1517 releaseOutput(portId); 1518 return NO_ERROR; 1519 } break; 1520 1521 case GET_INPUT_FOR_ATTR: { 1522 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1523 audio_attributes_t attr = {}; 1524 data.read(&attr, sizeof(audio_attributes_t)); 1525 sanetizeAudioAttributes(&attr); 1526 audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1527 audio_unique_id_t riid = (audio_unique_id_t)data.readInt32(); 1528 audio_session_t session = (audio_session_t)data.readInt32(); 1529 pid_t pid = (pid_t)data.readInt32(); 1530 uid_t uid = (uid_t)data.readInt32(); 1531 const String16 opPackageName = data.readString16(); 1532 audio_config_base_t config; 1533 memset(&config, 0, sizeof(audio_config_base_t)); 1534 data.read(&config, sizeof(audio_config_base_t)); 1535 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1536 audio_port_handle_t selectedDeviceId = (audio_port_handle_t) data.readInt32(); 1537 audio_port_handle_t portId = (audio_port_handle_t)data.readInt32(); 1538 status_t status = getInputForAttr(&attr, &input, riid, session, pid, uid, 1539 opPackageName, &config, 1540 flags, &selectedDeviceId, &portId); 1541 reply->writeInt32(status); 1542 if (status == NO_ERROR) { 1543 reply->writeInt32(input); 1544 reply->writeInt32(selectedDeviceId); 1545 reply->writeInt32(portId); 1546 } 1547 return NO_ERROR; 1548 } break; 1549 1550 case START_INPUT: { 1551 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1552 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1553 status_t status = startInput(portId); 1554 reply->writeInt32(static_cast <uint32_t>(status)); 1555 return NO_ERROR; 1556 } break; 1557 1558 case STOP_INPUT: { 1559 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1560 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1561 reply->writeInt32(static_cast <uint32_t>(stopInput(portId))); 1562 return NO_ERROR; 1563 } break; 1564 1565 case RELEASE_INPUT: { 1566 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1567 audio_port_handle_t portId = static_cast <audio_port_handle_t>(data.readInt32()); 1568 releaseInput(portId); 1569 return NO_ERROR; 1570 } break; 1571 1572 case INIT_STREAM_VOLUME: { 1573 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1574 audio_stream_type_t stream = 1575 static_cast <audio_stream_type_t>(data.readInt32()); 1576 int indexMin = data.readInt32(); 1577 int indexMax = data.readInt32(); 1578 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 1579 return NO_ERROR; 1580 } break; 1581 1582 case SET_STREAM_VOLUME: { 1583 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1584 audio_stream_type_t stream = 1585 static_cast <audio_stream_type_t>(data.readInt32()); 1586 int index = data.readInt32(); 1587 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1588 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 1589 index, 1590 device))); 1591 return NO_ERROR; 1592 } break; 1593 1594 case GET_STREAM_VOLUME: { 1595 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1596 audio_stream_type_t stream = 1597 static_cast <audio_stream_type_t>(data.readInt32()); 1598 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1599 int index = 0; 1600 status_t status = getStreamVolumeIndex(stream, &index, device); 1601 reply->writeInt32(index); 1602 reply->writeInt32(static_cast <uint32_t>(status)); 1603 return NO_ERROR; 1604 } break; 1605 1606 case GET_STRATEGY_FOR_STREAM: { 1607 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1608 audio_stream_type_t stream = 1609 static_cast <audio_stream_type_t>(data.readInt32()); 1610 reply->writeUint32(getStrategyForStream(stream)); 1611 return NO_ERROR; 1612 } break; 1613 1614 case SET_VOLUME_ATTRIBUTES: { 1615 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1616 audio_attributes_t attributes = {}; 1617 status_t status = data.read(&attributes, sizeof(audio_attributes_t)); 1618 if (status != NO_ERROR) { 1619 return status; 1620 } 1621 int index = data.readInt32(); 1622 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1623 1624 reply->writeInt32(static_cast <uint32_t>(setVolumeIndexForAttributes(attributes, 1625 index, device))); 1626 return NO_ERROR; 1627 } break; 1628 1629 case GET_VOLUME_ATTRIBUTES: { 1630 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1631 audio_attributes_t attributes = {}; 1632 status_t status = data.read(&attributes, sizeof(audio_attributes_t)); 1633 if (status != NO_ERROR) { 1634 return status; 1635 } 1636 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 1637 1638 int index = 0; 1639 status = getVolumeIndexForAttributes(attributes, index, device); 1640 reply->writeInt32(static_cast <uint32_t>(status)); 1641 if (status == NO_ERROR) { 1642 reply->writeInt32(index); 1643 } 1644 return NO_ERROR; 1645 } break; 1646 1647 case GET_MIN_VOLUME_FOR_ATTRIBUTES: { 1648 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1649 audio_attributes_t attributes = {}; 1650 status_t status = data.read(&attributes, sizeof(audio_attributes_t)); 1651 if (status != NO_ERROR) { 1652 return status; 1653 } 1654 1655 int index = 0; 1656 status = getMinVolumeIndexForAttributes(attributes, index); 1657 reply->writeInt32(static_cast <uint32_t>(status)); 1658 if (status == NO_ERROR) { 1659 reply->writeInt32(index); 1660 } 1661 return NO_ERROR; 1662 } break; 1663 1664 case GET_MAX_VOLUME_FOR_ATTRIBUTES: { 1665 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1666 audio_attributes_t attributes = {}; 1667 status_t status = data.read(&attributes, sizeof(audio_attributes_t)); 1668 if (status != NO_ERROR) { 1669 return status; 1670 } 1671 1672 int index = 0; 1673 status = getMaxVolumeIndexForAttributes(attributes, index); 1674 reply->writeInt32(static_cast <uint32_t>(status)); 1675 if (status == NO_ERROR) { 1676 reply->writeInt32(index); 1677 } 1678 return NO_ERROR; 1679 } break; 1680 1681 case GET_DEVICES_FOR_STREAM: { 1682 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1683 audio_stream_type_t stream = 1684 static_cast <audio_stream_type_t>(data.readInt32()); 1685 reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 1686 return NO_ERROR; 1687 } break; 1688 1689 case GET_OUTPUT_FOR_EFFECT: { 1690 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1691 effect_descriptor_t desc = {}; 1692 if (data.read(&desc, sizeof(desc)) != NO_ERROR) { 1693 android_errorWriteLog(0x534e4554, "73126106"); 1694 } 1695 (void)sanitizeEffectDescriptor(&desc); 1696 audio_io_handle_t output = getOutputForEffect(&desc); 1697 reply->writeInt32(static_cast <int>(output)); 1698 return NO_ERROR; 1699 } break; 1700 1701 case REGISTER_EFFECT: { 1702 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1703 effect_descriptor_t desc = {}; 1704 if (data.read(&desc, sizeof(desc)) != NO_ERROR) { 1705 android_errorWriteLog(0x534e4554, "73126106"); 1706 } 1707 (void)sanitizeEffectDescriptor(&desc); 1708 audio_io_handle_t io = data.readInt32(); 1709 uint32_t strategy = data.readInt32(); 1710 audio_session_t session = (audio_session_t) data.readInt32(); 1711 int id = data.readInt32(); 1712 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 1713 io, 1714 strategy, 1715 session, 1716 id))); 1717 return NO_ERROR; 1718 } break; 1719 1720 case UNREGISTER_EFFECT: { 1721 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1722 int id = data.readInt32(); 1723 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 1724 return NO_ERROR; 1725 } break; 1726 1727 case SET_EFFECT_ENABLED: { 1728 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1729 int id = data.readInt32(); 1730 bool enabled = static_cast <bool>(data.readInt32()); 1731 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 1732 return NO_ERROR; 1733 } break; 1734 1735 case MOVE_EFFECTS_TO_IO: { 1736 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1737 std::vector<int> ids; 1738 int32_t size; 1739 status_t status = data.readInt32(&size); 1740 if (status != NO_ERROR) { 1741 return status; 1742 } 1743 if (size > MAX_ITEMS_PER_LIST) { 1744 return BAD_VALUE; 1745 } 1746 for (int32_t i = 0; i < size; i++) { 1747 int id; 1748 status = data.readInt32(&id); 1749 if (status != NO_ERROR) { 1750 return status; 1751 } 1752 ids.push_back(id); 1753 } 1754 1755 audio_io_handle_t io = data.readInt32(); 1756 reply->writeInt32(static_cast <int32_t>(moveEffectsToIo(ids, io))); 1757 return NO_ERROR; 1758 } break; 1759 1760 case IS_STREAM_ACTIVE: { 1761 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1762 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1763 uint32_t inPastMs = (uint32_t)data.readInt32(); 1764 reply->writeInt32( isStreamActive(stream, inPastMs) ); 1765 return NO_ERROR; 1766 } break; 1767 1768 case IS_STREAM_ACTIVE_REMOTELY: { 1769 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1770 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1771 uint32_t inPastMs = (uint32_t)data.readInt32(); 1772 reply->writeInt32( isStreamActiveRemotely(stream, inPastMs) ); 1773 return NO_ERROR; 1774 } break; 1775 1776 case IS_SOURCE_ACTIVE: { 1777 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1778 audio_source_t source = (audio_source_t) data.readInt32(); 1779 reply->writeInt32( isSourceActive(source)); 1780 return NO_ERROR; 1781 } 1782 1783 case QUERY_DEFAULT_PRE_PROCESSING: { 1784 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1785 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1786 uint32_t count = data.readInt32(); 1787 if (count > AudioEffect::kMaxPreProcessing) { 1788 count = AudioEffect::kMaxPreProcessing; 1789 } 1790 uint32_t retCount = count; 1791 effect_descriptor_t *descriptors = new effect_descriptor_t[count]{}; 1792 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 1793 reply->writeInt32(status); 1794 if (status != NO_ERROR && status != NO_MEMORY) { 1795 retCount = 0; 1796 } 1797 reply->writeInt32(retCount); 1798 if (retCount != 0) { 1799 if (retCount < count) { 1800 count = retCount; 1801 } 1802 reply->write(descriptors, sizeof(effect_descriptor_t) * count); 1803 } 1804 delete[] descriptors; 1805 return status; 1806 } 1807 1808 case IS_OFFLOAD_SUPPORTED: { 1809 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1810 audio_offload_info_t info = {}; 1811 data.read(&info, sizeof(audio_offload_info_t)); 1812 bool isSupported = isOffloadSupported(info); 1813 reply->writeInt32(isSupported); 1814 return NO_ERROR; 1815 } 1816 1817 case IS_DIRECT_OUTPUT_SUPPORTED: { 1818 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1819 audio_config_base_t config = {}; 1820 audio_attributes_t attributes = {}; 1821 status_t status = data.read(&config, sizeof(audio_config_base_t)); 1822 if (status != NO_ERROR) return status; 1823 status = data.read(&attributes, sizeof(audio_attributes_t)); 1824 if (status != NO_ERROR) return status; 1825 reply->writeInt32(isDirectOutputSupported(config, attributes)); 1826 return NO_ERROR; 1827 } 1828 1829 case LIST_AUDIO_PORTS: { 1830 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1831 audio_port_role_t role = (audio_port_role_t)data.readInt32(); 1832 audio_port_type_t type = (audio_port_type_t)data.readInt32(); 1833 unsigned int numPortsReq = data.readInt32(); 1834 if (numPortsReq > MAX_ITEMS_PER_LIST) { 1835 numPortsReq = MAX_ITEMS_PER_LIST; 1836 } 1837 unsigned int numPorts = numPortsReq; 1838 struct audio_port *ports = 1839 (struct audio_port *)calloc(numPortsReq, sizeof(struct audio_port)); 1840 if (ports == NULL) { 1841 reply->writeInt32(NO_MEMORY); 1842 reply->writeInt32(0); 1843 return NO_ERROR; 1844 } 1845 unsigned int generation; 1846 status_t status = listAudioPorts(role, type, &numPorts, ports, &generation); 1847 reply->writeInt32(status); 1848 reply->writeInt32(numPorts); 1849 1850 if (status == NO_ERROR) { 1851 if (numPortsReq > numPorts) { 1852 numPortsReq = numPorts; 1853 } 1854 reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1855 reply->writeInt32(generation); 1856 } 1857 free(ports); 1858 return NO_ERROR; 1859 } 1860 1861 case GET_AUDIO_PORT: { 1862 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1863 struct audio_port port = {}; 1864 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1865 ALOGE("b/23912202"); 1866 } 1867 status_t status = getAudioPort(&port); 1868 reply->writeInt32(status); 1869 if (status == NO_ERROR) { 1870 reply->write(&port, sizeof(struct audio_port)); 1871 } 1872 return NO_ERROR; 1873 } 1874 1875 case CREATE_AUDIO_PATCH: { 1876 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1877 struct audio_patch patch = {}; 1878 data.read(&patch, sizeof(struct audio_patch)); 1879 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1880 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1881 ALOGE("b/23912202"); 1882 } 1883 status_t status = createAudioPatch(&patch, &handle); 1884 reply->writeInt32(status); 1885 if (status == NO_ERROR) { 1886 reply->write(&handle, sizeof(audio_patch_handle_t)); 1887 } 1888 return NO_ERROR; 1889 } 1890 1891 case RELEASE_AUDIO_PATCH: { 1892 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1893 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1894 data.read(&handle, sizeof(audio_patch_handle_t)); 1895 status_t status = releaseAudioPatch(handle); 1896 reply->writeInt32(status); 1897 return NO_ERROR; 1898 } 1899 1900 case LIST_AUDIO_PATCHES: { 1901 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1902 unsigned int numPatchesReq = data.readInt32(); 1903 if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1904 numPatchesReq = MAX_ITEMS_PER_LIST; 1905 } 1906 unsigned int numPatches = numPatchesReq; 1907 struct audio_patch *patches = 1908 (struct audio_patch *)calloc(numPatchesReq, 1909 sizeof(struct audio_patch)); 1910 if (patches == NULL) { 1911 reply->writeInt32(NO_MEMORY); 1912 reply->writeInt32(0); 1913 return NO_ERROR; 1914 } 1915 unsigned int generation; 1916 status_t status = listAudioPatches(&numPatches, patches, &generation); 1917 reply->writeInt32(status); 1918 reply->writeInt32(numPatches); 1919 if (status == NO_ERROR) { 1920 if (numPatchesReq > numPatches) { 1921 numPatchesReq = numPatches; 1922 } 1923 reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1924 reply->writeInt32(generation); 1925 } 1926 free(patches); 1927 return NO_ERROR; 1928 } 1929 1930 case SET_AUDIO_PORT_CONFIG: { 1931 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1932 struct audio_port_config config = {}; 1933 data.read(&config, sizeof(struct audio_port_config)); 1934 (void)sanitizeAudioPortConfig(&config); 1935 status_t status = setAudioPortConfig(&config); 1936 reply->writeInt32(status); 1937 return NO_ERROR; 1938 } 1939 1940 case REGISTER_CLIENT: { 1941 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1942 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1943 data.readStrongBinder()); 1944 registerClient(client); 1945 return NO_ERROR; 1946 } break; 1947 1948 case SET_AUDIO_PORT_CALLBACK_ENABLED: { 1949 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1950 setAudioPortCallbacksEnabled(data.readInt32() == 1); 1951 return NO_ERROR; 1952 } break; 1953 1954 case SET_AUDIO_VOLUME_GROUP_CALLBACK_ENABLED: { 1955 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1956 setAudioVolumeGroupCallbacksEnabled(data.readInt32() == 1); 1957 return NO_ERROR; 1958 } break; 1959 1960 case ACQUIRE_SOUNDTRIGGER_SESSION: { 1961 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1962 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1963 data.readStrongBinder()); 1964 audio_session_t session = AUDIO_SESSION_NONE; 1965 audio_io_handle_t ioHandle = AUDIO_IO_HANDLE_NONE; 1966 audio_devices_t device = AUDIO_DEVICE_NONE; 1967 status_t status = acquireSoundTriggerSession(&session, &ioHandle, &device); 1968 reply->writeInt32(status); 1969 if (status == NO_ERROR) { 1970 reply->writeInt32(session); 1971 reply->writeInt32(ioHandle); 1972 reply->writeInt32(device); 1973 } 1974 return NO_ERROR; 1975 } break; 1976 1977 case RELEASE_SOUNDTRIGGER_SESSION: { 1978 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1979 sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>( 1980 data.readStrongBinder()); 1981 audio_session_t session = (audio_session_t)data.readInt32(); 1982 status_t status = releaseSoundTriggerSession(session); 1983 reply->writeInt32(status); 1984 return NO_ERROR; 1985 } break; 1986 1987 case GET_PHONE_STATE: { 1988 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1989 reply->writeInt32((int32_t)getPhoneState()); 1990 return NO_ERROR; 1991 } break; 1992 1993 case REGISTER_POLICY_MIXES: { 1994 CHECK_INTERFACE(IAudioPolicyService, data, reply); 1995 bool registration = data.readInt32() == 1; 1996 Vector<AudioMix> mixes; 1997 size_t size = (size_t)data.readInt32(); 1998 if (size > MAX_MIXES_PER_POLICY) { 1999 size = MAX_MIXES_PER_POLICY; 2000 } 2001 for (size_t i = 0; i < size; i++) { 2002 AudioMix mix; 2003 if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { 2004 mixes.add(mix); 2005 } 2006 } 2007 status_t status = registerPolicyMixes(mixes, registration); 2008 reply->writeInt32(status); 2009 return NO_ERROR; 2010 } break; 2011 2012 case START_AUDIO_SOURCE: { 2013 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2014 struct audio_port_config source = {}; 2015 data.read(&source, sizeof(struct audio_port_config)); 2016 (void)sanitizeAudioPortConfig(&source); 2017 audio_attributes_t attributes = {}; 2018 data.read(&attributes, sizeof(audio_attributes_t)); 2019 sanetizeAudioAttributes(&attributes); 2020 audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE; 2021 status_t status = startAudioSource(&source, &attributes, &portId); 2022 reply->writeInt32(status); 2023 reply->writeInt32(portId); 2024 return NO_ERROR; 2025 } break; 2026 2027 case STOP_AUDIO_SOURCE: { 2028 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2029 audio_port_handle_t portId = (audio_port_handle_t) data.readInt32(); 2030 status_t status = stopAudioSource(portId); 2031 reply->writeInt32(status); 2032 return NO_ERROR; 2033 } break; 2034 2035 case SET_MASTER_MONO: { 2036 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2037 bool mono = static_cast<bool>(data.readInt32()); 2038 status_t status = setMasterMono(mono); 2039 reply->writeInt32(status); 2040 return NO_ERROR; 2041 } break; 2042 2043 case GET_MASTER_MONO: { 2044 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2045 bool mono; 2046 status_t status = getMasterMono(&mono); 2047 reply->writeInt32(status); 2048 if (status == NO_ERROR) { 2049 reply->writeInt32(static_cast<int32_t>(mono)); 2050 } 2051 return NO_ERROR; 2052 } break; 2053 2054 case GET_STREAM_VOLUME_DB: { 2055 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2056 audio_stream_type_t stream = 2057 static_cast <audio_stream_type_t>(data.readInt32()); 2058 int index = static_cast <int>(data.readInt32()); 2059 audio_devices_t device = 2060 static_cast <audio_devices_t>(data.readUint32()); 2061 reply->writeFloat(getStreamVolumeDB(stream, index, device)); 2062 return NO_ERROR; 2063 } 2064 2065 case GET_SURROUND_FORMATS: { 2066 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2067 unsigned int numSurroundFormatsReq = data.readUint32(); 2068 if (numSurroundFormatsReq > MAX_ITEMS_PER_LIST) { 2069 numSurroundFormatsReq = MAX_ITEMS_PER_LIST; 2070 } 2071 bool reported = data.readBool(); 2072 unsigned int numSurroundFormats = numSurroundFormatsReq; 2073 audio_format_t *surroundFormats = (audio_format_t *)calloc( 2074 numSurroundFormats, sizeof(audio_format_t)); 2075 bool *surroundFormatsEnabled = (bool *)calloc(numSurroundFormats, sizeof(bool)); 2076 if (numSurroundFormatsReq > 0 && 2077 (surroundFormats == NULL || surroundFormatsEnabled == NULL)) { 2078 free(surroundFormats); 2079 free(surroundFormatsEnabled); 2080 reply->writeInt32(NO_MEMORY); 2081 return NO_ERROR; 2082 } 2083 status_t status = getSurroundFormats( 2084 &numSurroundFormats, surroundFormats, surroundFormatsEnabled, reported); 2085 reply->writeInt32(status); 2086 2087 if (status == NO_ERROR) { 2088 reply->writeUint32(numSurroundFormats); 2089 if (numSurroundFormatsReq > numSurroundFormats) { 2090 numSurroundFormatsReq = numSurroundFormats; 2091 } 2092 reply->write(surroundFormats, numSurroundFormatsReq * sizeof(audio_format_t)); 2093 reply->write(surroundFormatsEnabled, numSurroundFormatsReq * sizeof(bool)); 2094 } 2095 free(surroundFormats); 2096 free(surroundFormatsEnabled); 2097 return NO_ERROR; 2098 } 2099 2100 case SET_SURROUND_FORMAT_ENABLED: { 2101 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2102 audio_format_t audioFormat = (audio_format_t) data.readInt32(); 2103 bool enabled = data.readBool(); 2104 status_t status = setSurroundFormatEnabled(audioFormat, enabled); 2105 reply->writeInt32(status); 2106 return NO_ERROR; 2107 } 2108 2109 case GET_OFFLOAD_FORMATS_A2DP: { 2110 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2111 std::vector<audio_format_t> encodingFormats; 2112 status_t status = getHwOffloadEncodingFormatsSupportedForA2DP(&encodingFormats); 2113 reply->writeInt32(status); 2114 if (status != NO_ERROR) { 2115 return NO_ERROR; 2116 } 2117 reply->writeUint32(static_cast<uint32_t>(encodingFormats.size())); 2118 for (size_t i = 0; i < encodingFormats.size(); i++) 2119 reply->writeInt32(static_cast<int32_t>(encodingFormats[i])); 2120 return NO_ERROR; 2121 } 2122 2123 2124 case ADD_STREAM_DEFAULT_EFFECT: { 2125 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2126 effect_uuid_t type; 2127 status_t status = data.read(&type, sizeof(effect_uuid_t)); 2128 if (status != NO_ERROR) { 2129 return status; 2130 } 2131 String16 opPackageName; 2132 status = data.readString16(&opPackageName); 2133 if (status != NO_ERROR) { 2134 return status; 2135 } 2136 effect_uuid_t uuid; 2137 status = data.read(&uuid, sizeof(effect_uuid_t)); 2138 if (status != NO_ERROR) { 2139 return status; 2140 } 2141 int32_t priority = data.readInt32(); 2142 audio_usage_t usage = (audio_usage_t) data.readInt32(); 2143 audio_unique_id_t id = 0; 2144 reply->writeInt32(static_cast <int32_t>(addStreamDefaultEffect(&type, 2145 opPackageName, 2146 &uuid, 2147 priority, 2148 usage, 2149 &id))); 2150 reply->writeInt32(id); 2151 return NO_ERROR; 2152 } 2153 2154 case REMOVE_STREAM_DEFAULT_EFFECT: { 2155 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2156 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32()); 2157 reply->writeInt32(static_cast <int32_t>(removeStreamDefaultEffect(id))); 2158 return NO_ERROR; 2159 } 2160 2161 case ADD_SOURCE_DEFAULT_EFFECT: { 2162 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2163 effect_uuid_t type; 2164 status_t status = data.read(&type, sizeof(effect_uuid_t)); 2165 if (status != NO_ERROR) { 2166 return status; 2167 } 2168 String16 opPackageName; 2169 status = data.readString16(&opPackageName); 2170 if (status != NO_ERROR) { 2171 return status; 2172 } 2173 effect_uuid_t uuid; 2174 status = data.read(&uuid, sizeof(effect_uuid_t)); 2175 if (status != NO_ERROR) { 2176 return status; 2177 } 2178 int32_t priority = data.readInt32(); 2179 audio_source_t source = (audio_source_t) data.readInt32(); 2180 audio_unique_id_t id = 0; 2181 reply->writeInt32(static_cast <int32_t>(addSourceDefaultEffect(&type, 2182 opPackageName, 2183 &uuid, 2184 priority, 2185 source, 2186 &id))); 2187 reply->writeInt32(id); 2188 return NO_ERROR; 2189 } 2190 2191 case REMOVE_SOURCE_DEFAULT_EFFECT: { 2192 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2193 audio_unique_id_t id = static_cast<audio_unique_id_t>(data.readInt32()); 2194 reply->writeInt32(static_cast <int32_t>(removeSourceDefaultEffect(id))); 2195 return NO_ERROR; 2196 } 2197 2198 case SET_ASSISTANT_UID: { 2199 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2200 int32_t uid; 2201 status_t status = data.readInt32(&uid); 2202 if (status != NO_ERROR) { 2203 return status; 2204 } 2205 status = setAssistantUid(uid); 2206 reply->writeInt32(static_cast <int32_t>(status)); 2207 return NO_ERROR; 2208 } 2209 2210 case SET_A11Y_SERVICES_UIDS: { 2211 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2212 std::vector<uid_t> uids; 2213 int32_t size; 2214 status_t status = data.readInt32(&size); 2215 if (status != NO_ERROR) { 2216 return status; 2217 } 2218 if (size > MAX_ITEMS_PER_LIST) { 2219 size = MAX_ITEMS_PER_LIST; 2220 } 2221 for (int32_t i = 0; i < size; i++) { 2222 int32_t uid; 2223 status = data.readInt32(&uid); 2224 if (status != NO_ERROR) { 2225 return status; 2226 } 2227 uids.push_back(uid); 2228 } 2229 status = setA11yServicesUids(uids); 2230 reply->writeInt32(static_cast <int32_t>(status)); 2231 return NO_ERROR; 2232 } 2233 2234 case IS_HAPTIC_PLAYBACK_SUPPORTED: { 2235 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2236 bool isSupported = isHapticPlaybackSupported(); 2237 reply->writeBool(isSupported); 2238 return NO_ERROR; 2239 } 2240 2241 case SET_UID_DEVICE_AFFINITY: { 2242 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2243 const uid_t uid = (uid_t) data.readInt32(); 2244 Vector<AudioDeviceTypeAddr> devices; 2245 size_t size = (size_t)data.readInt32(); 2246 for (size_t i = 0; i < size; i++) { 2247 AudioDeviceTypeAddr device; 2248 if (device.readFromParcel((Parcel*)&data) == NO_ERROR) { 2249 devices.add(device); 2250 } 2251 } 2252 status_t status = setUidDeviceAffinities(uid, devices); 2253 reply->writeInt32(status); 2254 return NO_ERROR; 2255 } 2256 2257 case REMOVE_UID_DEVICE_AFFINITY: { 2258 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2259 const uid_t uid = (uid_t) data.readInt32(); 2260 status_t status = removeUidDeviceAffinities(uid); 2261 reply->writeInt32(status); 2262 return NO_ERROR; 2263 } 2264 2265 case LIST_AUDIO_PRODUCT_STRATEGIES: { 2266 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2267 AudioProductStrategyVector strategies; 2268 status_t status = listAudioProductStrategies(strategies); 2269 reply->writeInt32(status); 2270 if (status != NO_ERROR) { 2271 return NO_ERROR; 2272 } 2273 size_t size = strategies.size(); 2274 size_t sizePosition = reply->dataPosition(); 2275 reply->writeInt32(size); 2276 size_t finalSize = size; 2277 for (size_t i = 0; i < size; i++) { 2278 size_t position = reply->dataPosition(); 2279 if (strategies[i].writeToParcel(reply) != NO_ERROR) { 2280 reply->setDataPosition(position); 2281 finalSize--; 2282 } 2283 } 2284 if (size != finalSize) { 2285 size_t position = reply->dataPosition(); 2286 reply->setDataPosition(sizePosition); 2287 reply->writeInt32(finalSize); 2288 reply->setDataPosition(position); 2289 } 2290 return NO_ERROR; 2291 } 2292 2293 case GET_STRATEGY_FOR_ATTRIBUTES: { 2294 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2295 AudioAttributes attributes; 2296 status_t status = attributes.readFromParcel(&data); 2297 if (status != NO_ERROR) { 2298 return status; 2299 } 2300 product_strategy_t strategy; 2301 status = getProductStrategyFromAudioAttributes(attributes, strategy); 2302 reply->writeInt32(status); 2303 if (status != NO_ERROR) { 2304 return NO_ERROR; 2305 } 2306 reply->writeUint32(static_cast<int>(strategy)); 2307 return NO_ERROR; 2308 } 2309 2310 case LIST_AUDIO_VOLUME_GROUPS: { 2311 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2312 AudioVolumeGroupVector groups; 2313 status_t status = listAudioVolumeGroups(groups); 2314 reply->writeInt32(status); 2315 if (status != NO_ERROR) { 2316 return NO_ERROR; 2317 } 2318 size_t size = groups.size(); 2319 size_t sizePosition = reply->dataPosition(); 2320 reply->writeInt32(size); 2321 size_t finalSize = size; 2322 for (size_t i = 0; i < size; i++) { 2323 size_t position = reply->dataPosition(); 2324 if (groups[i].writeToParcel(reply) != NO_ERROR) { 2325 reply->setDataPosition(position); 2326 finalSize--; 2327 } 2328 } 2329 if (size != finalSize) { 2330 size_t position = reply->dataPosition(); 2331 reply->setDataPosition(sizePosition); 2332 reply->writeInt32(finalSize); 2333 reply->setDataPosition(position); 2334 } 2335 return NO_ERROR; 2336 } 2337 2338 case GET_VOLUME_GROUP_FOR_ATTRIBUTES: { 2339 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2340 AudioAttributes attributes; 2341 status_t status = attributes.readFromParcel(&data); 2342 if (status != NO_ERROR) { 2343 return status; 2344 } 2345 volume_group_t group; 2346 status = getVolumeGroupFromAudioAttributes(attributes, group); 2347 reply->writeInt32(status); 2348 if (status != NO_ERROR) { 2349 return NO_ERROR; 2350 } 2351 reply->writeUint32(static_cast<int>(group)); 2352 return NO_ERROR; 2353 } 2354 2355 case SET_ALLOWED_CAPTURE_POLICY: { 2356 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2357 uid_t uid = data.readInt32(); 2358 audio_flags_mask_t flags = data.readInt32(); 2359 status_t status = setAllowedCapturePolicy(uid, flags); 2360 reply->writeInt32(status); 2361 return NO_ERROR; 2362 } 2363 2364 case SET_RTT_ENABLED: { 2365 CHECK_INTERFACE(IAudioPolicyService, data, reply); 2366 bool enabled = static_cast<bool>(data.readInt32()); 2367 status_t status = setRttEnabled(enabled); 2368 reply->writeInt32(status); 2369 return NO_ERROR; 2370 } 2371 2372 default: 2373 return BBinder::onTransact(code, data, reply, flags); 2374 } 2375 } 2376 2377 /** returns true if string overflow was prevented by zero termination */ 2378 template <size_t size> 2379 static bool preventStringOverflow(char (&s)[size]) { 2380 if (strnlen(s, size) < size) return false; 2381 s[size - 1] = '\0'; 2382 return true; 2383 } 2384 2385 void BnAudioPolicyService::sanetizeAudioAttributes(audio_attributes_t* attr) 2386 { 2387 const size_t tagsMaxSize = AUDIO_ATTRIBUTES_TAGS_MAX_SIZE; 2388 if (strnlen(attr->tags, tagsMaxSize) >= tagsMaxSize) { 2389 android_errorWriteLog(0x534e4554, "68953950"); // SafetyNet logging 2390 } 2391 attr->tags[tagsMaxSize - 1] = '\0'; 2392 } 2393 2394 /** returns BAD_VALUE if sanitization was required. */ 2395 status_t BnAudioPolicyService::sanitizeEffectDescriptor(effect_descriptor_t* desc) 2396 { 2397 if (preventStringOverflow(desc->name) 2398 | /* always */ preventStringOverflow(desc->implementor)) { 2399 android_errorWriteLog(0x534e4554, "73126106"); // SafetyNet logging 2400 return BAD_VALUE; 2401 } 2402 return NO_ERROR; 2403 } 2404 2405 /** returns BAD_VALUE if sanitization was required. */ 2406 status_t BnAudioPolicyService::sanitizeAudioPortConfig(struct audio_port_config* config) 2407 { 2408 if (config->type == AUDIO_PORT_TYPE_DEVICE && 2409 preventStringOverflow(config->ext.device.address)) { 2410 return BAD_VALUE; 2411 } 2412 return NO_ERROR; 2413 } 2414 2415 // ---------------------------------------------------------------------------- 2416 2417 } // namespace android 2418