Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 510225b5 authored by Ray Essick's avatar Ray Essick
Browse files

add getMetrics() apis for AudioTrack and AudioRecord

add getMetrics() method to access media.metrics for AudioTrack and
AudioRecord. Includes the code paths and the sdk documentation
for the keys and what they return.

Moves the media metrics JNI support routines from media to core
to support these audiotrack/record operations being there; still
accessible to the existing operations in the media libraries.

Bug: 72179020
Bug: 72178968
Test: enhanced CTS
Change-Id: I3f05beba31aacb9b96854f8a774cb8f669ee1625
parent 0cccde6b
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -22097,6 +22097,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();
@@ -22145,6 +22146,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);
@@ -22204,6 +22213,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();
@@ -22284,6 +22294,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);
+2 −0
Original line number Diff line number Diff line
@@ -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",
+36 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@
#include "android_media_AudioFormat.h"
#include "android_media_AudioErrors.h"
#include "android_media_DeviceCallback.h"
#include "android_media_MediaMetricsJNI.h"

// ----------------------------------------------------------------------------

@@ -750,6 +751,39 @@ static jint android_media_AudioRecord_get_timestamp(JNIEnv *env, jobject thiz,
    return status;
}

// ----------------------------------------------------------------------------
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[] = {
@@ -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},
+36 −0
Original line number Diff line number Diff line
@@ -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",
Loading