From cb4b6e9f05d1c0b3fcc5be5ebe3f7d6f32669b1a Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Wed, 1 Oct 2014 14:26:10 -0700 Subject: audioflinger: fix failure to indicate volume to effect If an effect is added and enabled after a track is started it will not receive current volume information because volume is indicated only to active effects and if there is a volume change. Add a flag to force EffectChain::setVolume_l() to pass volume indication to all effects each time an effect is enabled. Bug: 17572556. Change-Id: I6b68488c9aca8b2095fb210aa124d02e4f759660 --- services/audioflinger/Effects.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'services/audioflinger/Effects.cpp') diff --git a/services/audioflinger/Effects.cpp b/services/audioflinger/Effects.cpp index 15f1f23..4678880 100644 --- a/services/audioflinger/Effects.cpp +++ b/services/audioflinger/Effects.cpp @@ -465,16 +465,21 @@ status_t AudioFlinger::EffectModule::start_l() if (status == 0) { status = cmdStatus; } - if (status == 0 && - ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC || - (mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_POST_PROC)) { - sp thread = mThread.promote(); - if (thread != 0) { - audio_stream_t *stream = thread->stream(); - if (stream != NULL) { - stream->add_audio_effect(stream, mEffectInterface); + if (status == 0) { + if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_PRE_PROC || + (mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_POST_PROC) { + sp thread = mThread.promote(); + if (thread != 0) { + audio_stream_t *stream = thread->stream(); + if (stream != NULL) { + stream->add_audio_effect(stream, mEffectInterface); + } } } + sp chain = mChain.promote(); + if (chain != 0) { + chain->forceVolume(); + } } return status; } @@ -1326,7 +1331,7 @@ AudioFlinger::EffectChain::EffectChain(ThreadBase *thread, int sessionId) : mThread(thread), mSessionId(sessionId), mActiveTrackCnt(0), mTrackCnt(0), mTailBufferCount(0), mOwnInBuffer(false), mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX), - mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX) + mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX), mForceVolume(false) { mStrategy = AudioSystem::getStrategyForStream(AUDIO_STREAM_MUSIC); if (thread == NULL) { @@ -1649,7 +1654,8 @@ bool AudioFlinger::EffectChain::setVolume_l(uint32_t *left, uint32_t *right) } } - if (ctrlIdx == mVolumeCtrlIdx && *left == mLeftVolume && *right == mRightVolume) { + if (!isVolumeForced() && ctrlIdx == mVolumeCtrlIdx && + *left == mLeftVolume && *right == mRightVolume) { if (hasControl) { *left = mNewLeftVolume; *right = mNewRightVolume; -- cgit v1.1