Merge "fix end of track presentation on suspended output" into jb-mr1-dev
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index de116a9..8e950aa 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -2116,7 +2116,17 @@
     }
     *halFrames = mBytesWritten / audio_stream_frame_size(&mOutput->stream->common);
 
-    return mOutput->stream->get_render_position(mOutput->stream, dspFrames);
+    if (isSuspended()) {
+        // return an estimation of rendered frames when the output is suspended
+        int32_t frames = mBytesWritten - latency_l();
+        if (frames < 0) {
+            frames = 0;
+        }
+        *dspFrames = (uint32_t)frames;
+        return NO_ERROR;
+    } else {
+        return mOutput->stream->get_render_position(mOutput->stream, dspFrames);
+    }
 }
 
 uint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId) const
@@ -2573,7 +2583,6 @@
                     threadLoop_standby();
 
                     mStandby = true;
-                    mBytesWritten = 0;
                 }
 
                 if (!mActiveTracks.size() && mConfigEvents.isEmpty()) {
@@ -2593,6 +2602,7 @@
 
                     mMixerStatus = MIXER_IDLE;
                     mMixerStatusIgnoringFastTracks = MIXER_IDLE;
+                    mBytesWritten = 0;
 
                     checkSilentMode_l();
 
@@ -2623,6 +2633,7 @@
 
         if (isSuspended()) {
             sleepTime = suspendSleepTimeUs();
+            mBytesWritten += mixBufferSize;
         }
 
         // only process effects if we're going to write