Merge "MediaSync: fix message delay based on play time for pending audio frames."
diff --git a/media/java/android/media/MediaSync.java b/media/java/android/media/MediaSync.java
index c1f1a73..3b4f8e5 100644
--- a/media/java/android/media/MediaSync.java
+++ b/media/java/android/media/MediaSync.java
@@ -29,6 +29,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.nio.ByteBuffer;
+import java.util.concurrent.TimeUnit;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -586,8 +587,9 @@
 
                         audioBuffer.mSizeInBytes -= sizeWritten;
                     }
-                    // TODO: wait time depends on fullness of audio track.
-                    postRenderAudio(10);
+                    long pendingTimeMs = TimeUnit.MICROSECONDS.toMillis(
+                            native_getPlayTimeForPendingAudioFrames());
+                    postRenderAudio(pendingTimeMs / 2);
                 }
             }
         }, delayMillis);
@@ -596,6 +598,8 @@
     private native final void native_updateQueuedAudioData(
             int sizeInBytes, long presentationTimeUs);
 
+    private native final long native_getPlayTimeForPendingAudioFrames();
+
     private final void postReturnByteBuffer(@NonNull final AudioBuffer audioBuffer) {
         synchronized(mCallbackLock) {
             if (mCallbackHandler != null) {
diff --git a/media/jni/android_media_MediaSync.cpp b/media/jni/android_media_MediaSync.cpp
index 72dacdf..f192262 100644
--- a/media/jni/android_media_MediaSync.cpp
+++ b/media/jni/android_media_MediaSync.cpp
@@ -86,6 +86,10 @@
     return mSync->updateQueuedAudioData(sizeInBytes, presentationTimeUs);
 }
 
+status_t JMediaSync::getPlayTimeForPendingAudioFrames(int64_t *outTimeUs) {
+    return mSync->getPlayTimeForPendingAudioFrames(outTimeUs);
+}
+
 }  // namespace android
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -268,6 +272,21 @@
     return JNI_TRUE;
 }
 
+static jlong android_media_MediaSync_native_getPlayTimeForPendingAudioFrames(
+        JNIEnv *env, jobject thiz) {
+    sp<JMediaSync> sync = getMediaSync(env, thiz);
+    if (sync == NULL) {
+        throwExceptionAsNecessary(env, INVALID_OPERATION);
+    }
+
+    int64_t playTimeUs = 0;
+    status_t err = sync->getPlayTimeForPendingAudioFrames(&playTimeUs);
+    if (err != NO_ERROR) {
+        throwExceptionAsNecessary(env, err);
+    }
+    return (jlong)playTimeUs;
+}
+
 static void
 android_media_MediaSync_setSyncSettings(JNIEnv *env, jobject thiz, jobject settings)
 {
@@ -387,6 +406,10 @@
       "(Landroid/media/MediaTimestamp;)Z",
       (void *)android_media_MediaSync_native_getTimestamp },
 
+    { "native_getPlayTimeForPendingAudioFrames",
+      "()J",
+      (void *)android_media_MediaSync_native_getPlayTimeForPendingAudioFrames },
+
     { "native_init", "()V", (void *)android_media_MediaSync_native_init },
 
     { "native_setup", "()V", (void *)android_media_MediaSync_native_setup },
diff --git a/media/jni/android_media_MediaSync.h b/media/jni/android_media_MediaSync.h
index 9e5de7e..cf81a72 100644
--- a/media/jni/android_media_MediaSync.h
+++ b/media/jni/android_media_MediaSync.h
@@ -41,6 +41,8 @@
 
     status_t setPlaybackRate(float rate);
 
+    status_t getPlayTimeForPendingAudioFrames(int64_t *outTimeUs);
+
     sp<const MediaClock> getMediaClock();
 
 protected: