Merge "audiopolicy: Synchronize calls to Effects state" into nyc-dev
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index c7486a5..fdd6dd2 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -482,6 +482,7 @@
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
+ Mutex::Autolock _l(mEffectsLock);
return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
}
@@ -490,6 +491,7 @@
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
+ Mutex::Autolock _l(mEffectsLock);
return mAudioPolicyManager->unregisterEffect(id);
}
@@ -498,6 +500,7 @@
if (mAudioPolicyManager == NULL) {
return NO_INIT;
}
+ Mutex::Autolock _l(mEffectsLock);
return mAudioPolicyManager->setEffectEnabled(id, enabled);
}
@@ -561,6 +564,8 @@
return false;
}
Mutex::Autolock _l(mLock);
+ Mutex::Autolock _le(mEffectsLock); // isOffloadSupported queries for
+ // non-offloadable effects
return mAudioPolicyManager->isOffloadSupported(info);
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 160f4f0..a91c560 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -553,6 +553,10 @@
mutable Mutex mLock; // prevents concurrent access to AudioPolicy manager functions changing
// device connection state or routing
+ mutable Mutex mEffectsLock; // serialize access to Effect state within APM.
+ // Note: lock acquisition order is always mLock > mEffectsLock:
+ // mLock protects AudioPolicyManager methods that can call into audio flinger
+ // and possibly back in to audio policy service and acquire mEffectsLock.
sp<AudioCommandThread> mAudioCommandThread; // audio commands thread
sp<AudioCommandThread> mTonePlaybackThread; // tone playback thread
sp<AudioCommandThread> mOutputCommandThread; // process stop and release output