summaryrefslogtreecommitdiffstats
path: root/services/audioflinger/Effects.cpp
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2013-09-18 14:26:49 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2013-09-18 14:26:49 -0700
commitdc8cae8c118e4aef4ef1f7b2c6f79becc1df4a05 (patch)
treeea0f76bad13db737ca85146367304b3397a111a3 /services/audioflinger/Effects.cpp
parentb81332964f2f3fb83f056b539a4eeea245bb7999 (diff)
parentbf5e23979a03da96ce1d63126c480103232f174b (diff)
downloadframeworks_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.cpp49
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;
}
}