From 240934ba80d6c6165749db7681d243c6857a092f Mon Sep 17 00:00:00 2001 From: Haynes Mathew George Date: Wed, 11 Mar 2015 18:25:50 -0700 Subject: 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: Weiyin Jiang CRs-Fixed: 803389 Bug: 19635137 Signed-off-by: Andy Hung Change-Id: Ia003a49c6896dba965798c062c98b8c367ef8369 --- services/audioflinger/Tracks.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp index 8329be4..38667b9 100644 --- a/services/audioflinger/Tracks.cpp +++ b/services/audioflinger/Tracks.cpp @@ -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); -- cgit v1.1