blob: c5506a3d6f2af1b75ea87a6b6ad2a652c9bbaad8 [file] [log] [blame]
Eric Laurent6d607012021-07-05 11:54:40 +02001/*
2**
3** Copyright 2021, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18
19#define LOG_TAG "Spatializer"
20//#define LOG_NDEBUG 0
21#include <utils/Log.h>
22
23#include <limits.h>
24#include <stdint.h>
25#include <sys/types.h>
26
27#include <android/content/AttributionSourceState.h>
Eric Laurent2be8b292021-08-23 09:44:33 -070028#include <android/sensor.h>
Eric Laurent6d607012021-07-05 11:54:40 +020029#include <audio_utils/fixedfft.h>
30#include <cutils/bitops.h>
Eric Laurent2be8b292021-08-23 09:44:33 -070031#include <hardware/sensors.h>
Eric Laurent6d607012021-07-05 11:54:40 +020032#include <media/ShmemCompat.h>
33#include <media/audiohal/EffectsFactoryHalInterface.h>
34#include <mediautils/ServiceUtilities.h>
35#include <utils/Thread.h>
36
37#include "Spatializer.h"
38
39namespace android {
40
41using aidl_utils::statusTFromBinderStatus;
42using aidl_utils::binderStatusFromStatusT;
43using android::content::AttributionSourceState;
44using binder::Status;
Eric Laurent2be8b292021-08-23 09:44:33 -070045using media::HeadTrackingMode;
46using media::Pose3f;
Eric Laurent6d607012021-07-05 11:54:40 +020047using media::SpatializationLevel;
Eric Laurent2be8b292021-08-23 09:44:33 -070048using media::SpatializationMode;
Ytai Ben-Tsvia16a9df2021-08-05 08:57:06 -070049using media::SpatializerHeadTrackingMode;
Eric Laurent2be8b292021-08-23 09:44:33 -070050using media::SensorPoseProvider;
51
52
53using namespace std::chrono_literals;
Eric Laurent6d607012021-07-05 11:54:40 +020054
55#define VALUE_OR_RETURN_BINDER_STATUS(x) \
56 ({ auto _tmp = (x); \
57 if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
58 std::move(_tmp.value()); })
59
60#define RETURN_IF_BINDER_ERROR(x) \
61 { \
62 binder::Status _tmp = (x); \
63 if (!_tmp.isOk()) return _tmp; \
64 }
65
66// ---------------------------------------------------------------------------
67
68sp<Spatializer> Spatializer::create(SpatializerPolicyCallback *callback) {
69 sp<Spatializer> spatializer;
70
71 sp<EffectsFactoryHalInterface> effectsFactoryHal = EffectsFactoryHalInterface::create();
72 if (effectsFactoryHal == nullptr) {
73 ALOGW("%s failed to create effect factory interface", __func__);
74 return spatializer;
75 }
76
77 std::vector<effect_descriptor_t> descriptors;
78 status_t status =
Eric Laurent1c5e2e32021-08-18 18:50:28 +020079 effectsFactoryHal->getDescriptors(FX_IID_SPATIALIZER, &descriptors);
Eric Laurent6d607012021-07-05 11:54:40 +020080 if (status != NO_ERROR) {
81 ALOGW("%s failed to get spatializer descriptor, error %d", __func__, status);
82 return spatializer;
83 }
84 ALOG_ASSERT(!descriptors.empty(),
85 "%s getDescriptors() returned no error but empty list", __func__);
86
87 //TODO: get supported spatialization modes from FX engine or descriptor
88
89 sp<EffectHalInterface> effect;
90 status = effectsFactoryHal->createEffect(&descriptors[0].uuid, AUDIO_SESSION_OUTPUT_STAGE,
91 AUDIO_IO_HANDLE_NONE, AUDIO_PORT_HANDLE_NONE, &effect);
92 ALOGI("%s FX create status %d effect %p", __func__, status, effect.get());
93
94 if (status == NO_ERROR && effect != nullptr) {
95 spatializer = new Spatializer(descriptors[0], callback);
Eric Laurent2be8b292021-08-23 09:44:33 -070096 if (spatializer->loadEngineConfiguration(effect) != NO_ERROR) {
97 spatializer.clear();
98 }
Eric Laurent6d607012021-07-05 11:54:40 +020099 }
100
101 return spatializer;
102}
103
Eric Laurent2be8b292021-08-23 09:44:33 -0700104Spatializer::Spatializer(effect_descriptor_t engineDescriptor, SpatializerPolicyCallback* callback)
105 : mEngineDescriptor(engineDescriptor),
106 mPolicyCallback(callback) {
Eric Laurent6d607012021-07-05 11:54:40 +0200107 ALOGV("%s", __func__);
108}
109
110Spatializer::~Spatializer() {
111 ALOGV("%s", __func__);
112}
113
Eric Laurent2be8b292021-08-23 09:44:33 -0700114status_t Spatializer::loadEngineConfiguration(sp<EffectHalInterface> effect) {
115 ALOGV("%s", __func__);
116
117 std::vector<bool> supportsHeadTracking;
118 status_t status = getHalParameter<false>(effect, SPATIALIZER_PARAM_HEADTRACKING_SUPPORTED,
119 &supportsHeadTracking);
120 if (status != NO_ERROR) {
121 return status;
122 }
123 mSupportsHeadTracking = supportsHeadTracking[0];
124
125 status = getHalParameter<true>(effect, SPATIALIZER_PARAM_SUPPORTED_LEVELS, &mLevels);
126 if (status != NO_ERROR) {
127 return status;
128 }
129 status = getHalParameter<true>(effect, SPATIALIZER_PARAM_SUPPORTED_SPATIALIZATION_MODES,
130 &mSpatializationModes);
131 if (status != NO_ERROR) {
132 return status;
133 }
134 status = getHalParameter<true>(effect, SPATIALIZER_PARAM_SUPPORTED_CHANNEL_MASKS,
135 &mChannelMasks);
136 if (status != NO_ERROR) {
137 return status;
138 }
139 return NO_ERROR;
140}
141
142/** Gets the channel mask, sampling rate and format set for the spatializer input. */
143audio_config_base_t Spatializer::getAudioInConfig() const {
144 std::lock_guard lock(mLock);
145 audio_config_base_t config = AUDIO_CONFIG_BASE_INITIALIZER;
146 // For now use highest supported channel count
147 uint32_t maxCount = 0;
148 for ( auto mask : mChannelMasks) {
149 if (audio_channel_count_from_out_mask(mask) > maxCount) {
150 config.channel_mask = mask;
151 }
152 }
153 return config;
154}
155
Eric Laurent6d607012021-07-05 11:54:40 +0200156status_t Spatializer::registerCallback(
157 const sp<media::INativeSpatializerCallback>& callback) {
Eric Laurent2be8b292021-08-23 09:44:33 -0700158 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200159 if (callback == nullptr) {
160 return BAD_VALUE;
161 }
162
163 sp<IBinder> binder = IInterface::asBinder(callback);
164 status_t status = binder->linkToDeath(this);
165 if (status == NO_ERROR) {
166 mSpatializerCallback = callback;
167 }
168 ALOGV("%s status %d", __func__, status);
169 return status;
170}
171
172// IBinder::DeathRecipient
173void Spatializer::binderDied(__unused const wp<IBinder> &who) {
174 {
Eric Laurent2be8b292021-08-23 09:44:33 -0700175 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200176 mLevel = SpatializationLevel::NONE;
177 mSpatializerCallback.clear();
178 }
179 ALOGV("%s", __func__);
180 mPolicyCallback->onCheckSpatializer();
181}
182
183// ISpatializer
184Status Spatializer::getSupportedLevels(std::vector<SpatializationLevel> *levels) {
185 ALOGV("%s", __func__);
186 if (levels == nullptr) {
187 return binderStatusFromStatusT(BAD_VALUE);
188 }
Eric Laurent6d607012021-07-05 11:54:40 +0200189 levels->push_back(SpatializationLevel::NONE);
Eric Laurent2be8b292021-08-23 09:44:33 -0700190 levels->insert(levels->end(), mLevels.begin(), mLevels.end());
Eric Laurent6d607012021-07-05 11:54:40 +0200191 return Status::ok();
192}
193
Eric Laurent2be8b292021-08-23 09:44:33 -0700194Status Spatializer::setLevel(SpatializationLevel level) {
Eric Laurent6d607012021-07-05 11:54:40 +0200195 ALOGV("%s level %d", __func__, (int)level);
196 if (level != SpatializationLevel::NONE
Eric Laurent2be8b292021-08-23 09:44:33 -0700197 && std::find(mLevels.begin(), mLevels.end(), level) == mLevels.end()) {
Eric Laurent6d607012021-07-05 11:54:40 +0200198 return binderStatusFromStatusT(BAD_VALUE);
199 }
200 sp<media::INativeSpatializerCallback> callback;
201 bool levelChanged = false;
202 {
Eric Laurent2be8b292021-08-23 09:44:33 -0700203 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200204 levelChanged = mLevel != level;
205 mLevel = level;
206 callback = mSpatializerCallback;
Eric Laurent2be8b292021-08-23 09:44:33 -0700207
208 if (levelChanged && mEngine != nullptr) {
209 setEffectParameter_l(SPATIALIZER_PARAM_LEVEL, std::vector<SpatializationLevel>{level});
210 }
Eric Laurent6d607012021-07-05 11:54:40 +0200211 }
212
213 if (levelChanged) {
214 mPolicyCallback->onCheckSpatializer();
215 if (callback != nullptr) {
216 callback->onLevelChanged(level);
217 }
218 }
219 return Status::ok();
220}
221
Eric Laurent2be8b292021-08-23 09:44:33 -0700222Status Spatializer::getLevel(SpatializationLevel *level) {
Eric Laurent6d607012021-07-05 11:54:40 +0200223 if (level == nullptr) {
224 return binderStatusFromStatusT(BAD_VALUE);
225 }
Eric Laurent2be8b292021-08-23 09:44:33 -0700226 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200227 *level = mLevel;
228 ALOGV("%s level %d", __func__, (int)*level);
229 return Status::ok();
230}
231
232Status Spatializer::getSupportedHeadTrackingModes(
Eric Laurent2be8b292021-08-23 09:44:33 -0700233 std::vector<SpatializerHeadTrackingMode>* modes) {
234 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200235 ALOGV("%s", __func__);
236 if (modes == nullptr) {
237 return binderStatusFromStatusT(BAD_VALUE);
238 }
Eric Laurent6d607012021-07-05 11:54:40 +0200239
Eric Laurent2be8b292021-08-23 09:44:33 -0700240 modes->push_back(SpatializerHeadTrackingMode::DISABLED);
241 if (mSupportsHeadTracking) {
242 if (mHeadSensor != nullptr) {
243 modes->push_back(SpatializerHeadTrackingMode::RELATIVE_WORLD);
244 if (mScreenSensor != nullptr) {
245 modes->push_back(SpatializerHeadTrackingMode::RELATIVE_SCREEN);
246 }
247 }
Eric Laurent6d607012021-07-05 11:54:40 +0200248 }
249 return Status::ok();
250}
251
Eric Laurent2be8b292021-08-23 09:44:33 -0700252Status Spatializer::setDesiredHeadTrackingMode(SpatializerHeadTrackingMode mode) {
253 ALOGV("%s mode %d", __func__, (int)mode);
254
255 if (!mSupportsHeadTracking) {
256 return binderStatusFromStatusT(INVALID_OPERATION);
257 }
258 std::lock_guard lock(mLock);
259 switch (mode) {
260 case SpatializerHeadTrackingMode::OTHER:
261 return binderStatusFromStatusT(BAD_VALUE);
262 case SpatializerHeadTrackingMode::DISABLED:
263 mDesiredHeadTrackingMode = HeadTrackingMode::STATIC;
264 break;
265 case SpatializerHeadTrackingMode::RELATIVE_WORLD:
266 mDesiredHeadTrackingMode = HeadTrackingMode::WORLD_RELATIVE;
267 break;
268 case SpatializerHeadTrackingMode::RELATIVE_SCREEN:
269 mDesiredHeadTrackingMode = HeadTrackingMode::SCREEN_RELATIVE;
270 break;
271 }
272
273 if (mPoseController != nullptr) {
274 mPoseController->setDesiredMode(mDesiredHeadTrackingMode);
275 }
276
277 return Status::ok();
278}
279
280Status Spatializer::getActualHeadTrackingMode(SpatializerHeadTrackingMode *mode) {
Eric Laurent6d607012021-07-05 11:54:40 +0200281 if (mode == nullptr) {
282 return binderStatusFromStatusT(BAD_VALUE);
283 }
Eric Laurent2be8b292021-08-23 09:44:33 -0700284 std::lock_guard lock(mLock);
285 *mode = mActualHeadTrackingMode;
Eric Laurent6d607012021-07-05 11:54:40 +0200286 ALOGV("%s mode %d", __func__, (int)*mode);
287 return Status::ok();
288}
289
Ytai Ben-Tsvia16a9df2021-08-05 08:57:06 -0700290Status Spatializer::recenterHeadTracker() {
Eric Laurent2be8b292021-08-23 09:44:33 -0700291 std::lock_guard lock(mLock);
292 if (mPoseController != nullptr) {
293 mPoseController->recenter();
294 }
Eric Laurent6d607012021-07-05 11:54:40 +0200295 return Status::ok();
296}
297
298Status Spatializer::setGlobalTransform(const std::vector<float>& screenToStage) {
Eric Laurent6d607012021-07-05 11:54:40 +0200299 ALOGV("%s", __func__);
Eric Laurent2be8b292021-08-23 09:44:33 -0700300 std::optional<Pose3f> maybePose = Pose3f::fromVector(screenToStage);
301 if (!maybePose.has_value()) {
302 ALOGW("Invalid screenToStage vector.");
303 return binderStatusFromStatusT(BAD_VALUE);
304 }
305 std::lock_guard lock(mLock);
306 if (mPoseController != nullptr) {
307 mPoseController->setScreenToStagePose(maybePose.value());
308 }
Eric Laurent6d607012021-07-05 11:54:40 +0200309 return Status::ok();
310}
311
312Status Spatializer::release() {
313 ALOGV("%s", __func__);
314 bool levelChanged = false;
315 {
Eric Laurent2be8b292021-08-23 09:44:33 -0700316 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200317 if (mSpatializerCallback == nullptr) {
318 return binderStatusFromStatusT(INVALID_OPERATION);
319 }
320
321 sp<IBinder> binder = IInterface::asBinder(mSpatializerCallback);
322 binder->unlinkToDeath(this);
323 mSpatializerCallback.clear();
324
325 levelChanged = mLevel != SpatializationLevel::NONE;
326 mLevel = SpatializationLevel::NONE;
327 }
328
329 if (levelChanged) {
330 mPolicyCallback->onCheckSpatializer();
331 }
332 return Status::ok();
333}
334
Eric Laurent2be8b292021-08-23 09:44:33 -0700335Status Spatializer::setHeadSensor(int sensorHandle) {
336 ALOGV("%s sensorHandle %d", __func__, sensorHandle);
337 std::lock_guard lock(mLock);
338 if (sensorHandle == ASENSOR_INVALID) {
339 mHeadSensor = nullptr;
340 } else {
341 mHeadSensor = VALUE_OR_RETURN_BINDER_STATUS(getSensorFromHandle(sensorHandle));
342 }
343 if (mPoseController != nullptr) {
344 mPoseController->setHeadSensor(mHeadSensor);
345 }
346 return Status::ok();
347}
348
349Status Spatializer::setScreenSensor(int sensorHandle) {
350 ALOGV("%s sensorHandle %d", __func__, sensorHandle);
351 std::lock_guard lock(mLock);
352 if (sensorHandle == ASENSOR_INVALID) {
353 mScreenSensor = nullptr;
354 } else {
355 mScreenSensor = VALUE_OR_RETURN_BINDER_STATUS(getSensorFromHandle(sensorHandle));
356 }
357 if (mPoseController != nullptr) {
358 mPoseController->setScreenSensor(mScreenSensor);
359 }
360 return Status::ok();
361}
362
363Status Spatializer::setDisplayOrientation(float physicalToLogicalAngle) {
364 ALOGV("%s physicalToLogicalAngle %f", __func__, physicalToLogicalAngle);
365 std::lock_guard lock(mLock);
366 mDisplayOrientation = physicalToLogicalAngle;
367 if (mPoseController != nullptr) {
368 mPoseController->setDisplayOrientation(mDisplayOrientation);
369 }
370 return Status::ok();
371}
372
373Status Spatializer::setHingeAngle(float hingeAngle) {
374 std::lock_guard lock(mLock);
375 ALOGV("%s hingeAngle %f", __func__, hingeAngle);
376 if (mEngine != nullptr) {
377 setEffectParameter_l(SPATIALIZER_PARAM_HINGE_ANGLE, std::vector<float>{hingeAngle});
378 }
379 return Status::ok();
380}
381
382Status Spatializer::getSupportedModes(std::vector<SpatializationMode> *modes) {
383 ALOGV("%s", __func__);
384 if (modes == nullptr) {
385 return binderStatusFromStatusT(BAD_VALUE);
386 }
387 *modes = mSpatializationModes;
388 return Status::ok();
389}
390
391// SpatializerPoseController::Listener
392void Spatializer::onHeadToStagePose(const Pose3f& headToStage) {
393 ALOGV("%s", __func__);
394 sp<media::INativeSpatializerCallback> callback;
395 auto vec = headToStage.toVector();
396 {
397 std::lock_guard lock(mLock);
398 callback = mSpatializerCallback;
399 if (mEngine != nullptr) {
400 setEffectParameter_l(SPATIALIZER_PARAM_HEAD_TO_STAGE, vec);
401 }
402 }
403
404 if (callback != nullptr) {
405 callback->onHeadToSoundStagePoseUpdated(vec);
406 }
407}
408
409void Spatializer::onActualModeChange(HeadTrackingMode mode) {
410 ALOGV("onActualModeChange(%d)", (int) mode);
411 sp<media::INativeSpatializerCallback> callback;
412 SpatializerHeadTrackingMode spatializerMode;
413 {
414 std::lock_guard lock(mLock);
415 if (!mSupportsHeadTracking) {
416 spatializerMode = SpatializerHeadTrackingMode::DISABLED;
417 } else {
418 switch (mode) {
419 case HeadTrackingMode::STATIC:
420 spatializerMode = SpatializerHeadTrackingMode::DISABLED;
421 break;
422 case HeadTrackingMode::WORLD_RELATIVE:
423 spatializerMode = SpatializerHeadTrackingMode::RELATIVE_WORLD;
424 break;
425 case HeadTrackingMode::SCREEN_RELATIVE:
426 spatializerMode = SpatializerHeadTrackingMode::RELATIVE_SCREEN;
427 break;
428 default:
429 LOG_ALWAYS_FATAL("Unknown mode: %d", mode);
430 }
431 }
432 mActualHeadTrackingMode = spatializerMode;
433 callback = mSpatializerCallback;
434 }
435 if (callback != nullptr) {
436 callback->onHeadTrackingModeChanged(spatializerMode);
437 }
438}
439
440/* static */
441ConversionResult<ASensorRef> Spatializer::getSensorFromHandle(int handle) {
442 ASensorManager* sensorManager =
443 ASensorManager_getInstanceForPackage("headtracker");
444 if (!sensorManager) {
445 ALOGE("Failed to get a sensor manager");
446 return base::unexpected(NO_INIT);
447 }
448 ASensorList sensorList;
449 int numSensors = ASensorManager_getSensorList(sensorManager, &sensorList);
450 for (int i = 0; i < numSensors; ++i) {
451 if (ASensor_getHandle(sensorList[i]) == handle) {
452 return sensorList[i];
453 }
454 }
455 return base::unexpected(BAD_VALUE);
456}
457
Eric Laurent6d607012021-07-05 11:54:40 +0200458status_t Spatializer::attachOutput(audio_io_handle_t output) {
Eric Laurent2be8b292021-08-23 09:44:33 -0700459 std::shared_ptr<SpatializerPoseController> poseController;
460 {
461 std::lock_guard lock(mLock);
462 ALOGV("%s output %d mOutput %d", __func__, (int)output, (int)mOutput);
463 if (mOutput != AUDIO_IO_HANDLE_NONE) {
464 LOG_ALWAYS_FATAL_IF(mEngine == nullptr, "%s output set without FX engine", __func__);
465 // remove FX instance
466 mEngine->setEnabled(false);
467 mEngine.clear();
468 }
469 // create FX instance on output
470 AttributionSourceState attributionSource = AttributionSourceState();
471 mEngine = new AudioEffect(attributionSource);
472 mEngine->set(nullptr, &mEngineDescriptor.uuid, 0, Spatializer::engineCallback /* cbf */,
473 this /* user */, AUDIO_SESSION_OUTPUT_STAGE, output, {} /* device */,
474 false /* probe */, true /* notifyFramesProcessed */);
475 status_t status = mEngine->initCheck();
476 ALOGV("%s mEngine create status %d", __func__, (int)status);
477 if (status != NO_ERROR) {
478 return status;
479 }
480
481 setEffectParameter_l(SPATIALIZER_PARAM_LEVEL,
482 std::vector<SpatializationLevel>{mLevel});
483 setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
484 std::vector<SpatializerHeadTrackingMode>{mActualHeadTrackingMode});
485
486 mEngine->setEnabled(true);
487 mOutput = output;
488
489 mPoseController = std::make_shared<SpatializerPoseController>(
490 static_cast<SpatializerPoseController::Listener*>(this), 10ms, 50ms);
491 LOG_ALWAYS_FATAL_IF(mPoseController == nullptr,
492 "%s could not allocate pose controller", __func__);
493
494 mPoseController->setDesiredMode(mDesiredHeadTrackingMode);
495 mPoseController->setHeadSensor(mHeadSensor);
496 mPoseController->setScreenSensor(mScreenSensor);
497 mPoseController->setDisplayOrientation(mDisplayOrientation);
498 poseController = mPoseController;
Eric Laurent6d607012021-07-05 11:54:40 +0200499 }
Eric Laurent2be8b292021-08-23 09:44:33 -0700500 poseController->waitUntilCalculated();
Eric Laurent6d607012021-07-05 11:54:40 +0200501 return NO_ERROR;
502}
503
504audio_io_handle_t Spatializer::detachOutput() {
Eric Laurent2be8b292021-08-23 09:44:33 -0700505 std::lock_guard lock(mLock);
Eric Laurent6d607012021-07-05 11:54:40 +0200506 ALOGV("%s mOutput %d", __func__, (int)mOutput);
Eric Laurent2be8b292021-08-23 09:44:33 -0700507 audio_io_handle_t output = AUDIO_IO_HANDLE_NONE;
Eric Laurent6d607012021-07-05 11:54:40 +0200508 if (mOutput == AUDIO_IO_HANDLE_NONE) {
Eric Laurent2be8b292021-08-23 09:44:33 -0700509 return output;
Eric Laurent6d607012021-07-05 11:54:40 +0200510 }
511 // remove FX instance
512 mEngine->setEnabled(false);
513 mEngine.clear();
Eric Laurent2be8b292021-08-23 09:44:33 -0700514 output = mOutput;
Eric Laurent6d607012021-07-05 11:54:40 +0200515 mOutput = AUDIO_IO_HANDLE_NONE;
Eric Laurent2be8b292021-08-23 09:44:33 -0700516 mPoseController.reset();
Eric Laurent6d607012021-07-05 11:54:40 +0200517 return output;
518}
519
Eric Laurent2be8b292021-08-23 09:44:33 -0700520void Spatializer::calculateHeadPose() {
521 ALOGV("%s", __func__);
522 std::lock_guard lock(mLock);
523 if (mPoseController != nullptr) {
524 mPoseController->calculateAsync();
525 }
526}
Eric Laurent6d607012021-07-05 11:54:40 +0200527
Eric Laurent2be8b292021-08-23 09:44:33 -0700528void Spatializer::engineCallback(int32_t event, void *user, void *info) {
Eric Laurent6d607012021-07-05 11:54:40 +0200529 if (user == nullptr) {
530 return;
531 }
Eric Laurent2be8b292021-08-23 09:44:33 -0700532 Spatializer* const me = reinterpret_cast<Spatializer *>(user);
Eric Laurent6d607012021-07-05 11:54:40 +0200533 switch (event) {
534 case AudioEffect::EVENT_FRAMES_PROCESSED: {
Eric Laurent2be8b292021-08-23 09:44:33 -0700535 int frames = info == nullptr ? 0 : *(int*)info;
Eric Laurent6d607012021-07-05 11:54:40 +0200536 ALOGD("%s frames processed %d for me %p", __func__, frames, me);
Eric Laurent2be8b292021-08-23 09:44:33 -0700537 if (frames > 0) {
538 me->calculateHeadPose();
539 }
540 } break;
Eric Laurent6d607012021-07-05 11:54:40 +0200541 default:
542 ALOGD("%s event %d", __func__, event);
543 break;
544 }
545}
546
547// ---------------------------------------------------------------------------
548
549Spatializer::EffectClient::EffectClient(const sp<media::IEffectClient>& effectClient,
550 Spatializer& parent)
551 : BnEffect(),
552 mEffectClient(effectClient), mParent(parent) {
553}
554
555Spatializer::EffectClient::~EffectClient() {
556}
557
558// IEffect
559
560#define RETURN(code) \
561 *_aidl_return = (code); \
562 return Status::ok();
563
564// Write a POD value into a vector of bytes (clears the previous buffer
565// content).
566template<typename T>
567void writeToBuffer(const T& value, std::vector<uint8_t>* buffer) {
568 buffer->clear();
569 appendToBuffer(value, buffer);
570}
571
572Status Spatializer::EffectClient::enable(int32_t* _aidl_return) {
573 RETURN(OK);
574}
575
576Status Spatializer::EffectClient::disable(int32_t* _aidl_return) {
577 RETURN(OK);
578}
579
580Status Spatializer::EffectClient::command(int32_t cmdCode,
581 const std::vector<uint8_t>& cmdData __unused,
582 int32_t maxResponseSize __unused,
583 std::vector<uint8_t>* response __unused,
584 int32_t* _aidl_return) {
585
586 // reject commands reserved for internal use by audio framework if coming from outside
587 // of audioserver
588 switch(cmdCode) {
589 case EFFECT_CMD_ENABLE:
590 case EFFECT_CMD_DISABLE:
591 case EFFECT_CMD_SET_PARAM_DEFERRED:
592 case EFFECT_CMD_SET_PARAM_COMMIT:
593 RETURN(BAD_VALUE);
594 case EFFECT_CMD_SET_PARAM:
595 case EFFECT_CMD_GET_PARAM:
596 break;
597 default:
598 if (cmdCode >= EFFECT_CMD_FIRST_PROPRIETARY) {
599 break;
600 }
601 android_errorWriteLog(0x534e4554, "62019992");
602 RETURN(BAD_VALUE);
603 }
604 (void)mParent;
605 RETURN(OK);
606}
607
608Status Spatializer::EffectClient::disconnect() {
609 mDisconnected = true;
610 return Status::ok();
611}
612
613Status Spatializer::EffectClient::getCblk(media::SharedFileRegion* _aidl_return) {
614 LOG_ALWAYS_FATAL_IF(!convertIMemoryToSharedFileRegion(mCblkMemory, _aidl_return));
615 return Status::ok();
616}
617
618} // namespace android