libaudiohal: Make effect descriptors cache thread-safe

Due to legacy reasons, the code in the audio server assumes that
querying all effect descriptors is a cheap operation (stems from
pre-Treble times). Thus, the HIDL shim code needs to cache the
list of descriptors. It was assumed that the audio server code
queries effect descriptors under a lock, however recently it was
observed that it's not always the case (or it's not always the
same lock). To prevent races, access to the cache has been
serialized.

Bug: 243877224
Test: atest android.media.audio.cts.AudioEffectTest
Merged-In: Id5f3615074e540afca33a83d53d2b84634df89cf
Change-Id: Id5f3615074e540afca33a83d53d2b84634df89cf
diff --git a/media/libaudiohal/impl/EffectsFactoryHalHidl.h b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
index e1882e1..7ccddc6 100644
--- a/media/libaudiohal/impl/EffectsFactoryHalHidl.h
+++ b/media/libaudiohal/impl/EffectsFactoryHalHidl.h
@@ -17,6 +17,8 @@
 #ifndef ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
 #define ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
 
+#include <memory>
+
 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
 #include <media/audiohal/EffectsFactoryHalInterface.h>
 
@@ -28,6 +30,8 @@
 using ::android::hardware::hidl_vec;
 using namespace ::android::hardware::audio::effect::CPP_VERSION;
 
+class EffectDescriptorCache;
+
 class EffectsFactoryHalHidl : public EffectsFactoryHalInterface, public EffectConversionHelperHidl
 {
   public:
@@ -63,9 +67,7 @@
 
   private:
     sp<IEffectsFactory> mEffectsFactory;
-    hidl_vec<EffectDescriptor> mLastDescriptors;
-
-    status_t queryAllDescriptors();
+    std::unique_ptr<EffectDescriptorCache> mCache;
 };
 
 } // namespace effect