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

Commit 3fcdf521 authored by Andy Hung's avatar Andy Hung Committed by Automerger Merge Worker
Browse files

Merge changes from topic "fix-218273231-spatial-latency" am: 095598af

parents 4295d22b 095598af
Loading
Loading
Loading
Loading
+28 −1
Original line number Original line Diff line number Diff line
@@ -769,7 +769,9 @@ status_t Spatializer::attachOutput(audio_io_handle_t output, size_t numActiveTra
            mEngine->setEnabled(false);
            mEngine->setEnabled(false);
            mEngine.clear();
            mEngine.clear();
            mPoseController.reset();
            mPoseController.reset();
            AudioSystem::removeSupportedLatencyModesCallback(this);
        }
        }

        // create FX instance on output
        // create FX instance on output
        AttributionSourceState attributionSource = AttributionSourceState();
        AttributionSourceState attributionSource = AttributionSourceState();
        mEngine = new AudioEffect(attributionSource);
        mEngine = new AudioEffect(attributionSource);
@@ -785,6 +787,13 @@ status_t Spatializer::attachOutput(audio_io_handle_t output, size_t numActiveTra
        outputChanged = mOutput != output;
        outputChanged = mOutput != output;
        mOutput = output;
        mOutput = output;
        mNumActiveTracks = numActiveTracks;
        mNumActiveTracks = numActiveTracks;
        AudioSystem::addSupportedLatencyModesCallback(this);

        std::vector<audio_latency_mode_t> latencyModes;
        status = AudioSystem::getSupportedLatencyModes(mOutput, &latencyModes);
        if (status == OK) {
            mSupportedLatencyModes = latencyModes;
        }


        checkEngineState_l();
        checkEngineState_l();
        if (mSupportsHeadTracking) {
        if (mSupportsHeadTracking) {
@@ -815,6 +824,7 @@ audio_io_handle_t Spatializer::detachOutput() {
        // remove FX instance
        // remove FX instance
        mEngine->setEnabled(false);
        mEngine->setEnabled(false);
        mEngine.clear();
        mEngine.clear();
        AudioSystem::removeSupportedLatencyModesCallback(this);
        output = mOutput;
        output = mOutput;
        mOutput = AUDIO_IO_HANDLE_NONE;
        mOutput = AUDIO_IO_HANDLE_NONE;
        mPoseController.reset();
        mPoseController.reset();
@@ -827,6 +837,15 @@ audio_io_handle_t Spatializer::detachOutput() {
    return output;
    return output;
}
}


void Spatializer::onSupportedLatencyModesChanged(
        audio_io_handle_t output, const std::vector<audio_latency_mode_t>& modes) {
    std::lock_guard lock(mLock);
    if (output == mOutput) {
        mSupportedLatencyModes = modes;
        checkSensorsState_l();
    }
}

void Spatializer::updateActiveTracks(size_t numActiveTracks) {
void Spatializer::updateActiveTracks(size_t numActiveTracks) {
    std::lock_guard lock(mLock);
    std::lock_guard lock(mLock);
    if (mNumActiveTracks != numActiveTracks) {
    if (mNumActiveTracks != numActiveTracks) {
@@ -838,17 +857,25 @@ void Spatializer::updateActiveTracks(size_t numActiveTracks) {
}
}


void Spatializer::checkSensorsState_l() {
void Spatializer::checkSensorsState_l() {
    if (mSupportsHeadTracking && mPoseController != nullptr) {
    audio_latency_mode_t requestedLatencyMode = AUDIO_LATENCY_MODE_FREE;
    bool lowLatencySupported = mSupportedLatencyModes.empty()
            || (std::find(mSupportedLatencyModes.begin(), mSupportedLatencyModes.end(),
                    AUDIO_LATENCY_MODE_LOW) != mSupportedLatencyModes.end());
    if (mSupportsHeadTracking && mPoseController != nullptr && lowLatencySupported) {
        if (mNumActiveTracks > 0 && mLevel != SpatializationLevel::NONE
        if (mNumActiveTracks > 0 && mLevel != SpatializationLevel::NONE
            && mDesiredHeadTrackingMode != HeadTrackingMode::STATIC
            && mDesiredHeadTrackingMode != HeadTrackingMode::STATIC
            && mHeadSensor != SpatializerPoseController::INVALID_SENSOR) {
            && mHeadSensor != SpatializerPoseController::INVALID_SENSOR) {
            mPoseController->setHeadSensor(mHeadSensor);
            mPoseController->setHeadSensor(mHeadSensor);
            mPoseController->setScreenSensor(mScreenSensor);
            mPoseController->setScreenSensor(mScreenSensor);
            requestedLatencyMode = AUDIO_LATENCY_MODE_LOW;
        } else {
        } else {
            mPoseController->setHeadSensor(SpatializerPoseController::INVALID_SENSOR);
            mPoseController->setHeadSensor(SpatializerPoseController::INVALID_SENSOR);
            mPoseController->setScreenSensor(SpatializerPoseController::INVALID_SENSOR);
            mPoseController->setScreenSensor(SpatializerPoseController::INVALID_SENSOR);
        }
        }
    }
    }
    if (mOutput != AUDIO_IO_HANDLE_NONE) {
        AudioSystem::setRequestedLatencyMode(mOutput, requestedLatencyMode);
    }
}
}


void Spatializer::checkEngineState_l() {
void Spatializer::checkEngineState_l() {
+7 −1
Original line number Original line Diff line number Diff line
@@ -89,7 +89,8 @@ public:
 */
 */
class Spatializer : public media::BnSpatializer,
class Spatializer : public media::BnSpatializer,
                    public IBinder::DeathRecipient,
                    public IBinder::DeathRecipient,
                    private SpatializerPoseController::Listener {
                    private SpatializerPoseController::Listener,
                    public virtual AudioSystem::SupportedLatencyModesCallback {
  public:
  public:
    static sp<Spatializer> create(SpatializerPolicyCallback *callback);
    static sp<Spatializer> create(SpatializerPolicyCallback *callback);


@@ -126,6 +127,10 @@ class Spatializer : public media::BnSpatializer,
    /** IBinder::DeathRecipient. Listen to the death of the INativeSpatializerCallback. */
    /** IBinder::DeathRecipient. Listen to the death of the INativeSpatializerCallback. */
    virtual void binderDied(const wp<IBinder>& who);
    virtual void binderDied(const wp<IBinder>& who);


    /** SupportedLatencyModesCallback */
    void onSupportedLatencyModesChanged(
            audio_io_handle_t output, const std::vector<audio_latency_mode_t>& modes) override;

    /** Registers a INativeSpatializerCallback when a client is attached to this Spatializer
    /** Registers a INativeSpatializerCallback when a client is attached to this Spatializer
     * by audio policy service.
     * by audio policy service.
     */
     */
@@ -397,6 +402,7 @@ private:
    sp<EngineCallbackHandler> mHandler;
    sp<EngineCallbackHandler> mHandler;


    size_t mNumActiveTracks GUARDED_BY(mLock) = 0;
    size_t mNumActiveTracks GUARDED_BY(mLock) = 0;
    std::vector<audio_latency_mode_t> mSupportedLatencyModes GUARDED_BY(mLock);


    static const std::vector<const char*> sHeadPoseKeys;
    static const std::vector<const char*> sHeadPoseKeys;