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