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
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 @@
                 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;