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