Merge "Pass PlaybackSettings as class object for AudioTrack JNI" into mnc-dev
This commit is contained in:
@@ -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 \
|
||||
|
||||
@@ -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) {
|
||||
jniThrowException(env, "java/lang/IllegalArgumentException",
|
||||
"arguments out of range");
|
||||
}
|
||||
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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user