Commit 341bb574 by krocard Committed by Ian Baker

Add a builder to `DefaultAudioSink`

`DefaultAudioSink` already has 3 telescoping
constructors and an other one would be have been
needed to add a buffer size tuning option.

PiperOrigin-RevId: 414703366
parent dcc69056
......@@ -66,7 +66,7 @@ public final class FfmpegAudioRenderer extends DecoderAudioRenderer<FfmpegAudioD
this(
eventHandler,
eventListener,
new DefaultAudioSink(/* audioCapabilities= */ null, audioProcessors));
new DefaultAudioSink.Builder().setAudioProcessors(audioProcessors).build());
}
/**
......
......@@ -28,7 +28,6 @@ import androidx.media3.datasource.DefaultDataSource;
import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioProcessor;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.source.MediaSource;
......@@ -67,9 +66,7 @@ public class FlacPlaybackTest {
}
private static void playAndAssertAudioSinkInput(String fileName) throws Exception {
CapturingAudioSink audioSink =
new CapturingAudioSink(
new DefaultAudioSink(/* audioCapabilities= */ null, new AudioProcessor[0]));
CapturingAudioSink audioSink = new CapturingAudioSink(new DefaultAudioSink.Builder().build());
TestPlaybackRunnable testPlaybackRunnable =
new TestPlaybackRunnable(
......
......@@ -47,6 +47,7 @@ dependencies {
compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion
compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion
compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion
compileOnly 'com.google.errorprone:error_prone_annotations:' + errorProneVersion
androidTestImplementation 'androidx.test:runner:' + androidxTestRunnerVersion
androidTestImplementation 'com.linkedin.dexmaker:dexmaker:' + dexmakerVersion
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:' + dexmakerVersion
......
......@@ -28,7 +28,6 @@ import androidx.media3.exoplayer.audio.AudioCapabilities;
import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink.DefaultAudioProcessorChain;
import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer;
import androidx.media3.exoplayer.mediacodec.DefaultMediaCodecAdapterFactory;
import androidx.media3.exoplayer.mediacodec.MediaCodecAdapter;
......@@ -666,14 +665,15 @@ public class DefaultRenderersFactory implements RenderersFactory {
boolean enableFloatOutput,
boolean enableAudioTrackPlaybackParams,
boolean enableOffload) {
return new DefaultAudioSink(
AudioCapabilities.getCapabilities(context),
new DefaultAudioProcessorChain(),
enableFloatOutput,
enableAudioTrackPlaybackParams,
enableOffload
? DefaultAudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
: DefaultAudioSink.OFFLOAD_MODE_DISABLED);
return new DefaultAudioSink.Builder()
.setAudioCapabilities(AudioCapabilities.getCapabilities(context))
.setEnableFloatOutput(enableFloatOutput)
.setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
.setOffloadMode(
enableOffload
? DefaultAudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
: DefaultAudioSink.OFFLOAD_MODE_DISABLED)
.build();
}
/**
......
......@@ -47,7 +47,6 @@ import androidx.media3.common.util.Util;
import androidx.media3.datasource.DataSource;
import androidx.media3.exoplayer.analytics.AnalyticsCollector;
import androidx.media3.exoplayer.analytics.AnalyticsListener;
import androidx.media3.exoplayer.audio.AudioCapabilities;
import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer;
......@@ -1585,8 +1584,7 @@ public interface ExoPlayer extends Player {
* <ul>
* <li>Audio offload rendering is enabled in {@link
* DefaultRenderersFactory#setEnableAudioOffload} or the equivalent option passed to {@link
* DefaultAudioSink#DefaultAudioSink(AudioCapabilities,
* DefaultAudioSink.AudioProcessorChain, boolean, boolean, int)}.
* DefaultAudioSink.Builder#setOffloadMode}.
* <li>An audio track is playing in a format that the device supports offloading (for example,
* MP3 or AAC).
* <li>The {@link AudioSink} is playing with an offload {@link AudioTrack}.
......
......@@ -57,6 +57,7 @@ import androidx.media3.exoplayer.audio.AudioSink.SinkFormatSupport;
import androidx.media3.exoplayer.drm.DrmSession;
import androidx.media3.exoplayer.drm.DrmSession.DrmSessionException;
import androidx.media3.exoplayer.source.SampleStream.ReadDataResult;
import com.google.common.base.MoreObjects;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
......@@ -175,7 +176,15 @@ public abstract class DecoderAudioRenderer<
@Nullable AudioRendererEventListener eventListener,
@Nullable AudioCapabilities audioCapabilities,
AudioProcessor... audioProcessors) {
this(eventHandler, eventListener, new DefaultAudioSink(audioCapabilities, audioProcessors));
this(
eventHandler,
eventListener,
new DefaultAudioSink.Builder()
.setAudioCapabilities(
MoreObjects.firstNonNull(
audioCapabilities, AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES))
.setAudioProcessors(audioProcessors)
.build());
}
/**
......
......@@ -159,7 +159,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
mediaCodecSelector,
eventHandler,
eventListener,
new DefaultAudioSink(audioCapabilities, audioProcessors));
new DefaultAudioSink.Builder()
.setAudioCapabilities(audioCapabilities)
.setAudioProcessors(audioProcessors)
.build());
}
/**
......
......@@ -15,6 +15,7 @@
*/
package androidx.media3.exoplayer.audio;
import static androidx.media3.exoplayer.audio.AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES;
import static androidx.media3.exoplayer.audio.AudioSink.CURRENT_POSITION_NOT_SET;
import static androidx.media3.exoplayer.audio.AudioSink.SINK_FORMAT_SUPPORTED_DIRECTLY;
import static androidx.media3.exoplayer.audio.AudioSink.SINK_FORMAT_SUPPORTED_WITH_TRANSCODING;
......@@ -24,6 +25,7 @@ import androidx.media3.common.C;
import androidx.media3.common.Format;
import androidx.media3.common.MimeTypes;
import androidx.media3.common.PlaybackParameters;
import androidx.media3.exoplayer.audio.DefaultAudioSink.DefaultAudioProcessorChain;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
......@@ -37,7 +39,6 @@ import org.robolectric.annotation.Config;
/** Unit tests for {@link DefaultAudioSink}. */
@RunWith(AndroidJUnit4.class)
public final class DefaultAudioSinkTest {
private static final int CHANNEL_COUNT_MONO = 1;
private static final int CHANNEL_COUNT_STEREO = 2;
private static final int BYTES_PER_FRAME_16_BIT = 2;
......@@ -59,19 +60,20 @@ public final class DefaultAudioSinkTest {
arrayAudioBufferSink = new ArrayAudioBufferSink();
TeeAudioProcessor teeAudioProcessor = new TeeAudioProcessor(arrayAudioBufferSink);
defaultAudioSink =
new DefaultAudioSink(
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES,
new DefaultAudioSink.DefaultAudioProcessorChain(teeAudioProcessor),
/* enableFloatOutput= */ false,
/* enableAudioTrackPlaybackParams= */ false,
DefaultAudioSink.OFFLOAD_MODE_DISABLED);
new DefaultAudioSink.Builder()
.setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
.setAudioProcessorChain(new DefaultAudioProcessorChain(teeAudioProcessor))
.setOffloadMode(DefaultAudioSink.OFFLOAD_MODE_DISABLED)
.build();
}
@Test
public void handlesSpecializedAudioProcessorArray() {
defaultAudioSink =
new DefaultAudioSink(
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES, new TeeAudioProcessor[0]);
new DefaultAudioSink.Builder()
.setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
.setAudioProcessors(new TeeAudioProcessor[0])
.build();
}
@Test
......@@ -203,10 +205,7 @@ public final class DefaultAudioSinkTest {
@Test
public void floatPcmNeedsTranscodingIfFloatOutputDisabled() {
defaultAudioSink =
new DefaultAudioSink(
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES,
new AudioProcessor[0],
/* enableFloatOutput= */ false);
new DefaultAudioSink.Builder().setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES).build();
Format floatFormat =
STEREO_44_1_FORMAT
.buildUpon()
......@@ -221,10 +220,10 @@ public final class DefaultAudioSinkTest {
@Test
public void floatPcmNeedsTranscodingIfFloatOutputEnabledBeforeApi21() {
defaultAudioSink =
new DefaultAudioSink(
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES,
new AudioProcessor[0],
/* enableFloatOutput= */ true);
new DefaultAudioSink.Builder()
.setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
.setEnableFloatOutput(true)
.build();
Format floatFormat =
STEREO_44_1_FORMAT
.buildUpon()
......@@ -239,10 +238,10 @@ public final class DefaultAudioSinkTest {
@Test
public void floatOutputSupportedIfFloatOutputEnabledFromApi21() {
defaultAudioSink =
new DefaultAudioSink(
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES,
new AudioProcessor[0],
/* enableFloatOutput= */ true);
new DefaultAudioSink.Builder()
.setAudioCapabilities(DEFAULT_AUDIO_CAPABILITIES)
.setEnableFloatOutput(true)
.build();
Format floatFormat =
STEREO_44_1_FORMAT
.buildUpon()
......@@ -267,8 +266,9 @@ public final class DefaultAudioSinkTest {
@Test
public void audioSinkWithAacAudioCapabilitiesWithoutOffload_doesNotSupportAac() {
DefaultAudioSink defaultAudioSink =
new DefaultAudioSink(
new AudioCapabilities(new int[] {C.ENCODING_AAC_LC}, 2), new AudioProcessor[0]);
new DefaultAudioSink.Builder()
.setAudioCapabilities(new AudioCapabilities(new int[] {C.ENCODING_AAC_LC}, 2))
.build();
Format aacLcFormat =
STEREO_44_1_FORMAT
.buildUpon()
......
......@@ -33,7 +33,6 @@ import androidx.media3.exoplayer.DefaultRenderersFactory;
import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioCapabilities;
import androidx.media3.exoplayer.audio.AudioProcessor;
import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer;
......@@ -96,7 +95,9 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa
/* enableDecoderFallback= */ false,
eventHandler,
audioRendererEventListener,
new DefaultAudioSink(AudioCapabilities.getCapabilities(context), new AudioProcessor[0])),
new DefaultAudioSink.Builder()
.setAudioCapabilities(AudioCapabilities.getCapabilities(context))
.build()),
new TextRenderer(textRendererOutput, eventHandler.getLooper()),
new MetadataRenderer(metadataRendererOutput, eventHandler.getLooper())
};
......
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