diff options
author | Eric Laurent <elaurent@google.com> | 2013-09-18 14:26:49 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-09-18 14:26:49 -0700 |
commit | dc8cae8c118e4aef4ef1f7b2c6f79becc1df4a05 (patch) | |
tree | ea0f76bad13db737ca85146367304b3397a111a3 /services/audioflinger/Effects.cpp | |
parent | b81332964f2f3fb83f056b539a4eeea245bb7999 (diff) | |
parent | bf5e23979a03da96ce1d63126c480103232f174b (diff) | |
download | frameworks_av-dc8cae8c118e4aef4ef1f7b2c6f79becc1df4a05.zip frameworks_av-dc8cae8c118e4aef4ef1f7b2c6f79becc1df4a05.tar.gz frameworks_av-dc8cae8c118e4aef4ef1f7b2c6f79becc1df4a05.tar.bz2 |
am bf5e2397: am 5baf2af5: more support for audio effect offload
* commit 'bf5e23979a03da96ce1d63126c480103232f174b':
more support for audio effect offload
Diffstat (limited to 'services/audioflinger/Effects.cpp')
-rw-r--r-- | services/audioflinger/Effects.cpp | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp index fc45caa..c6e78a6 100644 --- a/services/audioflinger/Effects.cpp +++ b/services/audioflinger/Effects.cpp @@ -765,6 +765,46 @@ bool AudioFlinger::EffectModule::purgeHandles() return enabled; } +status_t AudioFlinger::EffectModule::setOffloaded(bool offloaded, audio_io_handle_t io) +{ + Mutex::Autolock _l(mLock); + if (mStatus != NO_ERROR) { + return mStatus; + } + status_t status = NO_ERROR; + if ((mDescriptor.flags & EFFECT_FLAG_OFFLOAD_SUPPORTED) != 0) { + status_t cmdStatus; + uint32_t size = sizeof(status_t); + effect_offload_param_t cmd; + + cmd.isOffload = offloaded; + cmd.ioHandle = io; + status = (*mEffectInterface)->command(mEffectInterface, + EFFECT_CMD_OFFLOAD, + sizeof(effect_offload_param_t), + &cmd, + &size, + &cmdStatus); + if (status == NO_ERROR) { + status = cmdStatus; + } + mOffloaded = (status == NO_ERROR) ? offloaded : false; + } else { + if (offloaded) { + status = INVALID_OPERATION; + } + mOffloaded = false; + } + ALOGV("setOffloaded() offloaded %d io %d status %d", offloaded, io, status); + return status; +} + +bool AudioFlinger::EffectModule::isOffloaded() const +{ + Mutex::Autolock _l(mLock); + return mOffloaded; +} + void AudioFlinger::EffectModule::dump(int fd, const Vector<String16>& args) { const size_t SIZE = 256; @@ -933,14 +973,13 @@ status_t AudioFlinger::EffectHandle::enable() } mEnabled = false; } else { - //TODO: remove when effect offload is implemented - if (thread != 0) { + if (thread != 0 && !mEffect->isOffloadable()) { if ((thread->type() == ThreadBase::OFFLOAD)) { PlaybackThread *t = (PlaybackThread *)thread.get(); t->invalidateTracks(AUDIO_STREAM_MUSIC); } if (mEffect->sessionId() == AUDIO_SESSION_OUTPUT_MIX) { - thread->mAudioFlinger->onGlobalEffectEnable(); + thread->mAudioFlinger->onNonOffloadableGlobalEffectEnable(); } } } @@ -1729,12 +1768,12 @@ void AudioFlinger::EffectChain::checkSuspendOnEffectEnabled(const sp<EffectModul } } -bool AudioFlinger::EffectChain::isEnabled() +bool AudioFlinger::EffectChain::isNonOffloadableEnabled() { Mutex::Autolock _l(mLock); size_t size = mEffects.size(); for (size_t i = 0; i < size; i++) { - if (mEffects[i]->isEnabled()) { + if (mEffects[i]->isEnabled() && !mEffects[i]->isOffloadable()) { return true; } } |