Spatializer: Add head tracking callback
Split head tracking related events from main INativeSpatializerCallback
to a dedicated callback ISpatializerHeadTrackingCallback that can
be registerred and unregistered independently.
Bug: 188502620
Test: manual test with mock spatializer
Change-Id: I09eefb0911f557a6faa6cf0b6c1afe7eaf71ca84
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index ee25dc8..161c61e 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -506,6 +506,17 @@
return Status::ok();
}
+Status Spatializer::registerHeadTrackingCallback(
+ const sp<media::ISpatializerHeadTrackingCallback>& callback) {
+ ALOGV("%s callback %p", __func__, callback.get());
+ std::lock_guard lock(mLock);
+ if (!mSupportsHeadTracking) {
+ return binderStatusFromStatusT(INVALID_OPERATION);
+ }
+ mHeadTrackingCallback = callback;
+ return Status::ok();
+}
+
// SpatializerPoseController::Listener
void Spatializer::onHeadToStagePose(const Pose3f& headToStage) {
ALOGV("%s", __func__);
@@ -526,10 +537,10 @@
void Spatializer::onHeadToStagePoseMsg(const std::vector<float>& headToStage) {
ALOGV("%s", __func__);
- sp<media::INativeSpatializerCallback> callback;
+ sp<media::ISpatializerHeadTrackingCallback> callback;
{
std::lock_guard lock(mLock);
- callback = mSpatializerCallback;
+ callback = mHeadTrackingCallback;
if (mEngine != nullptr) {
setEffectParameter_l(SPATIALIZER_PARAM_HEAD_TO_STAGE, headToStage);
}
@@ -550,7 +561,7 @@
void Spatializer::onActualModeChangeMsg(HeadTrackingMode mode) {
ALOGV("%s(%d)", __func__, (int) mode);
- sp<media::INativeSpatializerCallback> callback;
+ sp<media::ISpatializerHeadTrackingCallback> callback;
SpatializerHeadTrackingMode spatializerMode;
{
std::lock_guard lock(mLock);
@@ -572,7 +583,7 @@
}
}
mActualHeadTrackingMode = spatializerMode;
- callback = mSpatializerCallback;
+ callback = mHeadTrackingCallback;
}
if (callback != nullptr) {
callback->onHeadTrackingModeChanged(spatializerMode);
diff --git a/services/audiopolicy/service/Spatializer.h b/services/audiopolicy/service/Spatializer.h
index ae7ded8..7a18cbe 100644
--- a/services/audiopolicy/service/Spatializer.h
+++ b/services/audiopolicy/service/Spatializer.h
@@ -113,7 +113,8 @@
binder::Status setDisplayOrientation(float physicalToLogicalAngle) override;
binder::Status setHingeAngle(float hingeAngle) override;
binder::Status getSupportedModes(std::vector<media::SpatializationMode>* modes) override;
-
+ binder::Status registerHeadTrackingCallback(
+ const sp<media::ISpatializerHeadTrackingCallback>& callback) override;
/** IBinder::DeathRecipient. Listen to the death of the INativeSpatializerCallback. */
virtual void binderDied(const wp<IBinder>& who);
@@ -277,6 +278,9 @@
/** Callback interface to the client (AudioService) controlling this`Spatializer */
sp<media::INativeSpatializerCallback> mSpatializerCallback GUARDED_BY(mLock);
+ /** Callback interface for head tracking */
+ sp<media::ISpatializerHeadTrackingCallback> mHeadTrackingCallback GUARDED_BY(mLock);
+
/** Requested spatialization level */
media::SpatializationLevel mLevel GUARDED_BY(mLock) = media::SpatializationLevel::NONE;