Set valid channel masks for 8 and 12 channels on all Android versions
Util.getAudioTrackChannelConfig() maps a channel count to a channel mask that is passed to AudioTrack. The method expected that playback of 8-channel audio is possible from Android 5.1 and playback of 12-channel audio is only possible from Android 12L. However, there is no restriction on the upper number of channels that can be passed to the AudioTrack. google/ExoPlayer#10701 is an example where the audio decoder outputs 12 channels on an Android 10. This change removes the restrictions for 8 and 12 channels. Note, we still do not support playback of arbitrary number of channels as it would require further changes to DefaultAudioSink. #minor-release Issue: google/ExoPlayer#10701 PiperOrigin-RevId: 488659831
This commit is contained in:
parent
3e5103a3e5
commit
1b24e6fd14
@ -1779,6 +1779,7 @@ public final class Util {
|
||||
* @return The channel configuration or {@link AudioFormat#CHANNEL_INVALID} if output is not
|
||||
* possible.
|
||||
*/
|
||||
@SuppressLint("InlinedApi") // Inlined AudioFormat constants.
|
||||
public static int getAudioTrackChannelConfig(int channelCount) {
|
||||
switch (channelCount) {
|
||||
case 1:
|
||||
@ -1796,21 +1797,9 @@ public final class Util {
|
||||
case 7:
|
||||
return AudioFormat.CHANNEL_OUT_5POINT1 | AudioFormat.CHANNEL_OUT_BACK_CENTER;
|
||||
case 8:
|
||||
if (SDK_INT >= 23) {
|
||||
return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
|
||||
} else if (SDK_INT >= 21) {
|
||||
// Equal to AudioFormat.CHANNEL_OUT_7POINT1_SURROUND, which is hidden before Android M.
|
||||
return AudioFormat.CHANNEL_OUT_5POINT1
|
||||
| AudioFormat.CHANNEL_OUT_SIDE_LEFT
|
||||
| AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
|
||||
} else {
|
||||
// 8 ch output is not supported before Android L.
|
||||
return AudioFormat.CHANNEL_INVALID;
|
||||
}
|
||||
return AudioFormat.CHANNEL_OUT_7POINT1_SURROUND;
|
||||
case 12:
|
||||
return Util.SDK_INT >= 32
|
||||
? AudioFormat.CHANNEL_OUT_7POINT1POINT4
|
||||
: AudioFormat.CHANNEL_INVALID;
|
||||
return AudioFormat.CHANNEL_OUT_7POINT1POINT4;
|
||||
default:
|
||||
return AudioFormat.CHANNEL_INVALID;
|
||||
}
|
||||
|
@ -680,16 +680,6 @@ public final class DefaultAudioSink implements AudioSink {
|
||||
outputChannelConfig = encodingAndChannelConfig.second;
|
||||
}
|
||||
}
|
||||
int bufferSize =
|
||||
specifiedBufferSize != 0
|
||||
? specifiedBufferSize
|
||||
: audioTrackBufferSizeProvider.getBufferSizeInBytes(
|
||||
getAudioTrackMinBufferSize(outputSampleRate, outputChannelConfig, outputEncoding),
|
||||
outputEncoding,
|
||||
outputMode,
|
||||
outputPcmFrameSize,
|
||||
outputSampleRate,
|
||||
enableAudioTrackPlaybackParams ? MAX_PLAYBACK_SPEED : DEFAULT_PLAYBACK_SPEED);
|
||||
|
||||
if (outputEncoding == C.ENCODING_INVALID) {
|
||||
throw new ConfigurationException(
|
||||
@ -700,6 +690,16 @@ public final class DefaultAudioSink implements AudioSink {
|
||||
"Invalid output channel config (mode=" + outputMode + ") for: " + inputFormat,
|
||||
inputFormat);
|
||||
}
|
||||
int bufferSize =
|
||||
specifiedBufferSize != 0
|
||||
? specifiedBufferSize
|
||||
: audioTrackBufferSizeProvider.getBufferSizeInBytes(
|
||||
getAudioTrackMinBufferSize(outputSampleRate, outputChannelConfig, outputEncoding),
|
||||
outputEncoding,
|
||||
outputMode,
|
||||
outputPcmFrameSize,
|
||||
outputSampleRate,
|
||||
enableAudioTrackPlaybackParams ? MAX_PLAYBACK_SPEED : DEFAULT_PLAYBACK_SPEED);
|
||||
|
||||
offloadDisabledUntilNextConfiguration = false;
|
||||
Configuration pendingConfiguration =
|
||||
|
Loading…
x
Reference in New Issue
Block a user