diff options
| -rw-r--r-- | core/jni/android_media_AudioFormat.h | 7 | ||||
| -rw-r--r-- | core/jni/android_media_AudioSystem.cpp | 33 |
2 files changed, 34 insertions, 6 deletions
diff --git a/core/jni/android_media_AudioFormat.h b/core/jni/android_media_AudioFormat.h index 514445737425..bb13c35ced1f 100644 --- a/core/jni/android_media_AudioFormat.h +++ b/core/jni/android_media_AudioFormat.h @@ -80,6 +80,13 @@ static inline int audioFormatFromNative(audio_format_t nativeFormat) return ENCODING_PCM_8BIT; case AUDIO_FORMAT_PCM_FLOAT: return ENCODING_PCM_FLOAT; + + // map these to ENCODING_PCM_FLOAT + case AUDIO_FORMAT_PCM_8_24_BIT: + case AUDIO_FORMAT_PCM_24_BIT_PACKED: + case AUDIO_FORMAT_PCM_32_BIT: + return ENCODING_PCM_FLOAT; + case AUDIO_FORMAT_AC3: return ENCODING_AC3; case AUDIO_FORMAT_E_AC3: diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index ac00532417a0..9f2181f0a791 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -832,6 +832,15 @@ exit: return jStatus; } +static bool hasFormat(int* formats, size_t size, int format) { + for (size_t index = 0; index < size; index++) { + if (formats[index] == format) { + return true; // found + } + } + return false; // not found +} + static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, const struct audio_port *nAudioPort) { @@ -839,6 +848,7 @@ static jint convertAudioPortFromNative(JNIEnv *env, jintArray jSamplingRates = NULL; jintArray jChannelMasks = NULL; jintArray jChannelIndexMasks = NULL; + int* cFormats = NULL; jintArray jFormats = NULL; jobjectArray jGains = NULL; jobject jHandle = NULL; @@ -846,7 +856,7 @@ static jint convertAudioPortFromNative(JNIEnv *env, bool useInMask; size_t numPositionMasks = 0; size_t numIndexMasks = 0; - + size_t numUniqueFormats; ALOGV("convertAudioPortFromNative id %d role %d type %d name %s", nAudioPort->id, nAudioPort->role, nAudioPort->type, nAudioPort->name); @@ -897,15 +907,20 @@ static jint convertAudioPortFromNative(JNIEnv *env, } // formats - jFormats = env->NewIntArray(nAudioPort->num_formats); + cFormats = new int[nAudioPort->num_formats]; + numUniqueFormats = 0; + for (size_t index = 0; index < nAudioPort->num_formats; index++) { + int format = audioFormatFromNative(nAudioPort->formats[index]); + if (!hasFormat(cFormats, numUniqueFormats, format)) { + cFormats[numUniqueFormats++] = format; + } + } + jFormats = env->NewIntArray(numUniqueFormats); if (jFormats == NULL) { jStatus = (jint)AUDIO_JAVA_ERROR; goto exit; } - for (size_t j = 0; j < nAudioPort->num_formats; j++) { - jint jFormat = audioFormatFromNative(nAudioPort->formats[j]); - env->SetIntArrayRegion(jFormats, j, 1, &jFormat); - } + env->SetIntArrayRegion(jFormats, 0, numUniqueFormats, cFormats); // gains jGains = env->NewObjectArray(nAudioPort->num_gains, @@ -1000,6 +1015,12 @@ exit: if (jChannelMasks != NULL) { env->DeleteLocalRef(jChannelMasks); } + if (jChannelIndexMasks != NULL) { + env->DeleteLocalRef(jChannelIndexMasks); + } + if (cFormats != NULL) { + delete[] cFormats; + } if (jFormats != NULL) { env->DeleteLocalRef(jFormats); } |