Package com.google.android.exoplayer2.audio

## 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 an `AudioTrack` 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` | Deprecated. Use `AudioProcessorChain`.
    `static interface` | `DefaultAudioSink.AudioTrackBufferSizeProvider` | Provides the buffer size to use when creating an `AudioTrack`.
    `static class` | `DefaultAudioSink.Builder` | A builder to create `DefaultAudioSink` instances.
    `static class` | `DefaultAudioSink.DefaultAudioProcessorChain` | The default audio processor chain, which applies a (possibly empty) chain of user-defined audio processors followed by `SilenceSkippingAudioProcessor` and `SonicAudioProcessor`.
    `static class` | `DefaultAudioSink.InvalidAudioTrackTimestampException` | Thrown when the audio track has provided a spurious timestamp, if `failOnSpuriousAudioTimestamp` 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 an `DefaultAudioSink.InvalidAudioTrackTimestampException` when a spurious timestamp is reported from `AudioTrack.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. Use `DefaultAudioSink.Builder`.
    `DefaultAudioSink​(AudioCapabilities audioCapabilities, AudioProcessor[] audioProcessors, boolean enableFloatOutput)` | Deprecated. Use `DefaultAudioSink.Builder`.
    `DefaultAudioSink​(AudioCapabilities audioCapabilities, DefaultAudioSink.AudioProcessorChain audioProcessorChain, boolean enableFloatOutput, boolean enableAudioTrackPlaybackParams, @com.google.android.exoplayer2.audio.DefaultAudioSink.OffloadMode int offloadMode)` | Deprecated. Use `DefaultAudioSink.Builder`.

  - ### 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, or `null` if the sink does not use audio attributes.
    `long` | `getCurrentPositionUs​(boolean sourceEnded)` | Returns the playback position in the stream starting at zero, in microseconds, or `AudioSink.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 given `Format`.
    `PlaybackParameters` | `getPlaybackParameters()` | Returns the active `PlaybackParameters`.
    `boolean` | `getSkipSilenceEnabled()` | Returns whether silences are skipped in the audio stream.
    `boolean` | `handleBuffer​(ByteBuffer buffer, long presentationTimeUs, int encodedAccessUnitCount)` | Attempts to process data from a `ByteBuffer`, 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 whether `AudioSink.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 the `PlayerId` of the player using this audio sink.
    `void` | `setPreferredDevice​(AudioDeviceInfo audioDeviceInfo)` | Sets the preferred audio device.
    `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 given `Format`.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface com.google.android.exoplayer2.audio.AudioSink

      `setOutputStreamOffsetUs`

