summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2018-01-25 20:31:07 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2018-01-25 20:31:07 +0000
commit4b7abff00546ffe56b698959832947ae99ef91dd (patch)
tree60c89b1cfb1ea395e6f708fd628e994413afbb56
parenteb576da48763e6138fbfb633180df82405ec638f (diff)
parent510225b5ef52143e46079b10b1fe285b69140a77 (diff)
Merge "add getMetrics() apis for AudioTrack and AudioRecord"
-rw-r--r--api/current.txt18
-rw-r--r--core/jni/Android.bp2
-rw-r--r--core/jni/android_media_AudioRecord.cpp36
-rw-r--r--core/jni/android_media_AudioTrack.cpp36
-rw-r--r--core/jni/android_media_MediaMetricsJNI.cpp (renamed from media/jni/android_media_MediaMetricsJNI.cpp)0
-rw-r--r--core/jni/android_media_MediaMetricsJNI.h (renamed from media/jni/android_media_MediaMetricsJNI.h)0
-rw-r--r--media/java/android/media/AudioRecord.java60
-rw-r--r--media/java/android/media/AudioTrack.java60
-rw-r--r--media/jni/Android.bp2
9 files changed, 212 insertions, 2 deletions
diff --git a/api/current.txt b/api/current.txt
index b7016a2221f1..fbcedc093cb7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -22101,6 +22101,7 @@ package android.media {
method public int getChannelConfiguration();
method public int getChannelCount();
method public android.media.AudioFormat getFormat();
+ method public android.os.PersistableBundle getMetrics();
method public static int getMinBufferSize(int, int, int);
method public int getNotificationMarkerPosition();
method public int getPositionNotificationPeriod();
@@ -22149,6 +22150,14 @@ package android.media {
method public android.media.AudioRecord.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException;
}
+ public static final class AudioRecord.MetricsConstants {
+ field public static final java.lang.String CHANNELS = "android.media.audiorecord.channels";
+ field public static final java.lang.String ENCODING = "android.media.audiorecord.encoding";
+ field public static final java.lang.String LATENCY = "android.media.audiorecord.latency";
+ field public static final java.lang.String SAMPLERATE = "android.media.audiorecord.samplerate";
+ field public static final java.lang.String SOURCE = "android.media.audiorecord.source";
+ }
+
public static abstract interface AudioRecord.OnRecordPositionUpdateListener {
method public abstract void onMarkerReached(android.media.AudioRecord);
method public abstract void onPeriodicNotification(android.media.AudioRecord);
@@ -22208,6 +22217,7 @@ package android.media {
method public int getChannelCount();
method public android.media.AudioFormat getFormat();
method public static float getMaxVolume();
+ method public android.os.PersistableBundle getMetrics();
method public static int getMinBufferSize(int, int, int);
method public static float getMinVolume();
method protected deprecated int getNativeFrameCount();
@@ -22288,6 +22298,14 @@ package android.media {
method public android.media.AudioTrack.Builder setTransferMode(int) throws java.lang.IllegalArgumentException;
}
+ public static final class AudioTrack.MetricsConstants {
+ field public static final java.lang.String CHANNELMASK = "android.media.audiorecord.channelmask";
+ field public static final java.lang.String CONTENTTYPE = "android.media.audiotrack.type";
+ field public static final java.lang.String SAMPLERATE = "android.media.audiorecord.samplerate";
+ field public static final java.lang.String STREAMTYPE = "android.media.audiotrack.streamtype";
+ field public static final java.lang.String USAGE = "android.media.audiotrack.usage";
+ }
+
public static abstract interface AudioTrack.OnPlaybackPositionUpdateListener {
method public abstract void onMarkerReached(android.media.AudioTrack);
method public abstract void onPeriodicNotification(android.media.AudioTrack);
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 102ff95e6d32..5751fc99a484 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -163,6 +163,7 @@ cc_library_shared {
"android_media_AudioTrack.cpp",
"android_media_DeviceCallback.cpp",
"android_media_JetPlayer.cpp",
+ "android_media_MediaMetricsJNI.cpp",
"android_media_RemoteDisplay.cpp",
"android_media_ToneGenerator.cpp",
"android_hardware_Camera.cpp",
@@ -261,6 +262,7 @@ cc_library_shared {
"libselinux",
"libicuuc",
"libmedia",
+ "libmediametrics",
"libaudioclient",
"libjpeg",
"libusbhost",
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index e4da3c6a6ac8..ebd16c7084ac 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -31,6 +31,7 @@
#include "android_media_AudioFormat.h"
#include "android_media_AudioErrors.h"
#include "android_media_DeviceCallback.h"
+#include "android_media_MediaMetricsJNI.h"
// ----------------------------------------------------------------------------
@@ -751,6 +752,39 @@ static jint android_media_AudioRecord_get_timestamp(JNIEnv *env, jobject thiz,
}
// ----------------------------------------------------------------------------
+static jobject
+android_media_AudioRecord_native_getMetrics(JNIEnv *env, jobject thiz)
+{
+ ALOGV("android_media_AudioRecord_native_getMetrics");
+
+ sp<AudioRecord> lpRecord = getAudioRecord(env, thiz);
+
+ if (lpRecord == NULL) {
+ ALOGE("Unable to retrieve AudioRecord pointer for getMetrics()");
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jobject) NULL;
+ }
+
+ // get what we have for the metrics from the record session
+ MediaAnalyticsItem *item = NULL;
+
+ status_t err = lpRecord->getMetrics(item);
+ if (err != OK) {
+ ALOGE("getMetrics failed");
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jobject) NULL;
+ }
+
+ jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL /* mybundle */);
+
+ // housekeeping
+ delete item;
+ item = NULL;
+
+ return mybundle;
+}
+
+// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
static const JNINativeMethod gMethods[] = {
// name, signature, funcPtr
@@ -781,6 +815,8 @@ static const JNINativeMethod gMethods[] = {
"()I", (void *)android_media_AudioRecord_get_pos_update_period},
{"native_get_min_buff_size",
"(III)I", (void *)android_media_AudioRecord_get_min_buff_size},
+ {"native_getMetrics", "()Landroid/os/PersistableBundle;",
+ (void *)android_media_AudioRecord_native_getMetrics},
{"native_setInputDevice", "(I)Z", (void *)android_media_AudioRecord_setInputDevice},
{"native_getRoutedDeviceId", "()I", (void *)android_media_AudioRecord_getRoutedDeviceId},
{"native_enableDeviceCallback", "()V", (void *)android_media_AudioRecord_enableDeviceCallback},
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 11011b1d7c16..afbc57913688 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -34,6 +34,7 @@
#include "android_media_AudioFormat.h"
#include "android_media_AudioErrors.h"
+#include "android_media_MediaMetricsJNI.h"
#include "android_media_PlaybackParams.h"
#include "android_media_DeviceCallback.h"
#include "android_media_VolumeShaper.h"
@@ -1011,6 +1012,39 @@ static jint android_media_AudioTrack_get_timestamp(JNIEnv *env, jobject thiz, j
return (jint) nativeToJavaStatus(status);
}
+// ----------------------------------------------------------------------------
+static jobject
+android_media_AudioTrack_native_getMetrics(JNIEnv *env, jobject thiz)
+{
+ ALOGD("android_media_AudioTrack_native_getMetrics");
+
+ sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
+
+ if (lpTrack == NULL) {
+ ALOGE("Unable to retrieve AudioTrack pointer for getMetrics()");
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jobject) NULL;
+ }
+
+ // get what we have for the metrics from the track
+ MediaAnalyticsItem *item = NULL;
+
+ status_t err = lpTrack->getMetrics(item);
+ if (err != OK) {
+ ALOGE("getMetrics failed");
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return (jobject) NULL;
+ }
+
+ jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL /* mybundle */);
+
+ // housekeeping
+ delete item;
+ item = NULL;
+
+ return mybundle;
+}
+
// ----------------------------------------------------------------------------
static jint android_media_AudioTrack_set_loop(JNIEnv *env, jobject thiz,
@@ -1275,6 +1309,8 @@ static const JNINativeMethod gMethods[] = {
{"native_get_underrun_count", "()I", (void *)android_media_AudioTrack_get_underrun_count},
{"native_get_flags", "()I", (void *)android_media_AudioTrack_get_flags},
{"native_get_timestamp", "([J)I", (void *)android_media_AudioTrack_get_timestamp},
+ {"native_getMetrics", "()Landroid/os/PersistableBundle;",
+ (void *)android_media_AudioTrack_native_getMetrics},
{"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/jni/android_media_MediaMetricsJNI.cpp b/core/jni/android_media_MediaMetricsJNI.cpp
index 38f7a7e25389..38f7a7e25389 100644
--- a/media/jni/android_media_MediaMetricsJNI.cpp
+++ b/core/jni/android_media_MediaMetricsJNI.cpp
diff --git a/media/jni/android_media_MediaMetricsJNI.h b/core/jni/android_media_MediaMetricsJNI.h
index 16081b4af1cb..16081b4af1cb 100644
--- a/media/jni/android_media_MediaMetricsJNI.h
+++ b/core/jni/android_media_MediaMetricsJNI.h
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 27784e96d9f9..eb6e83065fe9 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -32,6 +32,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.ArrayMap;
@@ -1314,6 +1315,23 @@ public class AudioRecord implements AudioRouting
return native_read_in_direct_buffer(audioBuffer, sizeInBytes, readMode == READ_BLOCKING);
}
+ /**
+ * Return Metrics data about the current AudioTrack instance.
+ *
+ * @return a {@link PersistableBundle} containing the set of attributes and values
+ * available for the media being handled by this instance of AudioRecord
+ * The attributes are descibed in {@link MetricsConstants}.
+ *
+ * Additional vendor-specific fields may also be present in
+ * the return value.
+ */
+ public PersistableBundle getMetrics() {
+ PersistableBundle bundle = native_getMetrics();
+ return bundle;
+ }
+
+ private native PersistableBundle native_getMetrics();
+
//--------------------------------------------------------------------------
// Initialization / configuration
//--------------------
@@ -1739,4 +1757,46 @@ public class AudioRecord implements AudioRouting
private static void loge(String msg) {
Log.e(TAG, msg);
}
+
+ public static final class MetricsConstants
+ {
+ private MetricsConstants() {}
+
+ /**
+ * Key to extract the output format being recorded
+ * from the {@link AudioRecord#getMetrics} return value.
+ * The value is a String.
+ */
+ public static final String ENCODING = "android.media.audiorecord.encoding";
+
+ /**
+ * Key to extract the Source Type for this track
+ * from the {@link AudioRecord#getMetrics} return value.
+ * The value is a String.
+ */
+ public static final String SOURCE = "android.media.audiorecord.source";
+
+ /**
+ * Key to extract the estimated latency through the recording pipeline
+ * from the {@link AudioRecord#getMetrics} return value.
+ * This is in units of milliseconds.
+ * The value is an integer.
+ */
+ public static final String LATENCY = "android.media.audiorecord.latency";
+
+ /**
+ * Key to extract the sink sample rate for this record track in Hz
+ * from the {@link AudioRecord#getMetrics} return value.
+ * The value is an integer.
+ */
+ public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
+
+ /**
+ * Key to extract the number of channels being recorded in this record track
+ * from the {@link AudioRecord#getMetrics} return value.
+ * The value is an integer.
+ */
+ public static final String CHANNELS = "android.media.audiorecord.channels";
+
+ }
}
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 5928d03dc4a1..4e9ce8e23e9c 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -36,6 +36,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
+import android.os.PersistableBundle;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -1718,6 +1719,23 @@ public class AudioTrack extends PlayerBase
return ret;
}
+ /**
+ * Return Metrics data about the current AudioTrack instance.
+ *
+ * @return a {@link PersistableBundle} containing the set of attributes and values
+ * available for the media being handled by this instance of AudioTrack
+ * The attributes are descibed in {@link MetricsConstants}.
+ *
+ * Additional vendor-specific fields may also be present in
+ * the return value.
+ */
+ public PersistableBundle getMetrics() {
+ PersistableBundle bundle = native_getMetrics();
+ return bundle;
+ }
+
+ private native PersistableBundle native_getMetrics();
+
//--------------------------------------------------------------------------
// Initialization / configuration
//--------------------
@@ -3239,4 +3257,46 @@ public class AudioTrack extends PlayerBase
private static void loge(String msg) {
Log.e(TAG, msg);
}
+
+ public final static class MetricsConstants
+ {
+ private MetricsConstants() {}
+
+ /**
+ * Key to extract the Stream Type for this track
+ * from the {@link AudioTrack#getMetrics} return value.
+ * The value is a String.
+ */
+ public static final String STREAMTYPE = "android.media.audiotrack.streamtype";
+
+ /**
+ * Key to extract the Content Type for this track
+ * from the {@link AudioTrack#getMetrics} return value.
+ * The value is a String.
+ */
+ public static final String CONTENTTYPE = "android.media.audiotrack.type";
+
+ /**
+ * Key to extract the Content Type for this track
+ * from the {@link AudioTrack#getMetrics} return value.
+ * The value is a String.
+ */
+ public static final String USAGE = "android.media.audiotrack.usage";
+
+ /**
+ * Key to extract the sample rate for this track in Hz
+ * from the {@link AudioTrack#getMetrics} return value.
+ * The value is an integer.
+ */
+ public static final String SAMPLERATE = "android.media.audiorecord.samplerate";
+
+ /**
+ * Key to extract the channel mask information for this track
+ * from the {@link AudioTrack#getMetrics} return value.
+ *
+ * The value is a Long integer.
+ */
+ public static final String CHANNELMASK = "android.media.audiorecord.channelmask";
+
+ }
}
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index 4b4a255644c3..74f3acad74fd 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -12,7 +12,6 @@ cc_library_shared {
"android_media_MediaDrm.cpp",
"android_media_MediaExtractor.cpp",
"android_media_MediaHTTPConnection.cpp",
- "android_media_MediaMetricsJNI.cpp",
"android_media_MediaMetadataRetriever.cpp",
"android_media_MediaMuxer.cpp",
"android_media_MediaPlayer.cpp",
@@ -93,7 +92,6 @@ cc_library_shared {
"android_media_MediaCrypto.cpp",
"android_media_Media2DataSource.cpp",
"android_media_MediaDrm.cpp",
- "android_media_MediaMetricsJNI.cpp",
"android_media_MediaPlayer2.cpp",
"android_media_SyncParams.cpp",
],