diff options
author | Eric Laurent <elaurent@google.com> | 2011-09-06 14:53:59 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-09-06 14:53:59 -0700 |
commit | a4f73a9e0e0863a567cc06defa0d9e0269388d4e (patch) | |
tree | 464d68e33f1351796c60a2a0ff43ec696eb69e7b /media | |
parent | 2e3319a62be898e1f0405025d24962fc6a1a3f07 (diff) | |
parent | 408b8dc3c0a364c6f6b4991d15da9e6bcc2b8008 (diff) | |
download | frameworks_av-a4f73a9e0e0863a567cc06defa0d9e0269388d4e.zip frameworks_av-a4f73a9e0e0863a567cc06defa0d9e0269388d4e.tar.gz frameworks_av-a4f73a9e0e0863a567cc06defa0d9e0269388d4e.tar.bz2 |
Merge "Issue 5247986: Battery drain due to audio wakelock"
Diffstat (limited to 'media')
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 3b6c64d..7509239 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1182,16 +1182,33 @@ status_t AudioTrack::restoreTrack_l(audio_track_cblk_t*& cblk, bool fromStart) false); if (result == NO_ERROR) { + uint32_t user = cblk->user; + uint32_t server = cblk->server; // restore write index and set other indexes to reflect empty buffer status - mCblk->user = cblk->user; - mCblk->server = cblk->user; - mCblk->userBase = cblk->user; - mCblk->serverBase = cblk->user; + mCblk->user = user; + mCblk->server = user; + mCblk->userBase = user; + mCblk->serverBase = user; // restore loop: this is not guaranteed to succeed if new frame count is not // compatible with loop length setLoop_l(cblk->loopStart, cblk->loopEnd, cblk->loopCount); if (!fromStart) { mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS; + // Make sure that a client relying on callback events indicating underrun or + // the actual amount of audio frames played (e.g SoundPool) receives them. + if (mSharedBuffer == 0) { + uint32_t frames = 0; + if (user > server) { + frames = ((user - server) > mCblk->frameCount) ? + mCblk->frameCount : (user - server); + memset(mCblk->buffers, 0, frames * mCblk->frameSize); + } + // restart playback even if buffer is not completely filled. + android_atomic_or(CBLK_FORCEREADY_ON, &mCblk->flags); + // stepUser() clears CBLK_UNDERRUN_ON flag enabling underrun callbacks to + // the client + mCblk->stepUser(frames); + } } if (mActive) { result = mAudioTrack->start(); |