1 /* 2 ** 3 ** Copyright 2012, 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 19 #define LOG_TAG "AudioFlinger" 20 //#define LOG_NDEBUG 0 21 22 #include "Configuration.h" 23 #include <utils/Log.h> 24 #include <audio_effects/effect_visualizer.h> 25 #include <audio_utils/primitives.h> 26 #include <private/media/AudioEffectShared.h> 27 #include <media/EffectsFactoryApi.h> 28 29 #include "AudioFlinger.h" 30 #include "ServiceUtilities.h" 31 32 // ---------------------------------------------------------------------------- 33 34 // Note: the following macro is used for extremely verbose logging message. In 35 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to 36 // 0; but one side effect of this is to turn all LOGV's as well. Some messages 37 // are so verbose that we want to suppress them even when we have ALOG_ASSERT 38 // turned on. Do not uncomment the #def below unless you really know what you 39 // are doing and want to see all of the extremely verbose messages. 40 //#define VERY_VERY_VERBOSE_LOGGING 41 #ifdef VERY_VERY_VERBOSE_LOGGING 42 #define ALOGVV ALOGV 43 #else 44 #define ALOGVV(a...) do { } while(0) 45 #endif 46 47 #define min(a, b) ((a) < (b) ? (a) : (b)) 48 49 namespace android { 50 51 // ---------------------------------------------------------------------------- 52 // EffectModule implementation 53 // ---------------------------------------------------------------------------- 54 55 #undef LOG_TAG 56 #define LOG_TAG "AudioFlinger::EffectModule" 57 58 AudioFlinger::EffectModule::EffectModule(ThreadBase *thread, 59 const wp<AudioFlinger::EffectChain>& chain, 60 effect_descriptor_t *desc, 61 int id, 62 audio_session_t sessionId) 63 : mPinned(sessionId > AUDIO_SESSION_OUTPUT_MIX), 64 mThread(thread), mChain(chain), mId(id), mSessionId(sessionId), 65 mDescriptor(*desc), 66 // mConfig is set by configure() and not used before then 67 mEffectInterface(NULL), 68 mStatus(NO_INIT), mState(IDLE), 69 // mMaxDisableWaitCnt is set by configure() and not used before then 70 // mDisableWaitCnt is set by process() and updateState() and not used before then 71 mSuspended(false), 72 mAudioFlinger(thread->mAudioFlinger) 73 { 74 ALOGV("Constructor %p", this); 75 int lStatus; 76 77 // create effect engine from effect factory 78 mStatus = EffectCreate(&desc->uuid, sessionId, thread->id(), &mEffectInterface); 79 80 if (mStatus != NO_ERROR) { 81 return; 82 } 83 lStatus = init(); 84 if (lStatus < 0) { 85 mStatus = lStatus; 86 goto Error; 87 } 88 89 ALOGV("Constructor success name %s, Interface %p", mDescriptor.name, mEffectInterface); 90 return; 91 Error: 92 EffectRelease(mEffectInterface); 93 mEffectInterface = NULL; 94 ALOGV("Constructor Error %d", mStatus); 95 } 96 97 AudioFlinger::EffectModule::~EffectModule() 98 { 99 ALOGV("Destructor %p", this); 100 if (mEffectInterface != NULL) { 101 remove_effect_from_hal_l(); 102 // release effect engine 103 EffectRelease(mEffectInterface); 104 } 105 } 106 107 status_t AudioFlinger::EffectModule::addHandle(EffectHandle *handle) 108 { 109 status_t status; 110 111 Mutex::Autolock _l(mLock); 112 int priority = handle->priority(); 113 size_t size = mHandles.size(); 114 EffectHandle *controlHandle = NULL; 115 size_t i; 116 for (i = 0; i < size; i++) { 117 EffectHandle *h = mHandles[i]; 118 if (h == NULL || h->destroyed_l()) { 119 continue; 120 } 121 // first non destroyed handle is considered in control 122 if (controlHandle == NULL) { 123 controlHandle = h; 124 } 125 if (h->priority() <= priority) { 126 break; 127 } 128 } 129 // if inserted in first place, move effect control from previous owner to this handle 130 if (i == 0) { 131 bool enabled = false; 132 if (controlHandle != NULL) { 133 enabled = controlHandle->enabled(); 134 controlHandle->setControl(false/*hasControl*/, true /*signal*/, enabled /*enabled*/); 135 } 136 handle->setControl(true /*hasControl*/, false /*signal*/, enabled /*enabled*/); 137 status = NO_ERROR; 138 } else { 139 status = ALREADY_EXISTS; 140 } 141 ALOGV("addHandle() %p added handle %p in position %zu", this, handle, i); 142 mHandles.insertAt(handle, i); 143 return status; 144 } 145 146 size_t AudioFlinger::EffectModule::removeHandle(EffectHandle *handle) 147 { 148 Mutex::Autolock _l(mLock); 149 size_t size = mHandles.size(); 150 size_t i; 151 for (i = 0; i < size; i++) { 152 if (mHandles[i] == handle) { 153 break; 154 } 155 } 156 if (i == size) { 157 return size; 158 } 159 ALOGV("removeHandle() %p removed handle %p in position %zu", this, handle, i); 160 161 mHandles.removeAt(i); 162 // if removed from first place, move effect control from this handle to next in line 163 if (i == 0) { 164 EffectHandle *h = controlHandle_l(); 165 if (h != NULL) { 166 h->setControl(true /*hasControl*/, true /*signal*/ , handle->enabled() /*enabled*/); 167 } 168 } 169 170 // Prevent calls to process() and other functions on effect interface from now on. 171 // The effect engine will be released by the destructor when the last strong reference on 172 // this object is released which can happen after next process is called. 173 if (mHandles.size() == 0 && !mPinned) { 174 mState = DESTROYED; 175 } 176 177 return mHandles.size(); 178 } 179 180 // must be called with EffectModule::mLock held 181 AudioFlinger::EffectHandle *AudioFlinger::EffectModule::controlHandle_l() 182 { 183 // the first valid handle in the list has control over the module 184 for (size_t i = 0; i < mHandles.size(); i++) { 185 EffectHandle *h = mHandles[i]; 186 if (h != NULL && !h->destroyed_l()) { 187 return h; 188 } 189 } 190 191 return NULL; 192 } 193 194 size_t AudioFlinger::EffectModule::disconnect(EffectHandle *handle, bool unpinIfLast) 195 { 196 ALOGV("disconnect() %p handle %p", this, handle); 197 // keep a strong reference on this EffectModule to avoid calling the 198 // destructor before we exit 199 sp<EffectModule> keep(this); 200 { 201 if (removeHandle(handle) == 0) { 202 if (!isPinned() || unpinIfLast) { 203 sp<ThreadBase> thread = mThread.promote(); 204 if (thread != 0) { 205 Mutex::Autolock _l(thread->mLock); 206 thread->removeEffect_l(this); 207 } 208 sp<AudioFlinger> af = mAudioFlinger.promote(); 209 if (af != 0) { 210 af->updateOrphanEffectChains(this); 211 } 212 AudioSystem::unregisterEffect(mId); 213 } 214 } 215 } 216 return mHandles.size(); 217 } 218 219 bool AudioFlinger::EffectModule::updateState() { 220 Mutex::Autolock _l(mLock); 221 222 bool started = false; 223 switch (mState) { 224 case RESTART: 225 reset_l(); 226 // FALL THROUGH 227 228 case STARTING: 229 // clear auxiliary effect input buffer for next accumulation 230 if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { 231 memset(mConfig.inputCfg.buffer.raw, 232 0, 233 mConfig.inputCfg.buffer.frameCount*sizeof(int32_t)); 234 } 235 if (start_l() == NO_ERROR) { 236 mState = ACTIVE; 237 started = true; 238 } else { 239 mState = IDLE; 240 } 241 break; 242 case STOPPING: 243 if (stop_l() == NO_ERROR) { 244 mDisableWaitCnt = mMaxDisableWaitCnt; 245 } else { 246 mDisableWaitCnt = 1; // will cause immediate transition to IDLE 247 } 248 mState = STOPPED; 249 break; 250 case STOPPED: 251 // mDisableWaitCnt is forced to 1 by process() when the engine indicates the end of the 252 // turn off sequence. 253 if (--mDisableWaitCnt == 0) { 254 reset_l(); 255 mState = IDLE; 256 } 257 break; 258 default: //IDLE , ACTIVE, DESTROYED 259 break; 260 } 261 262 return started; 263 } 264 265 void AudioFlinger::EffectModule::process() 266 { 267 Mutex::Autolock _l(mLock); 268 269 if (mState == DESTROYED || mEffectInterface == NULL || 270 mConfig.inputCfg.buffer.raw == NULL || 271 mConfig.outputCfg.buffer.raw == NULL) { 272 return; 273 } 274 275 if (isProcessEnabled()) { 276 // do 32 bit to 16 bit conversion for auxiliary effect input buffer 277 if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { 278 ditherAndClamp(mConfig.inputCfg.buffer.s32, 279 mConfig.inputCfg.buffer.s32, 280 mConfig.inputCfg.buffer.frameCount/2); 281 } 282 283 // do the actual processing in the effect engine 284 int ret = (*mEffectInterface)->process(mEffectInterface, 285 &mConfig.inputCfg.buffer, 286 &mConfig.outputCfg.buffer); 287 288 // force transition to IDLE state when engine is ready 289 if (mState == STOPPED && ret == -ENODATA) { 290 mDisableWaitCnt = 1; 291 } 292 293 // clear auxiliary effect input buffer for next accumulation 294 if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { 295 memset(mConfig.inputCfg.buffer.raw, 0, 296 mConfig.inputCfg.buffer.frameCount*sizeof(int32_t)); 297 } 298 } else if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_INSERT && 299 mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw) { 300 // If an insert effect is idle and input buffer is different from output buffer, 301 // accumulate input onto output 302 sp<EffectChain> chain = mChain.promote(); 303 if (chain != 0 && chain->activeTrackCnt() != 0) { 304 size_t frameCnt = mConfig.inputCfg.buffer.frameCount * 2; //always stereo here 305 int16_t *in = mConfig.inputCfg.buffer.s16; 306 int16_t *out = mConfig.outputCfg.buffer.s16; 307 for (size_t i = 0; i < frameCnt; i++) { 308 out[i] = clamp16((int32_t)out[i] + (int32_t)in[i]); 309 } 310 } 311 } 312 } 313 314 void AudioFlinger::EffectModule::reset_l() 315 { 316 if (mStatus != NO_ERROR || mEffectInterface == NULL) { 317 return; 318 } 319 (*mEffectInterface)->command(mEffectInterface, EFFECT_CMD_RESET, 0, NULL, 0, NULL); 320 } 321 322 status_t AudioFlinger::EffectModule::configure() 323 { 324 status_t status; 325 sp<ThreadBase> thread; 326 uint32_t size; 327 audio_channel_mask_t channelMask; 328 329 if (mEffectInterface == NULL) { 330 status = NO_INIT; 331 goto exit; 332 } 333 334 thread = mThread.promote(); 335 if (thread == 0) { 336 status = DEAD_OBJECT; 337 goto exit; 338 } 339 340 // TODO: handle configuration of effects replacing track process 341 channelMask = thread->channelMask(); 342 mConfig.outputCfg.channels = channelMask; 343 344 if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { 345 mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_MONO; 346 } else { 347 mConfig.inputCfg.channels = channelMask; 348 // TODO: Update this logic when multichannel effects are implemented. 349 // For offloaded tracks consider mono output as stereo for proper effect initialization 350 if (channelMask == AUDIO_CHANNEL_OUT_MONO) { 351 mConfig.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 352 mConfig.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 353 ALOGV("Overriding effect input and output as STEREO"); 354 } 355 } 356 357 mConfig.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 358 mConfig.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 359 mConfig.inputCfg.samplingRate = thread->sampleRate(); 360 mConfig.outputCfg.samplingRate = mConfig.inputCfg.samplingRate; 361 mConfig.inputCfg.bufferProvider.cookie = NULL; 362 mConfig.inputCfg.bufferProvider.getBuffer = NULL; 363 mConfig.inputCfg.bufferProvider.releaseBuffer = NULL; 364 mConfig.outputCfg.bufferProvider.cookie = NULL; 365 mConfig.outputCfg.bufferProvider.getBuffer = NULL; 366 mConfig.outputCfg.bufferProvider.releaseBuffer = NULL; 367 mConfig.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 368 // Insert effect: 369 // - in session AUDIO_SESSION_OUTPUT_MIX or AUDIO_SESSION_OUTPUT_STAGE, 370 // always overwrites output buffer: input buffer == output buffer 371 // - in other sessions: 372 // last effect in the chain accumulates in output buffer: input buffer != output buffer 373 // other effect: overwrites output buffer: input buffer == output buffer 374 // Auxiliary effect: 375 // accumulates in output buffer: input buffer != output buffer 376 // Therefore: accumulate <=> input buffer != output buffer 377 if (mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw) { 378 mConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 379 } else { 380 mConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_WRITE; 381 } 382 mConfig.inputCfg.mask = EFFECT_CONFIG_ALL; 383 mConfig.outputCfg.mask = EFFECT_CONFIG_ALL; 384 mConfig.inputCfg.buffer.frameCount = thread->frameCount(); 385 mConfig.outputCfg.buffer.frameCount = mConfig.inputCfg.buffer.frameCount; 386 387 ALOGV("configure() %p thread %p buffer %p framecount %zu", 388 this, thread.get(), mConfig.inputCfg.buffer.raw, mConfig.inputCfg.buffer.frameCount); 389 390 status_t cmdStatus; 391 size = sizeof(int); 392 status = (*mEffectInterface)->command(mEffectInterface, 393 EFFECT_CMD_SET_CONFIG, 394 sizeof(effect_config_t), 395 &mConfig, 396 &size, 397 &cmdStatus); 398 if (status == 0) { 399 status = cmdStatus; 400 } 401 402 if (status == 0 && 403 (memcmp(&mDescriptor.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0)) { 404 uint32_t buf32[sizeof(effect_param_t) / sizeof(uint32_t) + 2]; 405 effect_param_t *p = (effect_param_t *)buf32; 406 407 p->psize = sizeof(uint32_t); 408 p->vsize = sizeof(uint32_t); 409 size = sizeof(int); 410 *(int32_t *)p->data = VISUALIZER_PARAM_LATENCY; 411 412 uint32_t latency = 0; 413 PlaybackThread *pbt = thread->mAudioFlinger->checkPlaybackThread_l(thread->mId); 414 if (pbt != NULL) { 415 latency = pbt->latency_l(); 416 } 417 418 *((int32_t *)p->data + 1)= latency; 419 (*mEffectInterface)->command(mEffectInterface, 420 EFFECT_CMD_SET_PARAM, 421 sizeof(effect_param_t) + 8, 422 &buf32, 423 &size, 424 &cmdStatus); 425 } 426 427 mMaxDisableWaitCnt = (MAX_DISABLE_TIME_MS * mConfig.outputCfg.samplingRate) / 428 (1000 * mConfig.outputCfg.buffer.frameCount); 429 430 exit: 431 mStatus = status; 432 return status; 433 } 434 435 status_t AudioFlinger::EffectModule::init() 436 { 437 Mutex::Autolock _l(mLock); 438 if (mEffectInterface == NULL) { 439 return NO_INIT; 440 } 441 status_t cmdStatus; 442 uint32_t size = sizeof(status_t); 443 status_t status = (*mEffectInterface)->command(mEffectInterface, 444 EFFECT_CMD_INIT, 445 0, 446 NULL, 447 &size, 448 &cmdStatus); 449 if (status == 0) { 450 status = cmdStatus; 451 } 452 return status; 453 } 454 455 void AudioFlinger::EffectModule::addEffectToHal_l() 456 { 457 if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC || 458 (mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_POST_PROC) { 459 sp<ThreadBase> thread = mThread.promote(); 460 if (thread != 0) { 461 audio_stream_t *stream = thread->stream(); 462 if (stream != NULL) { 463 stream->add_audio_effect(stream, mEffectInterface); 464 } 465 } 466 } 467 } 468 469 // start() must be called with PlaybackThread::mLock or EffectChain::mLock held 470 status_t AudioFlinger::EffectModule::start() 471 { 472 sp<EffectChain> chain; 473 status_t status; 474 { 475 Mutex::Autolock _l(mLock); 476 status = start_l(); 477 if (status == NO_ERROR) { 478 chain = mChain.promote(); 479 } 480 } 481 if (chain != 0) { 482 chain->resetVolume_l(); 483 } 484 return status; 485 } 486 487 status_t AudioFlinger::EffectModule::start_l() 488 { 489 if (mEffectInterface == NULL) { 490 return NO_INIT; 491 } 492 if (mStatus != NO_ERROR) { 493 return mStatus; 494 } 495 status_t cmdStatus; 496 uint32_t size = sizeof(status_t); 497 status_t status = (*mEffectInterface)->command(mEffectInterface, 498 EFFECT_CMD_ENABLE, 499 0, 500 NULL, 501 &size, 502 &cmdStatus); 503 if (status == 0) { 504 status = cmdStatus; 505 } 506 if (status == 0) { 507 addEffectToHal_l(); 508 } 509 return status; 510 } 511 512 status_t AudioFlinger::EffectModule::stop() 513 { 514 Mutex::Autolock _l(mLock); 515 return stop_l(); 516 } 517 518 status_t AudioFlinger::EffectModule::stop_l() 519 { 520 if (mEffectInterface == NULL) { 521 return NO_INIT; 522 } 523 if (mStatus != NO_ERROR) { 524 return mStatus; 525 } 526 status_t cmdStatus = NO_ERROR; 527 uint32_t size = sizeof(status_t); 528 status_t status = (*mEffectInterface)->command(mEffectInterface, 529 EFFECT_CMD_DISABLE, 530 0, 531 NULL, 532 &size, 533 &cmdStatus); 534 if (status == NO_ERROR) { 535 status = cmdStatus; 536 } 537 if (status == NO_ERROR) { 538 status = remove_effect_from_hal_l(); 539 } 540 return status; 541 } 542 543 status_t AudioFlinger::EffectModule::remove_effect_from_hal_l() 544 { 545 if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC || 546 (mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_POST_PROC) { 547 sp<ThreadBase> thread = mThread.promote(); 548 if (thread != 0) { 549 audio_stream_t *stream = thread->stream(); 550 if (stream != NULL) { 551 stream->remove_audio_effect(stream, mEffectInterface); 552 } 553 } 554 } 555 return NO_ERROR; 556 } 557 558 // round up delta valid if value and divisor are positive. 559 template <typename T> 560 static T roundUpDelta(const T &value, const T &divisor) { 561 T remainder = value % divisor; 562 return remainder == 0 ? 0 : divisor - remainder; 563 } 564 565 status_t AudioFlinger::EffectModule::command(uint32_t cmdCode, 566 uint32_t cmdSize, 567 void *pCmdData, 568 uint32_t *replySize, 569 void *pReplyData) 570 { 571 Mutex::Autolock _l(mLock); 572 ALOGVV("command(), cmdCode: %d, mEffectInterface: %p", cmdCode, mEffectInterface); 573 574 if (mState == DESTROYED || mEffectInterface == NULL) { 575 return NO_INIT; 576 } 577 if (mStatus != NO_ERROR) { 578 return mStatus; 579 } 580 if (cmdCode == EFFECT_CMD_GET_PARAM && 581 (*replySize < sizeof(effect_param_t) || 582 ((effect_param_t *)pCmdData)->psize > *replySize - sizeof(effect_param_t))) { 583 android_errorWriteLog(0x534e4554, "29251553"); 584 return -EINVAL; 585 } 586 if ((cmdCode == EFFECT_CMD_SET_PARAM 587 || cmdCode == EFFECT_CMD_SET_PARAM_DEFERRED) && // DEFERRED not generally used 588 (sizeof(effect_param_t) > cmdSize 589 || ((effect_param_t *)pCmdData)->psize > cmdSize 590 - sizeof(effect_param_t) 591 || ((effect_param_t *)pCmdData)->vsize > cmdSize 592 - sizeof(effect_param_t) 593 - ((effect_param_t *)pCmdData)->psize 594 || roundUpDelta(((effect_param_t *)pCmdData)->psize, (uint32_t)sizeof(int)) > 595 cmdSize 596 - sizeof(effect_param_t) 597 - ((effect_param_t *)pCmdData)->psize 598 - ((effect_param_t *)pCmdData)->vsize)) { 599 android_errorWriteLog(0x534e4554, "30204301"); 600 return -EINVAL; 601 } 602 status_t status = (*mEffectInterface)->command(mEffectInterface, 603 cmdCode, 604 cmdSize, 605 pCmdData, 606 replySize, 607 pReplyData); 608 if (cmdCode != EFFECT_CMD_GET_PARAM && status == NO_ERROR) { 609 uint32_t size = (replySize == NULL) ? 0 : *replySize; 610 for (size_t i = 1; i < mHandles.size(); i++) { 611 EffectHandle *h = mHandles[i]; 612 if (h != NULL && !h->destroyed_l()) { 613 h->commandExecuted(cmdCode, cmdSize, pCmdData, size, pReplyData); 614 } 615 } 616 } 617 return status; 618 } 619 620 status_t AudioFlinger::EffectModule::setEnabled(bool enabled) 621 { 622 Mutex::Autolock _l(mLock); 623 return setEnabled_l(enabled); 624 } 625 626 // must be called with EffectModule::mLock held 627 status_t AudioFlinger::EffectModule::setEnabled_l(bool enabled) 628 { 629 630 ALOGV("setEnabled %p enabled %d", this, enabled); 631 632 if (enabled != isEnabled()) { 633 status_t status = AudioSystem::setEffectEnabled(mId, enabled); 634 if (enabled && status != NO_ERROR) { 635 return status; 636 } 637 638 switch (mState) { 639 // going from disabled to enabled 640 case IDLE: 641 mState = STARTING; 642 break; 643 case STOPPED: 644 mState = RESTART; 645 break; 646 case STOPPING: 647 mState = ACTIVE; 648 break; 649 650 // going from enabled to disabled 651 case RESTART: 652 mState = STOPPED; 653 break; 654 case STARTING: 655 mState = IDLE; 656 break; 657 case ACTIVE: 658 mState = STOPPING; 659 break; 660 case DESTROYED: 661 return NO_ERROR; // simply ignore as we are being destroyed 662 } 663 for (size_t i = 1; i < mHandles.size(); i++) { 664 EffectHandle *h = mHandles[i]; 665 if (h != NULL && !h->destroyed_l()) { 666 h->setEnabled(enabled); 667 } 668 } 669 } 670 return NO_ERROR; 671 } 672 673 bool AudioFlinger::EffectModule::isEnabled() const 674 { 675 switch (mState) { 676 case RESTART: 677 case STARTING: 678 case ACTIVE: 679 return true; 680 case IDLE: 681 case STOPPING: 682 case STOPPED: 683 case DESTROYED: 684 default: 685 return false; 686 } 687 } 688 689 bool AudioFlinger::EffectModule::isProcessEnabled() const 690 { 691 if (mStatus != NO_ERROR) { 692 return false; 693 } 694 695 switch (mState) { 696 case RESTART: 697 case ACTIVE: 698 case STOPPING: 699 case STOPPED: 700 return true; 701 case IDLE: 702 case STARTING: 703 case DESTROYED: 704 default: 705 return false; 706 } 707 } 708 709 status_t AudioFlinger::EffectModule::setVolume(uint32_t *left, uint32_t *right, bool controller) 710 { 711 Mutex::Autolock _l(mLock); 712 if (mStatus != NO_ERROR) { 713 return mStatus; 714 } 715 status_t status = NO_ERROR; 716 // Send volume indication if EFFECT_FLAG_VOLUME_IND is set and read back altered volume 717 // if controller flag is set (Note that controller == TRUE => EFFECT_FLAG_VOLUME_CTRL set) 718 if (isProcessEnabled() && 719 ((mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK) == EFFECT_FLAG_VOLUME_CTRL || 720 (mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK) == EFFECT_FLAG_VOLUME_IND)) { 721 uint32_t volume[2]; 722 uint32_t *pVolume = NULL; 723 uint32_t size = sizeof(volume); 724 volume[0] = *left; 725 volume[1] = *right; 726 if (controller) { 727 pVolume = volume; 728 } 729 status = (*mEffectInterface)->command(mEffectInterface, 730 EFFECT_CMD_SET_VOLUME, 731 size, 732 volume, 733 &size, 734 pVolume); 735 if (controller && status == NO_ERROR && size == sizeof(volume)) { 736 *left = volume[0]; 737 *right = volume[1]; 738 } 739 } 740 return status; 741 } 742 743 status_t AudioFlinger::EffectModule::setDevice(audio_devices_t device) 744 { 745 if (device == AUDIO_DEVICE_NONE) { 746 return NO_ERROR; 747 } 748 749 Mutex::Autolock _l(mLock); 750 if (mStatus != NO_ERROR) { 751 return mStatus; 752 } 753 status_t status = NO_ERROR; 754 if ((mDescriptor.flags & EFFECT_FLAG_DEVICE_MASK) == EFFECT_FLAG_DEVICE_IND) { 755 status_t cmdStatus; 756 uint32_t size = sizeof(status_t); 757 uint32_t cmd = audio_is_output_devices(device) ? EFFECT_CMD_SET_DEVICE : 758 EFFECT_CMD_SET_INPUT_DEVICE; 759 status = (*mEffectInterface)->command(mEffectInterface, 760 cmd, 761 sizeof(uint32_t), 762 &device, 763 &size, 764 &cmdStatus); 765 } 766 return status; 767 } 768 769 status_t AudioFlinger::EffectModule::setMode(audio_mode_t mode) 770 { 771 Mutex::Autolock _l(mLock); 772 if (mStatus != NO_ERROR) { 773 return mStatus; 774 } 775 status_t status = NO_ERROR; 776 if ((mDescriptor.flags & EFFECT_FLAG_AUDIO_MODE_MASK) == EFFECT_FLAG_AUDIO_MODE_IND) { 777 status_t cmdStatus; 778 uint32_t size = sizeof(status_t); 779 status = (*mEffectInterface)->command(mEffectInterface, 780 EFFECT_CMD_SET_AUDIO_MODE, 781 sizeof(audio_mode_t), 782 &mode, 783 &size, 784 &cmdStatus); 785 if (status == NO_ERROR) { 786 status = cmdStatus; 787 } 788 } 789 return status; 790 } 791 792 status_t AudioFlinger::EffectModule::setAudioSource(audio_source_t source) 793 { 794 Mutex::Autolock _l(mLock); 795 if (mStatus != NO_ERROR) { 796 return mStatus; 797 } 798 status_t status = NO_ERROR; 799 if ((mDescriptor.flags & EFFECT_FLAG_AUDIO_SOURCE_MASK) == EFFECT_FLAG_AUDIO_SOURCE_IND) { 800 uint32_t size = 0; 801 status = (*mEffectInterface)->command(mEffectInterface, 802 EFFECT_CMD_SET_AUDIO_SOURCE, 803 sizeof(audio_source_t), 804 &source, 805 &size, 806 NULL); 807 } 808 return status; 809 } 810 811 void AudioFlinger::EffectModule::setSuspended(bool suspended) 812 { 813 Mutex::Autolock _l(mLock); 814 mSuspended = suspended; 815 } 816 817 bool AudioFlinger::EffectModule::suspended() const 818 { 819 Mutex::Autolock _l(mLock); 820 return mSuspended; 821 } 822 823 bool AudioFlinger::EffectModule::purgeHandles() 824 { 825 bool enabled = false; 826 Mutex::Autolock _l(mLock); 827 for (size_t i = 0; i < mHandles.size(); i++) { 828 EffectHandle *handle = mHandles[i]; 829 if (handle != NULL && !handle->destroyed_l()) { 830 handle->effect().clear(); 831 if (handle->hasControl()) { 832 enabled = handle->enabled(); 833 } 834 } 835 } 836 return enabled; 837 } 838 839 status_t AudioFlinger::EffectModule::setOffloaded(bool offloaded, audio_io_handle_t io) 840 { 841 Mutex::Autolock _l(mLock); 842 if (mStatus != NO_ERROR) { 843 return mStatus; 844 } 845 status_t status = NO_ERROR; 846 if ((mDescriptor.flags & EFFECT_FLAG_OFFLOAD_SUPPORTED) != 0) { 847 status_t cmdStatus; 848 uint32_t size = sizeof(status_t); 849 effect_offload_param_t cmd; 850 851 cmd.isOffload = offloaded; 852 cmd.ioHandle = io; 853 status = (*mEffectInterface)->command(mEffectInterface, 854 EFFECT_CMD_OFFLOAD, 855 sizeof(effect_offload_param_t), 856 &cmd, 857 &size, 858 &cmdStatus); 859 if (status == NO_ERROR) { 860 status = cmdStatus; 861 } 862 mOffloaded = (status == NO_ERROR) ? offloaded : false; 863 } else { 864 if (offloaded) { 865 status = INVALID_OPERATION; 866 } 867 mOffloaded = false; 868 } 869 ALOGV("setOffloaded() offloaded %d io %d status %d", offloaded, io, status); 870 return status; 871 } 872 873 bool AudioFlinger::EffectModule::isOffloaded() const 874 { 875 Mutex::Autolock _l(mLock); 876 return mOffloaded; 877 } 878 879 String8 effectFlagsToString(uint32_t flags) { 880 String8 s; 881 882 s.append("conn. mode: "); 883 switch (flags & EFFECT_FLAG_TYPE_MASK) { 884 case EFFECT_FLAG_TYPE_INSERT: s.append("insert"); break; 885 case EFFECT_FLAG_TYPE_AUXILIARY: s.append("auxiliary"); break; 886 case EFFECT_FLAG_TYPE_REPLACE: s.append("replace"); break; 887 case EFFECT_FLAG_TYPE_PRE_PROC: s.append("preproc"); break; 888 case EFFECT_FLAG_TYPE_POST_PROC: s.append("postproc"); break; 889 default: s.append("unknown/reserved"); break; 890 } 891 s.append(", "); 892 893 s.append("insert pref: "); 894 switch (flags & EFFECT_FLAG_INSERT_MASK) { 895 case EFFECT_FLAG_INSERT_ANY: s.append("any"); break; 896 case EFFECT_FLAG_INSERT_FIRST: s.append("first"); break; 897 case EFFECT_FLAG_INSERT_LAST: s.append("last"); break; 898 case EFFECT_FLAG_INSERT_EXCLUSIVE: s.append("exclusive"); break; 899 default: s.append("unknown/reserved"); break; 900 } 901 s.append(", "); 902 903 s.append("volume mgmt: "); 904 switch (flags & EFFECT_FLAG_VOLUME_MASK) { 905 case EFFECT_FLAG_VOLUME_NONE: s.append("none"); break; 906 case EFFECT_FLAG_VOLUME_CTRL: s.append("implements control"); break; 907 case EFFECT_FLAG_VOLUME_IND: s.append("requires indication"); break; 908 default: s.append("unknown/reserved"); break; 909 } 910 s.append(", "); 911 912 uint32_t devind = flags & EFFECT_FLAG_DEVICE_MASK; 913 if (devind) { 914 s.append("device indication: "); 915 switch (devind) { 916 case EFFECT_FLAG_DEVICE_IND: s.append("requires updates"); break; 917 default: s.append("unknown/reserved"); break; 918 } 919 s.append(", "); 920 } 921 922 s.append("input mode: "); 923 switch (flags & EFFECT_FLAG_INPUT_MASK) { 924 case EFFECT_FLAG_INPUT_DIRECT: s.append("direct"); break; 925 case EFFECT_FLAG_INPUT_PROVIDER: s.append("provider"); break; 926 case EFFECT_FLAG_INPUT_BOTH: s.append("direct+provider"); break; 927 default: s.append("not set"); break; 928 } 929 s.append(", "); 930 931 s.append("output mode: "); 932 switch (flags & EFFECT_FLAG_OUTPUT_MASK) { 933 case EFFECT_FLAG_OUTPUT_DIRECT: s.append("direct"); break; 934 case EFFECT_FLAG_OUTPUT_PROVIDER: s.append("provider"); break; 935 case EFFECT_FLAG_OUTPUT_BOTH: s.append("direct+provider"); break; 936 default: s.append("not set"); break; 937 } 938 s.append(", "); 939 940 uint32_t accel = flags & EFFECT_FLAG_HW_ACC_MASK; 941 if (accel) { 942 s.append("hardware acceleration: "); 943 switch (accel) { 944 case EFFECT_FLAG_HW_ACC_SIMPLE: s.append("non-tunneled"); break; 945 case EFFECT_FLAG_HW_ACC_TUNNEL: s.append("tunneled"); break; 946 default: s.append("unknown/reserved"); break; 947 } 948 s.append(", "); 949 } 950 951 uint32_t modeind = flags & EFFECT_FLAG_AUDIO_MODE_MASK; 952 if (modeind) { 953 s.append("mode indication: "); 954 switch (modeind) { 955 case EFFECT_FLAG_AUDIO_MODE_IND: s.append("required"); break; 956 default: s.append("unknown/reserved"); break; 957 } 958 s.append(", "); 959 } 960 961 uint32_t srcind = flags & EFFECT_FLAG_AUDIO_SOURCE_MASK; 962 if (srcind) { 963 s.append("source indication: "); 964 switch (srcind) { 965 case EFFECT_FLAG_AUDIO_SOURCE_IND: s.append("required"); break; 966 default: s.append("unknown/reserved"); break; 967 } 968 s.append(", "); 969 } 970 971 if (flags & EFFECT_FLAG_OFFLOAD_MASK) { 972 s.append("offloadable, "); 973 } 974 975 int len = s.length(); 976 if (s.length() > 2) { 977 (void) s.lockBuffer(len); 978 s.unlockBuffer(len - 2); 979 } 980 return s; 981 } 982 983 984 void AudioFlinger::EffectModule::dump(int fd, const Vector<String16>& args __unused) 985 { 986 const size_t SIZE = 256; 987 char buffer[SIZE]; 988 String8 result; 989 990 snprintf(buffer, SIZE, "\tEffect ID %d:\n", mId); 991 result.append(buffer); 992 993 bool locked = AudioFlinger::dumpTryLock(mLock); 994 // failed to lock - AudioFlinger is probably deadlocked 995 if (!locked) { 996 result.append("\t\tCould not lock Fx mutex:\n"); 997 } 998 999 result.append("\t\tSession Status State Engine:\n"); 1000 snprintf(buffer, SIZE, "\t\t%05d %03d %03d %p\n", 1001 mSessionId, mStatus, mState, mEffectInterface); 1002 result.append(buffer); 1003 1004 result.append("\t\tDescriptor:\n"); 1005 snprintf(buffer, SIZE, "\t\t- UUID: %08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X\n", 1006 mDescriptor.uuid.timeLow, mDescriptor.uuid.timeMid, mDescriptor.uuid.timeHiAndVersion, 1007 mDescriptor.uuid.clockSeq, mDescriptor.uuid.node[0], mDescriptor.uuid.node[1], 1008 mDescriptor.uuid.node[2], 1009 mDescriptor.uuid.node[3],mDescriptor.uuid.node[4],mDescriptor.uuid.node[5]); 1010 result.append(buffer); 1011 snprintf(buffer, SIZE, "\t\t- TYPE: %08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X\n", 1012 mDescriptor.type.timeLow, mDescriptor.type.timeMid, 1013 mDescriptor.type.timeHiAndVersion, 1014 mDescriptor.type.clockSeq, mDescriptor.type.node[0], mDescriptor.type.node[1], 1015 mDescriptor.type.node[2], 1016 mDescriptor.type.node[3],mDescriptor.type.node[4],mDescriptor.type.node[5]); 1017 result.append(buffer); 1018 snprintf(buffer, SIZE, "\t\t- apiVersion: %08X\n\t\t- flags: %08X (%s)\n", 1019 mDescriptor.apiVersion, 1020 mDescriptor.flags, 1021 effectFlagsToString(mDescriptor.flags).string()); 1022 result.append(buffer); 1023 snprintf(buffer, SIZE, "\t\t- name: %s\n", 1024 mDescriptor.name); 1025 result.append(buffer); 1026 snprintf(buffer, SIZE, "\t\t- implementor: %s\n", 1027 mDescriptor.implementor); 1028 result.append(buffer); 1029 1030 result.append("\t\t- Input configuration:\n"); 1031 result.append("\t\t\tFrames Smp rate Channels Format Buffer\n"); 1032 snprintf(buffer, SIZE, "\t\t\t%05zu %05d %08x %6d (%s) %p\n", 1033 mConfig.inputCfg.buffer.frameCount, 1034 mConfig.inputCfg.samplingRate, 1035 mConfig.inputCfg.channels, 1036 mConfig.inputCfg.format, 1037 formatToString((audio_format_t)mConfig.inputCfg.format), 1038 mConfig.inputCfg.buffer.raw); 1039 result.append(buffer); 1040 1041 result.append("\t\t- Output configuration:\n"); 1042 result.append("\t\t\tBuffer Frames Smp rate Channels Format\n"); 1043 snprintf(buffer, SIZE, "\t\t\t%p %05zu %05d %08x %d (%s)\n", 1044 mConfig.outputCfg.buffer.raw, 1045 mConfig.outputCfg.buffer.frameCount, 1046 mConfig.outputCfg.samplingRate, 1047 mConfig.outputCfg.channels, 1048 mConfig.outputCfg.format, 1049 formatToString((audio_format_t)mConfig.outputCfg.format)); 1050 result.append(buffer); 1051 1052 snprintf(buffer, SIZE, "\t\t%zu Clients:\n", mHandles.size()); 1053 result.append(buffer); 1054 result.append("\t\t\t Pid Priority Ctrl Locked client server\n"); 1055 for (size_t i = 0; i < mHandles.size(); ++i) { 1056 EffectHandle *handle = mHandles[i]; 1057 if (handle != NULL && !handle->destroyed_l()) { 1058 handle->dumpToBuffer(buffer, SIZE); 1059 result.append(buffer); 1060 } 1061 } 1062 1063 write(fd, result.string(), result.length()); 1064 1065 if (locked) { 1066 mLock.unlock(); 1067 } 1068 } 1069 1070 // ---------------------------------------------------------------------------- 1071 // EffectHandle implementation 1072 // ---------------------------------------------------------------------------- 1073 1074 #undef LOG_TAG 1075 #define LOG_TAG "AudioFlinger::EffectHandle" 1076 1077 AudioFlinger::EffectHandle::EffectHandle(const sp<EffectModule>& effect, 1078 const sp<AudioFlinger::Client>& client, 1079 const sp<IEffectClient>& effectClient, 1080 int32_t priority) 1081 : BnEffect(), 1082 mEffect(effect), mEffectClient(effectClient), mClient(client), mCblk(NULL), 1083 mPriority(priority), mHasControl(false), mEnabled(false), mDestroyed(false) 1084 { 1085 ALOGV("constructor %p", this); 1086 1087 if (client == 0) { 1088 return; 1089 } 1090 int bufOffset = ((sizeof(effect_param_cblk_t) - 1) / sizeof(int) + 1) * sizeof(int); 1091 mCblkMemory = client->heap()->allocate(EFFECT_PARAM_BUFFER_SIZE + bufOffset); 1092 if (mCblkMemory == 0 || 1093 (mCblk = static_cast<effect_param_cblk_t *>(mCblkMemory->pointer())) == NULL) { 1094 ALOGE("not enough memory for Effect size=%zu", EFFECT_PARAM_BUFFER_SIZE + 1095 sizeof(effect_param_cblk_t)); 1096 mCblkMemory.clear(); 1097 return; 1098 } 1099 new(mCblk) effect_param_cblk_t(); 1100 mBuffer = (uint8_t *)mCblk + bufOffset; 1101 } 1102 1103 AudioFlinger::EffectHandle::~EffectHandle() 1104 { 1105 ALOGV("Destructor %p", this); 1106 1107 if (mEffect == 0) { 1108 mDestroyed = true; 1109 return; 1110 } 1111 mEffect->lock(); 1112 mDestroyed = true; 1113 mEffect->unlock(); 1114 disconnect(false); 1115 } 1116 1117 status_t AudioFlinger::EffectHandle::initCheck() 1118 { 1119 return mClient == 0 || mCblkMemory != 0 ? OK : NO_MEMORY; 1120 } 1121 1122 status_t AudioFlinger::EffectHandle::enable() 1123 { 1124 ALOGV("enable %p", this); 1125 if (!mHasControl) { 1126 return INVALID_OPERATION; 1127 } 1128 if (mEffect == 0) { 1129 return DEAD_OBJECT; 1130 } 1131 1132 if (mEnabled) { 1133 return NO_ERROR; 1134 } 1135 1136 mEnabled = true; 1137 1138 sp<ThreadBase> thread = mEffect->thread().promote(); 1139 if (thread != 0) { 1140 thread->checkSuspendOnEffectEnabled(mEffect, true, mEffect->sessionId()); 1141 } 1142 1143 // checkSuspendOnEffectEnabled() can suspend this same effect when enabled 1144 if (mEffect->suspended()) { 1145 return NO_ERROR; 1146 } 1147 1148 status_t status = mEffect->setEnabled(true); 1149 if (status != NO_ERROR) { 1150 if (thread != 0) { 1151 thread->checkSuspendOnEffectEnabled(mEffect, false, mEffect->sessionId()); 1152 } 1153 mEnabled = false; 1154 } else { 1155 if (thread != 0) { 1156 if (thread->type() == ThreadBase::OFFLOAD) { 1157 PlaybackThread *t = (PlaybackThread *)thread.get(); 1158 Mutex::Autolock _l(t->mLock); 1159 t->broadcast_l(); 1160 } 1161 if (!mEffect->isOffloadable()) { 1162 if (thread->type() == ThreadBase::OFFLOAD) { 1163 PlaybackThread *t = (PlaybackThread *)thread.get(); 1164 t->invalidateTracks(AUDIO_STREAM_MUSIC); 1165 } 1166 if (mEffect->sessionId() == AUDIO_SESSION_OUTPUT_MIX) { 1167 thread->mAudioFlinger->onNonOffloadableGlobalEffectEnable(); 1168 } 1169 } 1170 } 1171 } 1172 return status; 1173 } 1174 1175 status_t AudioFlinger::EffectHandle::disable() 1176 { 1177 ALOGV("disable %p", this); 1178 if (!mHasControl) { 1179 return INVALID_OPERATION; 1180 } 1181 if (mEffect == 0) { 1182 return DEAD_OBJECT; 1183 } 1184 1185 if (!mEnabled) { 1186 return NO_ERROR; 1187 } 1188 mEnabled = false; 1189 1190 if (mEffect->suspended()) { 1191 return NO_ERROR; 1192 } 1193 1194 status_t status = mEffect->setEnabled(false); 1195 1196 sp<ThreadBase> thread = mEffect->thread().promote(); 1197 if (thread != 0) { 1198 thread->checkSuspendOnEffectEnabled(mEffect, false, mEffect->sessionId()); 1199 if (thread->type() == ThreadBase::OFFLOAD) { 1200 PlaybackThread *t = (PlaybackThread *)thread.get(); 1201 Mutex::Autolock _l(t->mLock); 1202 t->broadcast_l(); 1203 } 1204 } 1205 1206 return status; 1207 } 1208 1209 void AudioFlinger::EffectHandle::disconnect() 1210 { 1211 disconnect(true); 1212 } 1213 1214 void AudioFlinger::EffectHandle::disconnect(bool unpinIfLast) 1215 { 1216 ALOGV("disconnect(%s)", unpinIfLast ? "true" : "false"); 1217 if (mEffect == 0) { 1218 return; 1219 } 1220 // restore suspended effects if the disconnected handle was enabled and the last one. 1221 if ((mEffect->disconnect(this, unpinIfLast) == 0) && mEnabled) { 1222 sp<ThreadBase> thread = mEffect->thread().promote(); 1223 if (thread != 0) { 1224 thread->checkSuspendOnEffectEnabled(mEffect, false, mEffect->sessionId()); 1225 } 1226 } 1227 1228 // release sp on module => module destructor can be called now 1229 mEffect.clear(); 1230 if (mClient != 0) { 1231 if (mCblk != NULL) { 1232 // unlike ~TrackBase(), mCblk is never a local new, so don't delete 1233 mCblk->~effect_param_cblk_t(); // destroy our shared-structure. 1234 } 1235 mCblkMemory.clear(); // free the shared memory before releasing the heap it belongs to 1236 // Client destructor must run with AudioFlinger client mutex locked 1237 Mutex::Autolock _l(mClient->audioFlinger()->mClientLock); 1238 mClient.clear(); 1239 } 1240 } 1241 1242 status_t AudioFlinger::EffectHandle::command(uint32_t cmdCode, 1243 uint32_t cmdSize, 1244 void *pCmdData, 1245 uint32_t *replySize, 1246 void *pReplyData) 1247 { 1248 ALOGVV("command(), cmdCode: %d, mHasControl: %d, mEffect: %p", 1249 cmdCode, mHasControl, (mEffect == 0) ? 0 : mEffect.get()); 1250 1251 // only get parameter command is permitted for applications not controlling the effect 1252 if (!mHasControl && cmdCode != EFFECT_CMD_GET_PARAM) { 1253 return INVALID_OPERATION; 1254 } 1255 if (mEffect == 0) { 1256 return DEAD_OBJECT; 1257 } 1258 if (mClient == 0) { 1259 return INVALID_OPERATION; 1260 } 1261 1262 // handle commands that are not forwarded transparently to effect engine 1263 if (cmdCode == EFFECT_CMD_SET_PARAM_COMMIT) { 1264 // No need to trylock() here as this function is executed in the binder thread serving a 1265 // particular client process: no risk to block the whole media server process or mixer 1266 // threads if we are stuck here 1267 Mutex::Autolock _l(mCblk->lock); 1268 if (mCblk->clientIndex > EFFECT_PARAM_BUFFER_SIZE || 1269 mCblk->serverIndex > EFFECT_PARAM_BUFFER_SIZE) { 1270 mCblk->serverIndex = 0; 1271 mCblk->clientIndex = 0; 1272 return BAD_VALUE; 1273 } 1274 status_t status = NO_ERROR; 1275 while (mCblk->serverIndex < mCblk->clientIndex) { 1276 int reply; 1277 uint32_t rsize = sizeof(int); 1278 int *p = (int *)(mBuffer + mCblk->serverIndex); 1279 int size = *p++; 1280 if (((uint8_t *)p + size) > mBuffer + mCblk->clientIndex) { 1281 ALOGW("command(): invalid parameter block size"); 1282 break; 1283 } 1284 effect_param_t *param = (effect_param_t *)p; 1285 if (param->psize == 0 || param->vsize == 0) { 1286 ALOGW("command(): null parameter or value size"); 1287 mCblk->serverIndex += size; 1288 continue; 1289 } 1290 uint32_t psize = sizeof(effect_param_t) + 1291 ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + 1292 param->vsize; 1293 status_t ret = mEffect->command(EFFECT_CMD_SET_PARAM, 1294 psize, 1295 p, 1296 &rsize, 1297 &reply); 1298 // stop at first error encountered 1299 if (ret != NO_ERROR) { 1300 status = ret; 1301 *(int *)pReplyData = reply; 1302 break; 1303 } else if (reply != NO_ERROR) { 1304 *(int *)pReplyData = reply; 1305 break; 1306 } 1307 mCblk->serverIndex += size; 1308 } 1309 mCblk->serverIndex = 0; 1310 mCblk->clientIndex = 0; 1311 return status; 1312 } else if (cmdCode == EFFECT_CMD_ENABLE) { 1313 *(int *)pReplyData = NO_ERROR; 1314 return enable(); 1315 } else if (cmdCode == EFFECT_CMD_DISABLE) { 1316 *(int *)pReplyData = NO_ERROR; 1317 return disable(); 1318 } 1319 1320 return mEffect->command(cmdCode, cmdSize, pCmdData, replySize, pReplyData); 1321 } 1322 1323 void AudioFlinger::EffectHandle::setControl(bool hasControl, bool signal, bool enabled) 1324 { 1325 ALOGV("setControl %p control %d", this, hasControl); 1326 1327 mHasControl = hasControl; 1328 mEnabled = enabled; 1329 1330 if (signal && mEffectClient != 0) { 1331 mEffectClient->controlStatusChanged(hasControl); 1332 } 1333 } 1334 1335 void AudioFlinger::EffectHandle::commandExecuted(uint32_t cmdCode, 1336 uint32_t cmdSize, 1337 void *pCmdData, 1338 uint32_t replySize, 1339 void *pReplyData) 1340 { 1341 if (mEffectClient != 0) { 1342 mEffectClient->commandExecuted(cmdCode, cmdSize, pCmdData, replySize, pReplyData); 1343 } 1344 } 1345 1346 1347 1348 void AudioFlinger::EffectHandle::setEnabled(bool enabled) 1349 { 1350 if (mEffectClient != 0) { 1351 mEffectClient->enableStatusChanged(enabled); 1352 } 1353 } 1354 1355 status_t AudioFlinger::EffectHandle::onTransact( 1356 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1357 { 1358 return BnEffect::onTransact(code, data, reply, flags); 1359 } 1360 1361 1362 void AudioFlinger::EffectHandle::dumpToBuffer(char* buffer, size_t size) 1363 { 1364 bool locked = mCblk != NULL && AudioFlinger::dumpTryLock(mCblk->lock); 1365 1366 snprintf(buffer, size, "\t\t\t%5d %5d %3s %3s %5u %5u\n", 1367 (mClient == 0) ? getpid_cached : mClient->pid(), 1368 mPriority, 1369 mHasControl ? "yes" : "no", 1370 locked ? "yes" : "no", 1371 mCblk ? mCblk->clientIndex : 0, 1372 mCblk ? mCblk->serverIndex : 0 1373 ); 1374 1375 if (locked) { 1376 mCblk->lock.unlock(); 1377 } 1378 } 1379 1380 #undef LOG_TAG 1381 #define LOG_TAG "AudioFlinger::EffectChain" 1382 1383 AudioFlinger::EffectChain::EffectChain(ThreadBase *thread, 1384 audio_session_t sessionId) 1385 : mThread(thread), mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), mTailBufferCount(0), 1386 mOwnInBuffer(false), mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX), 1387 mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX) 1388 { 1389 mStrategy = AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC); 1390 if (thread == NULL) { 1391 return; 1392 } 1393 mMaxTailBuffers = ((kProcessTailDurationMs * thread->sampleRate()) / 1000) / 1394 thread->frameCount(); 1395 } 1396 1397 AudioFlinger::EffectChain::~EffectChain() 1398 { 1399 if (mOwnInBuffer) { 1400 delete mInBuffer; 1401 } 1402 1403 } 1404 1405 // getEffectFromDesc_l() must be called with ThreadBase::mLock held 1406 sp<AudioFlinger::EffectModule> AudioFlinger::EffectChain::getEffectFromDesc_l( 1407 effect_descriptor_t *descriptor) 1408 { 1409 size_t size = mEffects.size(); 1410 1411 for (size_t i = 0; i < size; i++) { 1412 if (memcmp(&mEffects[i]->desc().uuid, &descriptor->uuid, sizeof(effect_uuid_t)) == 0) { 1413 return mEffects[i]; 1414 } 1415 } 1416 return 0; 1417 } 1418 1419 // getEffectFromId_l() must be called with ThreadBase::mLock held 1420 sp<AudioFlinger::EffectModule> AudioFlinger::EffectChain::getEffectFromId_l(int id) 1421 { 1422 size_t size = mEffects.size(); 1423 1424 for (size_t i = 0; i < size; i++) { 1425 // by convention, return first effect if id provided is 0 (0 is never a valid id) 1426 if (id == 0 || mEffects[i]->id() == id) { 1427 return mEffects[i]; 1428 } 1429 } 1430 return 0; 1431 } 1432 1433 // getEffectFromType_l() must be called with ThreadBase::mLock held 1434 sp<AudioFlinger::EffectModule> AudioFlinger::EffectChain::getEffectFromType_l( 1435 const effect_uuid_t *type) 1436 { 1437 size_t size = mEffects.size(); 1438 1439 for (size_t i = 0; i < size; i++) { 1440 if (memcmp(&mEffects[i]->desc().type, type, sizeof(effect_uuid_t)) == 0) { 1441 return mEffects[i]; 1442 } 1443 } 1444 return 0; 1445 } 1446 1447 void AudioFlinger::EffectChain::clearInputBuffer() 1448 { 1449 Mutex::Autolock _l(mLock); 1450 sp<ThreadBase> thread = mThread.promote(); 1451 if (thread == 0) { 1452 ALOGW("clearInputBuffer(): cannot promote mixer thread"); 1453 return; 1454 } 1455 clearInputBuffer_l(thread); 1456 } 1457 1458 // Must be called with EffectChain::mLock locked 1459 void AudioFlinger::EffectChain::clearInputBuffer_l(sp<ThreadBase> thread) 1460 { 1461 // TODO: This will change in the future, depending on multichannel 1462 // and sample format changes for effects. 1463 // Currently effects processing is only available for stereo, AUDIO_FORMAT_PCM_16_BIT 1464 // (4 bytes frame size) 1465 const size_t frameSize = 1466 audio_bytes_per_sample(AUDIO_FORMAT_PCM_16_BIT) * min(FCC_2, thread->channelCount()); 1467 memset(mInBuffer, 0, thread->frameCount() * frameSize); 1468 } 1469 1470 // Must be called with EffectChain::mLock locked 1471 void AudioFlinger::EffectChain::process_l() 1472 { 1473 sp<ThreadBase> thread = mThread.promote(); 1474 if (thread == 0) { 1475 ALOGW("process_l(): cannot promote mixer thread"); 1476 return; 1477 } 1478 bool isGlobalSession = (mSessionId == AUDIO_SESSION_OUTPUT_MIX) || 1479 (mSessionId == AUDIO_SESSION_OUTPUT_STAGE); 1480 // never process effects when: 1481 // - on an OFFLOAD thread 1482 // - no more tracks are on the session and the effect tail has been rendered 1483 bool doProcess = (thread->type() != ThreadBase::OFFLOAD); 1484 if (!isGlobalSession) { 1485 bool tracksOnSession = (trackCnt() != 0); 1486 1487 if (!tracksOnSession && mTailBufferCount == 0) { 1488 doProcess = false; 1489 } 1490 1491 if (activeTrackCnt() == 0) { 1492 // if no track is active and the effect tail has not been rendered, 1493 // the input buffer must be cleared here as the mixer process will not do it 1494 if (tracksOnSession || mTailBufferCount > 0) { 1495 clearInputBuffer_l(thread); 1496 if (mTailBufferCount > 0) { 1497 mTailBufferCount--; 1498 } 1499 } 1500 } 1501 } 1502 1503 size_t size = mEffects.size(); 1504 if (doProcess) { 1505 for (size_t i = 0; i < size; i++) { 1506 mEffects[i]->process(); 1507 } 1508 } 1509 bool doResetVolume = false; 1510 for (size_t i = 0; i < size; i++) { 1511 doResetVolume = mEffects[i]->updateState() || doResetVolume; 1512 } 1513 if (doResetVolume) { 1514 resetVolume_l(); 1515 } 1516 } 1517 1518 // addEffect_l() must be called with PlaybackThread::mLock held 1519 status_t AudioFlinger::EffectChain::addEffect_l(const sp<EffectModule>& effect) 1520 { 1521 effect_descriptor_t desc = effect->desc(); 1522 uint32_t insertPref = desc.flags & EFFECT_FLAG_INSERT_MASK; 1523 1524 Mutex::Autolock _l(mLock); 1525 effect->setChain(this); 1526 sp<ThreadBase> thread = mThread.promote(); 1527 if (thread == 0) { 1528 return NO_INIT; 1529 } 1530 effect->setThread(thread); 1531 1532 if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { 1533 // Auxiliary effects are inserted at the beginning of mEffects vector as 1534 // they are processed first and accumulated in chain input buffer 1535 mEffects.insertAt(effect, 0); 1536 1537 // the input buffer for auxiliary effect contains mono samples in 1538 // 32 bit format. This is to avoid saturation in AudoMixer 1539 // accumulation stage. Saturation is done in EffectModule::process() before 1540 // calling the process in effect engine 1541 size_t numSamples = thread->frameCount(); 1542 int32_t *buffer = new int32_t[numSamples]; 1543 memset(buffer, 0, numSamples * sizeof(int32_t)); 1544 effect->setInBuffer((int16_t *)buffer); 1545 // auxiliary effects output samples to chain input buffer for further processing 1546 // by insert effects 1547 effect->setOutBuffer(mInBuffer); 1548 } else { 1549 // Insert effects are inserted at the end of mEffects vector as they are processed 1550 // after track and auxiliary effects. 1551 // Insert effect order as a function of indicated preference: 1552 // if EFFECT_FLAG_INSERT_EXCLUSIVE, insert in first position or reject if 1553 // another effect is present 1554 // else if EFFECT_FLAG_INSERT_FIRST, insert in first position or after the 1555 // last effect claiming first position 1556 // else if EFFECT_FLAG_INSERT_LAST, insert in last position or before the 1557 // first effect claiming last position 1558 // else if EFFECT_FLAG_INSERT_ANY insert after first or before last 1559 // Reject insertion if an effect with EFFECT_FLAG_INSERT_EXCLUSIVE is 1560 // already present 1561 1562 size_t size = mEffects.size(); 1563 size_t idx_insert = size; 1564 ssize_t idx_insert_first = -1; 1565 ssize_t idx_insert_last = -1; 1566 1567 for (size_t i = 0; i < size; i++) { 1568 effect_descriptor_t d = mEffects[i]->desc(); 1569 uint32_t iMode = d.flags & EFFECT_FLAG_TYPE_MASK; 1570 uint32_t iPref = d.flags & EFFECT_FLAG_INSERT_MASK; 1571 if (iMode == EFFECT_FLAG_TYPE_INSERT) { 1572 // check invalid effect chaining combinations 1573 if (insertPref == EFFECT_FLAG_INSERT_EXCLUSIVE || 1574 iPref == EFFECT_FLAG_INSERT_EXCLUSIVE) { 1575 ALOGW("addEffect_l() could not insert effect %s: exclusive conflict with %s", 1576 desc.name, d.name); 1577 return INVALID_OPERATION; 1578 } 1579 // remember position of first insert effect and by default 1580 // select this as insert position for new effect 1581 if (idx_insert == size) { 1582 idx_insert = i; 1583 } 1584 // remember position of last insert effect claiming 1585 // first position 1586 if (iPref == EFFECT_FLAG_INSERT_FIRST) { 1587 idx_insert_first = i; 1588 } 1589 // remember position of first insert effect claiming 1590 // last position 1591 if (iPref == EFFECT_FLAG_INSERT_LAST && 1592 idx_insert_last == -1) { 1593 idx_insert_last = i; 1594 } 1595 } 1596 } 1597 1598 // modify idx_insert from first position if needed 1599 if (insertPref == EFFECT_FLAG_INSERT_LAST) { 1600 if (idx_insert_last != -1) { 1601 idx_insert = idx_insert_last; 1602 } else { 1603 idx_insert = size; 1604 } 1605 } else { 1606 if (idx_insert_first != -1) { 1607 idx_insert = idx_insert_first + 1; 1608 } 1609 } 1610 1611 // always read samples from chain input buffer 1612 effect->setInBuffer(mInBuffer); 1613 1614 // if last effect in the chain, output samples to chain 1615 // output buffer, otherwise to chain input buffer 1616 if (idx_insert == size) { 1617 if (idx_insert != 0) { 1618 mEffects[idx_insert-1]->setOutBuffer(mInBuffer); 1619 mEffects[idx_insert-1]->configure(); 1620 } 1621 effect->setOutBuffer(mOutBuffer); 1622 } else { 1623 effect->setOutBuffer(mInBuffer); 1624 } 1625 mEffects.insertAt(effect, idx_insert); 1626 1627 ALOGV("addEffect_l() effect %p, added in chain %p at rank %zu", effect.get(), this, 1628 idx_insert); 1629 } 1630 effect->configure(); 1631 return NO_ERROR; 1632 } 1633 1634 // removeEffect_l() must be called with PlaybackThread::mLock held 1635 size_t AudioFlinger::EffectChain::removeEffect_l(const sp<EffectModule>& effect) 1636 { 1637 Mutex::Autolock _l(mLock); 1638 size_t size = mEffects.size(); 1639 uint32_t type = effect->desc().flags & EFFECT_FLAG_TYPE_MASK; 1640 1641 for (size_t i = 0; i < size; i++) { 1642 if (effect == mEffects[i]) { 1643 // calling stop here will remove pre-processing effect from the audio HAL. 1644 // This is safe as we hold the EffectChain mutex which guarantees that we are not in 1645 // the middle of a read from audio HAL 1646 if (mEffects[i]->state() == EffectModule::ACTIVE || 1647 mEffects[i]->state() == EffectModule::STOPPING) { 1648 mEffects[i]->stop(); 1649 } 1650 if (type == EFFECT_FLAG_TYPE_AUXILIARY) { 1651 delete[] effect->inBuffer(); 1652 } else { 1653 if (i == size - 1 && i != 0) { 1654 mEffects[i - 1]->setOutBuffer(mOutBuffer); 1655 mEffects[i - 1]->configure(); 1656 } 1657 } 1658 mEffects.removeAt(i); 1659 ALOGV("removeEffect_l() effect %p, removed from chain %p at rank %zu", effect.get(), 1660 this, i); 1661 break; 1662 } 1663 } 1664 1665 return mEffects.size(); 1666 } 1667 1668 // setDevice_l() must be called with PlaybackThread::mLock held 1669 void AudioFlinger::EffectChain::setDevice_l(audio_devices_t device) 1670 { 1671 size_t size = mEffects.size(); 1672 for (size_t i = 0; i < size; i++) { 1673 mEffects[i]->setDevice(device); 1674 } 1675 } 1676 1677 // setMode_l() must be called with PlaybackThread::mLock held 1678 void AudioFlinger::EffectChain::setMode_l(audio_mode_t mode) 1679 { 1680 size_t size = mEffects.size(); 1681 for (size_t i = 0; i < size; i++) { 1682 mEffects[i]->setMode(mode); 1683 } 1684 } 1685 1686 // setAudioSource_l() must be called with PlaybackThread::mLock held 1687 void AudioFlinger::EffectChain::setAudioSource_l(audio_source_t source) 1688 { 1689 size_t size = mEffects.size(); 1690 for (size_t i = 0; i < size; i++) { 1691 mEffects[i]->setAudioSource(source); 1692 } 1693 } 1694 1695 // setVolume_l() must be called with PlaybackThread::mLock or EffectChain::mLock held 1696 bool AudioFlinger::EffectChain::setVolume_l(uint32_t *left, uint32_t *right, bool force) 1697 { 1698 uint32_t newLeft = *left; 1699 uint32_t newRight = *right; 1700 bool hasControl = false; 1701 int ctrlIdx = -1; 1702 size_t size = mEffects.size(); 1703 1704 // first update volume controller 1705 for (size_t i = size; i > 0; i--) { 1706 if (mEffects[i - 1]->isProcessEnabled() && 1707 (mEffects[i - 1]->desc().flags & EFFECT_FLAG_VOLUME_MASK) == EFFECT_FLAG_VOLUME_CTRL) { 1708 ctrlIdx = i - 1; 1709 hasControl = true; 1710 break; 1711 } 1712 } 1713 1714 if (!force && ctrlIdx == mVolumeCtrlIdx && 1715 *left == mLeftVolume && *right == mRightVolume) { 1716 if (hasControl) { 1717 *left = mNewLeftVolume; 1718 *right = mNewRightVolume; 1719 } 1720 return hasControl; 1721 } 1722 1723 mVolumeCtrlIdx = ctrlIdx; 1724 mLeftVolume = newLeft; 1725 mRightVolume = newRight; 1726 1727 // second get volume update from volume controller 1728 if (ctrlIdx >= 0) { 1729 mEffects[ctrlIdx]->setVolume(&newLeft, &newRight, true); 1730 mNewLeftVolume = newLeft; 1731 mNewRightVolume = newRight; 1732 } 1733 // then indicate volume to all other effects in chain. 1734 // Pass altered volume to effects before volume controller 1735 // and requested volume to effects after controller 1736 uint32_t lVol = newLeft; 1737 uint32_t rVol = newRight; 1738 1739 for (size_t i = 0; i < size; i++) { 1740 if ((int)i == ctrlIdx) { 1741 continue; 1742 } 1743 // this also works for ctrlIdx == -1 when there is no volume controller 1744 if ((int)i > ctrlIdx) { 1745 lVol = *left; 1746 rVol = *right; 1747 } 1748 mEffects[i]->setVolume(&lVol, &rVol, false); 1749 } 1750 *left = newLeft; 1751 *right = newRight; 1752 1753 return hasControl; 1754 } 1755 1756 // resetVolume_l() must be called with PlaybackThread::mLock or EffectChain::mLock held 1757 void AudioFlinger::EffectChain::resetVolume_l() 1758 { 1759 if ((mLeftVolume != UINT_MAX) && (mRightVolume != UINT_MAX)) { 1760 uint32_t left = mLeftVolume; 1761 uint32_t right = mRightVolume; 1762 (void)setVolume_l(&left, &right, true); 1763 } 1764 } 1765 1766 void AudioFlinger::EffectChain::syncHalEffectsState() 1767 { 1768 Mutex::Autolock _l(mLock); 1769 for (size_t i = 0; i < mEffects.size(); i++) { 1770 if (mEffects[i]->state() == EffectModule::ACTIVE || 1771 mEffects[i]->state() == EffectModule::STOPPING) { 1772 mEffects[i]->addEffectToHal_l(); 1773 } 1774 } 1775 } 1776 1777 void AudioFlinger::EffectChain::dump(int fd, const Vector<String16>& args) 1778 { 1779 const size_t SIZE = 256; 1780 char buffer[SIZE]; 1781 String8 result; 1782 1783 size_t numEffects = mEffects.size(); 1784 snprintf(buffer, SIZE, " %zu effects for session %d\n", numEffects, mSessionId); 1785 result.append(buffer); 1786 1787 if (numEffects) { 1788 bool locked = AudioFlinger::dumpTryLock(mLock); 1789 // failed to lock - AudioFlinger is probably deadlocked 1790 if (!locked) { 1791 result.append("\tCould not lock mutex:\n"); 1792 } 1793 1794 result.append("\tIn buffer Out buffer Active tracks:\n"); 1795 snprintf(buffer, SIZE, "\t%p %p %d\n", 1796 mInBuffer, 1797 mOutBuffer, 1798 mActiveTrackCnt); 1799 result.append(buffer); 1800 write(fd, result.string(), result.size()); 1801 1802 for (size_t i = 0; i < numEffects; ++i) { 1803 sp<EffectModule> effect = mEffects[i]; 1804 if (effect != 0) { 1805 effect->dump(fd, args); 1806 } 1807 } 1808 1809 if (locked) { 1810 mLock.unlock(); 1811 } 1812 } 1813 } 1814 1815 // must be called with ThreadBase::mLock held 1816 void AudioFlinger::EffectChain::setEffectSuspended_l( 1817 const effect_uuid_t *type, bool suspend) 1818 { 1819 sp<SuspendedEffectDesc> desc; 1820 // use effect type UUID timelow as key as there is no real risk of identical 1821 // timeLow fields among effect type UUIDs. 1822 ssize_t index = mSuspendedEffects.indexOfKey(type->timeLow); 1823 if (suspend) { 1824 if (index >= 0) { 1825 desc = mSuspendedEffects.valueAt(index); 1826 } else { 1827 desc = new SuspendedEffectDesc(); 1828 desc->mType = *type; 1829 mSuspendedEffects.add(type->timeLow, desc); 1830 ALOGV("setEffectSuspended_l() add entry for %08x", type->timeLow); 1831 } 1832 if (desc->mRefCount++ == 0) { 1833 sp<EffectModule> effect = getEffectIfEnabled(type); 1834 if (effect != 0) { 1835 desc->mEffect = effect; 1836 effect->setSuspended(true); 1837 effect->setEnabled(false); 1838 } 1839 } 1840 } else { 1841 if (index < 0) { 1842 return; 1843 } 1844 desc = mSuspendedEffects.valueAt(index); 1845 if (desc->mRefCount <= 0) { 1846 ALOGW("setEffectSuspended_l() restore refcount should not be 0 %d", desc->mRefCount); 1847 desc->mRefCount = 1; 1848 } 1849 if (--desc->mRefCount == 0) { 1850 ALOGV("setEffectSuspended_l() remove entry for %08x", mSuspendedEffects.keyAt(index)); 1851 if (desc->mEffect != 0) { 1852 sp<EffectModule> effect = desc->mEffect.promote(); 1853 if (effect != 0) { 1854 effect->setSuspended(false); 1855 effect->lock(); 1856 EffectHandle *handle = effect->controlHandle_l(); 1857 if (handle != NULL && !handle->destroyed_l()) { 1858 effect->setEnabled_l(handle->enabled()); 1859 } 1860 effect->unlock(); 1861 } 1862 desc->mEffect.clear(); 1863 } 1864 mSuspendedEffects.removeItemsAt(index); 1865 } 1866 } 1867 } 1868 1869 // must be called with ThreadBase::mLock held 1870 void AudioFlinger::EffectChain::setEffectSuspendedAll_l(bool suspend) 1871 { 1872 sp<SuspendedEffectDesc> desc; 1873 1874 ssize_t index = mSuspendedEffects.indexOfKey((int)kKeyForSuspendAll); 1875 if (suspend) { 1876 if (index >= 0) { 1877 desc = mSuspendedEffects.valueAt(index); 1878 } else { 1879 desc = new SuspendedEffectDesc(); 1880 mSuspendedEffects.add((int)kKeyForSuspendAll, desc); 1881 ALOGV("setEffectSuspendedAll_l() add entry for 0"); 1882 } 1883 if (desc->mRefCount++ == 0) { 1884 Vector< sp<EffectModule> > effects; 1885 getSuspendEligibleEffects(effects); 1886 for (size_t i = 0; i < effects.size(); i++) { 1887 setEffectSuspended_l(&effects[i]->desc().type, true); 1888 } 1889 } 1890 } else { 1891 if (index < 0) { 1892 return; 1893 } 1894 desc = mSuspendedEffects.valueAt(index); 1895 if (desc->mRefCount <= 0) { 1896 ALOGW("setEffectSuspendedAll_l() restore refcount should not be 0 %d", desc->mRefCount); 1897 desc->mRefCount = 1; 1898 } 1899 if (--desc->mRefCount == 0) { 1900 Vector<const effect_uuid_t *> types; 1901 for (size_t i = 0; i < mSuspendedEffects.size(); i++) { 1902 if (mSuspendedEffects.keyAt(i) == (int)kKeyForSuspendAll) { 1903 continue; 1904 } 1905 types.add(&mSuspendedEffects.valueAt(i)->mType); 1906 } 1907 for (size_t i = 0; i < types.size(); i++) { 1908 setEffectSuspended_l(types[i], false); 1909 } 1910 ALOGV("setEffectSuspendedAll_l() remove entry for %08x", 1911 mSuspendedEffects.keyAt(index)); 1912 mSuspendedEffects.removeItem((int)kKeyForSuspendAll); 1913 } 1914 } 1915 } 1916 1917 1918 // The volume effect is used for automated tests only 1919 #ifndef OPENSL_ES_H_ 1920 static const effect_uuid_t SL_IID_VOLUME_ = { 0x09e8ede0, 0xddde, 0x11db, 0xb4f6, 1921 { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }; 1922 const effect_uuid_t * const SL_IID_VOLUME = &SL_IID_VOLUME_; 1923 #endif //OPENSL_ES_H_ 1924 1925 bool AudioFlinger::EffectChain::isEffectEligibleForSuspend(const effect_descriptor_t& desc) 1926 { 1927 // auxiliary effects and visualizer are never suspended on output mix 1928 if ((mSessionId == AUDIO_SESSION_OUTPUT_MIX) && 1929 (((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) || 1930 (memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) || 1931 (memcmp(&desc.type, SL_IID_VOLUME, sizeof(effect_uuid_t)) == 0))) { 1932 return false; 1933 } 1934 return true; 1935 } 1936 1937 void AudioFlinger::EffectChain::getSuspendEligibleEffects( 1938 Vector< sp<AudioFlinger::EffectModule> > &effects) 1939 { 1940 effects.clear(); 1941 for (size_t i = 0; i < mEffects.size(); i++) { 1942 if (isEffectEligibleForSuspend(mEffects[i]->desc())) { 1943 effects.add(mEffects[i]); 1944 } 1945 } 1946 } 1947 1948 sp<AudioFlinger::EffectModule> AudioFlinger::EffectChain::getEffectIfEnabled( 1949 const effect_uuid_t *type) 1950 { 1951 sp<EffectModule> effect = getEffectFromType_l(type); 1952 return effect != 0 && effect->isEnabled() ? effect : 0; 1953 } 1954 1955 void AudioFlinger::EffectChain::checkSuspendOnEffectEnabled(const sp<EffectModule>& effect, 1956 bool enabled) 1957 { 1958 ssize_t index = mSuspendedEffects.indexOfKey(effect->desc().type.timeLow); 1959 if (enabled) { 1960 if (index < 0) { 1961 // if the effect is not suspend check if all effects are suspended 1962 index = mSuspendedEffects.indexOfKey((int)kKeyForSuspendAll); 1963 if (index < 0) { 1964 return; 1965 } 1966 if (!isEffectEligibleForSuspend(effect->desc())) { 1967 return; 1968 } 1969 setEffectSuspended_l(&effect->desc().type, enabled); 1970 index = mSuspendedEffects.indexOfKey(effect->desc().type.timeLow); 1971 if (index < 0) { 1972 ALOGW("checkSuspendOnEffectEnabled() Fx should be suspended here!"); 1973 return; 1974 } 1975 } 1976 ALOGV("checkSuspendOnEffectEnabled() enable suspending fx %08x", 1977 effect->desc().type.timeLow); 1978 sp<SuspendedEffectDesc> desc = mSuspendedEffects.valueAt(index); 1979 // if effect is requested to suspended but was not yet enabled, supend it now. 1980 if (desc->mEffect == 0) { 1981 desc->mEffect = effect; 1982 effect->setEnabled(false); 1983 effect->setSuspended(true); 1984 } 1985 } else { 1986 if (index < 0) { 1987 return; 1988 } 1989 ALOGV("checkSuspendOnEffectEnabled() disable restoring fx %08x", 1990 effect->desc().type.timeLow); 1991 sp<SuspendedEffectDesc> desc = mSuspendedEffects.valueAt(index); 1992 desc->mEffect.clear(); 1993 effect->setSuspended(false); 1994 } 1995 } 1996 1997 bool AudioFlinger::EffectChain::isNonOffloadableEnabled() 1998 { 1999 Mutex::Autolock _l(mLock); 2000 size_t size = mEffects.size(); 2001 for (size_t i = 0; i < size; i++) { 2002 if (mEffects[i]->isEnabled() && !mEffects[i]->isOffloadable()) { 2003 return true; 2004 } 2005 } 2006 return false; 2007 } 2008 2009 void AudioFlinger::EffectChain::setThread(const sp<ThreadBase>& thread) 2010 { 2011 Mutex::Autolock _l(mLock); 2012 mThread = thread; 2013 for (size_t i = 0; i < mEffects.size(); i++) { 2014 mEffects[i]->setThread(thread); 2015 } 2016 } 2017 2018 bool AudioFlinger::EffectChain::hasSoftwareEffect() const 2019 { 2020 Mutex::Autolock _l(mLock); 2021 for (size_t i = 0; i < mEffects.size(); i++) { 2022 if (mEffects[i]->isImplementationSoftware()) { 2023 return true; 2024 } 2025 } 2026 return false; 2027 } 2028 2029 // isCompatibleWithThread_l() must be called with thread->mLock held 2030 bool AudioFlinger::EffectChain::isCompatibleWithThread_l(const sp<ThreadBase>& thread) const 2031 { 2032 Mutex::Autolock _l(mLock); 2033 for (size_t i = 0; i < mEffects.size(); i++) { 2034 if (thread->checkEffectCompatibility_l(&(mEffects[i]->desc()), mSessionId) != NO_ERROR) { 2035 return false; 2036 } 2037 } 2038 return true; 2039 } 2040 2041 } // namespace android 2042