Merge "Expose latency methods through AudioManager and AudioTrack." into jb-mr2-dev
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 0827f7c..67c2cfd 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -271,6 +271,17 @@
return (jint) AudioSystem::getPrimaryOutputFrameCount();
}
+static jint
+android_media_AudioSystem_getOutputLatency(JNIEnv *env, jobject clazz, jint stream)
+{
+ uint32_t afLatency;
+ if (AudioSystem::getOutputLatency(&afLatency, static_cast <audio_stream_type_t>(stream))
+ != NO_ERROR) {
+ afLatency = -1;
+ }
+ return (jint) afLatency;
+}
+
// ----------------------------------------------------------------------------
static JNINativeMethod gMethods[] = {
@@ -296,6 +307,7 @@
{"getDevicesForStream", "(I)I", (void *)android_media_AudioSystem_getDevicesForStream},
{"getPrimaryOutputSamplingRate", "()I", (void *)android_media_AudioSystem_getPrimaryOutputSamplingRate},
{"getPrimaryOutputFrameCount", "()I", (void *)android_media_AudioSystem_getPrimaryOutputFrameCount},
+ {"getOutputLatency", "(I)I", (void *)android_media_AudioSystem_getOutputLatency},
};
int register_android_media_AudioSystem(JNIEnv *env)
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index e2d34c9..3ff9dda 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -728,6 +728,19 @@
// ----------------------------------------------------------------------------
+static jint android_media_AudioTrack_get_latency(JNIEnv *env, jobject thiz) {
+ sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
+
+ if (lpTrack == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Unable to retrieve AudioTrack pointer for latency()");
+ return AUDIOTRACK_ERROR;
+ }
+ return (jint)lpTrack->latency();
+}
+
+
+// ----------------------------------------------------------------------------
static jint android_media_AudioTrack_set_loop(JNIEnv *env, jobject thiz,
jint loopStart, jint loopEnd, jint loopCount) {
sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
@@ -854,6 +867,7 @@
"()I", (void *)android_media_AudioTrack_get_pos_update_period},
{"native_set_position", "(I)I", (void *)android_media_AudioTrack_set_position},
{"native_get_position", "()I", (void *)android_media_AudioTrack_get_position},
+ {"native_get_latency", "()I", (void *)android_media_AudioTrack_get_latency},
{"native_set_loop", "(III)I", (void *)android_media_AudioTrack_set_loop},
{"native_reload_static", "()I", (void *)android_media_AudioTrack_reload},
{"native_get_output_sample_rate",
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 8295c5f..93ab401 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2553,4 +2553,15 @@
}
}
+ /**
+ * Returns the estimated latency for the given stream type in milliseconds.
+ *
+ * DO NOT UNHIDE. The existing approach for doing A/V sync has too many problems. We need
+ * a better solution.
+ * @hide
+ */
+ public int getOutputLatency(int streamType) {
+ return AudioSystem.getOutputLatency(streamType);
+ }
+
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 4a33743..d42bfd44 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -401,5 +401,6 @@
// helpers for android.media.AudioManager.getProperty(), see description there for meaning
public static native int getPrimaryOutputSamplingRate();
public static native int getPrimaryOutputFrameCount();
+ public static native int getOutputLatency(int stream);
}
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 399eb7b..9768a78 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -628,6 +628,18 @@
}
/**
+ * Returns this track's estimated latency in milliseconds. This includes the latency due
+ * to AudioTrack buffer size, AudioMixer (if any) and audio hardware driver.
+ *
+ * DO NOT UNHIDE. The existing approach for doing A/V sync has too many problems. We need
+ * a better solution.
+ * @hide
+ */
+ public int getLatency() {
+ return native_get_latency();
+ }
+
+ /**
* Returns the hardware output sample rate
*/
static public int getNativeOutputSampleRate(int streamType) {
@@ -1256,6 +1268,8 @@
private native final int native_set_position(int position);
private native final int native_get_position();
+ private native final int native_get_latency();
+
private native final int native_set_loop(int start, int end, int loopCount);
static private native final int native_get_output_sample_rate(int streamType);