summaryrefslogtreecommitdiffstats
path: root/core/jni/android_media_AudioTrack.cpp
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2014-05-08 23:19:49 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-05-08 23:19:49 +0000
commiteea64a928e92e5b2e588274475ca562d1aeeaf5c (patch)
tree75d8fe3f3855c42863874d661abf572980f81421 /core/jni/android_media_AudioTrack.cpp
parent6e058419503910e0d5f67f9b51b84ad636ffa01f (diff)
parent54955e33c8612a737a76177408f3e7c8482cfcf4 (diff)
downloadframeworks_base-eea64a928e92e5b2e588274475ca562d1aeeaf5c.zip
frameworks_base-eea64a928e92e5b2e588274475ca562d1aeeaf5c.tar.gz
frameworks_base-eea64a928e92e5b2e588274475ca562d1aeeaf5c.tar.bz2
Merge "Add hidden support for ENCODING_PCM_FLOAT to AudioTrack"
Diffstat (limited to 'core/jni/android_media_AudioTrack.cpp')
-rw-r--r--core/jni/android_media_AudioTrack.cpp48
1 files changed, 45 insertions, 3 deletions
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index da752752..463a0a8 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -526,12 +526,15 @@ jint writeToTrack(const sp<AudioTrack>& track, jint audioFormat, const jbyte* da
switch (format) {
default:
- // TODO Currently the only possible values for format are AUDIO_FORMAT_PCM_16_BIT
- // and AUDIO_FORMAT_PCM_8_BIT, due to the limited set of values for audioFormat.
+ // TODO Currently the only possible values for format are AUDIO_FORMAT_PCM_16_BIT,
+ // AUDIO_FORMAT_PCM_8_BIT, and AUDIO_FORMAT_PCM_FLOAT,
+ // due to the limited set of values for audioFormat.
// The next section of the switch will probably work for more formats, but it has only
- // been tested for AUDIO_FORMAT_PCM_16_BIT, so that's why the "default" case fails.
+ // been tested for AUDIO_FORMAT_PCM_16_BIT and AUDIO_FORMAT_PCM_FLOAT,
+ // so that's why the "default" case fails.
break;
+ case AUDIO_FORMAT_PCM_FLOAT:
case AUDIO_FORMAT_PCM_16_BIT: {
// writing to shared memory, check for capacity
if ((size_t)sizeInBytes > track->sharedBuffer()->size()) {
@@ -679,6 +682,44 @@ static jint android_media_AudioTrack_write_short(JNIEnv *env, jobject thiz,
// ----------------------------------------------------------------------------
+static jint android_media_AudioTrack_write_float(JNIEnv *env, jobject thiz,
+ jfloatArray javaAudioData,
+ jint offsetInFloats, jint sizeInFloats,
+ jint javaAudioFormat,
+ jboolean isWriteBlocking) {
+
+ sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
+ if (lpTrack == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException",
+ "Unable to retrieve AudioTrack pointer for write()");
+ return 0;
+ }
+
+ jfloat* cAudioData = NULL;
+ if (javaAudioData) {
+ cAudioData = (jfloat *)env->GetFloatArrayElements(javaAudioData, NULL);
+ if (cAudioData == NULL) {
+ ALOGE("Error retrieving source of audio data to play, can't play");
+ return 0; // out of memory or no data to load
+ }
+ } else {
+ ALOGE("NULL java array of audio data to play, can't play");
+ return 0;
+ }
+ jint written = writeToTrack(lpTrack, javaAudioFormat, (jbyte *)cAudioData,
+ offsetInFloats * sizeof(float), sizeInFloats * sizeof(float),
+ isWriteBlocking == JNI_TRUE /* blocking */);
+ env->ReleaseFloatArrayElements(javaAudioData, cAudioData, 0);
+
+ if (written > 0) {
+ written /= sizeof(float);
+ }
+
+ return written;
+}
+
+
+// ----------------------------------------------------------------------------
static jint android_media_AudioTrack_get_native_frame_count(JNIEnv *env, jobject thiz) {
sp<AudioTrack> lpTrack = getAudioTrack(env, thiz);
if (lpTrack == NULL) {
@@ -963,6 +1004,7 @@ static JNINativeMethod gMethods[] = {
"(Ljava/lang/Object;IIIZ)I",
(void *)android_media_AudioTrack_write_native_bytes},
{"native_write_short", "([SIII)I", (void *)android_media_AudioTrack_write_short},
+ {"native_write_float", "([FIIIZ)I",(void *)android_media_AudioTrack_write_float},
{"native_setVolume", "(FF)V", (void *)android_media_AudioTrack_set_volume},
{"native_get_native_frame_count",
"()I", (void *)android_media_AudioTrack_get_native_frame_count},