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

Commit 240934ba authored by Haynes Mathew George's avatar Haynes Mathew George Committed by Andy Hung
Browse files

audioflinger: refresh fast track underrun state upon start



False underrun is detected when starting recycled fast tracks, which
leads to continuous fatal assertion failures and even AP reboot.

Track's last mObservedUnderruns isn't updated one at previous stop()
call. Hence, when we start the same track again, we should synchronize
it to the latest state instead of relying on stale one.

authored-by: default avatarWeiyin <Jiang&lt;wjiang@codeaurora.org>
CRs-Fixed: 803389
Bug: 19635137
Signed-off-by: default avatarAndy Hung <hunga@google.com>
Change-Id: Ia003a49c6896dba965798c062c98b8c367ef8369
parent 1a86a8ad
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -444,8 +444,6 @@ AudioFlinger::PlaybackThread::Track::Track(
        //       this means we are potentially denying other more important fast tracks from
        //       being created.  It would be better to allocate the index dynamically.
        mFastIndex = i;
        // Read the initial underruns because this field is never cleared by the fast mixer
        mObservedUnderruns = thread->getFastTrackUnderruns(i);
        thread->mFastTrackAvailMask &= ~(1 << i);
    }
}
@@ -694,6 +692,12 @@ status_t AudioFlinger::PlaybackThread::Track::start(AudioSystem::sync_event_t ev
        }

        PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
        if (isFastTrack()) {
            // refresh fast track underruns on start because that field is never cleared
            // by the fast mixer; furthermore, the same track can be recycled, i.e. start
            // after stop.
            mObservedUnderruns = playbackThread->getFastTrackUnderruns(mFastIndex);
        }
        status = playbackThread->addTrack_l(this);
        if (status == INVALID_OPERATION || status == PERMISSION_DENIED) {
            triggerEvents(AudioSystem::SYNC_EVENT_PRESENTATION_COMPLETE);