Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bdecc054 authored by Eric Laurent's avatar Eric Laurent
Browse files

Spatializer: recenter head pose when head tracking is disabled

Make sure a centered head pose as well as a disabled head tracking
mode is sent to the spatializer effect engine when head tracking is
disabled or the head tracking sensor unregistered.

Previous implementation was relying on updates from the
onActualModeChange() callback from the head pose controller but this
callback is not garantied when the pose controller is destroyed.
Also a neutral head pose is explicitely applied to the engine before
disabling headtracking.

Bug: 249820860
Test: repro steps in bug.
Change-Id: I3c8fee7c1cd763206826d4d5f9058abc3231b118
parent feb4e5c8
Loading
Loading
Loading
Loading
+36 −13
Original line number Diff line number Diff line
@@ -741,6 +741,17 @@ void Spatializer::onHeadToStagePose(const Pose3f& headToStage) {
    msg->post();
}

void Spatializer::resetEngineHeadPose_l() {
    ALOGV("%s mEngine %p", __func__, mEngine.get());
    if (mEngine == nullptr) {
        return;
    }
    const std::vector<float> headToStage(6, 0.0);
    setEffectParameter_l(SPATIALIZER_PARAM_HEAD_TO_STAGE, headToStage);
    setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
            std::vector<SpatializerHeadTrackingMode>{SpatializerHeadTrackingMode::DISABLED});
}

void Spatializer::onHeadToStagePoseMsg(const std::vector<float>& headToStage) {
    ALOGV("%s", __func__);
    sp<media::ISpatializerHeadTrackingCallback> callback;
@@ -792,9 +803,13 @@ void Spatializer::onActualModeChangeMsg(HeadTrackingMode mode) {
        }
        mActualHeadTrackingMode = spatializerMode;
        if (mEngine != nullptr) {
            if (spatializerMode == SpatializerHeadTrackingMode::DISABLED) {
                resetEngineHeadPose_l();
            } else {
                setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
                                     std::vector<SpatializerHeadTrackingMode>{spatializerMode});
            }
        }
        callback = mHeadTrackingCallback;
        mLocalLog.log("%s: %s, spatializerMode %s", __func__, media::toString(mode).c_str(),
                      media::toString(spatializerMode).c_str());
@@ -923,16 +938,25 @@ void Spatializer::checkSensorsState_l() {
    bool lowLatencySupported = mSupportedLatencyModes.empty()
            || (std::find(mSupportedLatencyModes.begin(), mSupportedLatencyModes.end(),
                    AUDIO_LATENCY_MODE_LOW) != mSupportedLatencyModes.end());
    if (mSupportsHeadTracking && mPoseController != nullptr) {
    if (mSupportsHeadTracking) {
        if (mPoseController != nullptr) {
            if (lowLatencySupported && mNumActiveTracks > 0 && mLevel != SpatializationLevel::NONE
                && mDesiredHeadTrackingMode != HeadTrackingMode::STATIC
                && mHeadSensor != SpatializerPoseController::INVALID_SENSOR) {
                if (mEngine != nullptr) {
                    setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
                            std::vector<SpatializerHeadTrackingMode>{mActualHeadTrackingMode});
                }
                mPoseController->setHeadSensor(mHeadSensor);
                mPoseController->setScreenSensor(mScreenSensor);
                requestedLatencyMode = AUDIO_LATENCY_MODE_LOW;
            } else {
                mPoseController->setHeadSensor(SpatializerPoseController::INVALID_SENSOR);
                mPoseController->setScreenSensor(SpatializerPoseController::INVALID_SENSOR);
                resetEngineHeadPose_l();
            }
        } else {
            resetEngineHeadPose_l();
        }
    }
    if (mOutput != AUDIO_IO_HANDLE_NONE) {
@@ -946,8 +970,6 @@ void Spatializer::checkEngineState_l() {
            mEngine->setEnabled(true);
            setEffectParameter_l(SPATIALIZER_PARAM_LEVEL,
                    std::vector<SpatializationLevel>{mLevel});
            setEffectParameter_l(SPATIALIZER_PARAM_HEADTRACKING_MODE,
                    std::vector<SpatializerHeadTrackingMode>{mActualHeadTrackingMode});
        } else {
            setEffectParameter_l(SPATIALIZER_PARAM_LEVEL,
                    std::vector<SpatializationLevel>{SpatializationLevel::NONE});
@@ -969,6 +991,7 @@ void Spatializer::checkPoseController_l() {
        mPoseController->setDisplayOrientation(mDisplayOrientation);
    } else if (!isControllerNeeded && mPoseController != nullptr) {
        mPoseController.reset();
        resetEngineHeadPose_l();
    }
    if (mPoseController != nullptr) {
        mPoseController->setDesiredMode(mDesiredHeadTrackingMode);
+6 −0
Original line number Diff line number Diff line
@@ -350,6 +350,12 @@ private:
     */
    void checkEngineState_l() REQUIRES(mLock);

    /**
     * Reset head tracking mode and recenter pose in engine: Called when the head tracking
     * is disabled.
     */
    void resetEngineHeadPose_l() REQUIRES(mLock);

    /** Effect engine descriptor */
    const effect_descriptor_t mEngineDescriptor;
    /** Callback interface to parent audio policy service */