Refactor getDirectPlaybackSupportedEncodings()
This commit is contained in:
parent
c984387248
commit
f47930e587
@ -516,6 +516,26 @@ public final class Util {
|
|||||||
return concatenation;
|
return concatenation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new Integer array containing the concatenation of two non-null Integer arrays.
|
||||||
|
*
|
||||||
|
* @param first The first array.
|
||||||
|
* @param second The second array.
|
||||||
|
* @return The concatenated result.
|
||||||
|
*/
|
||||||
|
@UnstableApi
|
||||||
|
@SuppressWarnings("nullness:assignment")
|
||||||
|
public static int[] nullSafeIntegerArrayConcatenation(int[] first, int[] second) {
|
||||||
|
int[] concatenation = Arrays.copyOf(first, first.length + second.length);
|
||||||
|
System.arraycopy(
|
||||||
|
/* src= */ second,
|
||||||
|
+ /* srcPos= */ 0,
|
||||||
|
/* dest= */ concatenation,
|
||||||
|
/* destPos= */ first.length,
|
||||||
|
/* length= */ second.length);
|
||||||
|
return concatenation;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copies the contents of {@code list} into {@code array}.
|
* Copies the contents of {@code list} into {@code array}.
|
||||||
*
|
*
|
||||||
|
@ -58,15 +58,11 @@ public final class AudioCapabilities {
|
|||||||
public static final AudioCapabilities DEFAULT_AUDIO_CAPABILITIES =
|
public static final AudioCapabilities DEFAULT_AUDIO_CAPABILITIES =
|
||||||
new AudioCapabilities(new int[] {AudioFormat.ENCODING_PCM_16BIT}, DEFAULT_MAX_CHANNEL_COUNT);
|
new AudioCapabilities(new int[] {AudioFormat.ENCODING_PCM_16BIT}, DEFAULT_MAX_CHANNEL_COUNT);
|
||||||
|
|
||||||
/** Audio capabilities when the device specifies external surround sound. */
|
/** Encodings supported when the device specifies external surround sound. */
|
||||||
@SuppressWarnings("InlinedApi")
|
private static final int[] EXTERNAL_SURROUND_SOUND_CAPABILITIES =
|
||||||
private static final AudioCapabilities EXTERNAL_SURROUND_SOUND_CAPABILITIES =
|
|
||||||
new AudioCapabilities(
|
|
||||||
new int[]{
|
new int[]{
|
||||||
AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_AC3, AudioFormat.ENCODING_E_AC3,
|
AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_AC3, AudioFormat.ENCODING_E_AC3
|
||||||
AudioFormat.ENCODING_DTS, AudioFormat.ENCODING_DTS_HD
|
};
|
||||||
},
|
|
||||||
DEFAULT_MAX_CHANNEL_COUNT);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All surround sound encodings that a device may be capable of playing mapped to a maximum
|
* All surround sound encodings that a device may be capable of playing mapped to a maximum
|
||||||
@ -101,6 +97,19 @@ public final class AudioCapabilities {
|
|||||||
return getCapabilities(context, intent);
|
return getCapabilities(context, intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static AudioCapabilities getExternalSurroundCapabilities(@Nullable Intent intent) {
|
||||||
|
int[] supportedEncodings = EXTERNAL_SURROUND_SOUND_CAPABILITIES;
|
||||||
|
|
||||||
|
if (Util.SDK_INT >= 29) {
|
||||||
|
// Check if DTS Encodings are supported via Direct Playback.
|
||||||
|
int[] dtsTypes = {AudioFormat.ENCODING_DTS, AudioFormat.ENCODING_DTS_HD};
|
||||||
|
supportedEncodings = Util.nullSafeIntegerArrayConcatenation(supportedEncodings,
|
||||||
|
Api29.getDirectPlaybackSupportedEncodings(dtsTypes));
|
||||||
|
}
|
||||||
|
supportedEncodings = Arrays.stream(supportedEncodings).distinct().toArray();
|
||||||
|
return new AudioCapabilities(supportedEncodings,/* defaultValue= */ DEFAULT_MAX_CHANNEL_COUNT);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("InlinedApi")
|
@SuppressLint("InlinedApi")
|
||||||
/* package */ static AudioCapabilities getCapabilities(Context context, @Nullable Intent intent) {
|
/* package */ static AudioCapabilities getCapabilities(Context context, @Nullable Intent intent) {
|
||||||
// If a connection to Bluetooth device is detected, we only return the minimum capabilities that
|
// If a connection to Bluetooth device is detected, we only return the minimum capabilities that
|
||||||
@ -110,7 +119,7 @@ public final class AudioCapabilities {
|
|||||||
}
|
}
|
||||||
if (deviceMaySetExternalSurroundSoundGlobalSetting()
|
if (deviceMaySetExternalSurroundSoundGlobalSetting()
|
||||||
&& Global.getInt(context.getContentResolver(), EXTERNAL_SURROUND_SOUND_KEY, 0) == 1) {
|
&& Global.getInt(context.getContentResolver(), EXTERNAL_SURROUND_SOUND_KEY, 0) == 1) {
|
||||||
return EXTERNAL_SURROUND_SOUND_CAPABILITIES;
|
return getExternalSurroundCapabilities(intent);
|
||||||
}
|
}
|
||||||
// AudioTrack.isDirectPlaybackSupported returns true for encodings that are supported for audio
|
// AudioTrack.isDirectPlaybackSupported returns true for encodings that are supported for audio
|
||||||
// offload, as well as for encodings we want to list for passthrough mode. Therefore we only use
|
// offload, as well as for encodings we want to list for passthrough mode. Therefore we only use
|
||||||
@ -118,7 +127,9 @@ public final class AudioCapabilities {
|
|||||||
// encodings.
|
// encodings.
|
||||||
if (Util.SDK_INT >= 29 && (Util.isTv(context) || Util.isAutomotive(context))) {
|
if (Util.SDK_INT >= 29 && (Util.isTv(context) || Util.isAutomotive(context))) {
|
||||||
return new AudioCapabilities(
|
return new AudioCapabilities(
|
||||||
Api29.getDirectPlaybackSupportedEncodings(), DEFAULT_MAX_CHANNEL_COUNT);
|
Api29.getDirectPlaybackSupportedEncodings(
|
||||||
|
Api29.getAllSurroundEncodingsMaybeSupported().stream().mapToInt(Integer::intValue)
|
||||||
|
.toArray()), DEFAULT_MAX_CHANNEL_COUNT);
|
||||||
}
|
}
|
||||||
if (intent == null || intent.getIntExtra(AudioManager.EXTRA_AUDIO_PLUG_STATE, 0) == 0) {
|
if (intent == null || intent.getIntExtra(AudioManager.EXTRA_AUDIO_PLUG_STATE, 0) == 0) {
|
||||||
return DEFAULT_AUDIO_CAPABILITIES;
|
return DEFAULT_AUDIO_CAPABILITIES;
|
||||||
@ -361,9 +372,9 @@ public final class AudioCapabilities {
|
|||||||
private Api29() {}
|
private Api29() {}
|
||||||
|
|
||||||
@DoNotInline
|
@DoNotInline
|
||||||
public static int[] getDirectPlaybackSupportedEncodings() {
|
public static int[] getDirectPlaybackSupportedEncodings(int[] encodings) {
|
||||||
ImmutableList.Builder<Integer> supportedEncodingsListBuilder = ImmutableList.builder();
|
ImmutableList.Builder<Integer> supportedEncodingsListBuilder = ImmutableList.builder();
|
||||||
for (int encoding : getAllSurroundEncodingsMaybeSupported()) {
|
for (int encoding : encodings) {
|
||||||
if (AudioTrack.isDirectPlaybackSupported(
|
if (AudioTrack.isDirectPlaybackSupported(
|
||||||
new AudioFormat.Builder()
|
new AudioFormat.Builder()
|
||||||
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
|
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user