Commit 927105ed by tianyifeng Committed by microkatz

Intercept audio capabilities change in `DefaultAudioSink`

PiperOrigin-RevId: 517144710
parent 3c8f5cf7
......@@ -24,7 +24,6 @@ import android.os.Handler;
import android.os.Looper;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioCapabilities;
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.DefaultAudioSink;
......@@ -649,8 +648,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
boolean enableFloatOutput,
boolean enableAudioTrackPlaybackParams,
boolean enableOffload) {
return new DefaultAudioSink.Builder()
.setAudioCapabilities(AudioCapabilities.getCapabilities(context))
return new DefaultAudioSink.Builder(context)
.setEnableFloatOutput(enableFloatOutput)
.setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
.setOffloadMode(
......
......@@ -24,6 +24,7 @@ import static java.lang.Math.min;
import static java.lang.annotation.ElementType.TYPE_USE;
import android.annotation.SuppressLint;
import android.content.Context;
import android.media.AudioDeviceInfo;
import android.media.AudioFormat;
import android.media.AudioManager;
......@@ -214,6 +215,7 @@ public final class DefaultAudioSink implements AudioSink {
/** A builder to create {@link DefaultAudioSink} instances. */
public static final class Builder {
@Nullable private final Context context;
private AudioCapabilities audioCapabilities;
@Nullable private com.google.android.exoplayer2.audio.AudioProcessorChain audioProcessorChain;
private boolean enableFloatOutput;
......@@ -222,19 +224,34 @@ public final class DefaultAudioSink implements AudioSink {
AudioTrackBufferSizeProvider audioTrackBufferSizeProvider;
@Nullable AudioOffloadListener audioOffloadListener;
/** Creates a new builder. */
/**
* @deprecated Use {@link #Builder(Context)} instead.
*/
@Deprecated
public Builder() {
this(/* context= */ null);
}
/**
* Creates a new builder.
*
* @param context The {@link Context}.
*/
public Builder(@Nullable Context context) {
this.context = context;
audioCapabilities = DEFAULT_AUDIO_CAPABILITIES;
offloadMode = OFFLOAD_MODE_DISABLED;
audioTrackBufferSizeProvider = AudioTrackBufferSizeProvider.DEFAULT;
}
/**
* Sets audio capabilities for playback on this device. May be {@code null} if the default
* capabilities (no encoded audio passthrough support) should be assumed.
*
* <p>Default is {@link AudioCapabilities#DEFAULT_AUDIO_CAPABILITIES}.
* @deprecated The {@linkplain AudioCapabilities audio capabilities} set to the {@linkplain
* Builder builder} will be effective for the {@link DefaultAudioSink} only in the absence
* of {@linkplain Context context}. If 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
public Builder setAudioCapabilities(AudioCapabilities audioCapabilities) {
checkNotNull(audioCapabilities);
......@@ -470,6 +487,7 @@ public final class DefaultAudioSink implements AudioSink {
private final PendingExceptionHolder<WriteException> writeExceptionPendingExceptionHolder;
private final AudioTrackBufferSizeProvider audioTrackBufferSizeProvider;
@Nullable private final AudioOffloadListener audioOffloadListener;
@Nullable private final AudioCapabilitiesReceiver audioCapabilitiesReceiver;
@Nullable private PlayerId playerId;
@Nullable private Listener listener;
......@@ -519,7 +537,14 @@ public final class DefaultAudioSink implements AudioSink {
@RequiresNonNull("#1.audioProcessorChain")
private DefaultAudioSink(Builder builder) {
audioCapabilities = builder.audioCapabilities;
audioCapabilitiesReceiver =
builder.context != null
? new AudioCapabilitiesReceiver(builder.context, this::onAudioCapabilitiesChanged)
: null;
audioCapabilities =
audioCapabilitiesReceiver != null
? audioCapabilitiesReceiver.register()
: builder.audioCapabilities;
audioProcessorChain = builder.audioProcessorChain;
enableFloatOutput = Util.SDK_INT >= 21 && builder.enableFloatOutput;
preferAudioTrackPlaybackParams = Util.SDK_INT >= 23 && builder.enableAudioTrackPlaybackParams;
......@@ -1418,6 +1443,21 @@ public final class DefaultAudioSink implements AudioSink {
offloadDisabledUntilNextConfiguration = false;
}
@Override
public void release() {
if (audioCapabilitiesReceiver != null) {
audioCapabilitiesReceiver.unregister();
}
}
// AudioCapabilitiesReceiver.Listener implementation.
public void onAudioCapabilitiesChanged(AudioCapabilities audioCapabilities) {
if (!audioCapabilities.equals(this.audioCapabilities)) {
this.audioCapabilities = audioCapabilities;
}
}
// Internal methods.
private void resetSinkStateForFlush() {
......
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