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;
};