Class DefaultAudioSink
- java.lang.Object
-
- com.google.android.exoplayer2.audio.DefaultAudioSink
-
- All Implemented Interfaces:
AudioSink
public final class DefaultAudioSink extends Object implements AudioSink
Plays audio data. The implementation delegates to anAudioTrack
and handles playback position smoothing, non-blocking writes and reconfiguration.If tunneling mode is enabled, care must be taken that audio processors do not output buffers with a different duration than their input, and buffer processors must produce output corresponding to their last input immediately after that input is queued. This means that, for example, speed adjustment is not possible while using tunneling.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
DefaultAudioSink.AudioProcessorChain
Provides a chain of audio processors, which are used for any user-defined processing and applying playback parameters (if supported).static class
DefaultAudioSink.Builder
A builder to createDefaultAudioSink
instances.static class
DefaultAudioSink.DefaultAudioProcessorChain
The default audio processor chain, which applies a (possibly empty) chain of user-defined audio processors followed bySilenceSkippingAudioProcessor
andSonicAudioProcessor
.static class
DefaultAudioSink.InvalidAudioTrackTimestampException
Thrown when the audio track has provided a spurious timestamp, iffailOnSpuriousAudioTimestamp
is set.static interface
DefaultAudioSink.OffloadMode
Audio offload mode configuration.static interface
DefaultAudioSink.OutputMode
Output mode of the audio sink.-
Nested classes/interfaces inherited from interface com.google.android.exoplayer2.audio.AudioSink
AudioSink.ConfigurationException, AudioSink.InitializationException, AudioSink.Listener, AudioSink.SinkFormatSupport, AudioSink.UnexpectedDiscontinuityException, AudioSink.WriteException
-
-
Field Summary
Fields Modifier and Type Field Description static float
DEFAULT_PLAYBACK_SPEED
The default playback speed.static boolean
failOnSpuriousAudioTimestamp
Whether to throw anDefaultAudioSink.InvalidAudioTrackTimestampException
when a spurious timestamp is reported fromAudioTrack.getTimestamp(android.media.AudioTimestamp)
.static float
MAX_PITCH
The maximum allowed pitch factor.static float
MAX_PLAYBACK_SPEED
The maximum allowed playback speed.static float
MIN_PITCH
The minimum allowed pitch factor.static float
MIN_PLAYBACK_SPEED
The minimum allowed playback speed.static int
OFFLOAD_MODE_DISABLED
The audio sink will never play in offload mode.static int
OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
The audio sink will prefer offload playback, disabling gapless offload support.static int
OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED
The audio sink will prefer offload playback even if this might result in silence gaps between tracks.static int
OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
The audio sink will prefer offload playback except if the track is gapless and the device does not advertise support for gapless playback in offload.static int
OUTPUT_MODE_OFFLOAD
The audio sink plays encoded audio in offload.static int
OUTPUT_MODE_PASSTHROUGH
The audio sink plays encoded audio in passthrough.static int
OUTPUT_MODE_PCM
The audio sink plays PCM audio.-
Fields inherited from interface com.google.android.exoplayer2.audio.AudioSink
CURRENT_POSITION_NOT_SET, SINK_FORMAT_SUPPORTED_DIRECTLY, SINK_FORMAT_SUPPORTED_WITH_TRANSCODING, SINK_FORMAT_UNSUPPORTED
-
-
Constructor Summary
Constructors Constructor Description DefaultAudioSink(AudioCapabilities audioCapabilities, AudioProcessor[] audioProcessors)
Deprecated.DefaultAudioSink(AudioCapabilities audioCapabilities, AudioProcessor[] audioProcessors, boolean enableFloatOutput)
Deprecated.DefaultAudioSink(AudioCapabilities audioCapabilities, DefaultAudioSink.AudioProcessorChain audioProcessorChain, boolean enableFloatOutput, boolean enableAudioTrackPlaybackParams, @com.google.android.exoplayer2.audio.DefaultAudioSink.OffloadMode int offloadMode)
Deprecated.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
configure(Format inputFormat, int specifiedBufferSize, int[] outputChannels)
Configures (or reconfigures) the sink.void
disableTunneling()
Disables tunneling.void
enableTunnelingV21()
Enables tunneling, if possible.void
experimentalFlushWithoutAudioTrackRelease()
Flushes the sink, after which it is ready to receive buffers from a new playback position.void
flush()
Flushes the sink, after which it is ready to receive buffers from a new playback position.AudioAttributes
getAudioAttributes()
Returns the audio attributes used for audio playback, ornull
if the sink does not use audio attributes.long
getCurrentPositionUs(boolean sourceEnded)
Returns the playback position in the stream starting at zero, in microseconds, orAudioSink.CURRENT_POSITION_NOT_SET
if it is not yet available.@com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport int
getFormatSupport(Format format)
Returns the level of support that the sink provides for a givenFormat
.PlaybackParameters
getPlaybackParameters()
Returns the activePlaybackParameters
.boolean
getSkipSilenceEnabled()
Returns whether silences are skipped in the audio stream.boolean
handleBuffer(ByteBuffer buffer, long presentationTimeUs, int encodedAccessUnitCount)
Attempts to process data from aByteBuffer
, starting from its current position and ending at its limit (exclusive).void
handleDiscontinuity()
Signals to the sink that the next buffer may be discontinuous with the previous buffer.boolean
hasPendingData()
Returns whether the sink has data pending that has not been consumed yet.boolean
isEnded()
Returns whetherAudioSink.playToEndOfStream()
has been called and all buffers have been processed.void
pause()
Pauses playback.void
play()
Starts or resumes consuming audio if initialized.void
playToEndOfStream()
Processes any remaining data.void
reset()
Resets the sink, releasing any resources that it currently holds.void
setAudioAttributes(AudioAttributes audioAttributes)
Sets attributes for audio playback.void
setAudioSessionId(int audioSessionId)
Sets the audio session id.void
setAuxEffectInfo(AuxEffectInfo auxEffectInfo)
Sets the auxiliary effect.void
setListener(AudioSink.Listener listener)
Sets the listener for sink events, which should be the audio renderer.void
setPlaybackParameters(PlaybackParameters playbackParameters)
Attempts to set the playback parameters.void
setPlayerId(PlayerId playerId)
Sets thePlayerId
of the player using this audio sink.void
setSkipSilenceEnabled(boolean skipSilenceEnabled)
Sets whether silences should be skipped in the audio stream.void
setVolume(float volume)
Sets the playback volume.boolean
supportsFormat(Format format)
Returns whether the sink supports a givenFormat
.
-
-
-
Field Detail
-
DEFAULT_PLAYBACK_SPEED
public static final float DEFAULT_PLAYBACK_SPEED
The default playback speed.- See Also:
- Constant Field Values
-
MIN_PLAYBACK_SPEED
public static final float MIN_PLAYBACK_SPEED
The minimum allowed playback speed. Lower values will be constrained to fall in range.- See Also:
- Constant Field Values
-
MAX_PLAYBACK_SPEED
public static final float MAX_PLAYBACK_SPEED
The maximum allowed playback speed. Higher values will be constrained to fall in range.- See Also:
- Constant Field Values
-
MIN_PITCH
public static final float MIN_PITCH
The minimum allowed pitch factor. Lower values will be constrained to fall in range.- See Also:
- Constant Field Values
-
MAX_PITCH
public static final float MAX_PITCH
The maximum allowed pitch factor. Higher values will be constrained to fall in range.- See Also:
- Constant Field Values
-
OFFLOAD_MODE_DISABLED
public static final int OFFLOAD_MODE_DISABLED
The audio sink will never play in offload mode.- See Also:
- Constant Field Values
-
OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
public static final int OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
The audio sink will prefer offload playback except if the track is gapless and the device does not advertise support for gapless playback in offload.Use this option to prioritize seamless transitions between tracks of the same album to power savings.
- See Also:
- Constant Field Values
-
OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED
public static final int OFFLOAD_MODE_ENABLED_GAPLESS_NOT_REQUIRED
The audio sink will prefer offload playback even if this might result in silence gaps between tracks.Use this option to prioritize battery saving at the cost of a possible non seamless transitions between tracks of the same album.
- See Also:
- Constant Field Values
-
OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
public static final int OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
The audio sink will prefer offload playback, disabling gapless offload support.Use this option if gapless has undesirable side effects. For example if it introduces hardware issues.
- See Also:
- Constant Field Values
-
OUTPUT_MODE_PCM
public static final int OUTPUT_MODE_PCM
The audio sink plays PCM audio.- See Also:
- Constant Field Values
-
OUTPUT_MODE_OFFLOAD
public static final int OUTPUT_MODE_OFFLOAD
The audio sink plays encoded audio in offload.- See Also:
- Constant Field Values
-
OUTPUT_MODE_PASSTHROUGH
public static final int OUTPUT_MODE_PASSTHROUGH
The audio sink plays encoded audio in passthrough.- See Also:
- Constant Field Values
-
failOnSpuriousAudioTimestamp
public static boolean failOnSpuriousAudioTimestamp
Whether to throw anDefaultAudioSink.InvalidAudioTrackTimestampException
when a spurious timestamp is reported fromAudioTrack.getTimestamp(android.media.AudioTimestamp)
.The flag must be set before creating a player. Should be set to
true
for testing and debugging purposes only.
-
-
Constructor Detail
-
DefaultAudioSink
@Deprecated @InlineMe(replacement="new DefaultAudioSink.Builder().setAudioCapabilities(audioCapabilities).setAudioProcessors(audioProcessors).build()", imports="com.google.android.exoplayer2.audio.DefaultAudioSink") public DefaultAudioSink(@Nullable AudioCapabilities audioCapabilities, AudioProcessor[] audioProcessors)
Deprecated.
-
DefaultAudioSink
@Deprecated @InlineMe(replacement="new DefaultAudioSink.Builder().setAudioCapabilities(audioCapabilities).setAudioProcessors(audioProcessors).setEnableFloatOutput(enableFloatOutput).build()", imports="com.google.android.exoplayer2.audio.DefaultAudioSink") public DefaultAudioSink(@Nullable AudioCapabilities audioCapabilities, AudioProcessor[] audioProcessors, boolean enableFloatOutput)
Deprecated.
-
DefaultAudioSink
@Deprecated @InlineMe(replacement="new DefaultAudioSink.Builder().setAudioCapabilities(audioCapabilities).setAudioProcessorChain(audioProcessorChain).setEnableFloatOutput(enableFloatOutput).setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams).setOffloadMode(offloadMode).build()", imports="com.google.android.exoplayer2.audio.DefaultAudioSink") public DefaultAudioSink(@Nullable AudioCapabilities audioCapabilities, DefaultAudioSink.AudioProcessorChain audioProcessorChain, boolean enableFloatOutput, boolean enableAudioTrackPlaybackParams, @com.google.android.exoplayer2.audio.DefaultAudioSink.OffloadMode int offloadMode)
Deprecated.
-
-
Method Detail
-
setListener
public void setListener(AudioSink.Listener listener)
Description copied from interface:AudioSink
Sets the listener for sink events, which should be the audio renderer.- Specified by:
setListener
in interfaceAudioSink
- Parameters:
listener
- The listener for sink events, which should be the audio renderer.
-
setPlayerId
public void setPlayerId(@Nullable PlayerId playerId)
Description copied from interface:AudioSink
Sets thePlayerId
of the player using this audio sink.- Specified by:
setPlayerId
in interfaceAudioSink
- Parameters:
playerId
- ThePlayerId
, or null to clear a previously set id.
-
supportsFormat
public boolean supportsFormat(Format format)
Description copied from interface:AudioSink
Returns whether the sink supports a givenFormat
.- Specified by:
supportsFormat
in interfaceAudioSink
- Parameters:
format
- The format.- Returns:
- Whether the sink supports the format.
-
getFormatSupport
public @com.google.android.exoplayer2.audio.AudioSink.SinkFormatSupport int getFormatSupport(Format format)
Description copied from interface:AudioSink
Returns the level of support that the sink provides for a givenFormat
.- Specified by:
getFormatSupport
in interfaceAudioSink
- Parameters:
format
- The format.- Returns:
- The level of support provided.
-
getCurrentPositionUs
public long getCurrentPositionUs(boolean sourceEnded)
Description copied from interface:AudioSink
Returns the playback position in the stream starting at zero, in microseconds, orAudioSink.CURRENT_POSITION_NOT_SET
if it is not yet available.- Specified by:
getCurrentPositionUs
in interfaceAudioSink
- Parameters:
sourceEnded
- Specifytrue
if no more input buffers will be provided.- Returns:
- The playback position relative to the start of playback, in microseconds.
-
configure
public void configure(Format inputFormat, int specifiedBufferSize, @Nullable int[] outputChannels) throws AudioSink.ConfigurationException
Description copied from interface:AudioSink
Configures (or reconfigures) the sink.- Specified by:
configure
in interfaceAudioSink
- Parameters:
inputFormat
- The format of audio data provided in the input buffers.specifiedBufferSize
- A specific size for the playback buffer in bytes, or 0 to infer a suitable buffer size.outputChannels
- A mapping from input to output channels that is applied to this sink's input as a preprocessing step, if handling PCM input. Specifynull
to leave the input unchanged. Otherwise, the element at indexi
specifies index of the input channel to map to output channeli
when preprocessing input buffers. After the map is applied the audio data will haveoutputChannels.length
channels.- Throws:
AudioSink.ConfigurationException
- If an error occurs configuring the sink.
-
play
public void play()
Description copied from interface:AudioSink
Starts or resumes consuming audio if initialized.
-
handleDiscontinuity
public void handleDiscontinuity()
Description copied from interface:AudioSink
Signals to the sink that the next buffer may be discontinuous with the previous buffer.- Specified by:
handleDiscontinuity
in interfaceAudioSink
-
handleBuffer
public boolean handleBuffer(ByteBuffer buffer, long presentationTimeUs, int encodedAccessUnitCount) throws AudioSink.InitializationException, AudioSink.WriteException
Description copied from interface:AudioSink
Attempts to process data from aByteBuffer
, starting from its current position and ending at its limit (exclusive). The position of theByteBuffer
is advanced by the number of bytes that were handled.AudioSink.Listener.onPositionDiscontinuity()
will be called ifpresentationTimeUs
is discontinuous with the last buffer handled since the last reset.Returns whether the data was handled in full. If the data was not handled in full then the same
ByteBuffer
must be provided to subsequent calls until it has been fully consumed, except in the case of an intervening call toAudioSink.flush()
(or toAudioSink.configure(Format, int, int[])
that causes the sink to be flushed).- Specified by:
handleBuffer
in interfaceAudioSink
- Parameters:
buffer
- The buffer containing audio data.presentationTimeUs
- The presentation timestamp of the buffer in microseconds.encodedAccessUnitCount
- The number of encoded access units in the buffer, or 1 if the buffer contains PCM audio. This allows batching multiple encoded access units in one buffer.- Returns:
- Whether the buffer was handled fully.
- Throws:
AudioSink.InitializationException
- If an error occurs initializing the sink.AudioSink.WriteException
- If an error occurs writing the audio data.
-
playToEndOfStream
public void playToEndOfStream() throws AudioSink.WriteException
Description copied from interface:AudioSink
Processes any remaining data.AudioSink.isEnded()
will returntrue
when no data remains.- Specified by:
playToEndOfStream
in interfaceAudioSink
- Throws:
AudioSink.WriteException
- If an error occurs draining data to the sink.
-
isEnded
public boolean isEnded()
Description copied from interface:AudioSink
Returns whetherAudioSink.playToEndOfStream()
has been called and all buffers have been processed.
-
hasPendingData
public boolean hasPendingData()
Description copied from interface:AudioSink
Returns whether the sink has data pending that has not been consumed yet.- Specified by:
hasPendingData
in interfaceAudioSink
-
setPlaybackParameters
public void setPlaybackParameters(PlaybackParameters playbackParameters)
Description copied from interface:AudioSink
Attempts to set the playback parameters. The audio sink may override these parameters if they are not supported.- Specified by:
setPlaybackParameters
in interfaceAudioSink
- Parameters:
playbackParameters
- The new playback parameters to attempt to set.
-
getPlaybackParameters
public PlaybackParameters getPlaybackParameters()
Description copied from interface:AudioSink
Returns the activePlaybackParameters
.- Specified by:
getPlaybackParameters
in interfaceAudioSink
-
setSkipSilenceEnabled
public void setSkipSilenceEnabled(boolean skipSilenceEnabled)
Description copied from interface:AudioSink
Sets whether silences should be skipped in the audio stream.- Specified by:
setSkipSilenceEnabled
in interfaceAudioSink
-
getSkipSilenceEnabled
public boolean getSkipSilenceEnabled()
Description copied from interface:AudioSink
Returns whether silences are skipped in the audio stream.- Specified by:
getSkipSilenceEnabled
in interfaceAudioSink
-
setAudioAttributes
public void setAudioAttributes(AudioAttributes audioAttributes)
Description copied from interface:AudioSink
Sets attributes for audio playback. If the attributes have changed and if the sink is not configured for use with tunneling, then it is reset and the audio session id is cleared.If the sink is configured for use with tunneling then the audio attributes are ignored. The sink is not reset and the audio session id is not cleared. The passed attributes will be used if the sink is later re-configured into non-tunneled mode.
- Specified by:
setAudioAttributes
in interfaceAudioSink
- Parameters:
audioAttributes
- The attributes for audio playback.
-
getAudioAttributes
public AudioAttributes getAudioAttributes()
Description copied from interface:AudioSink
Returns the audio attributes used for audio playback, ornull
if the sink does not use audio attributes.- Specified by:
getAudioAttributes
in interfaceAudioSink
-
setAudioSessionId
public void setAudioSessionId(int audioSessionId)
Description copied from interface:AudioSink
Sets the audio session id.- Specified by:
setAudioSessionId
in interfaceAudioSink
-
setAuxEffectInfo
public void setAuxEffectInfo(AuxEffectInfo auxEffectInfo)
Description copied from interface:AudioSink
Sets the auxiliary effect.- Specified by:
setAuxEffectInfo
in interfaceAudioSink
-
enableTunnelingV21
public void enableTunnelingV21()
Description copied from interface:AudioSink
Enables tunneling, if possible. The sink is reset if tunneling was previously disabled. Enabling tunneling is only possible if the sink is based on a platformAudioTrack
, and requires platform API version 21 onwards.- Specified by:
enableTunnelingV21
in interfaceAudioSink
-
disableTunneling
public void disableTunneling()
Description copied from interface:AudioSink
Disables tunneling. If tunneling was previously enabled then the sink is reset and any audio session id is cleared.- Specified by:
disableTunneling
in interfaceAudioSink
-
setVolume
public void setVolume(float volume)
Description copied from interface:AudioSink
Sets the playback volume.
-
pause
public void pause()
Description copied from interface:AudioSink
Pauses playback.
-
flush
public void flush()
Description copied from interface:AudioSink
Flushes the sink, after which it is ready to receive buffers from a new playback position.The audio session may remain active until
AudioSink.reset()
is called.
-
experimentalFlushWithoutAudioTrackRelease
public void experimentalFlushWithoutAudioTrackRelease()
Description copied from interface:AudioSink
Flushes the sink, after which it is ready to receive buffers from a new playback position.Does not release the
AudioTrack
held by the sink.This method is experimental, and will be renamed or removed in a future release.
Only for experimental use as part of
MediaCodecAudioRenderer.experimentalSetEnableKeepAudioTrackOnSeek(boolean)
.- Specified by:
experimentalFlushWithoutAudioTrackRelease
in interfaceAudioSink
-
-