From 078538cfc6c4682889ed52de460d29c0d15bb9eb Mon Sep 17 00:00:00 2001 From: Marco Nelissen Date: Tue, 12 May 2015 09:17:57 -0700 Subject: Work around bug in offload driver There is a bug in the offload driver that causes the last offload buffer(s) to be dropped unless the device is on power or holding a wake lock. To avoid truncated playback, we now hold a wake lock during the drain phase of offloaded playback. Bug: 19928717 Change-Id: I8df22e965ec791448aa5d9b74e743f48ef886fc4 --- services/audioflinger/Threads.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'services/audioflinger/Threads.cpp') diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp index 2c4d801..e02c79f 100644 --- a/services/audioflinger/Threads.cpp +++ b/services/audioflinger/Threads.cpp @@ -2679,13 +2679,23 @@ bool AudioFlinger::PlaybackThread::threadLoop() if (exitPending()) { break; } - releaseWakeLock_l(); + bool released = false; + // The following works around a bug in the offload driver. Ideally we would release + // the wake lock every time, but that causes the last offload buffer(s) to be + // dropped while the device is on battery, so we need to hold a wake lock during + // the drain phase. + if (mBytesRemaining && !(mDrainSequence & 1)) { + releaseWakeLock_l(); + released = true; + } mWakeLockUids.clear(); mActiveTracksGeneration++; ALOGV("wait async completion"); mWaitWorkCV.wait(mLock); ALOGV("async completion/wake"); - acquireWakeLock_l(); + if (released) { + acquireWakeLock_l(); + } standbyTime = systemTime() + standbyDelay; sleepTime = 0; -- cgit v1.1