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

Commit 12d07c50 authored by Andy Hung's avatar Andy Hung Committed by Android (Google) Code Review
Browse files

Merge "AudioFlinger: Fix haptic race condition" into qt-dev

parents 91c82546 6e6a2e61
Loading
Loading
Loading
Loading
+16 −11
Original line number Diff line number Diff line
@@ -3276,6 +3276,7 @@ bool AudioFlinger::PlaybackThread::threadLoop()
        cpuStats.sample(myName);

        Vector< sp<EffectChain> > effectChains;
        audio_session_t activeHapticSessionId = AUDIO_SESSION_NONE;

        // If the device is AUDIO_DEVICE_OUT_BUS, check for downstream latency.
        //
@@ -3549,6 +3550,19 @@ bool AudioFlinger::PlaybackThread::threadLoop()
            // during mixing and effect process as the audio buffers could be deleted
            // or modified if an effect is created or deleted
            lockEffectChains_l(effectChains);

            // Determine which session to pick up haptic data.
            // This must be done under the same lock as prepareTracks_l().
            // TODO: Write haptic data directly to sink buffer when mixing.
            if (mHapticChannelCount > 0 && effectChains.size() > 0) {
                for (const auto& track : mActiveTracks) {
                    if (track->getHapticPlaybackEnabled()) {
                        activeHapticSessionId = track->sessionId();
                        break;
                    }
                }
            }

        } // mLock scope ends

        if (mBytesRemaining == 0) {
@@ -3621,20 +3635,11 @@ bool AudioFlinger::PlaybackThread::threadLoop()

            // only process effects if we're going to write
            if (mSleepTimeUs == 0 && mType != OFFLOAD) {
                audio_session_t activeHapticId = AUDIO_SESSION_NONE;
                if (mHapticChannelCount > 0 && effectChains.size() > 0) {
                    for (auto track : mActiveTracks) {
                        if (track->getHapticPlaybackEnabled()) {
                            activeHapticId = track->sessionId();
                            break;
                        }
                    }
                }
                for (size_t i = 0; i < effectChains.size(); i ++) {
                    effectChains[i]->process_l();
                    // TODO: Write haptic data directly to sink buffer when mixing.
                    if (activeHapticId != AUDIO_SESSION_NONE
                            && activeHapticId == effectChains[i]->sessionId()) {
                    if (activeHapticSessionId != AUDIO_SESSION_NONE
                            && activeHapticSessionId == effectChains[i]->sessionId()) {
                        // Haptic data is active in this case, copy it directly from
                        // in buffer to out buffer.
                        const size_t audioBufferSize = mNormalFrameCount