diff options
author | jiabin <jiabin@google.com> | 2021-07-15 14:53:31 -0700 |
---|---|---|
committer | jiabin <jiabin@google.com> | 2021-07-16 11:40:30 -0700 |
commit | 3e575e58cc2a6fa30cda89fcf0a7dba9f67e832b (patch) | |
tree | ec76a327b05c9c151f58e1b43ad9e880dfa36792 /core/jni | |
parent | f36c575bee6e45d274ebdb3cb931028695d613d9 (diff) |
Add PCM float profile if extended precision PCM shows but not pcm float.
This is required for backwards compatibility. This ensures pre-S apps
that look for pcm float continue to see that encoding if the device
supports extended precision integers.
Test: atest AudioManagerTest
Bug: 193747274
Change-Id: Ia244bdcd51520dd082a292baab54f1795ccccaea
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/android_media_AudioSystem.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index 6e2b9cf250c6..16ee6a745e1d 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -1242,6 +1242,8 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, jstring jDeviceName = NULL; jobject jAudioProfiles = NULL; jobject jAudioDescriptors = nullptr; + ScopedLocalRef<jobject> jPcmFloatProfileFromExtendedInteger(env, nullptr); + bool hasFloat = false; bool useInMask; ALOGV("convertAudioPortFromNative id %d role %d type %d name %s", @@ -1338,6 +1340,25 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort, goto exit; } env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, jAudioProfile.get()); + if (nAudioPort->audio_profiles[i].format == AUDIO_FORMAT_PCM_FLOAT) { + hasFloat = true; + } else if (jPcmFloatProfileFromExtendedInteger.get() == nullptr && + audio_is_linear_pcm(nAudioPort->audio_profiles[i].format) && + audio_bytes_per_sample(nAudioPort->audio_profiles[i].format) > 2) { + jPcmFloatProfileFromExtendedInteger.reset( + env->NewObject(gAudioProfileClass, gAudioProfileCstor, + audioFormatFromNative(AUDIO_FORMAT_PCM_FLOAT), + jSamplingRates.get(), jChannelMasks.get(), + jChannelIndexMasks.get(), encapsulationType)); + } + } + if (!hasFloat && jPcmFloatProfileFromExtendedInteger.get() != nullptr) { + // R and earlier compatibility - add ENCODING_PCM_FLOAT to the end + // (replacing the zero pad). This ensures pre-S apps that look + // for ENCODING_PCM_FLOAT continue to see that encoding if the device supports + // extended precision integers. + env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, + jPcmFloatProfileFromExtendedInteger.get()); } jAudioDescriptors = env->NewObject(gArrayListClass, gArrayListMethods.cstor); |