summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-09-06 14:53:59 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-09-06 14:53:59 -0700
commita4f73a9e0e0863a567cc06defa0d9e0269388d4e (patch)
tree464d68e33f1351796c60a2a0ff43ec696eb69e7b /media
parent2e3319a62be898e1f0405025d24962fc6a1a3f07 (diff)
parent408b8dc3c0a364c6f6b4991d15da9e6bcc2b8008 (diff)
downloadframeworks_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.cpp25
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();