Spatializer: enforce only one client registered
Make sure that only one client can successfully obtain an
ISpatializer control interface to the native Spatializer controller.
Do not reject the same callback being registered twice (NOOP).
Bug: 244427550
Test: manual spatial audio regression
Merged-In: I3e3cbc5340a6e9f07359786cc931875a55e1f048
Change-Id: I3e3cbc5340a6e9f07359786cc931875a55e1f048
(cherry picked from commit d6bee3a27e4f2a775cd79c554a6c7e42e9cd33e2)
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index 3860bbd..c376e57 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -373,6 +373,17 @@
return BAD_VALUE;
}
+ if (mSpatializerCallback != nullptr) {
+ if (IInterface::asBinder(callback) == IInterface::asBinder(mSpatializerCallback)) {
+ ALOGW("%s: Registering callback %p again",
+ __func__, mSpatializerCallback.get());
+ return NO_ERROR;
+ }
+ ALOGE("%s: Already one client registered with callback %p",
+ __func__, mSpatializerCallback.get());
+ return INVALID_OPERATION;
+ }
+
sp<IBinder> binder = IInterface::asBinder(callback);
status_t status = binder->linkToDeath(this);
if (status == NO_ERROR) {