Loading core/jni/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -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 \ Loading core/jni/android_media_AudioTrack.cpp +36 −36 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include "android_media_AudioFormat.h" #include "android_media_AudioErrors.h" #include "android_media_PlaybackSettings.h" // ---------------------------------------------------------------------------- Loading @@ -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; Loading Loading @@ -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", Loading @@ -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); } Loading Loading @@ -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", Loading Loading @@ -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"); Loading @@ -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)); } Loading media/java/android/media/AudioTrack.java +4 −30 Original line number Diff line number Diff line Loading @@ -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(); } /** Loading Loading @@ -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); } Loading Loading @@ -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(); Loading Loading
core/jni/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -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 \ Loading
core/jni/android_media_AudioTrack.cpp +36 −36 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ #include "android_media_AudioFormat.h" #include "android_media_AudioErrors.h" #include "android_media_PlaybackSettings.h" // ---------------------------------------------------------------------------- Loading @@ -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; Loading Loading @@ -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", Loading @@ -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); } Loading Loading @@ -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", Loading Loading @@ -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"); Loading @@ -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)); } Loading
media/java/android/media/AudioTrack.java +4 −30 Original line number Diff line number Diff line Loading @@ -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(); } /** Loading Loading @@ -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); } Loading Loading @@ -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(); Loading