Commit 1075837d by tianyifeng Committed by Tianyi Feng

Rollback of https://github.com/google/ExoPlayer/commit/736242d1a6d244b87585508867f27328e3be1b6a

*** Original commit ***

Rollback of https://github.com/google/ExoPlayer/commit/927105ed0dc6c811a1057db4b664003cf753ac12

*** Original commit ***

Intercept audio capabilities change in `DefaultAudioSink`

***

***

PiperOrigin-RevId: 520619600
parent 080ee6f4
...@@ -24,7 +24,6 @@ import android.os.Handler; ...@@ -24,7 +24,6 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioCapabilities;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
...@@ -649,8 +648,7 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -649,8 +648,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
boolean enableFloatOutput, boolean enableFloatOutput,
boolean enableAudioTrackPlaybackParams, boolean enableAudioTrackPlaybackParams,
boolean enableOffload) { boolean enableOffload) {
return new DefaultAudioSink.Builder() return new DefaultAudioSink.Builder(context)
.setAudioCapabilities(AudioCapabilities.getCapabilities(context))
.setEnableFloatOutput(enableFloatOutput) .setEnableFloatOutput(enableFloatOutput)
.setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams) .setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
.setOffloadMode( .setOffloadMode(
......
...@@ -16,14 +16,17 @@ ...@@ -16,14 +16,17 @@
package com.google.android.exoplayer2.audio; package com.google.android.exoplayer2.audio;
import static com.google.android.exoplayer2.audio.AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES; import static com.google.android.exoplayer2.audio.AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES;
import static com.google.android.exoplayer2.audio.AudioCapabilities.getCapabilities;
import static com.google.android.exoplayer2.audio.AudioProcessor.EMPTY_BUFFER; import static com.google.android.exoplayer2.audio.AudioProcessor.EMPTY_BUFFER;
import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Assertions.checkNotNull;
import static com.google.android.exoplayer2.util.Assertions.checkState;
import static com.google.android.exoplayer2.util.Util.constrainValue; import static com.google.android.exoplayer2.util.Util.constrainValue;
import static java.lang.Math.max; import static java.lang.Math.max;
import static java.lang.Math.min; import static java.lang.Math.min;
import static java.lang.annotation.ElementType.TYPE_USE; import static java.lang.annotation.ElementType.TYPE_USE;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context;
import android.media.AudioDeviceInfo; import android.media.AudioDeviceInfo;
import android.media.AudioFormat; import android.media.AudioFormat;
import android.media.AudioManager; import android.media.AudioManager;
...@@ -214,6 +217,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -214,6 +217,7 @@ public final class DefaultAudioSink implements AudioSink {
/** A builder to create {@link DefaultAudioSink} instances. */ /** A builder to create {@link DefaultAudioSink} instances. */
public static final class Builder { public static final class Builder {
@Nullable private final Context context;
private AudioCapabilities audioCapabilities; private AudioCapabilities audioCapabilities;
@Nullable private com.google.android.exoplayer2.audio.AudioProcessorChain audioProcessorChain; @Nullable private com.google.android.exoplayer2.audio.AudioProcessorChain audioProcessorChain;
private boolean enableFloatOutput; private boolean enableFloatOutput;
...@@ -222,19 +226,36 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -222,19 +226,36 @@ public final class DefaultAudioSink implements AudioSink {
AudioTrackBufferSizeProvider audioTrackBufferSizeProvider; AudioTrackBufferSizeProvider audioTrackBufferSizeProvider;
@Nullable AudioOffloadListener audioOffloadListener; @Nullable AudioOffloadListener audioOffloadListener;
/** Creates a new builder. */ /**
* @deprecated Use {@link #Builder(Context)} instead.
*/
@Deprecated
public Builder() { public Builder() {
this.context = null;
audioCapabilities = DEFAULT_AUDIO_CAPABILITIES; audioCapabilities = DEFAULT_AUDIO_CAPABILITIES;
offloadMode = OFFLOAD_MODE_DISABLED; offloadMode = OFFLOAD_MODE_DISABLED;
audioTrackBufferSizeProvider = AudioTrackBufferSizeProvider.DEFAULT; audioTrackBufferSizeProvider = AudioTrackBufferSizeProvider.DEFAULT;
} }
/** /**
* Sets audio capabilities for playback on this device. May be {@code null} if the default * Creates a new builder.
* capabilities (no encoded audio passthrough support) should be assumed.
* *
* <p>Default is {@link AudioCapabilities#DEFAULT_AUDIO_CAPABILITIES}. * @param context The {@link Context}.
*/ */
public Builder(Context context) {
this.context = context;
audioCapabilities = DEFAULT_AUDIO_CAPABILITIES;
offloadMode = OFFLOAD_MODE_DISABLED;
audioTrackBufferSizeProvider = AudioTrackBufferSizeProvider.DEFAULT;
}
/**
* @deprecated These {@linkplain AudioCapabilities audio capabilities} are only used in the
* absence of a {@linkplain Context context}. In the case when the {@code Context} is {@code
* null} and the {@code audioCapabilities} is not set to the {@code Builder}, the default
* capabilities (no encoded audio passthrough support) should be assumed.
*/
@Deprecated
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Builder setAudioCapabilities(AudioCapabilities audioCapabilities) { public Builder setAudioCapabilities(AudioCapabilities audioCapabilities) {
checkNotNull(audioCapabilities); checkNotNull(audioCapabilities);
...@@ -453,6 +474,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -453,6 +474,7 @@ public final class DefaultAudioSink implements AudioSink {
@GuardedBy("releaseExecutorLock") @GuardedBy("releaseExecutorLock")
private static int pendingReleaseCount; private static int pendingReleaseCount;
@Nullable private final Context context;
private final com.google.android.exoplayer2.audio.AudioProcessorChain audioProcessorChain; private final com.google.android.exoplayer2.audio.AudioProcessorChain audioProcessorChain;
private final boolean enableFloatOutput; private final boolean enableFloatOutput;
private final ChannelMappingAudioProcessor channelMappingAudioProcessor; private final ChannelMappingAudioProcessor channelMappingAudioProcessor;
...@@ -478,6 +500,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -478,6 +500,7 @@ public final class DefaultAudioSink implements AudioSink {
private @MonotonicNonNull AudioProcessingPipeline audioProcessingPipeline; private @MonotonicNonNull AudioProcessingPipeline audioProcessingPipeline;
@Nullable private AudioTrack audioTrack; @Nullable private AudioTrack audioTrack;
private AudioCapabilities audioCapabilities; private AudioCapabilities audioCapabilities;
private @MonotonicNonNull AudioCapabilitiesReceiver audioCapabilitiesReceiver;
private AudioAttributes audioAttributes; private AudioAttributes audioAttributes;
@Nullable private MediaPositionParameters afterDrainParameters; @Nullable private MediaPositionParameters afterDrainParameters;
...@@ -516,10 +539,12 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -516,10 +539,12 @@ public final class DefaultAudioSink implements AudioSink {
private long lastFeedElapsedRealtimeMs; private long lastFeedElapsedRealtimeMs;
private boolean offloadDisabledUntilNextConfiguration; private boolean offloadDisabledUntilNextConfiguration;
private boolean isWaitingForOffloadEndOfStreamHandled; private boolean isWaitingForOffloadEndOfStreamHandled;
@Nullable private Looper playbackLooper;
@RequiresNonNull("#1.audioProcessorChain") @RequiresNonNull("#1.audioProcessorChain")
private DefaultAudioSink(Builder builder) { private DefaultAudioSink(Builder builder) {
audioCapabilities = builder.audioCapabilities; context = builder.context;
audioCapabilities = context != null ? getCapabilities(context) : builder.audioCapabilities;
audioProcessorChain = builder.audioProcessorChain; audioProcessorChain = builder.audioProcessorChain;
enableFloatOutput = Util.SDK_INT >= 21 && builder.enableFloatOutput; enableFloatOutput = Util.SDK_INT >= 21 && builder.enableFloatOutput;
preferAudioTrackPlaybackParams = Util.SDK_INT >= 23 && builder.enableAudioTrackPlaybackParams; preferAudioTrackPlaybackParams = Util.SDK_INT >= 23 && builder.enableAudioTrackPlaybackParams;
...@@ -586,7 +611,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -586,7 +611,7 @@ public final class DefaultAudioSink implements AudioSink {
if (!offloadDisabledUntilNextConfiguration && useOffloadedPlayback(format, audioAttributes)) { if (!offloadDisabledUntilNextConfiguration && useOffloadedPlayback(format, audioAttributes)) {
return SINK_FORMAT_SUPPORTED_DIRECTLY; return SINK_FORMAT_SUPPORTED_DIRECTLY;
} }
if (audioCapabilities.isPassthroughPlaybackSupported(format)) { if (getAudioCapabilities().isPassthroughPlaybackSupported(format)) {
return SINK_FORMAT_SUPPORTED_DIRECTLY; return SINK_FORMAT_SUPPORTED_DIRECTLY;
} }
return SINK_FORMAT_UNSUPPORTED; return SINK_FORMAT_UNSUPPORTED;
...@@ -679,7 +704,7 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -679,7 +704,7 @@ public final class DefaultAudioSink implements AudioSink {
outputMode = OUTPUT_MODE_PASSTHROUGH; outputMode = OUTPUT_MODE_PASSTHROUGH;
@Nullable @Nullable
Pair<Integer, Integer> encodingAndChannelConfig = Pair<Integer, Integer> encodingAndChannelConfig =
audioCapabilities.getEncodingAndChannelConfigForPassthrough(inputFormat); getAudioCapabilities().getEncodingAndChannelConfigForPassthrough(inputFormat);
if (encodingAndChannelConfig == null) { if (encodingAndChannelConfig == null) {
throw new ConfigurationException( throw new ConfigurationException(
"Unable to configure passthrough for: " + inputFormat, inputFormat); "Unable to configure passthrough for: " + inputFormat, inputFormat);
...@@ -1418,6 +1443,22 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1418,6 +1443,22 @@ public final class DefaultAudioSink implements AudioSink {
offloadDisabledUntilNextConfiguration = false; offloadDisabledUntilNextConfiguration = false;
} }
@Override
public void release() {
if (audioCapabilitiesReceiver != null) {
audioCapabilitiesReceiver.unregister();
}
}
// AudioCapabilitiesReceiver.Listener implementation.
public void onAudioCapabilitiesChanged(AudioCapabilities audioCapabilities) {
checkState(playbackLooper == Looper.myLooper());
if (!audioCapabilities.equals(getAudioCapabilities())) {
this.audioCapabilities = audioCapabilities;
}
}
// Internal methods. // Internal methods.
private void resetSinkStateForFlush() { private void resetSinkStateForFlush() {
...@@ -1633,6 +1674,18 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -1633,6 +1674,18 @@ public final class DefaultAudioSink implements AudioSink {
} }
} }
private AudioCapabilities getAudioCapabilities() {
if (audioCapabilitiesReceiver == null && context != null) {
// Must be lazily initialized to receive audio capabilities receiver listener event on the
// current (playback) thread as the constructor is not called in the playback thread.
playbackLooper = Looper.myLooper();
audioCapabilitiesReceiver =
new AudioCapabilitiesReceiver(context, this::onAudioCapabilitiesChanged);
audioCapabilities = audioCapabilitiesReceiver.register();
}
return audioCapabilities;
}
@RequiresApi(29) @RequiresApi(29)
@SuppressLint("InlinedApi") @SuppressLint("InlinedApi")
private int getOffloadedPlaybackSupport( private int getOffloadedPlaybackSupport(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment