diff options
author | Eric Laurent <elaurent@google.com> | 2013-10-04 18:01:25 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-10-04 18:01:25 -0700 |
commit | 61f58c0c8d02970ea6d94ff816c54bf606f755b7 (patch) | |
tree | d18ab1a7d9ca3261b715c3b57b47dea2609f8ccf | |
parent | 1c7feca9cc3e408dfeb632e7060cf31e5015227e (diff) | |
parent | c22a1a495c26b8a36fa15233cc136cb6ce6d6bea (diff) | |
download | frameworks_av-61f58c0c8d02970ea6d94ff816c54bf606f755b7.zip frameworks_av-61f58c0c8d02970ea6d94ff816c54bf606f755b7.tar.gz frameworks_av-61f58c0c8d02970ea6d94ff816c54bf606f755b7.tar.bz2 |
am c22a1a49: am ea0fadeb: audioflinger: offload: fix pause/flush/resume
* commit 'c22a1a495c26b8a36fa15233cc136cb6ce6d6bea':
audioflinger: offload: fix pause/flush/resume
-rw-r--r-- | services/audioflinger/Threads.cpp | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 54cc4f6..aaa9608 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -3874,6 +3874,7 @@ AudioFlinger::OffloadThread::OffloadThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, audio_io_handle_t id, uint32_t device) : DirectOutputThread(audioFlinger, output, id, device, OFFLOAD), mHwPaused(false), + mFlushPending(false), mPausedBytesRemaining(0) { } @@ -4039,9 +4040,15 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::OffloadThread::prepareTr processVolume_l(track, last); } - // make sure the pause/flush/resume sequence is executed in the right order - if (doHwPause) { + // make sure the pause/flush/resume sequence is executed in the right order. + // If a flush is pending and a track is active but the HW is not paused, force a HW pause + // before flush and then resume HW. This can happen in case of pause/flush/resume + // if resume is received before pause is executed. + if (doHwPause || (mFlushPending && !mHwPaused && (count != 0))) { mOutput->stream->pause(mOutput->stream); + if (!doHwPause) { + doHwResume = true; + } } if (mFlushPending) { flushHw_l(); |