From a85a74a8219c03f2b1d1ef98f3f02e55f89f89a3 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 19 Oct 2011 11:44:54 -0700 Subject: Fix issue 381905: BassBoostTest CTS tests fail... When AudioEffectTest is executed, an Equalizer is created and enabled on a MediaPlayer session. Effects on the output mix are therefore suspended. Then the MediaPlayer is released with the effect still enabled. In this case, Audioflinger::purgeStaleEffects_l() fails to restore the suspended effects when the effect attached to the released audio session is removed. When subsequent tests are executed on output mix effects, these effects cannot be enabled as they are still suspended. Fixed purgeStaleEffects_l() to restore suspended effects if the effect removed is enabled. Also fixed EffectHandle::disconnect() to only restore suspended effects if the disconnected handle actually has control over the effect. Change-Id: I67232e7c34680b0cc01abfd57d5d510a524e5d4f --- services/audioflinger/AudioFlinger.cpp | 11 ++++++++++- services/audioflinger/AudioFlinger.h | 8 +++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 3e0304f2..69560e57 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -1332,7 +1332,13 @@ void AudioFlinger::ThreadBase::checkSuspendOnEffectEnabled(const sp& effect, + bool enabled, + int sessionId) +{ if (mType != RECORD) { // suspend all effects in AUDIO_SESSION_OUTPUT_MIX when enabling any effect on // another session. This gives the priority to well behaved effect control panels @@ -5224,6 +5230,9 @@ void AudioFlinger::purgeStaleEffects_l() { sp handle = effect->mHandles[j].promote(); if (handle != 0) { handle->mEffect.clear(); + if (handle->mHasControl && handle->mEnabled) { + t->checkSuspendOnEffectEnabled_l(effect, false, effect->sessionId()); + } } } AudioSystem::unregisterEffect(effect->id()); @@ -6844,7 +6853,7 @@ void AudioFlinger::EffectHandle::disconnect(bool unpiniflast) } mEffect->disconnect(this, unpiniflast); - if (mEnabled) { + if (mHasControl && mEnabled) { sp thread = mEffect->thread().promote(); if (thread != 0) { thread->checkSuspendOnEffectEnabled(mEffect, false, mEffect->sessionId()); diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index ed9d81ed..4b794ef5 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -492,10 +492,12 @@ private: int sessionId = AUDIO_SESSION_OUTPUT_MIX); // check if some effects must be suspended/restored when an effect is enabled // or disabled - virtual void checkSuspendOnEffectEnabled(const sp& effect, + void checkSuspendOnEffectEnabled(const sp& effect, bool enabled, int sessionId = AUDIO_SESSION_OUTPUT_MIX); - + void checkSuspendOnEffectEnabled_l(const sp& effect, + bool enabled, + int sessionId = AUDIO_SESSION_OUTPUT_MIX); mutable Mutex mLock; protected: @@ -1299,7 +1301,7 @@ private: // suspend all eligible effects void setEffectSuspendedAll_l(bool suspend); // check if effects should be suspend or restored when a given effect is enable or disabled - virtual void checkSuspendOnEffectEnabled(const sp& effect, + void checkSuspendOnEffectEnabled(const sp& effect, bool enabled); status_t dump(int fd, const Vector& args); -- cgit v1.2.3