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