IAudioFlinger.cpp revision fa2877b9ea48baed934b866d2ab3658b69c4c869
1/* //device/extlibs/pv/android/IAudioflinger.cpp 2** 3** Copyright 2007, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18#define LOG_TAG "IAudioFlinger" 19//#define LOG_NDEBUG 0 20#include <utils/Log.h> 21 22#include <stdint.h> 23#include <sys/types.h> 24 25#include <binder/Parcel.h> 26 27#include <media/IAudioFlinger.h> 28 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 IS_MUSIC_ACTIVE, 51 SET_PARAMETERS, 52 GET_PARAMETERS, 53 REGISTER_CLIENT, 54 GET_INPUTBUFFERSIZE, 55 OPEN_OUTPUT, 56 OPEN_DUPLICATE_OUTPUT, 57 CLOSE_OUTPUT, 58 SUSPEND_OUTPUT, 59 RESTORE_OUTPUT, 60 OPEN_INPUT, 61 CLOSE_INPUT, 62 SET_STREAM_OUTPUT 63}; 64 65class BpAudioFlinger : public BpInterface<IAudioFlinger> 66{ 67public: 68 BpAudioFlinger(const sp<IBinder>& impl) 69 : BpInterface<IAudioFlinger>(impl) 70 { 71 } 72 73 virtual sp<IAudioTrack> createTrack( 74 pid_t pid, 75 int streamType, 76 uint32_t sampleRate, 77 int format, 78 int channelCount, 79 int frameCount, 80 uint32_t flags, 81 const sp<IMemory>& sharedBuffer, 82 int output, 83 status_t *status) 84 { 85 Parcel data, reply; 86 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 87 data.writeInt32(pid); 88 data.writeInt32(streamType); 89 data.writeInt32(sampleRate); 90 data.writeInt32(format); 91 data.writeInt32(channelCount); 92 data.writeInt32(frameCount); 93 data.writeInt32(flags); 94 data.writeStrongBinder(sharedBuffer->asBinder()); 95 data.writeInt32(output); 96 status_t lStatus = remote()->transact(CREATE_TRACK, data, &reply); 97 if (lStatus != NO_ERROR) { 98 LOGE("createTrack error: %s", strerror(-lStatus)); 99 } 100 lStatus = reply.readInt32(); 101 if (status) { 102 *status = lStatus; 103 } 104 return interface_cast<IAudioTrack>(reply.readStrongBinder()); 105 } 106 107 virtual sp<IAudioRecord> openRecord( 108 pid_t pid, 109 int input, 110 uint32_t sampleRate, 111 int format, 112 int channelCount, 113 int frameCount, 114 uint32_t flags, 115 status_t *status) 116 { 117 Parcel data, reply; 118 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 119 data.writeInt32(pid); 120 data.writeInt32(input); 121 data.writeInt32(sampleRate); 122 data.writeInt32(format); 123 data.writeInt32(channelCount); 124 data.writeInt32(frameCount); 125 data.writeInt32(flags); 126 remote()->transact(OPEN_RECORD, data, &reply); 127 status_t lStatus = reply.readInt32(); 128 if (status) { 129 *status = lStatus; 130 } 131 return interface_cast<IAudioRecord>(reply.readStrongBinder()); 132 } 133 134 virtual uint32_t sampleRate(int output) const 135 { 136 Parcel data, reply; 137 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 138 data.writeInt32(output); 139 remote()->transact(SAMPLE_RATE, data, &reply); 140 return reply.readInt32(); 141 } 142 143 virtual int channelCount(int output) const 144 { 145 Parcel data, reply; 146 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 147 data.writeInt32(output); 148 remote()->transact(CHANNEL_COUNT, data, &reply); 149 return reply.readInt32(); 150 } 151 152 virtual int format(int output) const 153 { 154 Parcel data, reply; 155 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 156 data.writeInt32(output); 157 remote()->transact(FORMAT, data, &reply); 158 return reply.readInt32(); 159 } 160 161 virtual size_t frameCount(int output) const 162 { 163 Parcel data, reply; 164 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 165 data.writeInt32(output); 166 remote()->transact(FRAME_COUNT, data, &reply); 167 return reply.readInt32(); 168 } 169 170 virtual uint32_t latency(int output) const 171 { 172 Parcel data, reply; 173 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 174 data.writeInt32(output); 175 remote()->transact(LATENCY, data, &reply); 176 return reply.readInt32(); 177 } 178 179 virtual status_t setMasterVolume(float value) 180 { 181 Parcel data, reply; 182 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 183 data.writeFloat(value); 184 remote()->transact(SET_MASTER_VOLUME, data, &reply); 185 return reply.readInt32(); 186 } 187 188 virtual status_t setMasterMute(bool muted) 189 { 190 Parcel data, reply; 191 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 192 data.writeInt32(muted); 193 remote()->transact(SET_MASTER_MUTE, data, &reply); 194 return reply.readInt32(); 195 } 196 197 virtual float masterVolume() const 198 { 199 Parcel data, reply; 200 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 201 remote()->transact(MASTER_VOLUME, data, &reply); 202 return reply.readFloat(); 203 } 204 205 virtual bool masterMute() const 206 { 207 Parcel data, reply; 208 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 209 remote()->transact(MASTER_MUTE, data, &reply); 210 return reply.readInt32(); 211 } 212 213 virtual status_t setStreamVolume(int stream, float value, int output) 214 { 215 Parcel data, reply; 216 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 217 data.writeInt32(stream); 218 data.writeFloat(value); 219 data.writeInt32(output); 220 remote()->transact(SET_STREAM_VOLUME, data, &reply); 221 return reply.readInt32(); 222 } 223 224 virtual status_t setStreamMute(int stream, bool muted) 225 { 226 Parcel data, reply; 227 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 228 data.writeInt32(stream); 229 data.writeInt32(muted); 230 remote()->transact(SET_STREAM_MUTE, data, &reply); 231 return reply.readInt32(); 232 } 233 234 virtual float streamVolume(int stream, int output) const 235 { 236 Parcel data, reply; 237 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 238 data.writeInt32(stream); 239 data.writeInt32(output); 240 remote()->transact(STREAM_VOLUME, data, &reply); 241 return reply.readFloat(); 242 } 243 244 virtual bool streamMute(int stream) const 245 { 246 Parcel data, reply; 247 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 248 data.writeInt32(stream); 249 remote()->transact(STREAM_MUTE, data, &reply); 250 return reply.readInt32(); 251 } 252 253 virtual status_t setMode(int mode) 254 { 255 Parcel data, reply; 256 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 257 data.writeInt32(mode); 258 remote()->transact(SET_MODE, data, &reply); 259 return reply.readInt32(); 260 } 261 262 virtual status_t setMicMute(bool state) 263 { 264 Parcel data, reply; 265 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 266 data.writeInt32(state); 267 remote()->transact(SET_MIC_MUTE, data, &reply); 268 return reply.readInt32(); 269 } 270 271 virtual bool getMicMute() const 272 { 273 Parcel data, reply; 274 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 275 remote()->transact(GET_MIC_MUTE, data, &reply); 276 return reply.readInt32(); 277 } 278 279 virtual bool isMusicActive() const 280 { 281 Parcel data, reply; 282 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 283 remote()->transact(IS_MUSIC_ACTIVE, data, &reply); 284 return reply.readInt32(); 285 } 286 287 virtual status_t setParameters(int ioHandle, const String8& keyValuePairs) 288 { 289 Parcel data, reply; 290 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 291 data.writeInt32(ioHandle); 292 data.writeString8(keyValuePairs); 293 remote()->transact(SET_PARAMETERS, data, &reply); 294 return reply.readInt32(); 295 } 296 297 virtual String8 getParameters(int ioHandle, const String8& keys) 298 { 299 Parcel data, reply; 300 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 301 data.writeInt32(ioHandle); 302 data.writeString8(keys); 303 remote()->transact(GET_PARAMETERS, data, &reply); 304 return reply.readString8(); 305 } 306 307 virtual void registerClient(const sp<IAudioFlingerClient>& client) 308 { 309 Parcel data, reply; 310 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 311 data.writeStrongBinder(client->asBinder()); 312 remote()->transact(REGISTER_CLIENT, data, &reply); 313 } 314 315 virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount) 316 { 317 Parcel data, reply; 318 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 319 data.writeInt32(sampleRate); 320 data.writeInt32(format); 321 data.writeInt32(channelCount); 322 remote()->transact(GET_INPUTBUFFERSIZE, data, &reply); 323 return reply.readInt32(); 324 } 325 326 virtual int openOutput(uint32_t *pDevices, 327 uint32_t *pSamplingRate, 328 uint32_t *pFormat, 329 uint32_t *pChannels, 330 uint32_t *pLatencyMs, 331 uint32_t flags) 332 { 333 Parcel data, reply; 334 uint32_t devices = pDevices ? *pDevices : 0; 335 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 336 uint32_t format = pFormat ? *pFormat : 0; 337 uint32_t channels = pChannels ? *pChannels : 0; 338 uint32_t latency = pLatencyMs ? *pLatencyMs : 0; 339 340 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 341 data.writeInt32(devices); 342 data.writeInt32(samplingRate); 343 data.writeInt32(format); 344 data.writeInt32(channels); 345 data.writeInt32(latency); 346 data.writeInt32(flags); 347 remote()->transact(OPEN_OUTPUT, data, &reply); 348 int output = reply.readInt32(); 349 LOGV("openOutput() returned output, %p", output); 350 devices = reply.readInt32(); 351 if (pDevices) *pDevices = devices; 352 samplingRate = reply.readInt32(); 353 if (pSamplingRate) *pSamplingRate = samplingRate; 354 format = reply.readInt32(); 355 if (pFormat) *pFormat = format; 356 channels = reply.readInt32(); 357 if (pChannels) *pChannels = channels; 358 latency = reply.readInt32(); 359 if (pLatencyMs) *pLatencyMs = latency; 360 return output; 361 } 362 363 virtual int openDuplicateOutput(int output1, int output2) 364 { 365 Parcel data, reply; 366 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 367 data.writeInt32(output1); 368 data.writeInt32(output2); 369 remote()->transact(OPEN_DUPLICATE_OUTPUT, data, &reply); 370 return reply.readInt32(); 371 } 372 373 virtual status_t closeOutput(int output) 374 { 375 Parcel data, reply; 376 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 377 data.writeInt32(output); 378 remote()->transact(CLOSE_OUTPUT, data, &reply); 379 return reply.readInt32(); 380 } 381 382 virtual status_t suspendOutput(int output) 383 { 384 Parcel data, reply; 385 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 386 data.writeInt32(output); 387 remote()->transact(SUSPEND_OUTPUT, data, &reply); 388 return reply.readInt32(); 389 } 390 391 virtual status_t restoreOutput(int output) 392 { 393 Parcel data, reply; 394 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 395 data.writeInt32(output); 396 remote()->transact(RESTORE_OUTPUT, data, &reply); 397 return reply.readInt32(); 398 } 399 400 virtual int openInput(uint32_t *pDevices, 401 uint32_t *pSamplingRate, 402 uint32_t *pFormat, 403 uint32_t *pChannels, 404 uint32_t acoustics) 405 { 406 Parcel data, reply; 407 uint32_t devices = pDevices ? *pDevices : 0; 408 uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0; 409 uint32_t format = pFormat ? *pFormat : 0; 410 uint32_t channels = pChannels ? *pChannels : 0; 411 412 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 413 data.writeInt32(devices); 414 data.writeInt32(samplingRate); 415 data.writeInt32(format); 416 data.writeInt32(channels); 417 data.writeInt32(acoustics); 418 remote()->transact(OPEN_INPUT, data, &reply); 419 int input = reply.readInt32(); 420 devices = reply.readInt32(); 421 if (pDevices) *pDevices = devices; 422 samplingRate = reply.readInt32(); 423 if (pSamplingRate) *pSamplingRate = samplingRate; 424 format = reply.readInt32(); 425 if (pFormat) *pFormat = format; 426 channels = reply.readInt32(); 427 if (pChannels) *pChannels = channels; 428 return input; 429 } 430 431 virtual status_t closeInput(int input) 432 { 433 Parcel data, reply; 434 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 435 data.writeInt32(input); 436 remote()->transact(CLOSE_INPUT, data, &reply); 437 return reply.readInt32(); 438 } 439 440 virtual status_t setStreamOutput(uint32_t stream, int output) 441 { 442 Parcel data, reply; 443 data.writeInterfaceToken(IAudioFlinger::getInterfaceDescriptor()); 444 data.writeInt32(stream); 445 data.writeInt32(output); 446 remote()->transact(SET_STREAM_OUTPUT, data, &reply); 447 return reply.readInt32(); 448 } 449}; 450 451IMPLEMENT_META_INTERFACE(AudioFlinger, "android.media.IAudioFlinger"); 452 453// ---------------------------------------------------------------------- 454 455status_t BnAudioFlinger::onTransact( 456 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 457{ 458 switch(code) { 459 case CREATE_TRACK: { 460 CHECK_INTERFACE(IAudioFlinger, data, reply); 461 pid_t pid = data.readInt32(); 462 int streamType = data.readInt32(); 463 uint32_t sampleRate = data.readInt32(); 464 int format = data.readInt32(); 465 int channelCount = data.readInt32(); 466 size_t bufferCount = data.readInt32(); 467 uint32_t flags = data.readInt32(); 468 sp<IMemory> buffer = interface_cast<IMemory>(data.readStrongBinder()); 469 int output = data.readInt32(); 470 status_t status; 471 sp<IAudioTrack> track = createTrack(pid, 472 streamType, sampleRate, format, 473 channelCount, bufferCount, flags, buffer, output, &status); 474 reply->writeInt32(status); 475 reply->writeStrongBinder(track->asBinder()); 476 return NO_ERROR; 477 } break; 478 case OPEN_RECORD: { 479 CHECK_INTERFACE(IAudioFlinger, data, reply); 480 pid_t pid = data.readInt32(); 481 int input = data.readInt32(); 482 uint32_t sampleRate = data.readInt32(); 483 int format = data.readInt32(); 484 int channelCount = data.readInt32(); 485 size_t bufferCount = data.readInt32(); 486 uint32_t flags = data.readInt32(); 487 status_t status; 488 sp<IAudioRecord> record = openRecord(pid, input, 489 sampleRate, format, channelCount, bufferCount, flags, &status); 490 reply->writeInt32(status); 491 reply->writeStrongBinder(record->asBinder()); 492 return NO_ERROR; 493 } break; 494 case SAMPLE_RATE: { 495 CHECK_INTERFACE(IAudioFlinger, data, reply); 496 reply->writeInt32( sampleRate(data.readInt32()) ); 497 return NO_ERROR; 498 } break; 499 case CHANNEL_COUNT: { 500 CHECK_INTERFACE(IAudioFlinger, data, reply); 501 reply->writeInt32( channelCount(data.readInt32()) ); 502 return NO_ERROR; 503 } break; 504 case FORMAT: { 505 CHECK_INTERFACE(IAudioFlinger, data, reply); 506 reply->writeInt32( format(data.readInt32()) ); 507 return NO_ERROR; 508 } break; 509 case FRAME_COUNT: { 510 CHECK_INTERFACE(IAudioFlinger, data, reply); 511 reply->writeInt32( frameCount(data.readInt32()) ); 512 return NO_ERROR; 513 } break; 514 case LATENCY: { 515 CHECK_INTERFACE(IAudioFlinger, data, reply); 516 reply->writeInt32( latency(data.readInt32()) ); 517 return NO_ERROR; 518 } break; 519 case SET_MASTER_VOLUME: { 520 CHECK_INTERFACE(IAudioFlinger, data, reply); 521 reply->writeInt32( setMasterVolume(data.readFloat()) ); 522 return NO_ERROR; 523 } break; 524 case SET_MASTER_MUTE: { 525 CHECK_INTERFACE(IAudioFlinger, data, reply); 526 reply->writeInt32( setMasterMute(data.readInt32()) ); 527 return NO_ERROR; 528 } break; 529 case MASTER_VOLUME: { 530 CHECK_INTERFACE(IAudioFlinger, data, reply); 531 reply->writeFloat( masterVolume() ); 532 return NO_ERROR; 533 } break; 534 case MASTER_MUTE: { 535 CHECK_INTERFACE(IAudioFlinger, data, reply); 536 reply->writeInt32( masterMute() ); 537 return NO_ERROR; 538 } break; 539 case SET_STREAM_VOLUME: { 540 CHECK_INTERFACE(IAudioFlinger, data, reply); 541 int stream = data.readInt32(); 542 float volume = data.readFloat(); 543 int output = data.readInt32(); 544 reply->writeInt32( setStreamVolume(stream, volume, output) ); 545 return NO_ERROR; 546 } break; 547 case SET_STREAM_MUTE: { 548 CHECK_INTERFACE(IAudioFlinger, data, reply); 549 int stream = data.readInt32(); 550 reply->writeInt32( setStreamMute(stream, data.readInt32()) ); 551 return NO_ERROR; 552 } break; 553 case STREAM_VOLUME: { 554 CHECK_INTERFACE(IAudioFlinger, data, reply); 555 int stream = data.readInt32(); 556 int output = data.readInt32(); 557 reply->writeFloat( streamVolume(stream, output) ); 558 return NO_ERROR; 559 } break; 560 case STREAM_MUTE: { 561 CHECK_INTERFACE(IAudioFlinger, data, reply); 562 int stream = data.readInt32(); 563 reply->writeInt32( streamMute(stream) ); 564 return NO_ERROR; 565 } break; 566 case SET_MODE: { 567 CHECK_INTERFACE(IAudioFlinger, data, reply); 568 int mode = data.readInt32(); 569 reply->writeInt32( setMode(mode) ); 570 return NO_ERROR; 571 } break; 572 case SET_MIC_MUTE: { 573 CHECK_INTERFACE(IAudioFlinger, data, reply); 574 int state = data.readInt32(); 575 reply->writeInt32( setMicMute(state) ); 576 return NO_ERROR; 577 } break; 578 case GET_MIC_MUTE: { 579 CHECK_INTERFACE(IAudioFlinger, data, reply); 580 reply->writeInt32( getMicMute() ); 581 return NO_ERROR; 582 } break; 583 case IS_MUSIC_ACTIVE: { 584 CHECK_INTERFACE(IAudioFlinger, data, reply); 585 reply->writeInt32( isMusicActive() ); 586 return NO_ERROR; 587 } break; 588 case SET_PARAMETERS: { 589 CHECK_INTERFACE(IAudioFlinger, data, reply); 590 int ioHandle = data.readInt32(); 591 String8 keyValuePairs(data.readString8()); 592 reply->writeInt32(setParameters(ioHandle, keyValuePairs)); 593 return NO_ERROR; 594 } break; 595 case GET_PARAMETERS: { 596 CHECK_INTERFACE(IAudioFlinger, data, reply); 597 int ioHandle = data.readInt32(); 598 String8 keys(data.readString8()); 599 reply->writeString8(getParameters(ioHandle, keys)); 600 return NO_ERROR; 601 } break; 602 603 case REGISTER_CLIENT: { 604 CHECK_INTERFACE(IAudioFlinger, data, reply); 605 sp<IAudioFlingerClient> client = interface_cast<IAudioFlingerClient>(data.readStrongBinder()); 606 registerClient(client); 607 return NO_ERROR; 608 } break; 609 case GET_INPUTBUFFERSIZE: { 610 CHECK_INTERFACE(IAudioFlinger, data, reply); 611 uint32_t sampleRate = data.readInt32(); 612 int format = data.readInt32(); 613 int channelCount = data.readInt32(); 614 reply->writeInt32( getInputBufferSize(sampleRate, format, channelCount) ); 615 return NO_ERROR; 616 } break; 617 case OPEN_OUTPUT: { 618 CHECK_INTERFACE(IAudioFlinger, data, reply); 619 uint32_t devices = data.readInt32(); 620 uint32_t samplingRate = data.readInt32(); 621 uint32_t format = data.readInt32(); 622 uint32_t channels = data.readInt32(); 623 uint32_t latency = data.readInt32(); 624 uint32_t flags = data.readInt32(); 625 int output = openOutput(&devices, 626 &samplingRate, 627 &format, 628 &channels, 629 &latency, 630 flags); 631 LOGV("OPEN_OUTPUT output, %p", output); 632 reply->writeInt32(output); 633 reply->writeInt32(devices); 634 reply->writeInt32(samplingRate); 635 reply->writeInt32(format); 636 reply->writeInt32(channels); 637 reply->writeInt32(latency); 638 return NO_ERROR; 639 } break; 640 case OPEN_DUPLICATE_OUTPUT: { 641 CHECK_INTERFACE(IAudioFlinger, data, reply); 642 int output1 = data.readInt32(); 643 int output2 = data.readInt32(); 644 reply->writeInt32(openDuplicateOutput(output1, output2)); 645 return NO_ERROR; 646 } break; 647 case CLOSE_OUTPUT: { 648 CHECK_INTERFACE(IAudioFlinger, data, reply); 649 reply->writeInt32(closeOutput(data.readInt32())); 650 return NO_ERROR; 651 } break; 652 case SUSPEND_OUTPUT: { 653 CHECK_INTERFACE(IAudioFlinger, data, reply); 654 reply->writeInt32(suspendOutput(data.readInt32())); 655 return NO_ERROR; 656 } break; 657 case RESTORE_OUTPUT: { 658 CHECK_INTERFACE(IAudioFlinger, data, reply); 659 reply->writeInt32(restoreOutput(data.readInt32())); 660 return NO_ERROR; 661 } break; 662 case OPEN_INPUT: { 663 CHECK_INTERFACE(IAudioFlinger, data, reply); 664 uint32_t devices = data.readInt32(); 665 uint32_t samplingRate = data.readInt32(); 666 uint32_t format = data.readInt32(); 667 uint32_t channels = data.readInt32(); 668 uint32_t acoutics = data.readInt32(); 669 670 int input = openInput(&devices, 671 &samplingRate, 672 &format, 673 &channels, 674 acoutics); 675 reply->writeInt32(input); 676 reply->writeInt32(devices); 677 reply->writeInt32(samplingRate); 678 reply->writeInt32(format); 679 reply->writeInt32(channels); 680 return NO_ERROR; 681 } break; 682 case CLOSE_INPUT: { 683 CHECK_INTERFACE(IAudioFlinger, data, reply); 684 reply->writeInt32(closeInput(data.readInt32())); 685 return NO_ERROR; 686 } break; 687 case SET_STREAM_OUTPUT: { 688 CHECK_INTERFACE(IAudioFlinger, data, reply); 689 uint32_t stream = data.readInt32(); 690 int output = data.readInt32(); 691 reply->writeInt32(setStreamOutput(stream, output)); 692 return NO_ERROR; 693 } break; 694 default: 695 return BBinder::onTransact(code, data, reply, flags); 696 } 697} 698 699// ---------------------------------------------------------------------------- 700 701}; // namespace android 702