am cb013629: am dfa29ab1: Merge "Smoothen audio "real" time by compensating with system_time()" into jb-dev

* commit 'cb013629eaac7fa42a5b1e2f9b6b10af87851909':
  Smoothen audio "real" time by compensating with system_time()
diff --git a/include/media/stagefright/AudioPlayer.h b/include/media/stagefright/AudioPlayer.h
index 9e8e4bb..a94b16e 100644
--- a/include/media/stagefright/AudioPlayer.h
+++ b/include/media/stagefright/AudioPlayer.h
@@ -80,6 +80,7 @@
 
     Mutex mLock;
     int64_t mNumFramesPlayed;
+    int64_t mNumFramesPlayedSysTimeUs;
 
     int64_t mPositionTimeMediaUs;
     int64_t mPositionTimeRealUs;
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index ca49782..f729a78 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -21,6 +21,7 @@
 #include <binder/IPCThreadState.h>
 #include <media/AudioTrack.h>
 #include <media/stagefright/foundation/ADebug.h>
+#include <media/stagefright/foundation/ALooper.h>
 #include <media/stagefright/AudioPlayer.h>
 #include <media/stagefright/MediaDefs.h>
 #include <media/stagefright/MediaErrors.h>
@@ -41,6 +42,7 @@
       mLatencyUs(0),
       mFrameSize(0),
       mNumFramesPlayed(0),
+      mNumFramesPlayedSysTimeUs(ALooper::GetNowUs()),
       mPositionTimeMediaUs(-1),
       mPositionTimeRealUs(-1),
       mSeeking(false),
@@ -200,6 +202,7 @@
         }
 
         mNumFramesPlayed = 0;
+        mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
     } else {
         if (mAudioSink.get() != NULL) {
             mAudioSink->pause();
@@ -260,6 +263,7 @@
     IPCThreadState::self()->flushCommands();
 
     mNumFramesPlayed = 0;
+    mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
     mPositionTimeMediaUs = -1;
     mPositionTimeRealUs = -1;
     mSeeking = false;
@@ -485,6 +489,7 @@
     {
         Mutex::Autolock autoLock(mLock);
         mNumFramesPlayed += size_done / mFrameSize;
+        mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
     }
 
     if (postEOS) {
@@ -506,7 +511,14 @@
 int64_t AudioPlayer::getRealTimeUsLocked() const {
     CHECK(mStarted);
     CHECK_NE(mSampleRate, 0);
-    return -mLatencyUs + (mNumFramesPlayed * 1000000) / mSampleRate;
+    int64_t result = -mLatencyUs + (mNumFramesPlayed * 1000000) / mSampleRate;
+
+    // Compensate for large audio buffers, updates of mNumFramesPlayed
+    // are less frequent, therefore to get a "smoother" notion of time we
+    // compensate using system time.
+    int64_t diffUs = ALooper::GetNowUs() - mNumFramesPlayedSysTimeUs;
+
+    return result + diffUs;
 }
 
 int64_t AudioPlayer::getMediaTimeUs() {
@@ -548,6 +560,7 @@
 
     // Flush resets the number of played frames
     mNumFramesPlayed = 0;
+    mNumFramesPlayedSysTimeUs = ALooper::GetNowUs();
 
     if (mAudioSink != NULL) {
         mAudioSink->flush();