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

Commit 1afdbe3b authored by Andy Hung's avatar Andy Hung Committed by Android (Google) Code Review
Browse files

Merge "Pass PlaybackSettings as class object for AudioTrack JNI" into mnc-dev

parents 33c9dde9 fe48e0df
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -176,6 +176,7 @@ LOCAL_C_INCLUDES += \
    $(call include-path-for, libhardware)/hardware \
    $(call include-path-for, libhardware_legacy)/hardware_legacy \
    $(TOP)/frameworks/av/include \
    $(TOP)/frameworks/base/media/jni \
    $(TOP)/system/media/camera/include \
    $(TOP)/system/netd/include \
    external/pdfium/core/include/fpdfapi \
+36 −36
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@

#include "android_media_AudioFormat.h"
#include "android_media_AudioErrors.h"
#include "android_media_PlaybackSettings.h"

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

@@ -59,6 +60,7 @@ struct audio_attributes_fields_t {
};
static audio_track_fields_t      javaAudioTrackFields;
static audio_attributes_fields_t javaAudioAttrFields;
static PlaybackSettings::fields_t gPlaybackSettingsFields;

struct audiotrack_callback_cookie {
    jclass      audioTrack_class;
@@ -690,7 +692,7 @@ static jint android_media_AudioTrack_get_playback_rate(JNIEnv *env, jobject thi

// ----------------------------------------------------------------------------
static void android_media_AudioTrack_set_playback_settings(JNIEnv *env,  jobject thiz,
        jfloatArray floatArray, jintArray intArray) {
        jobject settings) {
    sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
    if (lpTrack == NULL) {
        jniThrowException(env, "java/lang/IllegalStateException",
@@ -698,50 +700,39 @@ static void android_media_AudioTrack_set_playback_settings(JNIEnv *env, jobject
        return;
    }

    // NOTE: Get<Primitive>ArrayRegion throws ArrayIndexOutOfBoundsException if not valid.
    // TODO: consider the actual occupancy.
    float farray[2];
    int iarray[2];
    if ((env->GetFloatArrayRegion(floatArray, 0, 2, farray), env->ExceptionCheck()) == JNI_FALSE
            &&
        (env->GetIntArrayRegion(intArray, 0, 2, iarray), env->ExceptionCheck()) == JNI_FALSE) {
        // arrays retrieved OK
        AudioPlaybackRate playbackRate;
        playbackRate.mSpeed = farray[0];
        playbackRate.mPitch = farray[1];
        playbackRate.mFallbackMode = (AudioTimestretchFallbackMode)iarray[0];
        playbackRate.mStretchMode = (AudioTimestretchStretchMode)iarray[1];
        if (lpTrack->setPlaybackRate(playbackRate) != OK) {
    PlaybackSettings pbs;
    pbs.fillFromJobject(env, gPlaybackSettingsFields, settings);

    ALOGV("setPlaybackSettings: %d:%f %d:%f %d:%u %d:%u",
            pbs.speedSet, pbs.audioRate.mSpeed,
            pbs.pitchSet, pbs.audioRate.mPitch,
            pbs.audioFallbackModeSet, pbs.audioRate.mFallbackMode,
            pbs.audioStretchModeSet, pbs.audioRate.mStretchMode);

    if (lpTrack->setPlaybackRate(pbs.audioRate) != OK) {
        jniThrowException(env, "java/lang/IllegalArgumentException",
                "arguments out of range");
    }
}
}


// ----------------------------------------------------------------------------
static void android_media_AudioTrack_get_playback_settings(JNIEnv *env,  jobject thiz,
        jfloatArray floatArray, jintArray intArray) {
static jobject android_media_AudioTrack_get_playback_settings(JNIEnv *env,  jobject thiz,
        jobject settings) {
    sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
    if (lpTrack == NULL) {
        jniThrowException(env, "java/lang/IllegalStateException",
            "AudioTrack not initialized");
        return;
        return NULL;
    }

    AudioPlaybackRate playbackRate = lpTrack->getPlaybackRate();

    float farray[2] = {
            playbackRate.mSpeed,
            playbackRate.mPitch,
    };
    int iarray[2] = {
            playbackRate.mFallbackMode,
            playbackRate.mStretchMode,
    };
    // NOTE: Set<Primitive>ArrayRegion throws ArrayIndexOutOfBoundsException if not valid.
    env->SetFloatArrayRegion(floatArray, 0, 2, farray);
    env->SetIntArrayRegion(intArray, 0, 2, iarray);
    PlaybackSettings pbs;
    pbs.audioRate = lpTrack->getPlaybackRate();
    pbs.speedSet = true;
    pbs.pitchSet = true;
    pbs.audioFallbackModeSet = true;
    pbs.audioStretchModeSet = true;
    return pbs.asJobject(env, gPlaybackSettingsFields);
}


@@ -1012,9 +1003,11 @@ static JNINativeMethod gMethods[] = {
    {"native_get_playback_rate",
                             "()I",      (void *)android_media_AudioTrack_get_playback_rate},
    {"native_set_playback_settings",
                             "([F[I)V",  (void *)android_media_AudioTrack_set_playback_settings},
                             "(Landroid/media/PlaybackSettings;)V",
                                         (void *)android_media_AudioTrack_set_playback_settings},
    {"native_get_playback_settings",
                             "([F[I)V",  (void *)android_media_AudioTrack_get_playback_settings},
                             "()Landroid/media/PlaybackSettings;",
                                         (void *)android_media_AudioTrack_get_playback_settings},
    {"native_set_marker_pos","(I)I",     (void *)android_media_AudioTrack_set_marker_pos},
    {"native_get_marker_pos","()I",      (void *)android_media_AudioTrack_get_marker_pos},
    {"native_set_pos_update_period",
@@ -1088,6 +1081,8 @@ int register_android_media_AudioTrack(JNIEnv *env)
    javaAudioTrackFields.fieldStreamType = GetFieldIDOrDie(env,
            audioTrackClass, JAVA_STREAMTYPE_FIELD_NAME, "I");

    env->DeleteLocalRef(audioTrackClass);

    // Get the AudioAttributes class and fields
    jclass audioAttrClass = FindClassOrDie(env, kAudioAttributesClassPathName);
    javaAudioAttrFields.fieldUsage = GetFieldIDOrDie(env, audioAttrClass, "mUsage", "I");
@@ -1097,6 +1092,11 @@ int register_android_media_AudioTrack(JNIEnv *env)
    javaAudioAttrFields.fieldFormattedTags = GetFieldIDOrDie(env,
            audioAttrClass, "mFormattedTags", "Ljava/lang/String;");

    env->DeleteLocalRef(audioAttrClass);

    // initialize PlaybackSettings field info
    gPlaybackSettingsFields.init(env);

    return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
}

+4 −30
Original line number Diff line number Diff line
@@ -920,13 +920,7 @@ public class AudioTrack
     * @throws IllegalStateException if track is not initialized.
     */
    public @NonNull PlaybackSettings getPlaybackSettings() {
        float[] floatArray = new float[2];
        int[] intArray = new int[2];
        native_get_playback_settings(floatArray, intArray);
        return new PlaybackSettings()
                .setSpeed(floatArray[0])
                .setPitch(floatArray[1])
                .setAudioFallbackMode(intArray[0]);
        return native_get_playback_settings();
    }

    /**
@@ -1340,21 +1334,7 @@ public class AudioTrack
        if (settings == null) {
            throw new IllegalArgumentException("settings is null");
        }
        float[] floatArray;
        int[] intArray;
        try {
            floatArray = new float[] {
                    settings.getSpeed(),
                    settings.getPitch(),
            };
            intArray = new int[] {
                    settings.getAudioFallbackMode(),
                    PlaybackSettings.AUDIO_STRETCH_MODE_DEFAULT,
            };
        } catch (IllegalStateException e) {
            throw new IllegalArgumentException(e);
        }
        native_set_playback_settings(floatArray, intArray);
        native_set_playback_settings(settings);
    }


@@ -2353,14 +2333,8 @@ public class AudioTrack
    private native final int native_set_playback_rate(int sampleRateInHz);
    private native final int native_get_playback_rate();

    // floatArray must be a non-null array of length >= 2
    // [0] is speed
    // [1] is pitch
    // intArray must be a non-null array of length >= 2
    // [0] is audio fallback mode
    // [1] is audio stretch mode
    private native final void native_set_playback_settings(float[] floatArray, int[] intArray);
    private native final void native_get_playback_settings(float[] floatArray, int[] intArray);
    private native final void native_set_playback_settings(@NonNull PlaybackSettings settings);
    private native final @NonNull PlaybackSettings native_get_playback_settings();

    private native final int native_set_marker_pos(int marker);
    private native final int native_get_marker_pos();