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