Merge "Add PCM float profile if extended precision PCM shows but not pcm float." into sc-dev am: 14e7e8316f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15302848 Change-Id: I163f483af6d49def9ec848592c94f283bae835e0
This commit is contained in:
@@ -1243,6 +1243,8 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort,
|
|||||||
jstring jDeviceName = NULL;
|
jstring jDeviceName = NULL;
|
||||||
jobject jAudioProfiles = NULL;
|
jobject jAudioProfiles = NULL;
|
||||||
jobject jAudioDescriptors = nullptr;
|
jobject jAudioDescriptors = nullptr;
|
||||||
|
ScopedLocalRef<jobject> jPcmFloatProfileFromExtendedInteger(env, nullptr);
|
||||||
|
bool hasFloat = false;
|
||||||
bool useInMask;
|
bool useInMask;
|
||||||
|
|
||||||
ALOGV("convertAudioPortFromNative id %d role %d type %d name %s",
|
ALOGV("convertAudioPortFromNative id %d role %d type %d name %s",
|
||||||
@@ -1339,6 +1341,25 @@ static jint convertAudioPortFromNative(JNIEnv *env, jobject *jAudioPort,
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
env->CallBooleanMethod(jAudioProfiles, gArrayListMethods.add, jAudioProfile.get());
|
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);
|
jAudioDescriptors = env->NewObject(gArrayListClass, gArrayListMethods.cstor);
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import android.util.SparseIntArray;
|
|||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
@@ -515,29 +514,7 @@ public final class AudioDeviceInfo {
|
|||||||
* For forward compatibility, applications should ignore entries it does not recognize.
|
* For forward compatibility, applications should ignore entries it does not recognize.
|
||||||
*/
|
*/
|
||||||
public @NonNull int[] getEncodings() {
|
public @NonNull int[] getEncodings() {
|
||||||
final int[] encodings = AudioFormat.filterPublicFormats(mPort.formats());
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user