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

Commit fe48e0df authored by Andy Hung's avatar Andy Hung
Browse files

Pass PlaybackSettings as class object for AudioTrack JNI

Change-Id: Ic7fb5f84ed1fc4cc2286e5c207fee5298a64a5a4
parent c0667853
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();