- - ### 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 an `DefaultAudioSink.InvalidAudioTrackTimestampException` when a spurious timestamp is reported from `AudioTrack.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.
      Use `DefaultAudioSink.Builder`.

    - #### 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.
      Use `DefaultAudioSink.Builder`.

    - #### 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.
      Use `DefaultAudioSink.Builder`.

  - ### 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 interface `AudioSink`
      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 the `PlayerId` of the player using this audio sink.
      Specified by:
        `setPlayerId` in interface `AudioSink`
      Parameters:
        `playerId` - The `PlayerId`, 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 given `Format`.
      Specified by:
        `supportsFormat` in interface `AudioSink`
      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 given `Format`.
      Specified by:
        `getFormatSupport` in interface `AudioSink`
      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, or `AudioSink.CURRENT_POSITION_NOT_SET` if it is not yet available.
      Specified by:
        `getCurrentPositionUs` in interface `AudioSink`
      Parameters:
        `sourceEnded` - Specify `true` 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 interface `AudioSink`
      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. Specify `null` to leave the input unchanged. Otherwise, the element at index `i` specifies index of the input channel to map to output channel `i` when preprocessing input buffers. After the map is applied the audio data will have `outputChannels.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.
      Specified by:
        `play` in interface `AudioSink`

    - #### 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 interface `AudioSink`

    - #### 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 a `ByteBuffer`, starting from its current position and ending at its limit (exclusive). The position of the `ByteBuffer` is advanced by the number of bytes that were handled. `AudioSink.Listener.onPositionDiscontinuity()` will be called if `presentationTimeUs` 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 to `AudioSink.flush()` (or to `AudioSink.configure(Format, int, int[])` that causes the sink to be flushed).

      Specified by:
        `handleBuffer` in interface `AudioSink`
      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 return `true` when no data remains.
      Specified by:
        `playToEndOfStream` in interface `AudioSink`
      Throws:
        `AudioSink.WriteException` - If an error occurs draining data to the sink.

    - #### isEnded

          public boolean isEnded()

      Description copied from interface: `AudioSink`
      Returns whether `AudioSink.playToEndOfStream()` has been called and all buffers have been processed.
      Specified by:
        `isEnded` in interface `AudioSink`

    - #### 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 interface `AudioSink`

    - #### 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 interface `AudioSink`
      Parameters:
        `playbackParameters` - The new playback parameters to attempt to set.

    - #### getPlaybackParameters

          public PlaybackParameters getPlaybackParameters()

      Description copied from interface: `AudioSink`
      Returns the active `PlaybackParameters`.
      Specified by:
        `getPlaybackParameters` in interface `AudioSink`

    - #### 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 interface `AudioSink`

    - #### getSkipSilenceEnabled

          public boolean getSkipSilenceEnabled()

      Description copied from interface: `AudioSink`
      Returns whether silences are skipped in the audio stream.
      Specified by:
        `getSkipSilenceEnabled` in interface `AudioSink`

    - #### 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 interface `AudioSink`
      Parameters:
        `audioAttributes` - The attributes for audio playback.

    - #### getAudioAttributes

          public AudioAttributes getAudioAttributes()

      Description copied from interface: `AudioSink`
      Returns the audio attributes used for audio playback, or `null` if the sink does not use audio attributes.
      Specified by:
        `getAudioAttributes` in interface `AudioSink`

    - #### setAudioSessionId

          public void setAudioSessionId​(int audioSessionId)

      Description copied from interface: `AudioSink`
      Sets the audio session id.
      Specified by:
        `setAudioSessionId` in interface `AudioSink`

    - #### setAuxEffectInfo

          public void setAuxEffectInfo​(AuxEffectInfo auxEffectInfo)

      Description copied from interface: `AudioSink`
      Sets the auxiliary effect.
      Specified by:
        `setAuxEffectInfo` in interface `AudioSink`

    - #### setPreferredDevice

          @RequiresApi(23)
          public void setPreferredDevice​(@Nullable
                                         AudioDeviceInfo audioDeviceInfo)

      Description copied from interface: `AudioSink`
      Sets the preferred audio device.
      Specified by:
        `setPreferredDevice` in interface `AudioSink`
      Parameters:
        `audioDeviceInfo` - The preferred audio device, or null to restore the default.

    - #### 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 platform `AudioTrack`, and requires platform API version 21 onwards.
      Specified by:
        `enableTunnelingV21` in interface `AudioSink`

    - #### 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 interface `AudioSink`

    - #### setVolume

          public void setVolume​(float volume)

      Description copied from interface: `AudioSink`
      Sets the playback volume.
      Specified by:
        `setVolume` in interface `AudioSink`
      Parameters:
        `volume` - Linear output gain to apply to all channels. Should be in the range [0.0, 1.0].

    - #### pause

          public void pause()

      Description copied from interface: `AudioSink`
      Pauses playback.
      Specified by:
        `pause` in interface `AudioSink`

    - #### 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.

      Specified by:
        `flush` in interface `AudioSink`

    - #### 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 interface `AudioSink`

    - #### reset

          public void reset()

      Description copied from interface: `AudioSink`
      Resets the sink, releasing any resources that it currently holds.
      Specified by:
        `reset` in interface `AudioSink`