Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 85d3b615 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Add PCM float profile if extended precision PCM shows but not pcm...

Merge "Add PCM float profile if extended precision PCM shows but not pcm float." into sc-dev am: 14e7e831

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15302848

Change-Id: I7b23176c15db63032f4984e2abfc85dfd6615de4
parents a38fff7f 14e7e831
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -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);
+1 −24
Original line number Diff line number Diff line
@@ -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());
    }

    /**