From 582a15744be109fb630db7dbd1d1bdf22ff44f12 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 10 Aug 2011 20:16:23 -0700 Subject: AudioPolicyManager: register effect CPU on enable Audio effect CPU usage is now registered on enable and unregistered on disable instead of when the effect is created or destroyed. Change-Id: Icffcede9558d8d41887278f0efef2df430927381 --- audio/AudioPolicyManagerBase.cpp | 67 +++++++++++++++++++++++++++++----------- audio/audio_policy_hal.cpp | 7 +++++ 2 files changed, 56 insertions(+), 18 deletions(-) (limited to 'audio') diff --git a/audio/AudioPolicyManagerBase.cpp b/audio/AudioPolicyManagerBase.cpp index 9164646..b7b4e27 100644 --- a/audio/AudioPolicyManagerBase.cpp +++ b/audio/AudioPolicyManagerBase.cpp @@ -861,29 +861,23 @@ status_t AudioPolicyManagerBase::registerEffect(effect_descriptor_t *desc, } } - if (mTotalEffectsCpuLoad + desc->cpuLoad > getMaxEffectsCpuLoad()) { - LOGW("registerEffect() CPU Load limit exceeded for Fx %s, CPU %f MIPS", - desc->name, (float)desc->cpuLoad/10); - return INVALID_OPERATION; - } if (mTotalEffectsMemory + desc->memoryUsage > getMaxEffectsMemory()) { LOGW("registerEffect() memory limit exceeded for Fx %s, Memory %d KB", desc->name, desc->memoryUsage); return INVALID_OPERATION; } - mTotalEffectsCpuLoad += desc->cpuLoad; mTotalEffectsMemory += desc->memoryUsage; LOGV("registerEffect() effect %s, io %d, strategy %d session %d id %d", desc->name, io, strategy, session, id); - - LOGV("registerEffect() CPU %d, memory %d", desc->cpuLoad, desc->memoryUsage); - LOGV(" total CPU %d, total memory %d", mTotalEffectsCpuLoad, mTotalEffectsMemory); + LOGV("registerEffect() memory %d, total memory %d", desc->memoryUsage, mTotalEffectsMemory); EffectDescriptor *pDesc = new EffectDescriptor(); memcpy (&pDesc->mDesc, desc, sizeof(effect_descriptor_t)); pDesc->mIo = io; pDesc->mStrategy = (routing_strategy)strategy; pDesc->mSession = session; + pDesc->mEnabled = false; + mEffects.add(id, pDesc); return NO_ERROR; @@ -899,21 +893,16 @@ status_t AudioPolicyManagerBase::unregisterEffect(int id) EffectDescriptor *pDesc = mEffects.valueAt(index); - if (mTotalEffectsCpuLoad < pDesc->mDesc.cpuLoad) { - LOGW("unregisterEffect() CPU load %d too high for total %d", - pDesc->mDesc.cpuLoad, mTotalEffectsCpuLoad); - pDesc->mDesc.cpuLoad = mTotalEffectsCpuLoad; - } - mTotalEffectsCpuLoad -= pDesc->mDesc.cpuLoad; + setEffectEnabled(pDesc, false); + if (mTotalEffectsMemory < pDesc->mDesc.memoryUsage) { LOGW("unregisterEffect() memory %d too big for total %d", pDesc->mDesc.memoryUsage, mTotalEffectsMemory); pDesc->mDesc.memoryUsage = mTotalEffectsMemory; } mTotalEffectsMemory -= pDesc->mDesc.memoryUsage; - LOGV("unregisterEffect() effect %s, ID %d, CPU %d, memory %d", - pDesc->mDesc.name, id, pDesc->mDesc.cpuLoad, pDesc->mDesc.memoryUsage); - LOGV(" total CPU %d, total memory %d", mTotalEffectsCpuLoad, mTotalEffectsMemory); + LOGV("unregisterEffect() effect %s, ID %d, memory %d total memory %d", + pDesc->mDesc.name, id, pDesc->mDesc.memoryUsage, mTotalEffectsMemory); mEffects.removeItem(id); delete pDesc; @@ -921,6 +910,46 @@ status_t AudioPolicyManagerBase::unregisterEffect(int id) return NO_ERROR; } +status_t AudioPolicyManagerBase::setEffectEnabled(int id, bool enabled) +{ + ssize_t index = mEffects.indexOfKey(id); + if (index < 0) { + LOGW("unregisterEffect() unknown effect ID %d", id); + return INVALID_OPERATION; + } + + return setEffectEnabled(mEffects.valueAt(index), enabled); +} + +status_t AudioPolicyManagerBase::setEffectEnabled(EffectDescriptor *pDesc, bool enabled) +{ + if (enabled == pDesc->mEnabled) { + LOGV("setEffectEnabled(%s) effect already %s", + enabled?"true":"false", enabled?"enabled":"disabled"); + return INVALID_OPERATION; + } + + if (enabled) { + if (mTotalEffectsCpuLoad + pDesc->mDesc.cpuLoad > getMaxEffectsCpuLoad()) { + LOGW("setEffectEnabled(true) CPU Load limit exceeded for Fx %s, CPU %f MIPS", + pDesc->mDesc.name, (float)pDesc->mDesc.cpuLoad/10); + return INVALID_OPERATION; + } + mTotalEffectsCpuLoad += pDesc->mDesc.cpuLoad; + LOGV("setEffectEnabled(true) total CPU %d", mTotalEffectsCpuLoad); + } else { + if (mTotalEffectsCpuLoad < pDesc->mDesc.cpuLoad) { + LOGW("setEffectEnabled(false) CPU load %d too high for total %d", + pDesc->mDesc.cpuLoad, mTotalEffectsCpuLoad); + pDesc->mDesc.cpuLoad = mTotalEffectsCpuLoad; + } + mTotalEffectsCpuLoad -= pDesc->mDesc.cpuLoad; + LOGV("setEffectEnabled(false) total CPU %d", mTotalEffectsCpuLoad); + } + pDesc->mEnabled = enabled; + return NO_ERROR; +} + bool AudioPolicyManagerBase::isStreamActive(int stream, uint32_t inPastMs) const { nsecs_t sysTime = systemTime(); @@ -2279,6 +2308,8 @@ status_t AudioPolicyManagerBase::EffectDescriptor::dump(int fd) result.append(buffer); snprintf(buffer, SIZE, " Name: %s\n", mDesc.name); result.append(buffer); + snprintf(buffer, SIZE, " %s\n", mEnabled ? "Enabled" : "Disabled"); + result.append(buffer); write(fd, result.string(), result.size()); return NO_ERROR; diff --git a/audio/audio_policy_hal.cpp b/audio/audio_policy_hal.cpp index 0dc5524..d5f2816 100644 --- a/audio/audio_policy_hal.cpp +++ b/audio/audio_policy_hal.cpp @@ -265,6 +265,12 @@ static int ap_unregister_effect(struct audio_policy *pol, int id) return lap->apm->unregisterEffect(id); } +static int ap_set_effect_enabled(struct audio_policy *pol, int id, bool enabled) +{ + struct legacy_audio_policy *lap = to_lap(pol); + return lap->apm->setEffectEnabled(id, enabled); +} + static bool ap_is_stream_active(const struct audio_policy *pol, int stream, uint32_t in_past_ms) { @@ -318,6 +324,7 @@ static int create_legacy_ap(const struct audio_policy_device *device, lap->policy.get_output_for_effect = ap_get_output_for_effect; lap->policy.register_effect = ap_register_effect; lap->policy.unregister_effect = ap_unregister_effect; + lap->policy.set_effect_enabled = ap_set_effect_enabled; lap->policy.is_stream_active = ap_is_stream_active; lap->policy.dump = ap_dump; -- cgit v1.1