diff options
author | Eric Laurent <elaurent@google.com> | 2015-07-06 18:01:25 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2015-07-07 19:30:48 -0700 |
commit | 0f0631eb55b1f0a7f4b62212b78a3faa0b49919b (patch) | |
tree | 0ccee662c252bcb9741f233e5bdc6e42278c3da5 /services/audioflinger/Threads.cpp | |
parent | 065f6572752dca646b7d60df8e80b6d4ac159281 (diff) | |
download | frameworks_av-0f0631eb55b1f0a7f4b62212b78a3faa0b49919b.zip frameworks_av-0f0631eb55b1f0a7f4b62212b78a3faa0b49919b.tar.gz frameworks_av-0f0631eb55b1f0a7f4b62212b78a3faa0b49919b.tar.bz2 |
audioflinger: flush HAL when transitioning to next direct track
Send flush command to the audio HAL when transtioning to
next track on direct output thread, even if both tracks are in the
same audio session.
Commit 43b4dcc to fix issue 21145353 did only flush the HAL if the
audio session was different for the new track because the logic was
copied from the offload thread.
Bug: 22019044.
Change-Id: I89b217580023ed7449a58e9bf3dc068ce7a84487
Diffstat (limited to 'services/audioflinger/Threads.cpp')
-rw-r--r-- | services/audioflinger/Threads.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index d3ea9d8..966fb5c 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -4482,9 +4482,16 @@ void AudioFlinger::DirectOutputThread::onAddNewTrack_l() sp<Track> previousTrack = mPreviousTrack.promote(); sp<Track> latestTrack = mLatestActiveTrack.promote(); - if (previousTrack != 0 && latestTrack != 0 && - (previousTrack->sessionId() != latestTrack->sessionId())) { - mFlushPending = true; + if (previousTrack != 0 && latestTrack != 0) { + if (mType == DIRECT) { + if (previousTrack.get() != latestTrack.get()) { + mFlushPending = true; + } + } else /* mType == OFFLOAD */ { + if (previousTrack->sessionId() != latestTrack->sessionId()) { + mFlushPending = true; + } + } } PlaybackThread::onAddNewTrack_l(); } @@ -4577,12 +4584,8 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::DirectOutputThread::prep if (track != previousTrack.get()) { // Flush any data still being written from last track mBytesRemaining = 0; - // flush data already sent if changing audio session as audio - // comes from a different source. Also invalidate previous track to force a - // seek when resuming. - if (previousTrack->sessionId() != track->sessionId()) { - previousTrack->invalidate(); - } + // Invalidate previous track to force a seek when resuming. + previousTrack->invalidate(); } } mPreviousTrack = track; |