IAudioPolicyService.cpp revision 63ad6aacc6ce6b729bf25f41376cfea731a2c1eb
1/* 2** 3** Copyright 2009, 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 "IAudioPolicyService" 19#include <utils/Log.h> 20 21#include <stdint.h> 22#include <sys/types.h> 23 24#include <binder/Parcel.h> 25 26#include <media/IAudioPolicyService.h> 27 28#include <system/audio.h> 29 30namespace android { 31 32enum { 33 SET_DEVICE_CONNECTION_STATE = IBinder::FIRST_CALL_TRANSACTION, 34 GET_DEVICE_CONNECTION_STATE, 35 SET_PHONE_STATE, 36 SET_RINGER_MODE, 37 SET_FORCE_USE, 38 GET_FORCE_USE, 39 GET_OUTPUT, 40 START_OUTPUT, 41 STOP_OUTPUT, 42 RELEASE_OUTPUT, 43 GET_INPUT, 44 START_INPUT, 45 STOP_INPUT, 46 RELEASE_INPUT, 47 INIT_STREAM_VOLUME, 48 SET_STREAM_VOLUME, 49 GET_STREAM_VOLUME, 50 GET_STRATEGY_FOR_STREAM, 51 GET_OUTPUT_FOR_EFFECT, 52 REGISTER_EFFECT, 53 UNREGISTER_EFFECT, 54 IS_STREAM_ACTIVE, 55 GET_DEVICES_FOR_STREAM, 56 QUERY_DEFAULT_PRE_PROCESSING, 57 SET_EFFECT_ENABLED 58}; 59 60class BpAudioPolicyService : public BpInterface<IAudioPolicyService> 61{ 62public: 63 BpAudioPolicyService(const sp<IBinder>& impl) 64 : BpInterface<IAudioPolicyService>(impl) 65 { 66 } 67 68 virtual status_t setDeviceConnectionState( 69 audio_devices_t device, 70 audio_policy_dev_state_t state, 71 const char *device_address) 72 { 73 Parcel data, reply; 74 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 75 data.writeInt32(static_cast <uint32_t>(device)); 76 data.writeInt32(static_cast <uint32_t>(state)); 77 data.writeCString(device_address); 78 remote()->transact(SET_DEVICE_CONNECTION_STATE, data, &reply); 79 return static_cast <status_t> (reply.readInt32()); 80 } 81 82 virtual audio_policy_dev_state_t getDeviceConnectionState( 83 audio_devices_t device, 84 const char *device_address) 85 { 86 Parcel data, reply; 87 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 88 data.writeInt32(static_cast <uint32_t>(device)); 89 data.writeCString(device_address); 90 remote()->transact(GET_DEVICE_CONNECTION_STATE, data, &reply); 91 return static_cast <audio_policy_dev_state_t>(reply.readInt32()); 92 } 93 94 virtual status_t setPhoneState(audio_mode_t state) 95 { 96 Parcel data, reply; 97 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 98 data.writeInt32(state); 99 remote()->transact(SET_PHONE_STATE, data, &reply); 100 return static_cast <status_t> (reply.readInt32()); 101 } 102 103 virtual status_t setRingerMode(uint32_t mode, uint32_t mask) 104 { 105 Parcel data, reply; 106 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 107 data.writeInt32(mode); 108 data.writeInt32(mask); 109 remote()->transact(SET_RINGER_MODE, data, &reply); 110 return static_cast <status_t> (reply.readInt32()); 111 } 112 113 virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config) 114 { 115 Parcel data, reply; 116 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 117 data.writeInt32(static_cast <uint32_t>(usage)); 118 data.writeInt32(static_cast <uint32_t>(config)); 119 remote()->transact(SET_FORCE_USE, data, &reply); 120 return static_cast <status_t> (reply.readInt32()); 121 } 122 123 virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage) 124 { 125 Parcel data, reply; 126 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 127 data.writeInt32(static_cast <uint32_t>(usage)); 128 remote()->transact(GET_FORCE_USE, data, &reply); 129 return static_cast <audio_policy_forced_cfg_t> (reply.readInt32()); 130 } 131 132 virtual audio_io_handle_t getOutput( 133 audio_stream_type_t stream, 134 uint32_t samplingRate, 135 uint32_t format, 136 uint32_t channels, 137 audio_policy_output_flags_t flags) 138 { 139 Parcel data, reply; 140 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 141 data.writeInt32(static_cast <uint32_t>(stream)); 142 data.writeInt32(samplingRate); 143 data.writeInt32(static_cast <uint32_t>(format)); 144 data.writeInt32(channels); 145 data.writeInt32(static_cast <uint32_t>(flags)); 146 remote()->transact(GET_OUTPUT, data, &reply); 147 return static_cast <audio_io_handle_t> (reply.readInt32()); 148 } 149 150 virtual status_t startOutput(audio_io_handle_t output, 151 audio_stream_type_t stream, 152 int session) 153 { 154 Parcel data, reply; 155 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 156 data.writeInt32(output); 157 data.writeInt32((int32_t) stream); 158 data.writeInt32(session); 159 remote()->transact(START_OUTPUT, data, &reply); 160 return static_cast <status_t> (reply.readInt32()); 161 } 162 163 virtual status_t stopOutput(audio_io_handle_t output, 164 audio_stream_type_t stream, 165 int session) 166 { 167 Parcel data, reply; 168 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 169 data.writeInt32(output); 170 data.writeInt32((int32_t) stream); 171 data.writeInt32(session); 172 remote()->transact(STOP_OUTPUT, data, &reply); 173 return static_cast <status_t> (reply.readInt32()); 174 } 175 176 virtual void releaseOutput(audio_io_handle_t output) 177 { 178 Parcel data, reply; 179 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 180 data.writeInt32(output); 181 remote()->transact(RELEASE_OUTPUT, data, &reply); 182 } 183 184 virtual audio_io_handle_t getInput( 185 int inputSource, 186 uint32_t samplingRate, 187 uint32_t format, 188 uint32_t channels, 189 audio_in_acoustics_t acoustics, 190 int audioSession) 191 { 192 Parcel data, reply; 193 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 194 data.writeInt32(inputSource); 195 data.writeInt32(samplingRate); 196 data.writeInt32(static_cast <uint32_t>(format)); 197 data.writeInt32(channels); 198 data.writeInt32(static_cast <uint32_t>(acoustics)); 199 data.writeInt32(audioSession); 200 remote()->transact(GET_INPUT, data, &reply); 201 return static_cast <audio_io_handle_t> (reply.readInt32()); 202 } 203 204 virtual status_t startInput(audio_io_handle_t input) 205 { 206 Parcel data, reply; 207 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 208 data.writeInt32(input); 209 remote()->transact(START_INPUT, data, &reply); 210 return static_cast <status_t> (reply.readInt32()); 211 } 212 213 virtual status_t stopInput(audio_io_handle_t input) 214 { 215 Parcel data, reply; 216 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 217 data.writeInt32(input); 218 remote()->transact(STOP_INPUT, data, &reply); 219 return static_cast <status_t> (reply.readInt32()); 220 } 221 222 virtual void releaseInput(audio_io_handle_t input) 223 { 224 Parcel data, reply; 225 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 226 data.writeInt32(input); 227 remote()->transact(RELEASE_INPUT, data, &reply); 228 } 229 230 virtual status_t initStreamVolume(audio_stream_type_t stream, 231 int indexMin, 232 int indexMax) 233 { 234 Parcel data, reply; 235 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 236 data.writeInt32(static_cast <uint32_t>(stream)); 237 data.writeInt32(indexMin); 238 data.writeInt32(indexMax); 239 remote()->transact(INIT_STREAM_VOLUME, data, &reply); 240 return static_cast <status_t> (reply.readInt32()); 241 } 242 243 virtual status_t setStreamVolumeIndex(audio_stream_type_t stream, 244 int index, 245 audio_devices_t device) 246 { 247 Parcel data, reply; 248 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 249 data.writeInt32(static_cast <uint32_t>(stream)); 250 data.writeInt32(index); 251 data.writeInt32(static_cast <uint32_t>(device)); 252 remote()->transact(SET_STREAM_VOLUME, data, &reply); 253 return static_cast <status_t> (reply.readInt32()); 254 } 255 256 virtual status_t getStreamVolumeIndex(audio_stream_type_t stream, 257 int *index, 258 audio_devices_t device) 259 { 260 Parcel data, reply; 261 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 262 data.writeInt32(static_cast <uint32_t>(stream)); 263 data.writeInt32(static_cast <uint32_t>(device)); 264 265 remote()->transact(GET_STREAM_VOLUME, data, &reply); 266 int lIndex = reply.readInt32(); 267 if (index) *index = lIndex; 268 return static_cast <status_t> (reply.readInt32()); 269 } 270 271 virtual uint32_t getStrategyForStream(audio_stream_type_t stream) 272 { 273 Parcel data, reply; 274 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 275 data.writeInt32(static_cast <uint32_t>(stream)); 276 remote()->transact(GET_STRATEGY_FOR_STREAM, data, &reply); 277 return reply.readInt32(); 278 } 279 280 virtual uint32_t getDevicesForStream(audio_stream_type_t stream) 281 { 282 Parcel data, reply; 283 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 284 data.writeInt32(static_cast <uint32_t>(stream)); 285 remote()->transact(GET_DEVICES_FOR_STREAM, data, &reply); 286 return (uint32_t) reply.readInt32(); 287 } 288 289 virtual audio_io_handle_t getOutputForEffect(effect_descriptor_t *desc) 290 { 291 Parcel data, reply; 292 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 293 data.write(desc, sizeof(effect_descriptor_t)); 294 remote()->transact(GET_OUTPUT_FOR_EFFECT, data, &reply); 295 return static_cast <audio_io_handle_t> (reply.readInt32()); 296 } 297 298 virtual status_t registerEffect(effect_descriptor_t *desc, 299 audio_io_handle_t io, 300 uint32_t strategy, 301 int session, 302 int id) 303 { 304 Parcel data, reply; 305 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 306 data.write(desc, sizeof(effect_descriptor_t)); 307 data.writeInt32(io); 308 data.writeInt32(strategy); 309 data.writeInt32(session); 310 data.writeInt32(id); 311 remote()->transact(REGISTER_EFFECT, data, &reply); 312 return static_cast <status_t> (reply.readInt32()); 313 } 314 315 virtual status_t unregisterEffect(int id) 316 { 317 Parcel data, reply; 318 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 319 data.writeInt32(id); 320 remote()->transact(UNREGISTER_EFFECT, data, &reply); 321 return static_cast <status_t> (reply.readInt32()); 322 } 323 324 virtual status_t setEffectEnabled(int id, bool enabled) 325 { 326 Parcel data, reply; 327 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 328 data.writeInt32(id); 329 data.writeInt32(enabled); 330 remote()->transact(SET_EFFECT_ENABLED, data, &reply); 331 return static_cast <status_t> (reply.readInt32()); 332 } 333 334 virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 335 { 336 Parcel data, reply; 337 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 338 data.writeInt32((int32_t) stream); 339 data.writeInt32(inPastMs); 340 remote()->transact(IS_STREAM_ACTIVE, data, &reply); 341 return reply.readInt32(); 342 } 343 344 virtual status_t queryDefaultPreProcessing(int audioSession, 345 effect_descriptor_t *descriptors, 346 uint32_t *count) 347 { 348 if (descriptors == NULL || count == NULL) { 349 return BAD_VALUE; 350 } 351 Parcel data, reply; 352 data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); 353 data.writeInt32(audioSession); 354 data.writeInt32(*count); 355 status_t status = remote()->transact(QUERY_DEFAULT_PRE_PROCESSING, data, &reply); 356 if (status != NO_ERROR) { 357 return status; 358 } 359 status = static_cast <status_t> (reply.readInt32()); 360 uint32_t retCount = reply.readInt32(); 361 if (retCount != 0) { 362 uint32_t numDesc = (retCount < *count) ? retCount : *count; 363 reply.read(descriptors, sizeof(effect_descriptor_t) * numDesc); 364 } 365 *count = retCount; 366 return status; 367 } 368}; 369 370IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); 371 372// ---------------------------------------------------------------------- 373 374 375status_t BnAudioPolicyService::onTransact( 376 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 377{ 378 switch(code) { 379 case SET_DEVICE_CONNECTION_STATE: { 380 CHECK_INTERFACE(IAudioPolicyService, data, reply); 381 audio_devices_t device = 382 static_cast <audio_devices_t>(data.readInt32()); 383 audio_policy_dev_state_t state = 384 static_cast <audio_policy_dev_state_t>(data.readInt32()); 385 const char *device_address = data.readCString(); 386 reply->writeInt32(static_cast<uint32_t> (setDeviceConnectionState(device, 387 state, 388 device_address))); 389 return NO_ERROR; 390 } break; 391 392 case GET_DEVICE_CONNECTION_STATE: { 393 CHECK_INTERFACE(IAudioPolicyService, data, reply); 394 audio_devices_t device = 395 static_cast<audio_devices_t> (data.readInt32()); 396 const char *device_address = data.readCString(); 397 reply->writeInt32(static_cast<uint32_t> (getDeviceConnectionState(device, 398 device_address))); 399 return NO_ERROR; 400 } break; 401 402 case SET_PHONE_STATE: { 403 CHECK_INTERFACE(IAudioPolicyService, data, reply); 404 reply->writeInt32(static_cast <uint32_t>(setPhoneState((audio_mode_t) data.readInt32()))); 405 return NO_ERROR; 406 } break; 407 408 case SET_RINGER_MODE: { 409 CHECK_INTERFACE(IAudioPolicyService, data, reply); 410 uint32_t mode = data.readInt32(); 411 uint32_t mask = data.readInt32(); 412 reply->writeInt32(static_cast <uint32_t>(setRingerMode(mode, mask))); 413 return NO_ERROR; 414 } break; 415 416 case SET_FORCE_USE: { 417 CHECK_INTERFACE(IAudioPolicyService, data, reply); 418 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(data.readInt32()); 419 audio_policy_forced_cfg_t config = 420 static_cast <audio_policy_forced_cfg_t>(data.readInt32()); 421 reply->writeInt32(static_cast <uint32_t>(setForceUse(usage, config))); 422 return NO_ERROR; 423 } break; 424 425 case GET_FORCE_USE: { 426 CHECK_INTERFACE(IAudioPolicyService, data, reply); 427 audio_policy_force_use_t usage = static_cast <audio_policy_force_use_t>(data.readInt32()); 428 reply->writeInt32(static_cast <uint32_t>(getForceUse(usage))); 429 return NO_ERROR; 430 } break; 431 432 case GET_OUTPUT: { 433 CHECK_INTERFACE(IAudioPolicyService, data, reply); 434 audio_stream_type_t stream = 435 static_cast <audio_stream_type_t>(data.readInt32()); 436 uint32_t samplingRate = data.readInt32(); 437 uint32_t format = data.readInt32(); 438 uint32_t channels = data.readInt32(); 439 audio_policy_output_flags_t flags = 440 static_cast <audio_policy_output_flags_t>(data.readInt32()); 441 442 audio_io_handle_t output = getOutput(stream, 443 samplingRate, 444 format, 445 channels, 446 flags); 447 reply->writeInt32(static_cast <int>(output)); 448 return NO_ERROR; 449 } break; 450 451 case START_OUTPUT: { 452 CHECK_INTERFACE(IAudioPolicyService, data, reply); 453 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 454 uint32_t stream = data.readInt32(); 455 int session = data.readInt32(); 456 reply->writeInt32(static_cast <uint32_t>(startOutput(output, 457 (audio_stream_type_t)stream, 458 session))); 459 return NO_ERROR; 460 } break; 461 462 case STOP_OUTPUT: { 463 CHECK_INTERFACE(IAudioPolicyService, data, reply); 464 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 465 uint32_t stream = data.readInt32(); 466 int session = data.readInt32(); 467 reply->writeInt32(static_cast <uint32_t>(stopOutput(output, 468 (audio_stream_type_t)stream, 469 session))); 470 return NO_ERROR; 471 } break; 472 473 case RELEASE_OUTPUT: { 474 CHECK_INTERFACE(IAudioPolicyService, data, reply); 475 audio_io_handle_t output = static_cast <audio_io_handle_t>(data.readInt32()); 476 releaseOutput(output); 477 return NO_ERROR; 478 } break; 479 480 case GET_INPUT: { 481 CHECK_INTERFACE(IAudioPolicyService, data, reply); 482 int inputSource = data.readInt32(); 483 uint32_t samplingRate = data.readInt32(); 484 uint32_t format = data.readInt32(); 485 uint32_t channels = data.readInt32(); 486 audio_in_acoustics_t acoustics = 487 static_cast <audio_in_acoustics_t>(data.readInt32()); 488 int audioSession = data.readInt32(); 489 audio_io_handle_t input = getInput(inputSource, 490 samplingRate, 491 format, 492 channels, 493 acoustics, 494 audioSession); 495 reply->writeInt32(static_cast <int>(input)); 496 return NO_ERROR; 497 } break; 498 499 case START_INPUT: { 500 CHECK_INTERFACE(IAudioPolicyService, data, reply); 501 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 502 reply->writeInt32(static_cast <uint32_t>(startInput(input))); 503 return NO_ERROR; 504 } break; 505 506 case STOP_INPUT: { 507 CHECK_INTERFACE(IAudioPolicyService, data, reply); 508 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 509 reply->writeInt32(static_cast <uint32_t>(stopInput(input))); 510 return NO_ERROR; 511 } break; 512 513 case RELEASE_INPUT: { 514 CHECK_INTERFACE(IAudioPolicyService, data, reply); 515 audio_io_handle_t input = static_cast <audio_io_handle_t>(data.readInt32()); 516 releaseInput(input); 517 return NO_ERROR; 518 } break; 519 520 case INIT_STREAM_VOLUME: { 521 CHECK_INTERFACE(IAudioPolicyService, data, reply); 522 audio_stream_type_t stream = 523 static_cast <audio_stream_type_t>(data.readInt32()); 524 int indexMin = data.readInt32(); 525 int indexMax = data.readInt32(); 526 reply->writeInt32(static_cast <uint32_t>(initStreamVolume(stream, indexMin,indexMax))); 527 return NO_ERROR; 528 } break; 529 530 case SET_STREAM_VOLUME: { 531 CHECK_INTERFACE(IAudioPolicyService, data, reply); 532 audio_stream_type_t stream = 533 static_cast <audio_stream_type_t>(data.readInt32()); 534 int index = data.readInt32(); 535 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 536 reply->writeInt32(static_cast <uint32_t>(setStreamVolumeIndex(stream, 537 index, 538 device))); 539 return NO_ERROR; 540 } break; 541 542 case GET_STREAM_VOLUME: { 543 CHECK_INTERFACE(IAudioPolicyService, data, reply); 544 audio_stream_type_t stream = 545 static_cast <audio_stream_type_t>(data.readInt32()); 546 audio_devices_t device = static_cast <audio_devices_t>(data.readInt32()); 547 int index; 548 status_t status = getStreamVolumeIndex(stream, &index, device); 549 reply->writeInt32(index); 550 reply->writeInt32(static_cast <uint32_t>(status)); 551 return NO_ERROR; 552 } break; 553 554 case GET_STRATEGY_FOR_STREAM: { 555 CHECK_INTERFACE(IAudioPolicyService, data, reply); 556 audio_stream_type_t stream = 557 static_cast <audio_stream_type_t>(data.readInt32()); 558 reply->writeInt32(getStrategyForStream(stream)); 559 return NO_ERROR; 560 } break; 561 562 case GET_DEVICES_FOR_STREAM: { 563 CHECK_INTERFACE(IAudioPolicyService, data, reply); 564 audio_stream_type_t stream = 565 static_cast <audio_stream_type_t>(data.readInt32()); 566 reply->writeInt32(static_cast <int>(getDevicesForStream(stream))); 567 return NO_ERROR; 568 } break; 569 570 case GET_OUTPUT_FOR_EFFECT: { 571 CHECK_INTERFACE(IAudioPolicyService, data, reply); 572 effect_descriptor_t desc; 573 data.read(&desc, sizeof(effect_descriptor_t)); 574 audio_io_handle_t output = getOutputForEffect(&desc); 575 reply->writeInt32(static_cast <int>(output)); 576 return NO_ERROR; 577 } break; 578 579 case REGISTER_EFFECT: { 580 CHECK_INTERFACE(IAudioPolicyService, data, reply); 581 effect_descriptor_t desc; 582 data.read(&desc, sizeof(effect_descriptor_t)); 583 audio_io_handle_t io = data.readInt32(); 584 uint32_t strategy = data.readInt32(); 585 int session = data.readInt32(); 586 int id = data.readInt32(); 587 reply->writeInt32(static_cast <int32_t>(registerEffect(&desc, 588 io, 589 strategy, 590 session, 591 id))); 592 return NO_ERROR; 593 } break; 594 595 case UNREGISTER_EFFECT: { 596 CHECK_INTERFACE(IAudioPolicyService, data, reply); 597 int id = data.readInt32(); 598 reply->writeInt32(static_cast <int32_t>(unregisterEffect(id))); 599 return NO_ERROR; 600 } break; 601 602 case SET_EFFECT_ENABLED: { 603 CHECK_INTERFACE(IAudioPolicyService, data, reply); 604 int id = data.readInt32(); 605 bool enabled = static_cast <bool>(data.readInt32()); 606 reply->writeInt32(static_cast <int32_t>(setEffectEnabled(id, enabled))); 607 return NO_ERROR; 608 } break; 609 610 case IS_STREAM_ACTIVE: { 611 CHECK_INTERFACE(IAudioPolicyService, data, reply); 612 audio_stream_type_t stream = (audio_stream_type_t) data.readInt32(); 613 uint32_t inPastMs = (uint32_t)data.readInt32(); 614 reply->writeInt32( isStreamActive((audio_stream_type_t) stream, inPastMs) ); 615 return NO_ERROR; 616 } break; 617 618 case QUERY_DEFAULT_PRE_PROCESSING: { 619 CHECK_INTERFACE(IAudioPolicyService, data, reply); 620 int audioSession = data.readInt32(); 621 uint32_t count = data.readInt32(); 622 uint32_t retCount = count; 623 effect_descriptor_t *descriptors = 624 (effect_descriptor_t *)new char[count * sizeof(effect_descriptor_t)]; 625 status_t status = queryDefaultPreProcessing(audioSession, descriptors, &retCount); 626 reply->writeInt32(status); 627 if (status != NO_ERROR && status != NO_MEMORY) { 628 retCount = 0; 629 } 630 reply->writeInt32(retCount); 631 if (retCount) { 632 if (retCount < count) { 633 count = retCount; 634 } 635 reply->write(descriptors, sizeof(effect_descriptor_t) * count); 636 } 637 delete[] descriptors; 638 return status; 639 } 640 641 default: 642 return BBinder::onTransact(code, data, reply, flags); 643 } 644} 645 646// ---------------------------------------------------------------------------- 647 648}; // namespace android 649