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