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