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