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