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

Commit 56ce5254 authored by Andy Hung's avatar Andy Hung Committed by android-build-merger
Browse files

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

am: a0d7ca01

Change-Id: I5362ea7713b94bd2d91c4b7a784d7f06e8594782
parents 37f93e87 a0d7ca01
Loading
Loading
Loading
Loading
+16 −11
Original line number Original line Diff line number Diff line
@@ -3276,6 +3276,7 @@ bool AudioFlinger::PlaybackThread::threadLoop()
        cpuStats.sample(myName);
        cpuStats.sample(myName);


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


        // If the device is AUDIO_DEVICE_OUT_BUS, check for downstream latency.
        // 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
            // during mixing and effect process as the audio buffers could be deleted
            // or modified if an effect is created or deleted
            // or modified if an effect is created or deleted
            lockEffectChains_l(effectChains);
            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
        } // mLock scope ends


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


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