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