diff options
author | Eric Laurent <elaurent@google.com> | 2014-10-02 13:38:36 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-10-02 13:38:36 +0000 |
commit | b04432837b6d0dd5317e745304c0da246307f68a (patch) | |
tree | 49974d7ccf2b75684d594b32dba53e2c2723a8c5 /services/audioflinger | |
parent | 0e42a8807edec5541ecac4a050459fbb72c477dc (diff) | |
parent | 92a69cde5f53a916c8c26a64d0dd610284161555 (diff) | |
download | frameworks_av-b04432837b6d0dd5317e745304c0da246307f68a.zip frameworks_av-b04432837b6d0dd5317e745304c0da246307f68a.tar.gz frameworks_av-b04432837b6d0dd5317e745304c0da246307f68a.tar.bz2 |
am 92a69cde: am cb4b6e9f: audioflinger: fix failure to indicate volume to effect
* commit '92a69cde5f53a916c8c26a64d0dd610284161555':
audioflinger: fix failure to indicate volume to effect
Diffstat (limited to 'services/audioflinger')
-rw-r--r-- | services/audioflinger/Effects.cpp | 26 | ||||
-rw-r--r-- | services/audioflinger/Effects.h | 7 |
2 files changed, 23 insertions, 10 deletions
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<ThreadBase> 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<ThreadBase> thread = mThread.promote(); + if (thread != 0) { + audio_stream_t *stream = thread->stream(); + if (stream != NULL) { + stream->add_audio_effect(stream, mEffectInterface); + } } } + sp<EffectChain> 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; diff --git a/services/audioflinger/Effects.h b/services/audioflinger/Effects.h index eaf90e7..b87a1fd 100644 --- a/services/audioflinger/Effects.h +++ b/services/audioflinger/Effects.h @@ -318,6 +318,12 @@ public: // At least one non offloadable effect in the chain is enabled bool isNonOffloadableEnabled(); + // use release_cas because we don't care about the observed value, just want to make sure the + // new value is observable. + void forceVolume() { android_atomic_release_cas(false, true, &mForceVolume); } + // use acquire_cas because we are interested in the observed value and + // we are the only observers. + bool isVolumeForced() { return (android_atomic_acquire_cas(true, false, &mForceVolume) == 0); } void dump(int fd, const Vector<String16>& args); @@ -375,4 +381,5 @@ protected: // timeLow fields among effect type UUIDs. // Updated by updateSuspendedSessions_l() only. KeyedVector< int, sp<SuspendedEffectDesc> > mSuspendedEffects; + volatile int32_t mForceVolume; // force next volume command because a new effect was enabled }; |