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

Commit ae9a5f1f authored by Mohan Kumar's avatar Mohan Kumar Committed by Glenn Kasten
Browse files

audioflinger: clear mMixerBuffer if frame is not ready

Clear the mMixerBuffer if frame is not ready before the FastMixer
starts processing. Otherwise it might result in large glitches on
output device due to junk data present in the mixbuffer.

Change-Id: I9f025234d4ac100f85d2ec67c06a8df4195bea98
parent 844fab9b
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -334,6 +334,11 @@ void FastMixer::onWork()

    if ((command & FastMixerState::MIX) && (mMixer != NULL) && mIsWarm) {
        ALOG_ASSERT(mMixerBuffer != NULL);

        // AudioMixer::mState.enabledTracks is undefined if mState.hook == process__validate,
        // so we keep a side copy of enabledTracks
        bool anyEnabledTracks = false;

        // for each track, update volume and check for underrun
        unsigned currentTrackMask = current->mTrackMask;
        while (currentTrackMask != 0) {
@@ -392,11 +397,13 @@ void FastMixer::onWork()
                    underruns.mBitFields.mPartial++;
                    underruns.mBitFields.mMostRecent = UNDERRUN_PARTIAL;
                    mMixer->enable(name);
                    anyEnabledTracks = true;
                }
            } else {
                underruns.mBitFields.mFull++;
                underruns.mBitFields.mMostRecent = UNDERRUN_FULL;
                mMixer->enable(name);
                anyEnabledTracks = true;
            }
            ftDump->mUnderruns = underruns;
            ftDump->mFramesReady = framesReady;
@@ -407,9 +414,14 @@ void FastMixer::onWork()
            pts = AudioBufferProvider::kInvalidPTS;
        }

        if (anyEnabledTracks) {
            // process() is CPU-bound
            mMixer->process(pts);
            mMixerBufferState = MIXED;
        } else if (mMixerBufferState != ZEROED) {
            mMixerBufferState = UNDEFINED;
        }

    } else if (mMixerBufferState == MIXED) {
        mMixerBufferState = UNDEFINED;
    }