1 /* //device/extlibs/pv/android/IAudioflinger.cpp 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/Parcel.h> 26 27 #include <media/IAudioFlinger.h> 28 29 namespace android { 30 31 enum { 32 CREATE_TRACK = IBinder::FIRST_CALL_TRANSACTION, 33 OPEN_RECORD, 34 SAMPLE_RATE, 35 CHANNEL_COUNT, 36 FORMAT, 37 FRAME_COUNT, 38 LATENCY, 39 SET_MASTER_VOLUME, 40 SET_MASTER_MUTE, 41 MASTER_VOLUME, 42 MASTER_MUTE, 43 SET_STREAM_VOLUME, 44 SET_STREAM_MUTE, 45 STREAM_VOLUME, 46 STREAM_MUTE, 47 SET_MODE, 48 SET_MIC_MUTE, 49 GET_MIC_MUTE, 50 IS_STREAM_ACTIVE, 51 SET_PARAMETERS, 52 GET_PARAMETERS, 53 REGISTER_CLIENT, 54 GET_INPUTBUFFERSIZE, 55 OPEN_OUTPUT, 56 OPEN_DUPLICATE_OUTPUT, 57 CLOSE_OUTPUT, 58 SUSPEND_OUTPUT, 59 RESTORE_OUTPUT, 60 OPEN_INPUT, 61 CLOSE_INPUT, 62 SET_STREAM_OUTPUT, 63 SET_VOICE_VOLUME, 64 GET_RENDER_POSITION, 65 GET_INPUT_FRAMES_LOST, 66 NEW_AUDIO_SESSION_ID, 67 LOAD_EFFECT_LIBRARY, 68 UNLOAD_EFFECT_LIBRARY, 69 QUERY_NUM_EFFECTS, 70 QUERY_EFFECT, 71 GET_EFFECT_DESCRIPTOR, 72 CREATE_EFFECT, 73 MOVE_EFFECTS 74 }; 75 76 class BpAudioFlinger : public BpInterface<IAudioFlinger> 77 { 78 public: 79 BpAudioFlinger(const sp<IBinder>& impl) 80 : BpInterface<IAudioFlinger>(impl) 81 { 82 } 83 84 virtual sp<IAudioTrack> createTrack( 85 pid_t pid, 86 int streamType, 87 uint32_t sampleRate, 88 int format, 89 int channelCount, 90 int frameCount, 91 uint32_t flags, 92 const sp<IMemory>& sharedBuffer, 93 int output, 94 int *sessionId, 95 status_t *status) 96 { 97 Parcel data, reply; 98 sp<IAudioTrack> track; 99 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 100 data.writeInt32(pid); 101 data.writeInt32(streamType); 102 data.writeInt32(sampleRate); 103 data.writeInt32(format); 104 data.writeInt32(channelCount); 105 data.writeInt32(frameCount); 106 data.writeInt32(flags); 107 data.writeStrongBinder(sharedBuffer->asBinder()); 108 data.writeInt32(output); 109 int lSessionId = 0; 110 if (sessionId != NULL) { 111 lSessionId = *sessionId; 112 } 113 data.writeInt32(lSessionId); 114 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 115 if (lStatus != NO_ERROR) { 116 LOGE("createTrack error: %s", strerror(-lStatus)); 117 } else { 118 lSessionId = reply.readInt32(); 119 if (sessionId != NULL) { 120 *sessionId = lSessionId; 121 } 122 lStatus = reply.readInt32(); 123 track = interface_cast<IAudioTrack>(reply.readStrongBinder()); 124 } 125 if (status) { 126 *status = lStatus; 127 } 128 return track; 129 } 130 131 virtual sp<IAudioRecord> openRecord( 132 pid_t pid, 133 int input, 134 uint32_t sampleRate, 135 int format, 136 int channelCount, 137 int frameCount, 138 uint32_t flags, 139 int *sessionId, 140 status_t *status) 141 { 142 Parcel data, reply; 143 sp<IAudioRecord> record; 144 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 145 data.writeInt32(pid); 146 data.writeInt32(input); 147 data.writeInt32(sampleRate); 148 data.writeInt32(format); 149 data.writeInt32(channelCount); 150 data.writeInt32(frameCount); 151 data.writeInt32(flags); 152 int lSessionId = 0; 153 if (sessionId != NULL) { 154 lSessionId = *sessionId; 155 } 156 data.writeInt32(lSessionId); 157 status_t lStatus = remote()->transact(OPEN_RECORD, data, &reply); 158 if (lStatus != NO_ERROR) { 159 LOGE("openRecord error: %s", strerror(-lStatus)); 160 } else { 161 lSessionId = reply.readInt32(); 162 if (sessionId != NULL) { 163 *sessionId = lSessionId; 164 } 165 lStatus = reply.readInt32(); 166 record = interface_cast<IAudioRecord>(reply.readStrongBinder()); 167 } 168 if (status) { 169 *status = lStatus; 170 } 171 return record; 172 } 173 174 virtual uint32_t sampleRate(int output) const 175 { 176 Parcel data, reply; 177 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 178 data.writeInt32(output); 179 remote()->transact(SAMPLE_RATE, data, &reply); 180 return reply.readInt32(); 181 } 182 183 virtual int channelCount(int output) const 184 { 185 Parcel data, reply; 186 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 187 data.writeInt32(output); 188 remote()->transact(CHANNEL_COUNT, data, &reply); 189 return reply.readInt32(); 190 } 191 192 virtual int format(int output) const 193 { 194 Parcel data, reply; 195 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 196 data.writeInt32(output); 197 remote()->transact(FORMAT, data, &reply); 198 return reply.readInt32(); 199 } 200 201 virtual size_t frameCount(int output) const 202 { 203 Parcel data, reply; 204 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 205 data.writeInt32(output); 206 remote()->transact(FRAME_COUNT, data, &reply); 207 return reply.readInt32(); 208 } 209 210 virtual uint32_t latency(int output) const 211 { 212 Parcel data, reply; 213 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 214 data.writeInt32(output); 215 remote()->transact(LATENCY, data, &reply); 216 return reply.readInt32(); 217 } 218 219 virtual status_t setMasterVolume(float value) 220 { 221 Parcel data, reply; 222 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 223 data.writeFloat(value); 224 remote()->transact(SET_MASTER_VOLUME, data, &reply); 225 return reply.readInt32(); 226 } 227 228 virtual status_t setMasterMute(bool muted) 229 { 230 Parcel data, reply; 231 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 232 data.writeInt32(muted); 233 remote()->transact(SET_MASTER_MUTE, data, &reply); 234 return reply.readInt32(); 235 } 236 237 virtual float masterVolume() const 238 { 239 Parcel data, reply; 240 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 241 remote()->transact(MASTER_VOLUME, data, &reply); 242 return reply.readFloat(); 243 } 244 245 virtual bool masterMute() const 246 { 247 Parcel data, reply; 248 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 249 remote()->transact(MASTER_MUTE, data, &reply); 250 return reply.readInt32(); 251 } 252 253 virtual status_t setStreamVolume(int stream, float value, int output) 254 { 255 Parcel data, reply; 256 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 257 data.writeInt32(stream); 258 data.writeFloat(value); 259 data.writeInt32(output); 260 remote()->transact(SET_STREAM_VOLUME, data, &reply); 261 return reply.readInt32(); 262 } 263 264 virtual status_t setStreamMute(int stream, bool muted) 265 { 266 Parcel data, reply; 267 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 268 data.writeInt32(stream); 269 data.writeInt32(muted); 270 remote()->transact(SET_STREAM_MUTE, data, &reply); 271 return reply.readInt32(); 272 } 273 274 virtual float streamVolume(int stream, int output) const 275 { 276 Parcel data, reply; 277 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 278 data.writeInt32(stream); 279 data.writeInt32(output); 280 remote()->transact(STREAM_VOLUME, data, &reply); 281 return reply.readFloat(); 282 } 283 284 virtual bool streamMute(int stream) const 285 { 286 Parcel data, reply; 287 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 288 data.writeInt32(stream); 289 remote()->transact(STREAM_MUTE, data, &reply); 290 return reply.readInt32(); 291 } 292 293 virtual status_t setMode(int mode) 294 { 295 Parcel data, reply; 296 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 297 data.writeInt32(mode); 298 remote()->transact(SET_MODE, data, &reply); 299 return reply.readInt32(); 300 } 301 302 virtual status_t setMicMute(bool state) 303 { 304 Parcel data, reply; 305 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 306 data.writeInt32(state); 307 remote()->transact(SET_MIC_MUTE, data, &reply); 308 return reply.readInt32(); 309 } 310 311 virtual bool getMicMute() const 312 { 313 Parcel data, reply; 314 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 315 remote()->transact(GET_MIC_MUTE, data, &reply); 316 return reply.readInt32(); 317 } 318 319 virtual bool isStreamActive(int stream) const 320 { 321 Parcel data, reply; 322 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 323 data.writeInt32(stream); 324 remote()->transact(IS_STREAM_ACTIVE, data, &reply); 325 return reply.readInt32(); 326 } 327 328 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs) 329 { 330 Parcel data, reply; 331 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 332 data.writeInt32(ioHandle); 333 data.writeString8(keyValuePairs); 334 remote()->transact(SET_PARAMETERS, data, &reply); 335 return reply.readInt32(); 336 } 337 338 virtual String8 getParameters(int ioHandle, const String8& keys) 339 { 340 Parcel data, reply; 341 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 342 data.writeInt32(ioHandle); 343 data.writeString8(keys); 344 remote()->transact(GET_PARAMETERS, data, &reply); 345 return reply.readString8(); 346 } 347 348 virtual void registerClient(const sp<IAudioFlingerClient>& client) 349 { 350 Parcel data, reply; 351 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 352 data.writeStrongBinder(client->asBinder()); 353 remote()->transact(REGISTER_CLIENT, data, &reply); 354 } 355 356 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 357 { 358 Parcel data, reply; 359 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 360 data.writeInt32(sampleRate); 361 data.writeInt32(format); 362 data.writeInt32(channelCount); 363 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 364 return reply.readInt32(); 365 } 366 367 virtual int openOutput(uint32_t *pDevices, 368 uint32_t *pSamplingRate, 369 uint32_t *pFormat, 370 uint32_t *pChannels, 371 uint32_t *pLatencyMs, 372 uint32_t flags) 373 { 374 Parcel data, reply; 375 uint32_t devices = pDevices ? *pDevices : 0; 376 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 377 uint32_t format = pFormat ? *pFormat : 0; 378 uint32_t channels = pChannels ? *pChannels : 0; 379 uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 380 381 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 382 data.writeInt32(devices); 383 data.writeInt32(samplingRate); 384 data.writeInt32(format); 385 data.writeInt32(channels); 386 data.writeInt32(latency); 387 data.writeInt32(flags); 388 remote()->transact(OPEN_OUTPUT, data, &reply); 389 int output = reply.readInt32(); 390 LOGV("openOutput() returned output, %p", output); 391 devices = reply.readInt32(); 392 if (pDevices) *pDevices = devices; 393 samplingRate = reply.readInt32(); 394 if (pSamplingRate) *pSamplingRate = samplingRate; 395 format = reply.readInt32(); 396 if (pFormat) *pFormat = format; 397 channels = reply.readInt32(); 398 if (pChannels) *pChannels = channels; 399 latency = reply.readInt32(); 400 if (pLatencyMs) *pLatencyMs = latency; 401 return output; 402 } 403 404 virtual int openDuplicateOutput(int output1, int output2) 405 { 406 Parcel data, reply; 407 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 408 data.writeInt32(output1); 409 data.writeInt32(output2); 410 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 411 return reply.readInt32(); 412 } 413 414 virtual status_t closeOutput(int output) 415 { 416 Parcel data, reply; 417 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 418 data.writeInt32(output); 419 remote()->transact(CLOSE_OUTPUT, data, &reply); 420 return reply.readInt32(); 421 } 422 423 virtual status_t suspendOutput(int output) 424 { 425 Parcel data, reply; 426 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 427 data.writeInt32(output); 428 remote()->transact(SUSPEND_OUTPUT, data, &reply); 429 return reply.readInt32(); 430 } 431 432 virtual status_t restoreOutput(int output) 433 { 434 Parcel data, reply; 435 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 436 data.writeInt32(output); 437 remote()->transact(RESTORE_OUTPUT, data, &reply); 438 return reply.readInt32(); 439 } 440 441 virtual int openInput(uint32_t *pDevices, 442 uint32_t *pSamplingRate, 443 uint32_t *pFormat, 444 uint32_t *pChannels, 445 uint32_t acoustics) 446 { 447 Parcel data, reply; 448 uint32_t devices = pDevices ? *pDevices : 0; 449 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 450 uint32_t format = pFormat ? *pFormat : 0; 451 uint32_t channels = pChannels ? *pChannels : 0; 452 453 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 454 data.writeInt32(devices); 455 data.writeInt32(samplingRate); 456 data.writeInt32(format); 457 data.writeInt32(channels); 458 data.writeInt32(acoustics); 459 remote()->transact(OPEN_INPUT, data, &reply); 460 int input = reply.readInt32(); 461 devices = reply.readInt32(); 462 if (pDevices) *pDevices = devices; 463 samplingRate = reply.readInt32(); 464 if (pSamplingRate) *pSamplingRate = samplingRate; 465 format = reply.readInt32(); 466 if (pFormat) *pFormat = format; 467 channels = reply.readInt32(); 468 if (pChannels) *pChannels = channels; 469 return input; 470 } 471 472 virtual status_t closeInput(int input) 473 { 474 Parcel data, reply; 475 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 476 data.writeInt32(input); 477 remote()->transact(CLOSE_INPUT, data, &reply); 478 return reply.readInt32(); 479 } 480 481 virtual status_t setStreamOutput(uint32_t stream, int output) 482 { 483 Parcel data, reply; 484 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 485 data.writeInt32(stream); 486 data.writeInt32(output); 487 remote()->transact(SET_STREAM_OUTPUT, 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, int output) 501 { 502 Parcel data, reply; 503 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 504 data.writeInt32(output); 505 remote()->transact(GET_RENDER_POSITION, data, &reply); 506 status_t status = reply.readInt32(); 507 if (status == NO_ERROR) { 508 uint32_t tmp = reply.readInt32(); 509 if (halFrames) { 510 *halFrames = tmp; 511 } 512 tmp = reply.readInt32(); 513 if (dspFrames) { 514 *dspFrames = tmp; 515 } 516 } 517 return status; 518 } 519 520 virtual unsigned int getInputFramesLost(int ioHandle) 521 { 522 Parcel data, reply; 523 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 524 data.writeInt32(ioHandle); 525 remote()->transact(GET_INPUT_FRAMES_LOST, data, &reply); 526 return reply.readInt32(); 527 } 528 529 virtual int newAudioSessionId() 530 { 531 Parcel data, reply; 532 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 533 status_t status = remote()->transact(NEW_AUDIO_SESSION_ID, data, &reply); 534 int id = 0; 535 if (status == NO_ERROR) { 536 id = reply.readInt32(); 537 } 538 return id; 539 } 540 541 virtual status_t loadEffectLibrary(const char *libPath, int *handle) 542 { 543 if (libPath == NULL || handle == NULL) { 544 return BAD_VALUE; 545 } 546 *handle = 0; 547 Parcel data, reply; 548 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 549 data.writeCString(libPath); 550 status_t status = remote()->transact(LOAD_EFFECT_LIBRARY, data, &reply); 551 if (status == NO_ERROR) { 552 status = reply.readInt32(); 553 if (status == NO_ERROR) { 554 *handle = reply.readInt32(); 555 } 556 } 557 return status; 558 } 559 560 virtual status_t unloadEffectLibrary(int handle) 561 { 562 Parcel data, reply; 563 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 564 data.writeInt32(handle); 565 status_t status = remote()->transact(UNLOAD_EFFECT_LIBRARY, data, &reply); 566 if (status == NO_ERROR) { 567 status = reply.readInt32(); 568 } 569 return status; 570 } 571 572 virtual status_t queryNumberEffects(uint32_t *numEffects) 573 { 574 Parcel data, reply; 575 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 576 status_t status = remote()->transact(QUERY_NUM_EFFECTS, data, &reply); 577 if (status != NO_ERROR) { 578 return status; 579 } 580 status = reply.readInt32(); 581 if (status != NO_ERROR) { 582 return status; 583 } 584 if (numEffects) { 585 *numEffects = (uint32_t)reply.readInt32(); 586 } 587 return NO_ERROR; 588 } 589 590 virtual status_t queryEffect(uint32_t index, effect_descriptor_t *pDescriptor) 591 { 592 if (pDescriptor == NULL) { 593 return BAD_VALUE; 594 } 595 Parcel data, reply; 596 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 597 data.writeInt32(index); 598 status_t status = remote()->transact(QUERY_EFFECT, data, &reply); 599 if (status != NO_ERROR) { 600 return status; 601 } 602 status = reply.readInt32(); 603 if (status != NO_ERROR) { 604 return status; 605 } 606 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 607 return NO_ERROR; 608 } 609 610 virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *pDescriptor) 611 { 612 if (pUuid == NULL || pDescriptor == NULL) { 613 return BAD_VALUE; 614 } 615 Parcel data, reply; 616 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 617 data.write(pUuid, sizeof(effect_uuid_t)); 618 status_t status = remote()->transact(GET_EFFECT_DESCRIPTOR, data, &reply); 619 if (status != NO_ERROR) { 620 return status; 621 } 622 status = reply.readInt32(); 623 if (status != NO_ERROR) { 624 return status; 625 } 626 reply.read(pDescriptor, sizeof(effect_descriptor_t)); 627 return NO_ERROR; 628 } 629 630 virtual sp<IEffect> createEffect(pid_t pid, 631 effect_descriptor_t *pDesc, 632 const sp<IEffectClient>& client, 633 int32_t priority, 634 int output, 635 int sessionId, 636 status_t *status, 637 int *id, 638 int *enabled) 639 { 640 Parcel data, reply; 641 sp<IEffect> effect; 642 643 if (pDesc == NULL) { 644 return effect; 645 if (status) { 646 *status = BAD_VALUE; 647 } 648 } 649 650 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 651 data.writeInt32(pid); 652 data.write(pDesc, sizeof(effect_descriptor_t)); 653 data.writeStrongBinder(client->asBinder()); 654 data.writeInt32(priority); 655 data.writeInt32(output); 656 data.writeInt32(sessionId); 657 658 status_t lStatus = remote()->transact(CREATE_EFFECT, data, &reply); 659 if (lStatus != NO_ERROR) { 660 LOGE("createEffect error: %s", strerror(-lStatus)); 661 } else { 662 lStatus = reply.readInt32(); 663 int tmp = reply.readInt32(); 664 if (id) { 665 *id = tmp; 666 } 667 tmp = reply.readInt32(); 668 if (enabled) { 669 *enabled = tmp; 670 } 671 effect = interface_cast<IEffect>(reply.readStrongBinder()); 672 reply.read(pDesc, sizeof(effect_descriptor_t)); 673 } 674 if (status) { 675 *status = lStatus; 676 } 677 678 return effect; 679 } 680 681 virtual status_t moveEffects(int session, int srcOutput, int dstOutput) 682 { 683 Parcel data, reply; 684 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 685 data.writeInt32(session); 686 data.writeInt32(srcOutput); 687 data.writeInt32(dstOutput); 688 remote()->transact(MOVE_EFFECTS, data, &reply); 689 return reply.readInt32(); 690 } 691 }; 692 693 IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 694 695 // ---------------------------------------------------------------------- 696 697 status_t BnAudioFlinger::onTransact( 698 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 699 { 700 switch(code) { 701 case CREATE_TRACK: { 702 CHECK_INTERFACE(IAudioFlinger, data, reply); 703 pid_t pid = data.readInt32(); 704 int streamType = data.readInt32(); 705 uint32_t sampleRate = data.readInt32(); 706 int format = data.readInt32(); 707 int channelCount = data.readInt32(); 708 size_t bufferCount = data.readInt32(); 709 uint32_t flags = data.readInt32(); 710 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 711 int output = data.readInt32(); 712 int sessionId = data.readInt32(); 713 status_t status; 714 sp<IAudioTrack> track = createTrack(pid, 715 streamType, sampleRate, format, 716 channelCount, bufferCount, flags, buffer, output, &sessionId, &status); 717 reply->writeInt32(sessionId); 718 reply->writeInt32(status); 719 reply->writeStrongBinder(track->asBinder()); 720 return NO_ERROR; 721 } break; 722 case OPEN_RECORD: { 723 CHECK_INTERFACE(IAudioFlinger, data, reply); 724 pid_t pid = data.readInt32(); 725 int input = data.readInt32(); 726 uint32_t sampleRate = data.readInt32(); 727 int format = data.readInt32(); 728 int channelCount = data.readInt32(); 729 size_t bufferCount = data.readInt32(); 730 uint32_t flags = data.readInt32(); 731 int sessionId = data.readInt32(); 732 status_t status; 733 sp<IAudioRecord> record = openRecord(pid, input, 734 sampleRate, format, channelCount, bufferCount, flags, &sessionId, &status); 735 reply->writeInt32(sessionId); 736 reply->writeInt32(status); 737 reply->writeStrongBinder(record->asBinder()); 738 return NO_ERROR; 739 } break; 740 case SAMPLE_RATE: { 741 CHECK_INTERFACE(IAudioFlinger, data, reply); 742 reply->writeInt32( sampleRate(data.readInt32()) ); 743 return NO_ERROR; 744 } break; 745 case CHANNEL_COUNT: { 746 CHECK_INTERFACE(IAudioFlinger, data, reply); 747 reply->writeInt32( channelCount(data.readInt32()) ); 748 return NO_ERROR; 749 } break; 750 case FORMAT: { 751 CHECK_INTERFACE(IAudioFlinger, data, reply); 752 reply->writeInt32( format(data.readInt32()) ); 753 return NO_ERROR; 754 } break; 755 case FRAME_COUNT: { 756 CHECK_INTERFACE(IAudioFlinger, data, reply); 757 reply->writeInt32( frameCount(data.readInt32()) ); 758 return NO_ERROR; 759 } break; 760 case LATENCY: { 761 CHECK_INTERFACE(IAudioFlinger, data, reply); 762 reply->writeInt32( latency(data.readInt32()) ); 763 return NO_ERROR; 764 } break; 765 case SET_MASTER_VOLUME: { 766 CHECK_INTERFACE(IAudioFlinger, data, reply); 767 reply->writeInt32( setMasterVolume(data.readFloat()) ); 768 return NO_ERROR; 769 } break; 770 case SET_MASTER_MUTE: { 771 CHECK_INTERFACE(IAudioFlinger, data, reply); 772 reply->writeInt32( setMasterMute(data.readInt32()) ); 773 return NO_ERROR; 774 } break; 775 case MASTER_VOLUME: { 776 CHECK_INTERFACE(IAudioFlinger, data, reply); 777 reply->writeFloat( masterVolume() ); 778 return NO_ERROR; 779 } break; 780 case MASTER_MUTE: { 781 CHECK_INTERFACE(IAudioFlinger, data, reply); 782 reply->writeInt32( masterMute() ); 783 return NO_ERROR; 784 } break; 785 case SET_STREAM_VOLUME: { 786 CHECK_INTERFACE(IAudioFlinger, data, reply); 787 int stream = data.readInt32(); 788 float volume = data.readFloat(); 789 int output = data.readInt32(); 790 reply->writeInt32( setStreamVolume(stream, volume, output) ); 791 return NO_ERROR; 792 } break; 793 case SET_STREAM_MUTE: { 794 CHECK_INTERFACE(IAudioFlinger, data, reply); 795 int stream = data.readInt32(); 796 reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 797 return NO_ERROR; 798 } break; 799 case STREAM_VOLUME: { 800 CHECK_INTERFACE(IAudioFlinger, data, reply); 801 int stream = data.readInt32(); 802 int output = data.readInt32(); 803 reply->writeFloat( streamVolume(stream, output) ); 804 return NO_ERROR; 805 } break; 806 case STREAM_MUTE: { 807 CHECK_INTERFACE(IAudioFlinger, data, reply); 808 int stream = data.readInt32(); 809 reply->writeInt32( streamMute(stream) ); 810 return NO_ERROR; 811 } break; 812 case SET_MODE: { 813 CHECK_INTERFACE(IAudioFlinger, data, reply); 814 int mode = data.readInt32(); 815 reply->writeInt32( setMode(mode) ); 816 return NO_ERROR; 817 } break; 818 case SET_MIC_MUTE: { 819 CHECK_INTERFACE(IAudioFlinger, data, reply); 820 int state = data.readInt32(); 821 reply->writeInt32( setMicMute(state) ); 822 return NO_ERROR; 823 } break; 824 case GET_MIC_MUTE: { 825 CHECK_INTERFACE(IAudioFlinger, data, reply); 826 reply->writeInt32( getMicMute() ); 827 return NO_ERROR; 828 } break; 829 case IS_STREAM_ACTIVE: { 830 CHECK_INTERFACE(IAudioFlinger, data, reply); 831 int stream = data.readInt32(); 832 reply->writeInt32( isStreamActive(stream) ); 833 return NO_ERROR; 834 } break; 835 case SET_PARAMETERS: { 836 CHECK_INTERFACE(IAudioFlinger, data, reply); 837 int ioHandle = data.readInt32(); 838 String8 keyValuePairs(data.readString8()); 839 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 840 return NO_ERROR; 841 } break; 842 case GET_PARAMETERS: { 843 CHECK_INTERFACE(IAudioFlinger, data, reply); 844 int ioHandle = data.readInt32(); 845 String8 keys(data.readString8()); 846 reply->writeString8(getParameters(ioHandle, keys)); 847 return NO_ERROR; 848 } break; 849 850 case REGISTER_CLIENT: { 851 CHECK_INTERFACE(IAudioFlinger, data, reply); 852 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 853 registerClient(client); 854 return NO_ERROR; 855 } break; 856 case GET_INPUTBUFFERSIZE: { 857 CHECK_INTERFACE(IAudioFlinger, data, reply); 858 uint32_t sampleRate = data.readInt32(); 859 int format = data.readInt32(); 860 int channelCount = data.readInt32(); 861 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 862 return NO_ERROR; 863 } break; 864 case OPEN_OUTPUT: { 865 CHECK_INTERFACE(IAudioFlinger, data, reply); 866 uint32_t devices = data.readInt32(); 867 uint32_t samplingRate = data.readInt32(); 868 uint32_t format = data.readInt32(); 869 uint32_t channels = data.readInt32(); 870 uint32_t latency = data.readInt32(); 871 uint32_t flags = data.readInt32(); 872 int output = openOutput(&devices, 873 &samplingRate, 874 &format, 875 &channels, 876 &latency, 877 flags); 878 LOGV("OPEN_OUTPUT output, %p", output); 879 reply->writeInt32(output); 880 reply->writeInt32(devices); 881 reply->writeInt32(samplingRate); 882 reply->writeInt32(format); 883 reply->writeInt32(channels); 884 reply->writeInt32(latency); 885 return NO_ERROR; 886 } break; 887 case OPEN_DUPLICATE_OUTPUT: { 888 CHECK_INTERFACE(IAudioFlinger, data, reply); 889 int output1 = data.readInt32(); 890 int output2 = data.readInt32(); 891 reply->writeInt32(openDuplicateOutput(output1, output2)); 892 return NO_ERROR; 893 } break; 894 case CLOSE_OUTPUT: { 895 CHECK_INTERFACE(IAudioFlinger, data, reply); 896 reply->writeInt32(closeOutput(data.readInt32())); 897 return NO_ERROR; 898 } break; 899 case SUSPEND_OUTPUT: { 900 CHECK_INTERFACE(IAudioFlinger, data, reply); 901 reply->writeInt32(suspendOutput(data.readInt32())); 902 return NO_ERROR; 903 } break; 904 case RESTORE_OUTPUT: { 905 CHECK_INTERFACE(IAudioFlinger, data, reply); 906 reply->writeInt32(restoreOutput(data.readInt32())); 907 return NO_ERROR; 908 } break; 909 case OPEN_INPUT: { 910 CHECK_INTERFACE(IAudioFlinger, data, reply); 911 uint32_t devices = data.readInt32(); 912 uint32_t samplingRate = data.readInt32(); 913 uint32_t format = data.readInt32(); 914 uint32_t channels = data.readInt32(); 915 uint32_t acoutics = data.readInt32(); 916 917 int input = openInput(&devices, 918 &samplingRate, 919 &format, 920 &channels, 921 acoutics); 922 reply->writeInt32(input); 923 reply->writeInt32(devices); 924 reply->writeInt32(samplingRate); 925 reply->writeInt32(format); 926 reply->writeInt32(channels); 927 return NO_ERROR; 928 } break; 929 case CLOSE_INPUT: { 930 CHECK_INTERFACE(IAudioFlinger, data, reply); 931 reply->writeInt32(closeInput(data.readInt32())); 932 return NO_ERROR; 933 } break; 934 case SET_STREAM_OUTPUT: { 935 CHECK_INTERFACE(IAudioFlinger, data, reply); 936 uint32_t stream = data.readInt32(); 937 int output = data.readInt32(); 938 reply->writeInt32(setStreamOutput(stream, output)); 939 return NO_ERROR; 940 } break; 941 case SET_VOICE_VOLUME: { 942 CHECK_INTERFACE(IAudioFlinger, data, reply); 943 float volume = data.readFloat(); 944 reply->writeInt32( setVoiceVolume(volume) ); 945 return NO_ERROR; 946 } break; 947 case GET_RENDER_POSITION: { 948 CHECK_INTERFACE(IAudioFlinger, data, reply); 949 int output = data.readInt32(); 950 uint32_t halFrames; 951 uint32_t dspFrames; 952 status_t status = getRenderPosition(&halFrames, &dspFrames, output); 953 reply->writeInt32(status); 954 if (status == NO_ERROR) { 955 reply->writeInt32(halFrames); 956 reply->writeInt32(dspFrames); 957 } 958 return NO_ERROR; 959 } 960 case GET_INPUT_FRAMES_LOST: { 961 CHECK_INTERFACE(IAudioFlinger, data, reply); 962 int ioHandle = data.readInt32(); 963 reply->writeInt32(getInputFramesLost(ioHandle)); 964 return NO_ERROR; 965 } break; 966 case NEW_AUDIO_SESSION_ID: { 967 CHECK_INTERFACE(IAudioFlinger, data, reply); 968 reply->writeInt32(newAudioSessionId()); 969 return NO_ERROR; 970 } break; 971 case LOAD_EFFECT_LIBRARY: { 972 CHECK_INTERFACE(IAudioFlinger, data, reply); 973 int handle; 974 status_t status = loadEffectLibrary(data.readCString(), &handle); 975 reply->writeInt32(status); 976 if (status == NO_ERROR) { 977 reply->writeInt32(handle); 978 } 979 return NO_ERROR; 980 } 981 case UNLOAD_EFFECT_LIBRARY: { 982 CHECK_INTERFACE(IAudioFlinger, data, reply); 983 reply->writeInt32(unloadEffectLibrary(data.readInt32())); 984 return NO_ERROR; 985 } 986 case QUERY_NUM_EFFECTS: { 987 CHECK_INTERFACE(IAudioFlinger, data, reply); 988 uint32_t numEffects; 989 status_t status = queryNumberEffects(&numEffects); 990 reply->writeInt32(status); 991 if (status == NO_ERROR) { 992 reply->writeInt32((int32_t)numEffects); 993 } 994 return NO_ERROR; 995 } 996 case QUERY_EFFECT: { 997 CHECK_INTERFACE(IAudioFlinger, data, reply); 998 effect_descriptor_t desc; 999 status_t status = queryEffect(data.readInt32(), &desc); 1000 reply->writeInt32(status); 1001 if (status == NO_ERROR) { 1002 reply->write(&desc, sizeof(effect_descriptor_t)); 1003 } 1004 return NO_ERROR; 1005 } 1006 case GET_EFFECT_DESCRIPTOR: { 1007 CHECK_INTERFACE(IAudioFlinger, data, reply); 1008 effect_uuid_t uuid; 1009 data.read(&uuid, sizeof(effect_uuid_t)); 1010 effect_descriptor_t desc; 1011 status_t status = getEffectDescriptor(&uuid, &desc); 1012 reply->writeInt32(status); 1013 if (status == NO_ERROR) { 1014 reply->write(&desc, sizeof(effect_descriptor_t)); 1015 } 1016 return NO_ERROR; 1017 } 1018 case CREATE_EFFECT: { 1019 CHECK_INTERFACE(IAudioFlinger, data, reply); 1020 pid_t pid = data.readInt32(); 1021 effect_descriptor_t desc; 1022 data.read(&desc, sizeof(effect_descriptor_t)); 1023 sp<IEffectClient> client = interface_cast<IEffectClient>(data.readStrongBinder()); 1024 int32_t priority = data.readInt32(); 1025 int output = data.readInt32(); 1026 int sessionId = data.readInt32(); 1027 status_t status; 1028 int id; 1029 int enabled; 1030 1031 sp<IEffect> effect = createEffect(pid, &desc, client, priority, output, sessionId, &status, &id, &enabled); 1032 reply->writeInt32(status); 1033 reply->writeInt32(id); 1034 reply->writeInt32(enabled); 1035 reply->writeStrongBinder(effect->asBinder()); 1036 reply->write(&desc, sizeof(effect_descriptor_t)); 1037 return NO_ERROR; 1038 } break; 1039 case MOVE_EFFECTS: { 1040 CHECK_INTERFACE(IAudioFlinger, data, reply); 1041 int session = data.readInt32(); 1042 int srcOutput = data.readInt32(); 1043 int dstOutput = data.readInt32(); 1044 reply->writeInt32(moveEffects(session, srcOutput, dstOutput)); 1045 return NO_ERROR; 1046 } break; 1047 default: 1048 return BBinder::onTransact(code, data, reply, flags); 1049 } 1050 } 1051 1052 // ---------------------------------------------------------------------------- 1053 1054 }; // namespace android 1055