Spatializer: process callbacks in separate thread

Add a Looper and Handler to process events from the engine
and pose controler callback to avoid cross mutex deadlocks.

Bug: 188502620
Test: manual test with mock spatializer
Change-Id: I1342602259b147727c704ad7bbeb1b3a68c7b231
Merged-In: I1342602259b147727c704ad7bbeb1b3a68c7b231
diff --git a/services/audiopolicy/service/Spatializer.h b/services/audiopolicy/service/Spatializer.h
index a45290b..ae7ded8 100644
--- a/services/audiopolicy/service/Spatializer.h
+++ b/services/audiopolicy/service/Spatializer.h
@@ -24,6 +24,7 @@
 #include <android/media/SpatializerHeadTrackingMode.h>
 #include <android/sensor.h>
 #include <media/audiohal/EffectHalInterface.h>
+#include <media/stagefright/foundation/ALooper.h>
 #include <media/AudioEffect.h>
 #include <system/audio_effects/effect_spatializer.h>
 
@@ -91,6 +92,9 @@
 
            ~Spatializer() override;
 
+    /** RefBase */
+    void onFirstRef();
+
     /** ISpatializer, see ISpatializer.aidl */
     binder::Status release() override;
     binder::Status getSupportedLevels(std::vector<media::SpatializationLevel>* levels) override;
@@ -138,6 +142,8 @@
     /** Gets the channel mask, sampling rate and format set for the spatializer input. */
     audio_config_base_t getAudioInConfig() const;
 
+    void calculateHeadPose();
+
     /** An implementation of an IEffect interface that can be used to pass advanced parameters to
      * the spatializer engine. All APis are noop (i.e. the interface cannot be used to control
      * the effect) except for passing parameters via the command() API. */
@@ -176,7 +182,9 @@
     void onHeadToStagePose(const media::Pose3f& headToStage) override;
     void onActualModeChange(media::HeadTrackingMode mode) override;
 
-    void calculateHeadPose();
+    void onHeadToStagePoseMsg(const std::vector<float>& headToStage);
+    void onActualModeChangeMsg(media::HeadTrackingMode mode);
+
 
     static ConversionResult<ASensorRef> getSensorFromHandle(int handle);
 
@@ -251,6 +259,8 @@
         return mEngine->setParameter(p);
     }
 
+    void postFramesProcessedMsg(int frames);
+
     /** Effect engine descriptor */
     const effect_descriptor_t mEngineDescriptor;
     /** Callback interface to parent audio policy service */
@@ -298,6 +308,14 @@
     std::vector<media::SpatializationMode> mSpatializationModes;
     std::vector<audio_channel_mask_t> mChannelMasks;
     bool mSupportsHeadTracking;
+
+    // Looper thread for mEngine callbacks
+    class EngineCallbackHandler;
+
+    sp<ALooper> mLooper;
+    sp<EngineCallbackHandler> mHandler;
+
+    static const std::vector<const char *> sHeadPoseKeys;
 };