summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2014-10-02 01:12:37 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-10-02 01:12:37 +0000
commit29ccd3c4890601cb40f10e4e198c25a4a9f46819 (patch)
treead73f01d137e0ddc31dd0bef034ff24af190c2ba /services
parent03248b02ca1d23dbbbe670d7ed993f0c8dbf9178 (diff)
parentcb4b6e9f05d1c0b3fcc5be5ebe3f7d6f32669b1a (diff)
downloadframeworks_av-29ccd3c4890601cb40f10e4e198c25a4a9f46819.zip
frameworks_av-29ccd3c4890601cb40f10e4e198c25a4a9f46819.tar.gz
frameworks_av-29ccd3c4890601cb40f10e4e198c25a4a9f46819.tar.bz2
am cb4b6e9f: audioflinger: fix failure to indicate volume to effect
* commit 'cb4b6e9f05d1c0b3fcc5be5ebe3f7d6f32669b1a': audioflinger: fix failure to indicate volume to effect
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/Effects.cpp26
-rw-r--r--services/audioflinger/Effects.h7
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
};