summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjiabin <jiabin@google.com>2021-07-15 14:53:31 -0700
committerjiabin <jiabin@google.com>2021-07-16 11:40:30 -0700
commit3e575e58cc2a6fa30cda89fcf0a7dba9f67e832b (patch)
treeec76a327b05c9c151f58e1b43ad9e880dfa36792
parentf36c575bee6e45d274ebdb3cb931028695d613d9 (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
-rw-r--r--core/jni/android_media_AudioSystem.cpp21
-rw-r--r--media/java/android/media/AudioDeviceInfo.java25
2 files changed, 22 insertions, 24 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);
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index 09b382ee46d0..a186566aec0b 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -25,7 +25,6 @@ import android.util.SparseIntArray;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.TreeSet;
@@ -515,29 +514,7 @@ public final class AudioDeviceInfo {
* For forward compatibility, applications should ignore entries it does not recognize.
*/
public @NonNull int[] getEncodings() {
- final int[] encodings = AudioFormat.filterPublicFormats(mPort.formats());
- boolean hasFloat = false;
- boolean hasExtendedIntegerPrecision = false;
-
- for (int encoding : encodings) {
- if (AudioFormat.isEncodingLinearPcm(encoding)) {
- if (encoding == AudioFormat.ENCODING_PCM_FLOAT) {
- hasFloat = true;
- } else if (AudioFormat.getBytesPerSample(encoding) > 2) {
- hasExtendedIntegerPrecision = true;
- }
- }
- }
- if (hasExtendedIntegerPrecision && !hasFloat) {
- // 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.
- int[] encodingsPlusFloat = Arrays.copyOf(encodings, encodings.length + 1);
- encodingsPlusFloat[encodings.length] = AudioFormat.ENCODING_PCM_FLOAT;
- return encodingsPlusFloat;
- }
- return encodings;
+ return AudioFormat.filterPublicFormats(mPort.formats());
}
/**