1 /* 2 ** 3 ** Copyright 2007, 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 "IAudioFlinger" 19 //#define LOG_NDEBUG 0 20 #include <utils/Log.h> 21 22 #include <stdint.h> 23 #include <sys/types.h> 24 25 #include <binder/IPCThreadState.h> 26 #include <binder/Parcel.h> 27 #include <media/TimeCheck.h> 28 #include <mediautils/ServiceUtilities.h> 29 #include "IAudioFlinger.h" 30 31 namespace android { 32 33 enum { 34 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 35 CREATE_RECORD, 36 SAMPLE_RATE, 37 RESERVED, // obsolete, was CHANNEL_COUNT 38 FORMAT, 39 FRAME_COUNT, 40 LATENCY, 41 SET_MASTER_VOLUME, 42 SET_MASTER_MUTE, 43 MASTER_VOLUME, 44 MASTER_MUTE, 45 SET_STREAM_VOLUME, 46 SET_STREAM_MUTE, 47 STREAM_VOLUME, 48 STREAM_MUTE, 49 SET_MODE, 50 SET_MIC_MUTE, 51 GET_MIC_MUTE, 52 SET_RECORD_SILENCED, 53 SET_PARAMETERS, 54 GET_PARAMETERS, 55 REGISTER_CLIENT, 56 GET_INPUTBUFFERSIZE, 57 OPEN_OUTPUT, 58 OPEN_DUPLICATE_OUTPUT, 59 CLOSE_OUTPUT, 60 SUSPEND_OUTPUT, 61 RESTORE_OUTPUT, 62 OPEN_INPUT, 63 CLOSE_INPUT, 64 INVALIDATE_STREAM, 65 SET_VOICE_VOLUME, 66 GET_RENDER_POSITION, 67 GET_INPUT_FRAMES_LOST, 68 NEW_AUDIO_UNIQUE_ID, 69 ACQUIRE_AUDIO_SESSION_ID, 70 RELEASE_AUDIO_SESSION_ID, 71 QUERY_NUM_EFFECTS, 72 QUERY_EFFECT, 73 GET_EFFECT_DESCRIPTOR, 74 CREATE_EFFECT, 75 MOVE_EFFECTS, 76 LOAD_HW_MODULE, 77 GET_PRIMARY_OUTPUT_SAMPLING_RATE, 78 GET_PRIMARY_OUTPUT_FRAME_COUNT, 79 SET_LOW_RAM_DEVICE, 80 LIST_AUDIO_PORTS, 81 GET_AUDIO_PORT, 82 CREATE_AUDIO_PATCH, 83 RELEASE_AUDIO_PATCH, 84 LIST_AUDIO_PATCHES, 85 SET_AUDIO_PORT_CONFIG, 86 GET_AUDIO_HW_SYNC_FOR_SESSION, 87 SYSTEM_READY, 88 FRAME_COUNT_HAL, 89 GET_MICROPHONES, 90 SET_MASTER_BALANCE, 91 GET_MASTER_BALANCE, 92 SET_EFFECT_SUSPENDED, 93 }; 94 95 #define MAX_ITEMS_PER_LIST 1024 96 97 class BpAudioFlinger : public BpInterface<IAudioFlinger> 98 { 99 public: 100 explicit BpAudioFlinger(const sp<IBinder>& impl) 101 : BpInterface<IAudioFlinger>(impl) 102 { 103 } 104 105 virtual sp<IAudioTrack> createTrack(const CreateTrackInput& input, 106 CreateTrackOutput& output, 107 status_t *status) 108 { 109 Parcel data, reply; 110 sp<IAudioTrack> track; 111 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 112 113 if (status == nullptr) { 114 return track; 115 } 116 117 input.writeToParcel(&data); 118 119 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 120 if (lStatus != NO_ERROR) { 121 ALOGE("createTrack transaction error %d", lStatus); 122 *status = DEAD_OBJECT; 123 return track; 124 } 125 *status = reply.readInt32(); 126 if (*status != NO_ERROR) { 127 ALOGE("createTrack returned error %d", *status); 128 return track; 129 } 130 track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 131 if (track == 0) { 132 ALOGE("createTrack returned an NULL IAudioTrack with status OK"); 133 *status = DEAD_OBJECT; 134 return track; 135 } 136 output.readFromParcel(&reply); 137 return track; 138 } 139 140 virtual sp<media::IAudioRecord> createRecord(const CreateRecordInput& input, 141 CreateRecordOutput& output, 142 status_t *status) 143 { 144 Parcel data, reply; 145 sp<media::IAudioRecord> record; 146 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 147 148 if (status == nullptr) { 149 return record; 150 } 151 152 input.writeToParcel(&data); 153 154 status_t lStatus = remote()->transact(CREATE_RECORD, data, &reply); 155 if (lStatus != NO_ERROR) { 156 ALOGE("createRecord transaction error %d", lStatus); 157 *status = DEAD_OBJECT; 158 return record; 159 } 160 *status = reply.readInt32(); 161 if (*status != NO_ERROR) { 162 ALOGE("createRecord returned error %d", *status); 163 return record; 164 } 165 166 record = interface_cast<media::IAudioRecord>(reply.readStrongBinder()); 167 if (record == 0) { 168 ALOGE("createRecord returned a NULL IAudioRecord with status OK"); 169 *status = DEAD_OBJECT; 170 return record; 171 } 172 output.readFromParcel(&reply); 173 return record; 174 } 175 176 virtual uint32_t sampleRate(audio_io_handle_t ioHandle) const 177 { 178 Parcel data, reply; 179 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 180 data.writeInt32((int32_t) ioHandle); 181 remote()->transact(SAMPLE_RATE, data, &reply); 182 return reply.readInt32(); 183 } 184 185 // RESERVED for channelCount() 186 187 virtual audio_format_t format(audio_io_handle_t output) const 188 { 189 Parcel data, reply; 190 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 191 data.writeInt32((int32_t) output); 192 remote()->transact(FORMAT, data, &reply); 193 return (audio_format_t) reply.readInt32(); 194 } 195 196 virtual size_t frameCount(audio_io_handle_t ioHandle) const 197 { 198 Parcel data, reply; 199 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 200 data.writeInt32((int32_t) ioHandle); 201 remote()->transact(FRAME_COUNT, data, &reply); 202 return reply.readInt64(); 203 } 204 205 virtual uint32_t latency(audio_io_handle_t output) const 206 { 207 Parcel data, reply; 208 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 209 data.writeInt32((int32_t) output); 210 remote()->transact(LATENCY, data, &reply); 211 return reply.readInt32(); 212 } 213 214 virtual status_t setMasterVolume(float value) 215 { 216 Parcel data, reply; 217 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 218 data.writeFloat(value); 219 remote()->transact(SET_MASTER_VOLUME, data, &reply); 220 return reply.readInt32(); 221 } 222 223 virtual status_t setMasterMute(bool muted) 224 { 225 Parcel data, reply; 226 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 227 data.writeInt32(muted); 228 remote()->transact(SET_MASTER_MUTE, data, &reply); 229 return reply.readInt32(); 230 } 231 232 virtual float masterVolume() const 233 { 234 Parcel data, reply; 235 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 236 remote()->transact(MASTER_VOLUME, data, &reply); 237 return reply.readFloat(); 238 } 239 240 virtual bool masterMute() const 241 { 242 Parcel data, reply; 243 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 244 remote()->transact(MASTER_MUTE, data, &reply); 245 return reply.readInt32(); 246 } 247 248 status_t setMasterBalance(float balance) override 249 { 250 Parcel data, reply; 251 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 252 data.writeFloat(balance); 253 status_t status = remote()->transact(SET_MASTER_BALANCE, data, &reply); 254 if (status != NO_ERROR) { 255 return status; 256 } 257 return reply.readInt32(); 258 } 259 260 status_t getMasterBalance(float *balance) const override 261 { 262 Parcel data, reply; 263 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 264 status_t status = remote()->transact(GET_MASTER_BALANCE, data, &reply); 265 if (status != NO_ERROR) { 266 return status; 267 } 268 status = (status_t)reply.readInt32(); 269 if (status != NO_ERROR) { 270 return status; 271 } 272 *balance = reply.readFloat(); 273 return NO_ERROR; 274 } 275 276 virtual status_t setStreamVolume(audio_stream_type_t stream, float value, 277 audio_io_handle_t output) 278 { 279 Parcel data, reply; 280 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 281 data.writeInt32((int32_t) stream); 282 data.writeFloat(value); 283 data.writeInt32((int32_t) output); 284 remote()->transact(SET_STREAM_VOLUME, data, &reply); 285 return reply.readInt32(); 286 } 287 288 virtual status_t setStreamMute(audio_stream_type_t stream, bool muted) 289 { 290 Parcel data, reply; 291 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 292 data.writeInt32((int32_t) stream); 293 data.writeInt32(muted); 294 remote()->transact(SET_STREAM_MUTE, data, &reply); 295 return reply.readInt32(); 296 } 297 298 virtual float streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const 299 { 300 Parcel data, reply; 301 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 302 data.writeInt32((int32_t) stream); 303 data.writeInt32((int32_t) output); 304 remote()->transact(STREAM_VOLUME, data, &reply); 305 return reply.readFloat(); 306 } 307 308 virtual bool streamMute(audio_stream_type_t stream) const 309 { 310 Parcel data, reply; 311 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 312 data.writeInt32((int32_t) stream); 313 remote()->transact(STREAM_MUTE, data, &reply); 314 return reply.readInt32(); 315 } 316 317 virtual status_t setMode(audio_mode_t mode) 318 { 319 Parcel data, reply; 320 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 321 data.writeInt32(mode); 322 remote()->transact(SET_MODE, data, &reply); 323 return reply.readInt32(); 324 } 325 326 virtual status_t setMicMute(bool state) 327 { 328 Parcel data, reply; 329 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 330 data.writeInt32(state); 331 remote()->transact(SET_MIC_MUTE, data, &reply); 332 return reply.readInt32(); 333 } 334 335 virtual bool getMicMute() const 336 { 337 Parcel data, reply; 338 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 339 remote()->transact(GET_MIC_MUTE, data, &reply); 340 return reply.readInt32(); 341 } 342 343 virtual void setRecordSilenced(uid_t uid, bool silenced) 344 { 345 Parcel data, reply; 346 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 347 data.writeInt32(uid); 348 data.writeInt32(silenced ? 1 : 0); 349 remote()->transact(SET_RECORD_SILENCED, data, &reply); 350 } 351 352 virtual status_t setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs) 353 { 354 Parcel data, reply; 355 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 356 data.writeInt32((int32_t) ioHandle); 357 data.writeString8(keyValuePairs); 358 remote()->transact(SET_PARAMETERS, data, &reply); 359 return reply.readInt32(); 360 } 361 362 virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys) const 363 { 364 Parcel data, reply; 365 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 366 data.writeInt32((int32_t) ioHandle); 367 data.writeString8(keys); 368 remote()->transact(GET_PARAMETERS, data, &reply); 369 return reply.readString8(); 370 } 371 372 virtual void registerClient(const sp<IAudioFlingerClient>& client) 373 { 374 Parcel data, reply; 375 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 376 data.writeStrongBinder(IInterface::asBinder(client)); 377 remote()->transact(REGISTER_CLIENT, data, &reply); 378 } 379 380 virtual size_t getInputBufferSize(uint32_t sampleRate, audio_format_t format, 381 audio_channel_mask_t channelMask) const 382 { 383 Parcel data, reply; 384 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 385 data.writeInt32(sampleRate); 386 data.writeInt32(format); 387 data.writeInt32(channelMask); 388 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 389 return reply.readInt64(); 390 } 391 392 virtual status_t openOutput(audio_module_handle_t module, 393 audio_io_handle_t *output, 394 audio_config_t *config, 395 audio_devices_t *devices, 396 const String8& address, 397 uint32_t *latencyMs, 398 audio_output_flags_t flags) 399 { 400 if (output == NULL || config == NULL || devices == NULL || latencyMs == NULL) { 401 return BAD_VALUE; 402 } 403 Parcel data, reply; 404 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 405 data.writeInt32(module); 406 data.write(config, sizeof(audio_config_t)); 407 data.writeInt32(*devices); 408 data.writeString8(address); 409 data.writeInt32((int32_t) flags); 410 status_t status = remote()->transact(OPEN_OUTPUT, data, &reply); 411 if (status != NO_ERROR) { 412 *output = AUDIO_IO_HANDLE_NONE; 413 return status; 414 } 415 status = (status_t)reply.readInt32(); 416 if (status != NO_ERROR) { 417 *output = AUDIO_IO_HANDLE_NONE; 418 return status; 419 } 420 *output = (audio_io_handle_t)reply.readInt32(); 421 ALOGV("openOutput() returned output, %d", *output); 422 reply.read(config, sizeof(audio_config_t)); 423 *devices = (audio_devices_t)reply.readInt32(); 424 *latencyMs = reply.readInt32(); 425 return NO_ERROR; 426 } 427 428 virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, 429 audio_io_handle_t output2) 430 { 431 Parcel data, reply; 432 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 433 data.writeInt32((int32_t) output1); 434 data.writeInt32((int32_t) output2); 435 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 436 return (audio_io_handle_t) reply.readInt32(); 437 } 438 439 virtual status_t closeOutput(audio_io_handle_t output) 440 { 441 Parcel data, reply; 442 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 443 data.writeInt32((int32_t) output); 444 remote()->transact(CLOSE_OUTPUT, data, &reply); 445 return reply.readInt32(); 446 } 447 448 virtual status_t suspendOutput(audio_io_handle_t output) 449 { 450 Parcel data, reply; 451 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 452 data.writeInt32((int32_t) output); 453 remote()->transact(SUSPEND_OUTPUT, data, &reply); 454 return reply.readInt32(); 455 } 456 457 virtual status_t restoreOutput(audio_io_handle_t output) 458 { 459 Parcel data, reply; 460 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 461 data.writeInt32((int32_t) output); 462 remote()->transact(RESTORE_OUTPUT, data, &reply); 463 return reply.readInt32(); 464 } 465 466 virtual status_t openInput(audio_module_handle_t module, 467 audio_io_handle_t *input, 468 audio_config_t *config, 469 audio_devices_t *device, 470 const String8& address, 471 audio_source_t source, 472 audio_input_flags_t flags) 473 { 474 if (input == NULL || config == NULL || device == NULL) { 475 return BAD_VALUE; 476 } 477 Parcel data, reply; 478 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 479 data.writeInt32(module); 480 data.writeInt32(*input); 481 data.write(config, sizeof(audio_config_t)); 482 data.writeInt32(*device); 483 data.writeString8(address); 484 data.writeInt32(source); 485 data.writeInt32(flags); 486 status_t status = remote()->transact(OPEN_INPUT, data, &reply); 487 if (status != NO_ERROR) { 488 *input = AUDIO_IO_HANDLE_NONE; 489 return status; 490 } 491 status = (status_t)reply.readInt32(); 492 if (status != NO_ERROR) { 493 *input = AUDIO_IO_HANDLE_NONE; 494 return status; 495 } 496 *input = (audio_io_handle_t)reply.readInt32(); 497 reply.read(config, sizeof(audio_config_t)); 498 *device = (audio_devices_t)reply.readInt32(); 499 return NO_ERROR; 500 } 501 502 virtual status_t closeInput(int input) 503 { 504 Parcel data, reply; 505 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 506 data.writeInt32(input); 507 remote()->transact(CLOSE_INPUT, data, &reply); 508 return reply.readInt32(); 509 } 510 511 virtual status_t invalidateStream(audio_stream_type_t stream) 512 { 513 Parcel data, reply; 514 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 515 data.writeInt32((int32_t) stream); 516 remote()->transact(INVALIDATE_STREAM, data, &reply); 517 return reply.readInt32(); 518 } 519 520 virtual status_t setVoiceVolume(float volume) 521 { 522 Parcel data, reply; 523 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 524 data.writeFloat(volume); 525 remote()->transact(SET_VOICE_VOLUME, data, &reply); 526 return reply.readInt32(); 527 } 528 529 virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, 530 audio_io_handle_t output) const 531 { 532 Parcel data, reply; 533 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 534 data.writeInt32((int32_t) output); 535 remote()->transact(GET_RENDER_POSITION, data, &reply); 536 status_t status = reply.readInt32(); 537 if (status == NO_ERROR) { 538 uint32_t tmp = reply.readInt32(); 539 if (halFrames != NULL) { 540 *halFrames = tmp; 541 } 542 tmp = reply.readInt32(); 543 if (dspFrames != NULL) { 544 *dspFrames = tmp; 545 } 546 } 547 return status; 548 } 549 550 virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const 551 { 552 Parcel data, reply; 553 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 554 data.writeInt32((int32_t) ioHandle); 555 status_t status = remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 556 if (status != NO_ERROR) { 557 return 0; 558 } 559 return (uint32_t) reply.readInt32(); 560 } 561 562 virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use) 563 { 564 Parcel data, reply; 565 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 566 data.writeInt32((int32_t) use); 567 status_t status = remote()->transact(NEW_AUDIO_UNIQUE_ID, data, &reply); 568 audio_unique_id_t id = AUDIO_UNIQUE_ID_ALLOCATE; 569 if (status == NO_ERROR) { 570 id = reply.readInt32(); 571 } 572 return id; 573 } 574 575 virtual void acquireAudioSessionId(audio_session_t audioSession, int pid) 576 { 577 Parcel data, reply; 578 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 579 data.writeInt32(audioSession); 580 data.writeInt32(pid); 581 remote()->transact(ACQUIRE_AUDIO_SESSION_ID, data, &reply); 582 } 583 584 virtual void releaseAudioSessionId(audio_session_t audioSession, int pid) 585 { 586 Parcel data, reply; 587 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 588 data.writeInt32(audioSession); 589 data.writeInt32(pid); 590 remote()->transact(RELEASE_AUDIO_SESSION_ID, data, &reply); 591 } 592 593 virtual status_t queryNumberEffects(uint32_t *numEffects) const 594 { 595 Parcel data, reply; 596 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 597 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 598 if (status != NO_ERROR) { 599 return status; 600 } 601 status = reply.readInt32(); 602 if (status != NO_ERROR) { 603 return status; 604 } 605 if (numEffects != NULL) { 606 *numEffects = (uint32_t)reply.readInt32(); 607 } 608 return NO_ERROR; 609 } 610 611 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) const 612 { 613 if (pDescriptor == NULL) { 614 return BAD_VALUE; 615 } 616 Parcel data, reply; 617 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 618 data.writeInt32(index); 619 status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 620 if (status != NO_ERROR) { 621 return status; 622 } 623 status = reply.readInt32(); 624 if (status != NO_ERROR) { 625 return status; 626 } 627 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 628 return NO_ERROR; 629 } 630 631 virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid, 632 const effect_uuid_t *pType, 633 uint32_t preferredTypeFlag, 634 effect_descriptor_t *pDescriptor) const 635 { 636 if (pUuid == NULL || pType == NULL || pDescriptor == NULL) { 637 return BAD_VALUE; 638 } 639 Parcel data, reply; 640 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 641 data.write(pUuid, sizeof(effect_uuid_t)); 642 data.write(pType, sizeof(effect_uuid_t)); 643 data.writeUint32(preferredTypeFlag); 644 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 645 if (status != NO_ERROR) { 646 return status; 647 } 648 status = reply.readInt32(); 649 if (status != NO_ERROR) { 650 return status; 651 } 652 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 653 return NO_ERROR; 654 } 655 656 virtual sp<IEffect> createEffect( 657 effect_descriptor_t *pDesc, 658 const sp<IEffectClient>& client, 659 int32_t priority, 660 audio_io_handle_t output, 661 audio_session_t sessionId, 662 const String16& opPackageName, 663 pid_t pid, 664 status_t *status, 665 int *id, 666 int *enabled) 667 { 668 Parcel data, reply; 669 sp<IEffect> effect; 670 671 if (pDesc == NULL) { 672 if (status != NULL) { 673 *status = BAD_VALUE; 674 } 675 return effect; 676 } 677 678 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 679 data.write(pDesc, sizeof(effect_descriptor_t)); 680 data.writeStrongBinder(IInterface::asBinder(client)); 681 data.writeInt32(priority); 682 data.writeInt32((int32_t) output); 683 data.writeInt32(sessionId); 684 data.writeString16(opPackageName); 685 data.writeInt32((int32_t) pid); 686 687 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 688 if (lStatus != NO_ERROR) { 689 ALOGE("createEffect error: %s", strerror(-lStatus)); 690 } else { 691 lStatus = reply.readInt32(); 692 int tmp = reply.readInt32(); 693 if (id != NULL) { 694 *id = tmp; 695 } 696 tmp = reply.readInt32(); 697 if (enabled != NULL) { 698 *enabled = tmp; 699 } 700 effect = interface_cast<IEffect>(reply.readStrongBinder()); 701 reply.read(pDesc, sizeof(effect_descriptor_t)); 702 } 703 if (status != NULL) { 704 *status = lStatus; 705 } 706 707 return effect; 708 } 709 710 virtual status_t moveEffects(audio_session_t session, audio_io_handle_t srcOutput, 711 audio_io_handle_t dstOutput) 712 { 713 Parcel data, reply; 714 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 715 data.writeInt32(session); 716 data.writeInt32((int32_t) srcOutput); 717 data.writeInt32((int32_t) dstOutput); 718 remote()->transact(MOVE_EFFECTS, data, &reply); 719 return reply.readInt32(); 720 } 721 722 virtual void setEffectSuspended(int effectId, 723 audio_session_t sessionId, 724 bool suspended) 725 { 726 Parcel data, reply; 727 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 728 data.writeInt32(effectId); 729 data.writeInt32(sessionId); 730 data.writeInt32(suspended ? 1 : 0); 731 remote()->transact(SET_EFFECT_SUSPENDED, data, &reply); 732 } 733 734 virtual audio_module_handle_t loadHwModule(const char *name) 735 { 736 Parcel data, reply; 737 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 738 data.writeCString(name); 739 remote()->transact(LOAD_HW_MODULE, data, &reply); 740 return (audio_module_handle_t) reply.readInt32(); 741 } 742 743 virtual uint32_t getPrimaryOutputSamplingRate() 744 { 745 Parcel data, reply; 746 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 747 remote()->transact(GET_PRIMARY_OUTPUT_SAMPLING_RATE, data, &reply); 748 return reply.readInt32(); 749 } 750 751 virtual size_t getPrimaryOutputFrameCount() 752 { 753 Parcel data, reply; 754 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 755 remote()->transact(GET_PRIMARY_OUTPUT_FRAME_COUNT, data, &reply); 756 return reply.readInt64(); 757 } 758 759 virtual status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory) override 760 { 761 Parcel data, reply; 762 763 static_assert(NO_ERROR == 0, "NO_ERROR must be 0"); 764 return data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()) 765 ?: data.writeInt32((int) isLowRamDevice) 766 ?: data.writeInt64(totalMemory) 767 ?: remote()->transact(SET_LOW_RAM_DEVICE, data, &reply) 768 ?: reply.readInt32(); 769 } 770 771 virtual status_t listAudioPorts(unsigned int *num_ports, 772 struct audio_port *ports) 773 { 774 if (num_ports == NULL || *num_ports == 0 || ports == NULL) { 775 return BAD_VALUE; 776 } 777 Parcel data, reply; 778 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 779 data.writeInt32(*num_ports); 780 status_t status = remote()->transact(LIST_AUDIO_PORTS, data, &reply); 781 if (status != NO_ERROR || 782 (status = (status_t)reply.readInt32()) != NO_ERROR) { 783 return status; 784 } 785 *num_ports = (unsigned int)reply.readInt32(); 786 reply.read(ports, *num_ports * sizeof(struct audio_port)); 787 return status; 788 } 789 virtual status_t getAudioPort(struct audio_port *port) 790 { 791 if (port == NULL) { 792 return BAD_VALUE; 793 } 794 Parcel data, reply; 795 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 796 data.write(port, sizeof(struct audio_port)); 797 status_t status = remote()->transact(GET_AUDIO_PORT, data, &reply); 798 if (status != NO_ERROR || 799 (status = (status_t)reply.readInt32()) != NO_ERROR) { 800 return status; 801 } 802 reply.read(port, sizeof(struct audio_port)); 803 return status; 804 } 805 virtual status_t createAudioPatch(const struct audio_patch *patch, 806 audio_patch_handle_t *handle) 807 { 808 if (patch == NULL || handle == NULL) { 809 return BAD_VALUE; 810 } 811 Parcel data, reply; 812 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 813 data.write(patch, sizeof(struct audio_patch)); 814 data.write(handle, sizeof(audio_patch_handle_t)); 815 status_t status = remote()->transact(CREATE_AUDIO_PATCH, data, &reply); 816 if (status != NO_ERROR || 817 (status = (status_t)reply.readInt32()) != NO_ERROR) { 818 return status; 819 } 820 reply.read(handle, sizeof(audio_patch_handle_t)); 821 return status; 822 } 823 virtual status_t releaseAudioPatch(audio_patch_handle_t handle) 824 { 825 Parcel data, reply; 826 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 827 data.write(&handle, sizeof(audio_patch_handle_t)); 828 status_t status = remote()->transact(RELEASE_AUDIO_PATCH, data, &reply); 829 if (status != NO_ERROR) { 830 status = (status_t)reply.readInt32(); 831 } 832 return status; 833 } 834 virtual status_t listAudioPatches(unsigned int *num_patches, 835 struct audio_patch *patches) 836 { 837 if (num_patches == NULL || *num_patches == 0 || patches == NULL) { 838 return BAD_VALUE; 839 } 840 Parcel data, reply; 841 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 842 data.writeInt32(*num_patches); 843 status_t status = remote()->transact(LIST_AUDIO_PATCHES, data, &reply); 844 if (status != NO_ERROR || 845 (status = (status_t)reply.readInt32()) != NO_ERROR) { 846 return status; 847 } 848 *num_patches = (unsigned int)reply.readInt32(); 849 reply.read(patches, *num_patches * sizeof(struct audio_patch)); 850 return status; 851 } 852 virtual status_t setAudioPortConfig(const struct audio_port_config *config) 853 { 854 if (config == NULL) { 855 return BAD_VALUE; 856 } 857 Parcel data, reply; 858 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 859 data.write(config, sizeof(struct audio_port_config)); 860 status_t status = remote()->transact(SET_AUDIO_PORT_CONFIG, data, &reply); 861 if (status != NO_ERROR) { 862 status = (status_t)reply.readInt32(); 863 } 864 return status; 865 } 866 virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId) 867 { 868 Parcel data, reply; 869 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 870 data.writeInt32(sessionId); 871 status_t status = remote()->transact(GET_AUDIO_HW_SYNC_FOR_SESSION, data, &reply); 872 if (status != NO_ERROR) { 873 return AUDIO_HW_SYNC_INVALID; 874 } 875 return (audio_hw_sync_t)reply.readInt32(); 876 } 877 virtual status_t systemReady() 878 { 879 Parcel data, reply; 880 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 881 return remote()->transact(SYSTEM_READY, data, &reply, IBinder::FLAG_ONEWAY); 882 } 883 virtual size_t frameCountHAL(audio_io_handle_t ioHandle) const 884 { 885 Parcel data, reply; 886 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 887 data.writeInt32((int32_t) ioHandle); 888 status_t status = remote()->transact(FRAME_COUNT_HAL, data, &reply); 889 if (status != NO_ERROR) { 890 return 0; 891 } 892 return reply.readInt64(); 893 } 894 virtual status_t getMicrophones(std::vector<media::MicrophoneInfo> *microphones) 895 { 896 Parcel data, reply; 897 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 898 status_t status = remote()->transact(GET_MICROPHONES, data, &reply); 899 if (status != NO_ERROR || 900 (status = (status_t)reply.readInt32()) != NO_ERROR) { 901 return status; 902 } 903 status = reply.readParcelableVector(microphones); 904 return status; 905 } 906 }; 907 908 IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 909 910 // ---------------------------------------------------------------------- 911 912 status_t BnAudioFlinger::onTransact( 913 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 914 { 915 // make sure transactions reserved to AudioPolicyManager do not come from other processes 916 switch (code) { 917 case SET_STREAM_VOLUME: 918 case SET_STREAM_MUTE: 919 case OPEN_OUTPUT: 920 case OPEN_DUPLICATE_OUTPUT: 921 case CLOSE_OUTPUT: 922 case SUSPEND_OUTPUT: 923 case RESTORE_OUTPUT: 924 case OPEN_INPUT: 925 case CLOSE_INPUT: 926 case INVALIDATE_STREAM: 927 case SET_VOICE_VOLUME: 928 case MOVE_EFFECTS: 929 case SET_EFFECT_SUSPENDED: 930 case LOAD_HW_MODULE: 931 case LIST_AUDIO_PORTS: 932 case GET_AUDIO_PORT: 933 case CREATE_AUDIO_PATCH: 934 case RELEASE_AUDIO_PATCH: 935 case LIST_AUDIO_PATCHES: 936 case SET_AUDIO_PORT_CONFIG: 937 case SET_RECORD_SILENCED: 938 ALOGW("%s: transaction %d received from PID %d", 939 __func__, code, IPCThreadState::self()->getCallingPid()); 940 // return status only for non void methods 941 switch (code) { 942 case SET_RECORD_SILENCED: 943 case SET_EFFECT_SUSPENDED: 944 break; 945 default: 946 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 947 break; 948 } 949 return OK; 950 default: 951 break; 952 } 953 954 // make sure the following transactions come from system components 955 switch (code) { 956 case SET_MASTER_VOLUME: 957 case SET_MASTER_MUTE: 958 case SET_MODE: 959 case SET_MIC_MUTE: 960 case SET_LOW_RAM_DEVICE: 961 case SYSTEM_READY: { 962 if (!isServiceUid(IPCThreadState::self()->getCallingUid())) { 963 ALOGW("%s: transaction %d received from PID %d unauthorized UID %d", 964 __func__, code, IPCThreadState::self()->getCallingPid(), 965 IPCThreadState::self()->getCallingUid()); 966 // return status only for non void methods 967 switch (code) { 968 case SYSTEM_READY: 969 break; 970 default: 971 reply->writeInt32(static_cast<int32_t> (INVALID_OPERATION)); 972 break; 973 } 974 return OK; 975 } 976 } break; 977 default: 978 break; 979 } 980 981 // Whitelist of relevant events to trigger log merging. 982 // Log merging should activate during audio activity of any kind. This are considered the 983 // most relevant events. 984 // TODO should select more wisely the items from the list 985 switch (code) { 986 case CREATE_TRACK: 987 case CREATE_RECORD: 988 case SET_MASTER_VOLUME: 989 case SET_MASTER_MUTE: 990 case SET_MIC_MUTE: 991 case SET_PARAMETERS: 992 case CREATE_EFFECT: 993 case SYSTEM_READY: { 994 requestLogMerge(); 995 break; 996 } 997 default: 998 break; 999 } 1000 1001 std::string tag("IAudioFlinger command " + std::to_string(code)); 1002 TimeCheck check(tag.c_str()); 1003 1004 switch (code) { 1005 case CREATE_TRACK: { 1006 CHECK_INTERFACE(IAudioFlinger, data, reply); 1007 1008 CreateTrackInput input; 1009 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 1010 reply->writeInt32(DEAD_OBJECT); 1011 return NO_ERROR; 1012 } 1013 1014 status_t status; 1015 CreateTrackOutput output; 1016 1017 sp<IAudioTrack> track= createTrack(input, 1018 output, 1019 &status); 1020 1021 LOG_ALWAYS_FATAL_IF((track != 0) != (status == NO_ERROR)); 1022 reply->writeInt32(status); 1023 if (status != NO_ERROR) { 1024 return NO_ERROR; 1025 } 1026 reply->writeStrongBinder(IInterface::asBinder(track)); 1027 output.writeToParcel(reply); 1028 return NO_ERROR; 1029 } break; 1030 case CREATE_RECORD: { 1031 CHECK_INTERFACE(IAudioFlinger, data, reply); 1032 1033 CreateRecordInput input; 1034 if (input.readFromParcel((Parcel*)&data) != NO_ERROR) { 1035 reply->writeInt32(DEAD_OBJECT); 1036 return NO_ERROR; 1037 } 1038 1039 status_t status; 1040 CreateRecordOutput output; 1041 1042 sp<media::IAudioRecord> record = createRecord(input, 1043 output, 1044 &status); 1045 1046 LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); 1047 reply->writeInt32(status); 1048 if (status != NO_ERROR) { 1049 return NO_ERROR; 1050 } 1051 reply->writeStrongBinder(IInterface::asBinder(record)); 1052 output.writeToParcel(reply); 1053 return NO_ERROR; 1054 } break; 1055 case SAMPLE_RATE: { 1056 CHECK_INTERFACE(IAudioFlinger, data, reply); 1057 reply->writeInt32( sampleRate((audio_io_handle_t) data.readInt32()) ); 1058 return NO_ERROR; 1059 } break; 1060 1061 // RESERVED for channelCount() 1062 1063 case FORMAT: { 1064 CHECK_INTERFACE(IAudioFlinger, data, reply); 1065 reply->writeInt32( format((audio_io_handle_t) data.readInt32()) ); 1066 return NO_ERROR; 1067 } break; 1068 case FRAME_COUNT: { 1069 CHECK_INTERFACE(IAudioFlinger, data, reply); 1070 reply->writeInt64( frameCount((audio_io_handle_t) data.readInt32()) ); 1071 return NO_ERROR; 1072 } break; 1073 case LATENCY: { 1074 CHECK_INTERFACE(IAudioFlinger, data, reply); 1075 reply->writeInt32( latency((audio_io_handle_t) data.readInt32()) ); 1076 return NO_ERROR; 1077 } break; 1078 case SET_MASTER_VOLUME: { 1079 CHECK_INTERFACE(IAudioFlinger, data, reply); 1080 reply->writeInt32( setMasterVolume(data.readFloat()) ); 1081 return NO_ERROR; 1082 } break; 1083 case SET_MASTER_MUTE: { 1084 CHECK_INTERFACE(IAudioFlinger, data, reply); 1085 reply->writeInt32( setMasterMute(data.readInt32()) ); 1086 return NO_ERROR; 1087 } break; 1088 case MASTER_VOLUME: { 1089 CHECK_INTERFACE(IAudioFlinger, data, reply); 1090 reply->writeFloat( masterVolume() ); 1091 return NO_ERROR; 1092 } break; 1093 case MASTER_MUTE: { 1094 CHECK_INTERFACE(IAudioFlinger, data, reply); 1095 reply->writeInt32( masterMute() ); 1096 return NO_ERROR; 1097 } break; 1098 case SET_MASTER_BALANCE: { 1099 CHECK_INTERFACE(IAudioFlinger, data, reply); 1100 reply->writeInt32( setMasterBalance(data.readFloat()) ); 1101 return NO_ERROR; 1102 } break; 1103 case GET_MASTER_BALANCE: { 1104 CHECK_INTERFACE(IAudioFlinger, data, reply); 1105 float f; 1106 const status_t status = getMasterBalance(&f); 1107 reply->writeInt32((int32_t)status); 1108 if (status == NO_ERROR) { 1109 (void)reply->writeFloat(f); 1110 } 1111 return NO_ERROR; 1112 } break; 1113 case SET_STREAM_VOLUME: { 1114 CHECK_INTERFACE(IAudioFlinger, data, reply); 1115 int stream = data.readInt32(); 1116 float volume = data.readFloat(); 1117 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1118 reply->writeInt32( setStreamVolume((audio_stream_type_t) stream, volume, output) ); 1119 return NO_ERROR; 1120 } break; 1121 case SET_STREAM_MUTE: { 1122 CHECK_INTERFACE(IAudioFlinger, data, reply); 1123 int stream = data.readInt32(); 1124 reply->writeInt32( setStreamMute((audio_stream_type_t) stream, data.readInt32()) ); 1125 return NO_ERROR; 1126 } break; 1127 case STREAM_VOLUME: { 1128 CHECK_INTERFACE(IAudioFlinger, data, reply); 1129 int stream = data.readInt32(); 1130 int output = data.readInt32(); 1131 reply->writeFloat( streamVolume((audio_stream_type_t) stream, output) ); 1132 return NO_ERROR; 1133 } break; 1134 case STREAM_MUTE: { 1135 CHECK_INTERFACE(IAudioFlinger, data, reply); 1136 int stream = data.readInt32(); 1137 reply->writeInt32( streamMute((audio_stream_type_t) stream) ); 1138 return NO_ERROR; 1139 } break; 1140 case SET_MODE: { 1141 CHECK_INTERFACE(IAudioFlinger, data, reply); 1142 audio_mode_t mode = (audio_mode_t) data.readInt32(); 1143 reply->writeInt32( setMode(mode) ); 1144 return NO_ERROR; 1145 } break; 1146 case SET_MIC_MUTE: { 1147 CHECK_INTERFACE(IAudioFlinger, data, reply); 1148 int state = data.readInt32(); 1149 reply->writeInt32( setMicMute(state) ); 1150 return NO_ERROR; 1151 } break; 1152 case GET_MIC_MUTE: { 1153 CHECK_INTERFACE(IAudioFlinger, data, reply); 1154 reply->writeInt32( getMicMute() ); 1155 return NO_ERROR; 1156 } break; 1157 case SET_RECORD_SILENCED: { 1158 CHECK_INTERFACE(IAudioFlinger, data, reply); 1159 uid_t uid = data.readInt32(); 1160 audio_source_t source; 1161 data.read(&source, sizeof(audio_source_t)); 1162 bool silenced = data.readInt32() == 1; 1163 setRecordSilenced(uid, silenced); 1164 return NO_ERROR; 1165 } break; 1166 case SET_PARAMETERS: { 1167 CHECK_INTERFACE(IAudioFlinger, data, reply); 1168 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1169 String8 keyValuePairs(data.readString8()); 1170 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 1171 return NO_ERROR; 1172 } break; 1173 case GET_PARAMETERS: { 1174 CHECK_INTERFACE(IAudioFlinger, data, reply); 1175 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1176 String8 keys(data.readString8()); 1177 reply->writeString8(getParameters(ioHandle, keys)); 1178 return NO_ERROR; 1179 } break; 1180 1181 case REGISTER_CLIENT: { 1182 CHECK_INTERFACE(IAudioFlinger, data, reply); 1183 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>( 1184 data.readStrongBinder()); 1185 registerClient(client); 1186 return NO_ERROR; 1187 } break; 1188 case GET_INPUTBUFFERSIZE: { 1189 CHECK_INTERFACE(IAudioFlinger, data, reply); 1190 uint32_t sampleRate = data.readInt32(); 1191 audio_format_t format = (audio_format_t) data.readInt32(); 1192 audio_channel_mask_t channelMask = data.readInt32(); 1193 reply->writeInt64( getInputBufferSize(sampleRate, format, channelMask) ); 1194 return NO_ERROR; 1195 } break; 1196 case OPEN_OUTPUT: { 1197 CHECK_INTERFACE(IAudioFlinger, data, reply); 1198 audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1199 audio_config_t config = {}; 1200 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1201 ALOGE("b/23905951"); 1202 } 1203 audio_devices_t devices = (audio_devices_t)data.readInt32(); 1204 String8 address(data.readString8()); 1205 audio_output_flags_t flags = (audio_output_flags_t) data.readInt32(); 1206 uint32_t latencyMs = 0; 1207 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE; 1208 status_t status = openOutput(module, &output, &config, 1209 &devices, address, &latencyMs, flags); 1210 ALOGV("OPEN_OUTPUT output, %d", output); 1211 reply->writeInt32((int32_t)status); 1212 if (status == NO_ERROR) { 1213 reply->writeInt32((int32_t)output); 1214 reply->write(&config, sizeof(audio_config_t)); 1215 reply->writeInt32(devices); 1216 reply->writeInt32(latencyMs); 1217 } 1218 return NO_ERROR; 1219 } break; 1220 case OPEN_DUPLICATE_OUTPUT: { 1221 CHECK_INTERFACE(IAudioFlinger, data, reply); 1222 audio_io_handle_t output1 = (audio_io_handle_t) data.readInt32(); 1223 audio_io_handle_t output2 = (audio_io_handle_t) data.readInt32(); 1224 reply->writeInt32((int32_t) openDuplicateOutput(output1, output2)); 1225 return NO_ERROR; 1226 } break; 1227 case CLOSE_OUTPUT: { 1228 CHECK_INTERFACE(IAudioFlinger, data, reply); 1229 reply->writeInt32(closeOutput((audio_io_handle_t) data.readInt32())); 1230 return NO_ERROR; 1231 } break; 1232 case SUSPEND_OUTPUT: { 1233 CHECK_INTERFACE(IAudioFlinger, data, reply); 1234 reply->writeInt32(suspendOutput((audio_io_handle_t) data.readInt32())); 1235 return NO_ERROR; 1236 } break; 1237 case RESTORE_OUTPUT: { 1238 CHECK_INTERFACE(IAudioFlinger, data, reply); 1239 reply->writeInt32(restoreOutput((audio_io_handle_t) data.readInt32())); 1240 return NO_ERROR; 1241 } break; 1242 case OPEN_INPUT: { 1243 CHECK_INTERFACE(IAudioFlinger, data, reply); 1244 audio_module_handle_t module = (audio_module_handle_t)data.readInt32(); 1245 audio_io_handle_t input = (audio_io_handle_t)data.readInt32(); 1246 audio_config_t config = {}; 1247 if (data.read(&config, sizeof(audio_config_t)) != NO_ERROR) { 1248 ALOGE("b/23905951"); 1249 } 1250 audio_devices_t device = (audio_devices_t)data.readInt32(); 1251 String8 address(data.readString8()); 1252 audio_source_t source = (audio_source_t)data.readInt32(); 1253 audio_input_flags_t flags = (audio_input_flags_t) data.readInt32(); 1254 1255 status_t status = openInput(module, &input, &config, 1256 &device, address, source, flags); 1257 reply->writeInt32((int32_t) status); 1258 if (status == NO_ERROR) { 1259 reply->writeInt32((int32_t) input); 1260 reply->write(&config, sizeof(audio_config_t)); 1261 reply->writeInt32(device); 1262 } 1263 return NO_ERROR; 1264 } break; 1265 case CLOSE_INPUT: { 1266 CHECK_INTERFACE(IAudioFlinger, data, reply); 1267 reply->writeInt32(closeInput((audio_io_handle_t) data.readInt32())); 1268 return NO_ERROR; 1269 } break; 1270 case INVALIDATE_STREAM: { 1271 CHECK_INTERFACE(IAudioFlinger, data, reply); 1272 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 1273 reply->writeInt32(invalidateStream(stream)); 1274 return NO_ERROR; 1275 } break; 1276 case SET_VOICE_VOLUME: { 1277 CHECK_INTERFACE(IAudioFlinger, data, reply); 1278 float volume = data.readFloat(); 1279 reply->writeInt32( setVoiceVolume(volume) ); 1280 return NO_ERROR; 1281 } break; 1282 case GET_RENDER_POSITION: { 1283 CHECK_INTERFACE(IAudioFlinger, data, reply); 1284 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1285 uint32_t halFrames = 0; 1286 uint32_t dspFrames = 0; 1287 status_t status = getRenderPosition(&halFrames, &dspFrames, output); 1288 reply->writeInt32(status); 1289 if (status == NO_ERROR) { 1290 reply->writeInt32(halFrames); 1291 reply->writeInt32(dspFrames); 1292 } 1293 return NO_ERROR; 1294 } 1295 case GET_INPUT_FRAMES_LOST: { 1296 CHECK_INTERFACE(IAudioFlinger, data, reply); 1297 audio_io_handle_t ioHandle = (audio_io_handle_t) data.readInt32(); 1298 reply->writeInt32((int32_t) getInputFramesLost(ioHandle)); 1299 return NO_ERROR; 1300 } break; 1301 case NEW_AUDIO_UNIQUE_ID: { 1302 CHECK_INTERFACE(IAudioFlinger, data, reply); 1303 reply->writeInt32(newAudioUniqueId((audio_unique_id_use_t) data.readInt32())); 1304 return NO_ERROR; 1305 } break; 1306 case ACQUIRE_AUDIO_SESSION_ID: { 1307 CHECK_INTERFACE(IAudioFlinger, data, reply); 1308 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1309 int pid = data.readInt32(); 1310 acquireAudioSessionId(audioSession, pid); 1311 return NO_ERROR; 1312 } break; 1313 case RELEASE_AUDIO_SESSION_ID: { 1314 CHECK_INTERFACE(IAudioFlinger, data, reply); 1315 audio_session_t audioSession = (audio_session_t) data.readInt32(); 1316 int pid = data.readInt32(); 1317 releaseAudioSessionId(audioSession, pid); 1318 return NO_ERROR; 1319 } break; 1320 case QUERY_NUM_EFFECTS: { 1321 CHECK_INTERFACE(IAudioFlinger, data, reply); 1322 uint32_t numEffects = 0; 1323 status_t status = queryNumberEffects(&numEffects); 1324 reply->writeInt32(status); 1325 if (status == NO_ERROR) { 1326 reply->writeInt32((int32_t)numEffects); 1327 } 1328 return NO_ERROR; 1329 } 1330 case QUERY_EFFECT: { 1331 CHECK_INTERFACE(IAudioFlinger, data, reply); 1332 effect_descriptor_t desc = {}; 1333 status_t status = queryEffect(data.readInt32(), &desc); 1334 reply->writeInt32(status); 1335 if (status == NO_ERROR) { 1336 reply->write(&desc, sizeof(effect_descriptor_t)); 1337 } 1338 return NO_ERROR; 1339 } 1340 case GET_EFFECT_DESCRIPTOR: { 1341 CHECK_INTERFACE(IAudioFlinger, data, reply); 1342 effect_uuid_t uuid; 1343 data.read(&uuid, sizeof(effect_uuid_t)); 1344 effect_uuid_t type; 1345 data.read(&type, sizeof(effect_uuid_t)); 1346 uint32_t preferredTypeFlag = data.readUint32(); 1347 effect_descriptor_t desc = {}; 1348 status_t status = getEffectDescriptor(&uuid, &type, preferredTypeFlag, &desc); 1349 reply->writeInt32(status); 1350 if (status == NO_ERROR) { 1351 reply->write(&desc, sizeof(effect_descriptor_t)); 1352 } 1353 return NO_ERROR; 1354 } 1355 case CREATE_EFFECT: { 1356 CHECK_INTERFACE(IAudioFlinger, data, reply); 1357 effect_descriptor_t desc = {}; 1358 if (data.read(&desc, sizeof(effect_descriptor_t)) != NO_ERROR) { 1359 ALOGE("b/23905951"); 1360 } 1361 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1362 int32_t priority = data.readInt32(); 1363 audio_io_handle_t output = (audio_io_handle_t) data.readInt32(); 1364 audio_session_t sessionId = (audio_session_t) data.readInt32(); 1365 const String16 opPackageName = data.readString16(); 1366 pid_t pid = (pid_t)data.readInt32(); 1367 1368 status_t status = NO_ERROR; 1369 int id = 0; 1370 int enabled = 0; 1371 1372 sp<IEffect> effect = createEffect(&desc, client, priority, output, sessionId, 1373 opPackageName, pid, &status, &id, &enabled); 1374 reply->writeInt32(status); 1375 reply->writeInt32(id); 1376 reply->writeInt32(enabled); 1377 reply->writeStrongBinder(IInterface::asBinder(effect)); 1378 reply->write(&desc, sizeof(effect_descriptor_t)); 1379 return NO_ERROR; 1380 } break; 1381 case MOVE_EFFECTS: { 1382 CHECK_INTERFACE(IAudioFlinger, data, reply); 1383 audio_session_t session = (audio_session_t) data.readInt32(); 1384 audio_io_handle_t srcOutput = (audio_io_handle_t) data.readInt32(); 1385 audio_io_handle_t dstOutput = (audio_io_handle_t) data.readInt32(); 1386 reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1387 return NO_ERROR; 1388 } break; 1389 case SET_EFFECT_SUSPENDED: { 1390 CHECK_INTERFACE(IAudioFlinger, data, reply); 1391 int effectId = data.readInt32(); 1392 audio_session_t sessionId = (audio_session_t) data.readInt32(); 1393 bool suspended = data.readInt32() == 1; 1394 setEffectSuspended(effectId, sessionId, suspended); 1395 return NO_ERROR; 1396 } break; 1397 case LOAD_HW_MODULE: { 1398 CHECK_INTERFACE(IAudioFlinger, data, reply); 1399 reply->writeInt32(loadHwModule(data.readCString())); 1400 return NO_ERROR; 1401 } break; 1402 case GET_PRIMARY_OUTPUT_SAMPLING_RATE: { 1403 CHECK_INTERFACE(IAudioFlinger, data, reply); 1404 reply->writeInt32(getPrimaryOutputSamplingRate()); 1405 return NO_ERROR; 1406 } break; 1407 case GET_PRIMARY_OUTPUT_FRAME_COUNT: { 1408 CHECK_INTERFACE(IAudioFlinger, data, reply); 1409 reply->writeInt64(getPrimaryOutputFrameCount()); 1410 return NO_ERROR; 1411 } break; 1412 case SET_LOW_RAM_DEVICE: { 1413 CHECK_INTERFACE(IAudioFlinger, data, reply); 1414 int32_t isLowRamDevice; 1415 int64_t totalMemory; 1416 const status_t status = 1417 data.readInt32(&isLowRamDevice) ?: 1418 data.readInt64(&totalMemory) ?: 1419 setLowRamDevice(isLowRamDevice != 0, totalMemory); 1420 (void)reply->writeInt32(status); 1421 return NO_ERROR; 1422 } break; 1423 case LIST_AUDIO_PORTS: { 1424 CHECK_INTERFACE(IAudioFlinger, data, reply); 1425 unsigned int numPortsReq = data.readInt32(); 1426 if (numPortsReq > MAX_ITEMS_PER_LIST) { 1427 numPortsReq = MAX_ITEMS_PER_LIST; 1428 } 1429 unsigned int numPorts = numPortsReq; 1430 struct audio_port *ports = 1431 (struct audio_port *)calloc(numPortsReq, 1432 sizeof(struct audio_port)); 1433 if (ports == NULL) { 1434 reply->writeInt32(NO_MEMORY); 1435 reply->writeInt32(0); 1436 return NO_ERROR; 1437 } 1438 status_t status = listAudioPorts(&numPorts, ports); 1439 reply->writeInt32(status); 1440 reply->writeInt32(numPorts); 1441 if (status == NO_ERROR) { 1442 if (numPortsReq > numPorts) { 1443 numPortsReq = numPorts; 1444 } 1445 reply->write(ports, numPortsReq * sizeof(struct audio_port)); 1446 } 1447 free(ports); 1448 return NO_ERROR; 1449 } break; 1450 case GET_AUDIO_PORT: { 1451 CHECK_INTERFACE(IAudioFlinger, data, reply); 1452 struct audio_port port = {}; 1453 if (data.read(&port, sizeof(struct audio_port)) != NO_ERROR) { 1454 ALOGE("b/23905951"); 1455 } 1456 status_t status = getAudioPort(&port); 1457 reply->writeInt32(status); 1458 if (status == NO_ERROR) { 1459 reply->write(&port, sizeof(struct audio_port)); 1460 } 1461 return NO_ERROR; 1462 } break; 1463 case CREATE_AUDIO_PATCH: { 1464 CHECK_INTERFACE(IAudioFlinger, data, reply); 1465 struct audio_patch patch; 1466 data.read(&patch, sizeof(struct audio_patch)); 1467 audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE; 1468 if (data.read(&handle, sizeof(audio_patch_handle_t)) != NO_ERROR) { 1469 ALOGE("b/23905951"); 1470 } 1471 status_t status = createAudioPatch(&patch, &handle); 1472 reply->writeInt32(status); 1473 if (status == NO_ERROR) { 1474 reply->write(&handle, sizeof(audio_patch_handle_t)); 1475 } 1476 return NO_ERROR; 1477 } break; 1478 case RELEASE_AUDIO_PATCH: { 1479 CHECK_INTERFACE(IAudioFlinger, data, reply); 1480 audio_patch_handle_t handle; 1481 data.read(&handle, sizeof(audio_patch_handle_t)); 1482 status_t status = releaseAudioPatch(handle); 1483 reply->writeInt32(status); 1484 return NO_ERROR; 1485 } break; 1486 case LIST_AUDIO_PATCHES: { 1487 CHECK_INTERFACE(IAudioFlinger, data, reply); 1488 unsigned int numPatchesReq = data.readInt32(); 1489 if (numPatchesReq > MAX_ITEMS_PER_LIST) { 1490 numPatchesReq = MAX_ITEMS_PER_LIST; 1491 } 1492 unsigned int numPatches = numPatchesReq; 1493 struct audio_patch *patches = 1494 (struct audio_patch *)calloc(numPatchesReq, 1495 sizeof(struct audio_patch)); 1496 if (patches == NULL) { 1497 reply->writeInt32(NO_MEMORY); 1498 reply->writeInt32(0); 1499 return NO_ERROR; 1500 } 1501 status_t status = listAudioPatches(&numPatches, patches); 1502 reply->writeInt32(status); 1503 reply->writeInt32(numPatches); 1504 if (status == NO_ERROR) { 1505 if (numPatchesReq > numPatches) { 1506 numPatchesReq = numPatches; 1507 } 1508 reply->write(patches, numPatchesReq * sizeof(struct audio_patch)); 1509 } 1510 free(patches); 1511 return NO_ERROR; 1512 } break; 1513 case SET_AUDIO_PORT_CONFIG: { 1514 CHECK_INTERFACE(IAudioFlinger, data, reply); 1515 struct audio_port_config config; 1516 data.read(&config, sizeof(struct audio_port_config)); 1517 status_t status = setAudioPortConfig(&config); 1518 reply->writeInt32(status); 1519 return NO_ERROR; 1520 } break; 1521 case GET_AUDIO_HW_SYNC_FOR_SESSION: { 1522 CHECK_INTERFACE(IAudioFlinger, data, reply); 1523 reply->writeInt32(getAudioHwSyncForSession((audio_session_t) data.readInt32())); 1524 return NO_ERROR; 1525 } break; 1526 case SYSTEM_READY: { 1527 CHECK_INTERFACE(IAudioFlinger, data, reply); 1528 systemReady(); 1529 return NO_ERROR; 1530 } break; 1531 case FRAME_COUNT_HAL: { 1532 CHECK_INTERFACE(IAudioFlinger, data, reply); 1533 reply->writeInt64( frameCountHAL((audio_io_handle_t) data.readInt32()) ); 1534 return NO_ERROR; 1535 } break; 1536 case GET_MICROPHONES: { 1537 CHECK_INTERFACE(IAudioFlinger, data, reply); 1538 std::vector<media::MicrophoneInfo> microphones; 1539 status_t status = getMicrophones(µphones); 1540 reply->writeInt32(status); 1541 if (status == NO_ERROR) { 1542 reply->writeParcelableVector(microphones); 1543 } 1544 return NO_ERROR; 1545 } 1546 default: 1547 return BBinder::onTransact(code, data, reply, flags); 1548 } 1549 } 1550 1551 // ---------------------------------------------------------------------------- 1552 1553 } // namespace android 1554