Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels) Summary: [Nested Classes](https://developer.android.com/reference/android/media/AudioTrack#nestedclasses) \| [Constants](https://developer.android.com/reference/android/media/AudioTrack#constants) \| [Ctors](https://developer.android.com/reference/android/media/AudioTrack#pubctors) \| [Methods](https://developer.android.com/reference/android/media/AudioTrack#pubmethods) \| [Protected Methods](https://developer.android.com/reference/android/media/AudioTrack#promethods) \| [Inherited Methods](https://developer.android.com/reference/android/media/AudioTrack#inhmethods)

# AudioTrack

*** ** * ** ***


`
public


class
AudioTrack
`


`

extends https://developer.android.com/reference/java/lang/Object


`

`


implements

https://developer.android.com/reference/android/media/AudioRouting,

https://developer.android.com/reference/android/media/VolumeAutomation


`

|---|---|
| [java.lang.Object](https://developer.android.com/reference/java/lang/Object) ||
| ↳ | android.media.AudioTrack |

<br />

*** ** * ** ***

The AudioTrack class manages and plays a single audio resource for Java applications.
It allows streaming of PCM audio buffers to the audio sink for playback. This is
achieved by "pushing" the data to the AudioTrack object using one of the
`https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int)`,
and `https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)` methods.

An AudioTrack instance can operate under two modes: static or streaming.  

In Streaming mode, the application writes a continuous stream of data to the AudioTrack, using
one of the `write()` methods. These are blocking and return when the data has been
transferred from the Java layer to the native layer and queued for playback. The streaming
mode is most useful when playing blocks of audio data that for instance are:

- too big to fit in memory because of the duration of the sound to play,
- too big to fit in memory because of the characteristics of the audio data (high sampling rate, bits per sample ...)
- received or generated while previously queued audio is playing.

The static mode should be chosen when dealing with short sounds that fit in memory and that need to be played with the smallest latency possible. The static mode will therefore be preferred for UI and game sounds that are played often, and with the smallest overhead possible.

Upon creation, an AudioTrack object initializes its associated audio buffer.
The size of this buffer, specified during the construction, determines how long an AudioTrack
can play before running out of data.  

For an AudioTrack using the static mode, this size is the maximum size of the sound that can
be played from it.  

For the streaming mode, data will be written to the audio sink in chunks of
sizes less than or equal to the total buffer size.

AudioTrack is not final and thus permits subclasses, but such use is not recommended.

## Summary

| ### Nested classes ||
|---|---|
| ` class` | `https://developer.android.com/reference/android/media/AudioTrack.Builder` Builder class for `https://developer.android.com/reference/android/media/AudioTrack` objects. |
| ` class` | `https://developer.android.com/reference/android/media/AudioTrack.MetricsConstants` |
| ` interface` | `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` Interface definition for a listener for codec format changes. |
| ` interface` | `https://developer.android.com/reference/android/media/AudioTrack.OnPlaybackPositionUpdateListener` Interface definition for a callback to be invoked when the playback head position of an AudioTrack has reached a notification marker or has increased by a certain period. |
| ` interface` | `https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener` *This interface was deprecated in API level 24. users should switch to the general purpose `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` class instead.* |
| ` class` | `https://developer.android.com/reference/android/media/AudioTrack.StreamEventCallback` Abstract class to receive event notifications about the stream playback in offloaded mode. |

| ### Constants ||
|---|---|
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LL` This mode indicates that a stereo stream should be presented with the left audio channel replicated into the right audio channel. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LR` This mode indicates that a stereo stream should be presented with the left and right audio channels blended together and delivered to both channels. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_OFF` This mode disables any Dual Mono presentation effect. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_RR` This mode indicates that a stereo stream should be presented with the right audio channel replicated into the left audio channel. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR` Encapsulation metadata type for DVB AD descriptor. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER` Encapsulation metadata type for framework tuner information. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ENCAPSULATION_METADATA_TYPE_SUPPLEMENTARY_AUDIO_PLACEMENT` Encapsulation metadata type for placement of supplementary audio. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ENCAPSULATION_MODE_ELEMENTARY_STREAM` This mode indicates metadata encapsulation with an elementary stream payload. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ENCAPSULATION_MODE_NONE` This mode indicates no metadata encapsulation, which is the default mode for sending audio data through `AudioTrack`. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ERROR` Denotes a generic operation failure. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` Denotes a failure due to the use of an invalid value. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` An error code indicating that the object reporting it is no longer valid and needs to be recreated. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` Denotes a failure due to the improper use of a method. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_BEST_EFFORT` Accuracy mode for `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` to indicate the framework will flush the data as close as possible, but not below, to the requested position. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_EXACT` Accuracy mode for `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` to indicate the AudioTrack must be flushed from the requested position. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_WRITTEN_FRAMES_SUPPORTED` Constant flag value to indicate `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` is supported. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC` Creation mode where audio data is transferred from Java to the native layer only once before the audio starts playing. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` Creation mode where audio data is streamed from Java to the native layer as the audio is playing. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_LOW_LATENCY` Low latency performance mode for an `https://developer.android.com/reference/android/media/AudioTrack`. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_NONE` Default performance mode for an `https://developer.android.com/reference/android/media/AudioTrack`. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_POWER_SAVING` Power saving performance mode for an `https://developer.android.com/reference/android/media/AudioTrack`. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_PAUSED` indicates AudioTrack state is paused |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_PLAYING` indicates AudioTrack state is playing |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_STOPPED` indicates AudioTrack state is stopped |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#STATE_INITIALIZED` State of an AudioTrack that is ready to be used. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#STATE_NO_STATIC_DATA` State of a successfully initialized AudioTrack that uses static data, but that hasn't received that data yet. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#STATE_UNINITIALIZED` State of an AudioTrack that was not successfully initialized upon creation. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS` Denotes a successful operation. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#SUPPLEMENTARY_AUDIO_PLACEMENT_LEFT` Supplementary audio placement left. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#SUPPLEMENTARY_AUDIO_PLACEMENT_NORMAL` Supplementary audio placement normal. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#SUPPLEMENTARY_AUDIO_PLACEMENT_RIGHT` Supplementary audio placement right. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING` The write mode indicating the write operation will block until all data has been written, to be used as the actual value of the writeMode parameter in `https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`, and `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int,%20long)`. |
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING` The write mode indicating the write operation will return immediately after queuing as much audio data for playback as possible without blocking, to be used as the actual value of the writeMode parameter in `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`, and `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int,%20long)`. |

| ### Public constructors ||
|---|---|
| ` https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(android.media.AudioAttributes,%20android.media.AudioFormat,%20int,%20int,%20int)(https://developer.android.com/reference/android/media/AudioAttributes attributes, https://developer.android.com/reference/android/media/AudioFormat format, int bufferSizeInBytes, int mode, int sessionId) ` Class constructor with `https://developer.android.com/reference/android/media/AudioAttributes` and `https://developer.android.com/reference/android/media/AudioFormat`. |
| ` https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(int,%20int,%20int,%20int,%20int,%20int)(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode) ` *This constructor is deprecated. use `https://developer.android.com/reference/android/media/AudioTrack.Builder` or `https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(android.media.AudioAttributes,%20android.media.AudioFormat,%20int,%20int,%20int)` to specify the `https://developer.android.com/reference/android/media/AudioAttributes` instead of the stream type which is only for volume control.* |
| ` https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(int,%20int,%20int,%20int,%20int,%20int,%20int)(int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode, int sessionId) ` *This constructor is deprecated. use `https://developer.android.com/reference/android/media/AudioTrack.Builder` or `https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(android.media.AudioAttributes,%20android.media.AudioFormat,%20int,%20int,%20int)` to specify the `https://developer.android.com/reference/android/media/AudioAttributes` instead of the stream type which is only for volume control.* |

| ### Public methods ||
|---|---|
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#addOnCodecFormatChangedListener(java.util.concurrent.Executor,%20android.media.AudioTrack.OnCodecFormatChangedListener)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener listener) ` Adds an `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` to receive notifications of codec format change events on this `AudioTrack`. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener,%20android.os.Handler)(https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener listener, https://developer.android.com/reference/android/os/Handler handler) ` *This method was deprecated in API level 24. users should switch to the general purpose `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` class instead.* |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener,%20android.os.Handler)(https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener listener, https://developer.android.com/reference/android/os/Handler handler) ` Adds an `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` to receive notifications of routing changes on this AudioTrack. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#attachAuxEffect(int)(int effectId) ` Attaches an auxiliary effect to the audio track. |
| ` https://developer.android.com/reference/android/media/VolumeShaper` | ` https://developer.android.com/reference/android/media/AudioTrack#createVolumeShaper(android.media.VolumeShaper.Configuration)(https://developer.android.com/reference/android/media/VolumeShaper.Configuration configuration) ` Returns a `https://developer.android.com/reference/android/media/VolumeShaper` object that can be used modify the volume envelope of the player or track. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#flush()() ` Flushes the audio data currently queued for playback. |
| ` long` | ` https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)(long positionInFrames, int accuracy) ` Flush all data from the given position. |
| ` https://developer.android.com/reference/android/media/AudioAttributes` | ` https://developer.android.com/reference/android/media/AudioTrack#getAudioAttributes()() ` Returns the `https://developer.android.com/reference/android/media/AudioAttributes` used in configuration. |
| ` float` | ` https://developer.android.com/reference/android/media/AudioTrack#getAudioDescriptionMixLeveldB()() ` Returns the Audio Description mix level in dB. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getAudioFormat()() ` Returns the configured audio data encoding. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getAudioSessionId()() ` Returns the audio session ID. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getBufferCapacityInFrames()() ` Returns the maximum size of the `AudioTrack` buffer in frames. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()() ` Returns the effective size of the `AudioTrack` buffer that the application writes to. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getChannelConfiguration()() ` Returns the configured channel position mask. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getChannelCount()() ` Returns the configured number of channels. |
| ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/android/media/AudioTrack#getCodecProvenance()() ` Returns the codec provenance of the `AudioTrack` specified at the time of configuration. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getDualMonoMode()() ` Returns the Dual Mono mode presentation setting. |
| ` static int` | ` https://developer.android.com/reference/android/media/AudioTrack#getFlushWrittenFramesFromPositionSupport(android.media.AudioFormat,%20android.media.AudioAttributes)(https://developer.android.com/reference/android/media/AudioFormat format, https://developer.android.com/reference/android/media/AudioAttributes attributes) ` Returns a bit mask representing the current feature support for `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` for the AudioTrack in offload mode that is created with the given `https://developer.android.com/reference/android/media/AudioFormat` and `https://developer.android.com/reference/android/media/AudioAttributes`. |
| ` https://developer.android.com/reference/android/media/AudioFormat` | ` https://developer.android.com/reference/android/media/AudioTrack#getFormat()() ` Returns the configured `AudioTrack` format. |
| ` https://developer.android.com/reference/android/media/metrics/LogSessionId` | ` https://developer.android.com/reference/android/media/AudioTrack#getLogSessionId()() ` Returns the `https://developer.android.com/reference/android/media/metrics/LogSessionId`. |
| ` static float` | ` https://developer.android.com/reference/android/media/AudioTrack#getMaxVolume()() ` Returns the maximum gain value, which is greater than or equal to 1.0. |
| ` https://developer.android.com/reference/android/os/PersistableBundle` | ` https://developer.android.com/reference/android/media/AudioTrack#getMetrics()() ` Return Metrics data about the current AudioTrack instance. |
| ` static int` | ` https://developer.android.com/reference/android/media/AudioTrack#getMinBufferSize(int,%20int,%20int)(int sampleRateInHz, int channelConfig, int audioFormat) ` Returns the estimated minimum buffer size required for an AudioTrack object to be created in the `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` mode. |
| ` static float` | ` https://developer.android.com/reference/android/media/AudioTrack#getMinVolume()() ` Returns the minimum gain value, which is the constant 0.0. |
| ` static int` | ` https://developer.android.com/reference/android/media/AudioTrack#getNativeOutputSampleRate(int)(int streamType) ` Returns the output sample rate in Hz for the specified stream type. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getNotificationMarkerPosition()() ` Returns marker position expressed in frames. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getOffloadDelay()() ` Return the decoder delay of an offloaded track, expressed in frames, previously set with `https://developer.android.com/reference/android/media/AudioTrack#setOffloadDelayPadding(int,%20int)`, or 0 if it was never modified. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getOffloadPadding()() ` Return the decoder padding of an offloaded track, expressed in frames, previously set with `https://developer.android.com/reference/android/media/AudioTrack#setOffloadDelayPadding(int,%20int)`, or 0 if it was never modified. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getPerformanceMode()() ` Returns the current performance mode of the `https://developer.android.com/reference/android/media/AudioTrack`. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getPlayState()() ` Returns the playback state of the AudioTrack instance. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getPlaybackHeadPosition()() ` Returns the playback head position expressed in frames. |
| ` https://developer.android.com/reference/android/media/PlaybackParams` | ` https://developer.android.com/reference/android/media/AudioTrack#getPlaybackParams()() ` Returns the current playback parameters. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getPlaybackRate()() ` Returns the current playback sample rate rate in Hz. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getPositionNotificationPeriod()() ` Returns the notification update period expressed in frames. |
| ` https://developer.android.com/reference/android/media/AudioDeviceInfo` | ` https://developer.android.com/reference/android/media/AudioTrack#getPreferredDevice()() ` Returns the selected output specified by `https://developer.android.com/reference/android/media/AudioTrack#setPreferredDevice(android.media.AudioDeviceInfo)`. |
| ` https://developer.android.com/reference/android/media/AudioDeviceInfo` | ` https://developer.android.com/reference/android/media/AudioTrack#getRoutedDevice()() ` Returns an `https://developer.android.com/reference/android/media/AudioDeviceInfo` identifying the current routing of this AudioTrack. |
| ` https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/AudioDeviceInfo>` | ` https://developer.android.com/reference/android/media/AudioTrack#getRoutedDevices()() ` Returns a List of `https://developer.android.com/reference/android/media/AudioDeviceInfo` identifying the current routing of this AudioTrack. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getSampleRate()() ` Returns the configured audio source sample rate in Hz. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getStartThresholdInFrames()() ` Returns the streaming start threshold of the `AudioTrack`. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getState()() ` Returns the state of the AudioTrack instance. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getStreamType()() ` Returns the volume stream type of this AudioTrack. |
| ` boolean` | ` https://developer.android.com/reference/android/media/AudioTrack#getTimestamp(android.media.AudioTimestamp)(https://developer.android.com/reference/android/media/AudioTimestamp timestamp) ` Poll for a timestamp on demand. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getUnderrunCount()() ` Returns the number of underrun occurrences in the application-level write buffer since the AudioTrack was created. |
| ` long` | ` https://developer.android.com/reference/android/media/AudioTrack#getWrittenFramesCount()() ` Returns the number of audio frames written to a `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` `https://developer.android.com/reference/android/media/AudioTrack`. |
| ` static boolean` | ` https://developer.android.com/reference/android/media/AudioTrack#isDirectPlaybackSupported(android.media.AudioFormat,%20android.media.AudioAttributes)(https://developer.android.com/reference/android/media/AudioFormat format, https://developer.android.com/reference/android/media/AudioAttributes attributes) ` *This method was deprecated in API level 33. Use `https://developer.android.com/reference/android/media/AudioManager#getDirectPlaybackSupport(android.media.AudioFormat,%20android.media.AudioAttributes)` instead.* |
| ` boolean` | ` https://developer.android.com/reference/android/media/AudioTrack#isOffloadedPlayback()() ` Returns whether the track was built with `https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)` set to `true`. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#pause()() ` Pauses the playback of the audio data. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#play()() ` Starts playing an AudioTrack. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#registerStreamEventCallback(java.util.concurrent.Executor,%20android.media.AudioTrack.StreamEventCallback)(https://developer.android.com/reference/java/util/concurrent/Executor executor, https://developer.android.com/reference/android/media/AudioTrack.StreamEventCallback eventCallback) ` Registers a callback for the notification of stream events. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#release()() ` Releases the native AudioTrack resources. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#reloadStaticData()() ` Sets the playback head position within the static buffer to zero, that is it rewinds to start of static buffer. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#removeOnCodecFormatChangedListener(android.media.AudioTrack.OnCodecFormatChangedListener)(https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener listener) ` Removes an `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` which has been previously added to receive codec format change events. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener)(https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener listener) ` *This method was deprecated in API level 24. users should switch to the general purpose `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` class instead.* |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener)(https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener listener) ` Removes an `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` which has been previously added to receive rerouting notifications. |
| ` boolean` | ` https://developer.android.com/reference/android/media/AudioTrack#setAudioDescriptionMixLeveldB(float)(float level) ` Sets the Audio Description mix level in dB. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setAuxEffectSendLevel(float)(float level) ` Sets the send level of the audio track to the attached auxiliary effect `https://developer.android.com/reference/android/media/AudioTrack#attachAuxEffect(int)`. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setBufferSizeInFrames(int)(int bufferSizeInFrames) ` Limits the effective size of the `AudioTrack` buffer that the application writes to. |
| ` boolean` | ` https://developer.android.com/reference/android/media/AudioTrack#setDualMonoMode(int)(int dualMonoMode) ` Sets the Dual Mono mode presentation on the output device. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setLogSessionId(android.media.metrics.LogSessionId)(https://developer.android.com/reference/android/media/metrics/LogSessionId logSessionId) ` Sets a `https://developer.android.com/reference/android/media/metrics/LogSessionId` instance to this AudioTrack for metrics collection. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setLoopPoints(int,%20int,%20int)(int startInFrames, int endInFrames, int loopCount) ` Sets the loop points and the loop count. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setNotificationMarkerPosition(int)(int markerInFrames) ` Sets the position of the notification marker. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setOffloadDelayPadding(int,%20int)(int delayInFrames, int paddingInFrames) ` Configures the delay and padding values for the current compressed stream playing in offload mode. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setOffloadEndOfStream()() ` Declares that the last write() operation on this track provided the last buffer of this stream. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setPlaybackHeadPosition(int)(int positionInFrames) ` Sets the playback head position within the static buffer. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setPlaybackParams(android.media.PlaybackParams)(https://developer.android.com/reference/android/media/PlaybackParams params) ` Sets the playback parameters. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener,%20android.os.Handler)(https://developer.android.com/reference/android/media/AudioTrack.OnPlaybackPositionUpdateListener listener, https://developer.android.com/reference/android/os/Handler handler) ` Sets the listener the AudioTrack notifies when a previously set marker is reached or for each periodic playback head position update. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener)(https://developer.android.com/reference/android/media/AudioTrack.OnPlaybackPositionUpdateListener listener) ` Sets the listener the AudioTrack notifies when a previously set marker is reached or for each periodic playback head position update. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setPlaybackRate(int)(int sampleRateInHz) ` Sets the playback sample rate for this track. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setPositionNotificationPeriod(int)(int periodInFrames) ` Sets the period for the periodic notification event. |
| ` boolean` | ` https://developer.android.com/reference/android/media/AudioTrack#setPreferredDevice(android.media.AudioDeviceInfo)(https://developer.android.com/reference/android/media/AudioDeviceInfo deviceInfo) ` Specifies an audio device (via an `https://developer.android.com/reference/android/media/AudioDeviceInfo` object) to route the output from this AudioTrack. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setPresentation(android.media.AudioPresentation)(https://developer.android.com/reference/android/media/AudioPresentation presentation) ` Sets the audio presentation. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setStartThresholdInFrames(int)(int startThresholdInFrames) ` Sets the streaming start threshold for an `AudioTrack`. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setStereoVolume(float,%20float)(float leftGain, float rightGain) ` *This method was deprecated in API level 21. Applications should use `https://developer.android.com/reference/android/media/AudioTrack#setVolume(float)` instead, as it more gracefully scales down to mono, and up to multi-channel content beyond stereo.* |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#setVolume(float)(float gain) ` Sets the specified output gain value on all channels of this track. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#stop()() ` Stops playing the audio data. |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#unregisterStreamEventCallback(android.media.AudioTrack.StreamEventCallback)(https://developer.android.com/reference/android/media/AudioTrack.StreamEventCallback eventCallback) ` Unregisters the callback for notification of stream events, previously registered with `https://developer.android.com/reference/android/media/AudioTrack#registerStreamEventCallback(java.util.concurrent.Executor,%20android.media.AudioTrack.StreamEventCallback)`. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)(float[] audioData, int offsetInFloats, int sizeInFloats, int writeMode) ` Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int)(short[] audioData, int offsetInShorts, int sizeInShorts) ` Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int)(byte[] audioData, int offsetInBytes, int sizeInBytes) ` Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)(https://developer.android.com/reference/java/nio/ByteBuffer audioData, int sizeInBytes, int writeMode) ` Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int,%20long)(https://developer.android.com/reference/java/nio/ByteBuffer audioData, int sizeInBytes, int writeMode, long timestamp) ` Writes the audio data to the audio sink for playback in streaming mode on a HW_AV_SYNC track. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)(short[] audioData, int offsetInShorts, int sizeInShorts, int writeMode) ` Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int,%20int)(byte[] audioData, int offsetInBytes, int sizeInBytes, int writeMode) ` Writes the audio data to the audio sink for playback (streaming mode), or copies audio data for later playback (static buffer mode). |

| ### Protected methods ||
|---|---|
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#finalize()() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. |
| ` int` | ` https://developer.android.com/reference/android/media/AudioTrack#getNativeFrameCount()() ` *This method was deprecated in API level 19. Use the identical public method `https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()` instead.* |
| ` void` | ` https://developer.android.com/reference/android/media/AudioTrack#setState(int)(int state) ` *This method was deprecated in API level 19. Only accessible by subclasses, which are not recommended for AudioTrack.* |

| ### Inherited methods |
|---|---|
| From class ` https://developer.android.com/reference/java/lang/Object ` |---|---| | ` https://developer.android.com/reference/java/lang/Object` | ` https://developer.android.com/reference/java/lang/Object#clone()() ` Creates and returns a copy of this object. | | ` boolean` | ` https://developer.android.com/reference/java/lang/Object#equals(java.lang.Object)(https://developer.android.com/reference/java/lang/Object obj) ` Indicates whether some other object is "equal to" this one. | | ` void` | ` https://developer.android.com/reference/java/lang/Object#finalize()() ` Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. | | ` final https://developer.android.com/reference/java/lang/Class<?>` | ` https://developer.android.com/reference/java/lang/Object#getClass()() ` Returns the runtime class of this `Object`. | | ` int` | ` https://developer.android.com/reference/java/lang/Object#hashCode()() ` Returns a hash code value for the object. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#notify()() ` Wakes up a single thread that is waiting on this object's monitor. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#notifyAll()() ` Wakes up all threads that are waiting on this object's monitor. | | ` https://developer.android.com/reference/java/lang/String` | ` https://developer.android.com/reference/java/lang/Object#toString()() ` Returns a string representation of the object. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait(long,%20int)(long timeoutMillis, int nanos) ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait(long)(long timeoutMillis) ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*, or until a certain amount of real time has elapsed. | | ` final void` | ` https://developer.android.com/reference/java/lang/Object#wait()() ` Causes the current thread to wait until it is awakened, typically by being *notified* or *interrupted*. | ||
| From interface ` https://developer.android.com/reference/android/media/AudioRouting ` |---|---| | ` abstract void` | ` https://developer.android.com/reference/android/media/AudioRouting#addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener,%20android.os.Handler)(https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener listener, https://developer.android.com/reference/android/os/Handler handler) ` Adds an `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` to receive notifications of routing changes on this AudioTrack/AudioRecord. | | ` abstract https://developer.android.com/reference/android/media/AudioDeviceInfo` | ` https://developer.android.com/reference/android/media/AudioRouting#getPreferredDevice()() ` Returns the selected output/input specified by `https://developer.android.com/reference/android/media/AudioRouting#setPreferredDevice(android.media.AudioDeviceInfo)`. | | ` abstract https://developer.android.com/reference/android/media/AudioDeviceInfo` | ` https://developer.android.com/reference/android/media/AudioRouting#getRoutedDevice()() ` Returns an `https://developer.android.com/reference/android/media/AudioDeviceInfo` identifying the current routing of this AudioTrack/AudioRecord. | | ` default https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/AudioDeviceInfo>` | ` https://developer.android.com/reference/android/media/AudioRouting#getRoutedDevices()() ` Returns a List of `https://developer.android.com/reference/android/media/AudioDeviceInfo` identifying the current routing of this AudioTrack/AudioRecord. | | ` abstract void` | ` https://developer.android.com/reference/android/media/AudioRouting#removeOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener)(https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener listener) ` Removes an `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` which has been previously added to receive rerouting notifications. | | ` abstract boolean` | ` https://developer.android.com/reference/android/media/AudioRouting#setPreferredDevice(android.media.AudioDeviceInfo)(https://developer.android.com/reference/android/media/AudioDeviceInfo deviceInfo) ` Specifies an audio device (via an `https://developer.android.com/reference/android/media/AudioDeviceInfo` object) to route the output/input to/from. | ||
| From interface ` https://developer.android.com/reference/android/media/VolumeAutomation ` |---|---| | ` abstract https://developer.android.com/reference/android/media/VolumeShaper` | ` https://developer.android.com/reference/android/media/VolumeAutomation#createVolumeShaper(android.media.VolumeShaper.Configuration)(https://developer.android.com/reference/android/media/VolumeShaper.Configuration configuration) ` Returns a `https://developer.android.com/reference/android/media/VolumeShaper` object that can be used modify the volume envelope of the player or track. | ||

## Constants

### DUAL_MONO_MODE_LL

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int DUAL_MONO_MODE_LL
```

This mode indicates that a stereo stream should be presented
with the left audio channel replicated into the right audio channel.

Behavior for non-stereo streams is implementation defined.
A suggested guideline is that all channels with left-right
stereo symmetry will have the left channel position replicated
into the right channel position.
The center channels (with no left/right symmetry) or unbalanced
channels are left alone.

The Dual Mono effect occurs before volume scaling.

<br />

Constant Value:

2
(0x00000002)


### DUAL_MONO_MODE_LR

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int DUAL_MONO_MODE_LR
```

This mode indicates that a stereo stream should be presented
with the left and right audio channels blended together
and delivered to both channels.

Behavior for non-stereo streams is implementation defined.
A suggested guideline is that the left-right stereo symmetric
channels are pairwise blended;
the other channels such as center are left alone.

The Dual Mono effect occurs before volume scaling.

<br />

Constant Value:

1
(0x00000001)


### DUAL_MONO_MODE_OFF

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int DUAL_MONO_MODE_OFF
```

This mode disables any Dual Mono presentation effect.

<br />

Constant Value:

0
(0x00000000)


### DUAL_MONO_MODE_RR

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int DUAL_MONO_MODE_RR
```

This mode indicates that a stereo stream should be presented
with the right audio channel replicated into the left audio channel.

Behavior for non-stereo streams is implementation defined.
A suggested guideline is that all channels with left-right
stereo symmetry will have the right channel position replicated
into the left channel position.
The center channels (with no left/right symmetry) or unbalanced
channels are left alone.

The Dual Mono effect occurs before volume scaling.

<br />

Constant Value:

3
(0x00000003)


### ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ENCAPSULATION_METADATA_TYPE_DVB_AD_DESCRIPTOR
```

Encapsulation metadata type for DVB AD descriptor.

This metadata is formatted per ETSI TS 101 154 Table E.1: AD_descriptor.

<br />

Constant Value:

2
(0x00000002)


### ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ENCAPSULATION_METADATA_TYPE_FRAMEWORK_TUNER
```

Encapsulation metadata type for framework tuner information.

Refer to the Android Media TV Tuner API for details.

<br />

Constant Value:

1
(0x00000001)


### ENCAPSULATION_METADATA_TYPE_SUPPLEMENTARY_AUDIO_PLACEMENT

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ENCAPSULATION_METADATA_TYPE_SUPPLEMENTARY_AUDIO_PLACEMENT
```

Encapsulation metadata type for placement of supplementary audio.

A 32 bit integer constant, one of `https://developer.android.com/reference/android/media/AudioTrack#SUPPLEMENTARY_AUDIO_PLACEMENT_NORMAL`, `https://developer.android.com/reference/android/media/AudioTrack#SUPPLEMENTARY_AUDIO_PLACEMENT_LEFT`, `https://developer.android.com/reference/android/media/AudioTrack#SUPPLEMENTARY_AUDIO_PLACEMENT_RIGHT`.

<br />

Constant Value:

3
(0x00000003)


### ENCAPSULATION_MODE_ELEMENTARY_STREAM

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ENCAPSULATION_MODE_ELEMENTARY_STREAM
```

This mode indicates metadata encapsulation with an elementary stream payload.
Both compressed and PCM format is allowed.

<br />

Constant Value:

1
(0x00000001)


### ENCAPSULATION_MODE_NONE

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ENCAPSULATION_MODE_NONE
```

This mode indicates no metadata encapsulation,
which is the default mode for sending audio data
through `AudioTrack`.

<br />

Constant Value:

0
(0x00000000)


### ERROR

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ERROR
```

Denotes a generic operation failure.

<br />

Constant Value:

-1
(0xffffffff)


### ERROR_BAD_VALUE

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ERROR_BAD_VALUE
```

Denotes a failure due to the use of an invalid value.

<br />

Constant Value:

-2
(0xfffffffe)


### ERROR_DEAD_OBJECT

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ERROR_DEAD_OBJECT
```

An error code indicating that the object reporting it is no longer valid and needs to
be recreated.

<br />

Constant Value:

-6
(0xfffffffa)


### ERROR_INVALID_OPERATION

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int ERROR_INVALID_OPERATION
```

Denotes a failure due to the improper use of a method.

<br />

Constant Value:

-3
(0xfffffffd)


### FLUSH_FROM_ACCURACY_BEST_EFFORT

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int FLUSH_FROM_ACCURACY_BEST_EFFORT
```

Accuracy mode for `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`
to indicate the framework will flush the
data as close as possible, but not below, to the requested position.

<br />

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`

Constant Value:

0
(0x00000000)


### FLUSH_FROM_ACCURACY_EXACT

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int FLUSH_FROM_ACCURACY_EXACT
```

Accuracy mode for `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`
to indicate the AudioTrack must be
flushed from the requested position. If it is not possible to flush from the requested
position, the AudioTrack must not be flushed.

<br />

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`

Constant Value:

1
(0x00000001)


### FLUSH_WRITTEN_FRAMES_SUPPORTED

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int FLUSH_WRITTEN_FRAMES_SUPPORTED
```

Constant flag value to indicate `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`
is supported.

<br />

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`
- `https://developer.android.com/reference/android/media/AudioTrack#getFlushWrittenFramesFromPositionSupport(android.media.AudioFormat,%20android.media.AudioAttributes)`

Constant Value:

1
(0x00000001)


### MODE_STATIC

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int MODE_STATIC
```

Creation mode where audio data is transferred from Java to the native layer
only once before the audio starts playing.

<br />

Constant Value:

0
(0x00000000)


### MODE_STREAM

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int MODE_STREAM
```

Creation mode where audio data is streamed from Java to the native layer
as the audio is playing.

<br />

Constant Value:

1
(0x00000001)


### PERFORMANCE_MODE_LOW_LATENCY

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PERFORMANCE_MODE_LOW_LATENCY
```

Low latency performance mode for an `https://developer.android.com/reference/android/media/AudioTrack`.
If the device supports it, this mode
enables a lower latency path through to the audio output sink.
Effects may no longer work with such an `AudioTrack` and
the sample rate must match that of the output sink.


Applications should be aware that low latency requires careful
buffer management, with smaller chunks of audio data written by each
`write()` call.


If this flag is used without specifying a `bufferSizeInBytes` then the
`AudioTrack`'s actual buffer size may be too small.
It is recommended that a fairly
large buffer should be specified when the `AudioTrack` is created.
Then the actual size can be reduced by calling
`https://developer.android.com/reference/android/media/AudioTrack#setBufferSizeInFrames(int)`. The buffer size can be optimized
by lowering it after each `write()` call until the audio glitches,
which is detected by calling
`https://developer.android.com/reference/android/media/AudioTrack#getUnderrunCount()`. Then the buffer size can be increased
until there are no glitches.
This tuning step should be done while playing silence.
This technique provides a compromise between latency and glitch rate.

<br />

Constant Value:

1
(0x00000001)


### PERFORMANCE_MODE_NONE

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PERFORMANCE_MODE_NONE
```

Default performance mode for an `https://developer.android.com/reference/android/media/AudioTrack`.

<br />

Constant Value:

0
(0x00000000)


### PERFORMANCE_MODE_POWER_SAVING

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PERFORMANCE_MODE_POWER_SAVING
```

Power saving performance mode for an `https://developer.android.com/reference/android/media/AudioTrack`.
If the device supports it, this
mode will enable a lower power path to the audio output sink.
In addition, this lower power path typically will have
deeper internal buffers and better underrun resistance,
with a tradeoff of higher latency.


In this mode, applications should attempt to use a larger buffer size
and deliver larger chunks of audio data per `write()` call.
Use `https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()` to determine
the actual buffer size of the `AudioTrack` as it may have increased
to accommodate a deeper buffer.

<br />

Constant Value:

2
(0x00000002)


### PLAYSTATE_PAUSED

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PLAYSTATE_PAUSED
```

indicates AudioTrack state is paused

<br />

Constant Value:

2
(0x00000002)


### PLAYSTATE_PLAYING

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PLAYSTATE_PLAYING
```

indicates AudioTrack state is playing

<br />

Constant Value:

3
(0x00000003)


### PLAYSTATE_STOPPED

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int PLAYSTATE_STOPPED
```

indicates AudioTrack state is stopped

<br />

Constant Value:

1
(0x00000001)


### STATE_INITIALIZED

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int STATE_INITIALIZED
```

State of an AudioTrack that is ready to be used.

<br />

Constant Value:

1
(0x00000001)


### STATE_NO_STATIC_DATA

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int STATE_NO_STATIC_DATA
```

State of a successfully initialized AudioTrack that uses static data,
but that hasn't received that data yet.

<br />

Constant Value:

2
(0x00000002)


### STATE_UNINITIALIZED

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int STATE_UNINITIALIZED
```

State of an AudioTrack that was not successfully initialized upon creation.

<br />

Constant Value:

0
(0x00000000)


### SUCCESS

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int SUCCESS
```

Denotes a successful operation.

<br />

Constant Value:

0
(0x00000000)


### SUPPLEMENTARY_AUDIO_PLACEMENT_LEFT

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int SUPPLEMENTARY_AUDIO_PLACEMENT_LEFT
```

Supplementary audio placement left.

<br />

Constant Value:

1
(0x00000001)


### SUPPLEMENTARY_AUDIO_PLACEMENT_NORMAL

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int SUPPLEMENTARY_AUDIO_PLACEMENT_NORMAL
```

Supplementary audio placement normal.

<br />

Constant Value:

0
(0x00000000)


### SUPPLEMENTARY_AUDIO_PLACEMENT_RIGHT

Added in [API level 34](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int SUPPLEMENTARY_AUDIO_PLACEMENT_RIGHT
```

Supplementary audio placement right.

<br />

Constant Value:

2
(0x00000002)


### WRITE_BLOCKING

Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int WRITE_BLOCKING
```

The write mode indicating the write operation will block until all data has been written,
to be used as the actual value of the writeMode parameter in
`https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)`,
`https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`, and
`https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int,%20long)`.

<br />

Constant Value:

0
(0x00000000)


### WRITE_NON_BLOCKING

Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static final int WRITE_NON_BLOCKING
```

The write mode indicating the write operation will return immediately after
queuing as much audio data for playback as possible without blocking,
to be used as the actual value of the writeMode parameter in
`https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)`,
`https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`, and
`https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int,%20long)`.

<br />

Constant Value:

1
(0x00000001)


## Public constructors

### AudioTrack

Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioTrack (AudioAttributes attributes, 
                AudioFormat format, 
                int bufferSizeInBytes, 
                int mode, 
                int sessionId)
```

Class constructor with `https://developer.android.com/reference/android/media/AudioAttributes` and `https://developer.android.com/reference/android/media/AudioFormat`.

<br />

| Parameters ||
|---|---|
| `attributes` | `AudioAttributes`: a non-null `https://developer.android.com/reference/android/media/AudioAttributes` instance. <br /> |
| `format` | `AudioFormat`: a non-null `https://developer.android.com/reference/android/media/AudioFormat` instance describing the format of the data that will be played through this AudioTrack. See `https://developer.android.com/reference/android/media/AudioFormat.Builder` for configuring the audio format parameters such as encoding, channel mask and sample rate. <br /> |
| `bufferSizeInBytes` | `int`: the total size (in bytes) of the internal buffer where audio data is read from for playback. This should be a nonzero multiple of the frame size in bytes. If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`, this is the maximum length sample, or audio clip, that can be played by this instance. If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`, this should be the desired buffer size for the `AudioTrack` to satisfy the application's latency requirements. If `bufferSizeInBytes` is less than the minimum buffer size for the output sink, it is increased to the minimum buffer size. The method `https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()` returns the actual size in frames of the buffer created, which determines the minimum frequency to write to the streaming `AudioTrack` to avoid underrun. See `https://developer.android.com/reference/android/media/AudioTrack#getMinBufferSize(int,%20int,%20int)` to determine the estimated minimum buffer size for an AudioTrack instance in streaming mode. |
| `mode` | `int`: streaming or static buffer. See `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC` and `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`. <br /> |
| `sessionId` | `int`: ID of audio session the AudioTrack must be attached to, or `https://developer.android.com/reference/android/media/AudioManager#AUDIO_SESSION_ID_GENERATE` if the session isn't known at construction time. See also `https://developer.android.com/reference/android/media/AudioManager#generateAudioSessionId()` to obtain a session ID before construction. <br /> |

| Throws ||
|---|---|
|   | java.lang.IllegalArgumentException |
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` |   |

### AudioTrack

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioTrack (int streamType, 
                int sampleRateInHz, 
                int channelConfig, 
                int audioFormat, 
                int bufferSizeInBytes, 
                int mode)
```


**This constructor is deprecated.**   

use `https://developer.android.com/reference/android/media/AudioTrack.Builder` or
`https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(android.media.AudioAttributes,%20android.media.AudioFormat,%20int,%20int,%20int)` to specify the
`https://developer.android.com/reference/android/media/AudioAttributes` instead of the stream type which is only for volume control.

Class constructor.

<br />

| Parameters ||
|---|---|
| `streamType` | `int`: the type of the audio stream. See `https://developer.android.com/reference/android/media/AudioManager#STREAM_VOICE_CALL`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_SYSTEM`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_RING`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_MUSIC`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_ALARM`, and `https://developer.android.com/reference/android/media/AudioManager#STREAM_NOTIFICATION`. <br /> |
| `sampleRateInHz` | `int`: the initial source sample rate expressed in Hz. `https://developer.android.com/reference/android/media/AudioFormat#SAMPLE_RATE_UNSPECIFIED` means to use a route-dependent value which is usually the sample rate of the sink. `https://developer.android.com/reference/android/media/AudioTrack#getSampleRate()` can be used to retrieve the actual sample rate chosen. <br /> |
| `channelConfig` | `int`: describes the configuration of the audio channels. See `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_MONO` and `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_STEREO` <br /> |
| `audioFormat` | `int`: the format in which the audio data is represented. See `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT`, `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_8BIT`, and `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_FLOAT`. <br /> |
| `bufferSizeInBytes` | `int`: the total size (in bytes) of the internal buffer where audio data is read from for playback. This should be a nonzero multiple of the frame size in bytes. If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`, this is the maximum length sample, or audio clip, that can be played by this instance. If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`, this should be the desired buffer size for the `AudioTrack` to satisfy the application's latency requirements. If `bufferSizeInBytes` is less than the minimum buffer size for the output sink, it is increased to the minimum buffer size. The method `https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()` returns the actual size in frames of the buffer created, which determines the minimum frequency to write to the streaming `AudioTrack` to avoid underrun. See `https://developer.android.com/reference/android/media/AudioTrack#getMinBufferSize(int,%20int,%20int)` to determine the estimated minimum buffer size for an AudioTrack instance in streaming mode. |
| `mode` | `int`: streaming or static buffer. See `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC` and `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` <br /> |

| Throws ||
|---|---|
|   | java.lang.IllegalArgumentException |
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` |   |

### AudioTrack

Added in [API level 9](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioTrack (int streamType, 
                int sampleRateInHz, 
                int channelConfig, 
                int audioFormat, 
                int bufferSizeInBytes, 
                int mode, 
                int sessionId)
```


**This constructor is deprecated.**   

use `https://developer.android.com/reference/android/media/AudioTrack.Builder` or
`https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(android.media.AudioAttributes,%20android.media.AudioFormat,%20int,%20int,%20int)` to specify the
`https://developer.android.com/reference/android/media/AudioAttributes` instead of the stream type which is only for volume control.

Class constructor with audio session. Use this constructor when the AudioTrack must be
attached to a particular audio session. The primary use of the audio session ID is to
associate audio effects to a particular instance of AudioTrack: if an audio session ID
is provided when creating an AudioEffect, this effect will be applied only to audio tracks
and media players in the same session and not to the output mix.
When an AudioTrack is created without specifying a session, it will create its own session
which can be retrieved by calling the `https://developer.android.com/reference/android/media/AudioTrack#getAudioSessionId()` method.
If a non-zero session ID is provided, this AudioTrack will share effects attached to this
session
with all other media players or audio tracks in the same session, otherwise a new session
will be created for this track if none is supplied.

<br />

| Parameters ||
|---|---|
| `streamType` | `int`: the type of the audio stream. See `https://developer.android.com/reference/android/media/AudioManager#STREAM_VOICE_CALL`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_SYSTEM`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_RING`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_MUSIC`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_ALARM`, and `https://developer.android.com/reference/android/media/AudioManager#STREAM_NOTIFICATION`. <br /> |
| `sampleRateInHz` | `int`: the initial source sample rate expressed in Hz. `https://developer.android.com/reference/android/media/AudioFormat#SAMPLE_RATE_UNSPECIFIED` means to use a route-dependent value which is usually the sample rate of the sink. <br /> |
| `channelConfig` | `int`: describes the configuration of the audio channels. See `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_MONO` and `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_STEREO` <br /> |
| `audioFormat` | `int`: the format in which the audio data is represented. See `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT` and `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_8BIT`, and `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_FLOAT`. <br /> |
| `bufferSizeInBytes` | `int`: the total size (in bytes) of the internal buffer where audio data is read from for playback. This should be a nonzero multiple of the frame size in bytes. If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`, this is the maximum length sample, or audio clip, that can be played by this instance. If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`, this should be the desired buffer size for the `AudioTrack` to satisfy the application's latency requirements. If `bufferSizeInBytes` is less than the minimum buffer size for the output sink, it is increased to the minimum buffer size. The method `https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()` returns the actual size in frames of the buffer created, which determines the minimum frequency to write to the streaming `AudioTrack` to avoid underrun. You can write data into this buffer in smaller chunks than this size. See `https://developer.android.com/reference/android/media/AudioTrack#getMinBufferSize(int,%20int,%20int)` to determine the estimated minimum buffer size for an AudioTrack instance in streaming mode. |
| `mode` | `int`: streaming or static buffer. See `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC` and `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` <br /> |
| `sessionId` | `int`: Id of audio session the AudioTrack must be attached to <br /> |

| Throws ||
|---|---|
|   | java.lang.IllegalArgumentException |
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` |   |

## Public methods

### addOnCodecFormatChangedListener

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void addOnCodecFormatChangedListener (Executor executor, 
                AudioTrack.OnCodecFormatChangedListener listener)
```

Adds an `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` to receive notifications of
codec format change events on this `AudioTrack`.

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: Specifies the `https://developer.android.com/reference/java/util/concurrent/Executor` object to control execution. This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `listener` | `AudioTrack.OnCodecFormatChangedListener`: The `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` interface to receive notifications of codec events. This value cannot be `null`. <br /> |

### addOnRoutingChangedListener

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void addOnRoutingChangedListener (AudioTrack.OnRoutingChangedListener listener, 
                Handler handler)
```


**This method was deprecated
in API level 24.**   

users should switch to the general purpose
`https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` class instead.

Adds an `https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener` to receive notifications of routing changes
on this AudioTrack.

<br />

| Parameters ||
|---|---|
| `listener` | `AudioTrack.OnRoutingChangedListener`: The `https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener` interface to receive notifications of rerouting events. <br /> |
| `handler` | `Handler`: Specifies the `https://developer.android.com/reference/android/os/Handler` object for the thread on which to execute the callback. If `null`, the `https://developer.android.com/reference/android/os/Handler` associated with the main `https://developer.android.com/reference/android/os/Looper` will be used. <br /> |

### addOnRoutingChangedListener

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void addOnRoutingChangedListener (AudioRouting.OnRoutingChangedListener listener, 
                Handler handler)
```

Adds an `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` to receive notifications of routing
changes on this AudioTrack.

<br />

| Parameters ||
|---|---|
| `listener` | `AudioRouting.OnRoutingChangedListener`: The `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` interface to receive notifications of rerouting events. <br /> |
| `handler` | `Handler`: Specifies the `https://developer.android.com/reference/android/os/Handler` object for the thread on which to execute the callback. If `null`, the `https://developer.android.com/reference/android/os/Handler` associated with the main `https://developer.android.com/reference/android/os/Looper` will be used. <br /> |

### attachAuxEffect

Added in [API level 9](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int attachAuxEffect (int effectId)
```

Attaches an auxiliary effect to the audio track. A typical auxiliary
effect is a reverberation effect which can be applied on any sound source
that directs a certain amount of its energy to this effect. This amount
is defined by `https://developer.android.com/reference/android/media/AudioTrack#setAuxEffectSendLevel(float)`.

After creating an auxiliary effect (e.g.
`https://developer.android.com/reference/android/media/audiofx/EnvironmentalReverb`), retrieve its ID with
`https://developer.android.com/reference/android/media/audiofx/AudioEffect#getId()` and use it when calling
this method to attach the audio track to the effect.

To detach the effect from the audio track, call this method with a
null effect id.

<br />

| Parameters ||
|---|---|
| `effectId` | `int`: system wide unique id of the effect to attach <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` <br /> |

### createVolumeShaper

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public VolumeShaper createVolumeShaper (VolumeShaper.Configuration configuration)
```

Returns a `https://developer.android.com/reference/android/media/VolumeShaper` object that can be used modify the volume envelope
of the player or track.

<br />

| Parameters ||
|---|---|
| `configuration` | `VolumeShaper.Configuration`: This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/VolumeShaper` | This value cannot be `null`. <br /> |

### flush

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void flush ()
```

Flushes the audio data currently queued for playback. Any data that has
been written but not yet presented will be discarded. No-op if not stopped or paused,
or if the track's creation mode is not `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`.

Note that although data written but not yet presented is discarded, there is no
guarantee that all of the buffer space formerly used by that data
is available for a subsequent write.
For example, a call to `https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int)` with `sizeInBytes`
less than or equal to the total buffer size
may return a short actual transfer count.

<br />

### flushWrittenFramesFromPosition

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public long flushWrittenFramesFromPosition (long positionInFrames, 
                int accuracy)
```

Flush all data from the given position.

If this operation returns successfully, `https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int)` after a call to this method will
be written from frame position returned by this method. The method
`https://developer.android.com/reference/android/media/AudioTrack#getWrittenFramesCount()` may be used to find the current frame position.

This method is only allowed in offload mode ((i.e. tracks created with
`https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)` set to `true`)). Applications can call
this function to flush data while it is actively playing.

Supporting this method relies on the device's capabilities. Call
`https://developer.android.com/reference/android/media/AudioTrack#getFlushWrittenFramesFromPositionSupport(android.media.AudioFormat,%20android.media.AudioAttributes)` to query how
this method is supported with the `https://developer.android.com/reference/android/media/AudioFormat` and `https://developer.android.com/reference/android/media/AudioAttributes` before
creating the AudioTrack. If `https://developer.android.com/reference/android/media/AudioTrack#getFlushWrittenFramesFromPositionSupport(android.media.AudioFormat,%20android.media.AudioAttributes)` returns
`0`, UnsupportedOperationException will be thrown.

When clients request to flush from a certain position, the audio system will return the
actual flushed position based on the requested position, the requested flush accuracy, and
how much it was able to discard. All data from the actual flushed position will be discarded.
When the stream is flushed, the stream end (if set by `https://developer.android.com/reference/android/media/AudioTrack#setOffloadEndOfStream()`) will
be reset.

The client must not write any data before this function returns. Otherwise, the data may
be corrupted. When the method returns successfully and the stream is active, the client must
write data immediately if little audio data remains, otherwise the playback may underrun.

<br />

| Parameters ||
|---|---|
| `positionInFrames` | `long`: the start point in frames to flush. The value must be between 0 and total written frames. <br /> |
| `accuracy` | `int`: the accuracy requirement when flushing. Use `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_BEST_EFFORT` to indicate flush as close as possible to the requested position. Use `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_EXACT` to indicate must flush from the requested position. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_BEST_EFFORT` - `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_EXACT` |

| Returns ||
|---|---|
| `long` | the actual flushed position. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if `accuracy` is not valid, or `positionInFrames` is negative. |
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if the AudioTrack is not initialized. |
| `https://developer.android.com/reference/java/lang/IllegalStateException` | when accuracy is specified as `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_FROM_ACCURACY_EXACT` but the requested position is not between the rendered position and the written position. Call `https://developer.android.com/reference/android/media/AudioTrack#getTimestamp(android.media.AudioTimestamp)` to query the rendered position and `https://developer.android.com/reference/android/media/AudioTrack#getWrittenFramesCount()` for the written position. |
| `https://developer.android.com/reference/java/lang/UnsupportedOperationException` | if this method is not supported. |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#getFlushWrittenFramesFromPositionSupport(android.media.AudioFormat,%20android.media.AudioAttributes)`

### getAudioAttributes

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioAttributes getAudioAttributes ()
```

Returns the `https://developer.android.com/reference/android/media/AudioAttributes` used in configuration.
If a `streamType` is used instead of an `AudioAttributes`
to configure the AudioTrack
(the use of `streamType` for configuration is deprecated),
then the `AudioAttributes`
equivalent to the `streamType` is returned.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/AudioAttributes` | The `AudioAttributes` used to configure the AudioTrack. This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | If the track is not initialized. |

### getAudioDescriptionMixLeveldB

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public float getAudioDescriptionMixLeveldB ()
```

Returns the Audio Description mix level in dB.

If Audio Description mixing is unavailable from the hardware device,
a value of `Float.NEGATIVE_INFINITY` is returned.

<br />

| Returns ||
|---|---|
| `float` | the current Audio Description Mix Level in dB. A value of `Float.NEGATIVE_INFINITY` means that the audio description is not mixed or the hardware is not available. This should reflect the **true** internal device mix level; hence the application might receive any floating value except `Float.NaN`. <br /> |

### getAudioFormat

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getAudioFormat ()
```

Returns the configured audio data encoding. See `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_8BIT`,
`https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT`, and `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_FLOAT`.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getAudioSessionId

Added in [API level 9](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getAudioSessionId ()
```

Returns the audio session ID.

<br />

| Returns ||
|---|---|
| `int` | the ID of the audio session this AudioTrack belongs to. <br /> |

### getBufferCapacityInFrames

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getBufferCapacityInFrames ()
```

Returns the maximum size of the `AudioTrack` buffer in frames.

If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`,
it is equal to the specified bufferSizeInBytes on construction, converted to frame units.
A static track's frame count will not change.

If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`,
it is greater than or equal to the specified bufferSizeInBytes converted to frame units.
For streaming tracks, this value may be rounded up to a larger value if needed by
the target output sink, and
if the track is subsequently routed to a different output sink, the
frame count may enlarge to accommodate.

If the `AudioTrack` encoding indicates compressed data,
e.g. `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_AC3`, then the frame count returned is
the size of the `AudioTrack` buffer in bytes.

See also `https://developer.android.com/reference/android/media/AudioManager#getProperty(java.lang.String)` for key
`https://developer.android.com/reference/android/media/AudioManager#PROPERTY_OUTPUT_FRAMES_PER_BUFFER`.

<br />

| Returns ||
|---|---|
| `int` | maximum size in frames of the `AudioTrack` buffer. Value is 0 or greater <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### getBufferSizeInFrames

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getBufferSizeInFrames ()
```

Returns the effective size of the `AudioTrack` buffer
that the application writes to.

This will be less than or equal to the result of
`https://developer.android.com/reference/android/media/AudioTrack#getBufferCapacityInFrames()`.
It will be equal if `https://developer.android.com/reference/android/media/AudioTrack#setBufferSizeInFrames(int)` has never been called.

If the track is subsequently routed to a different output sink, the buffer
size and capacity may enlarge to accommodate.

If the `AudioTrack` encoding indicates compressed data,
e.g. `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_AC3`, then the frame count returned is
the size of the `AudioTrack` buffer in bytes.

See also `https://developer.android.com/reference/android/media/AudioManager#getProperty(java.lang.String)` for key
`https://developer.android.com/reference/android/media/AudioManager#PROPERTY_OUTPUT_FRAMES_PER_BUFFER`.

<br />

| Returns ||
|---|---|
| `int` | current size in frames of the `AudioTrack` buffer. Value is 0 or greater <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### getChannelConfiguration

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getChannelConfiguration ()
```

Returns the configured channel position mask.

For example, refer to `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_MONO`,
`https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_STEREO`, `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_5POINT1`.
This method may return `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_INVALID` if
a channel index mask was used. Consider
`https://developer.android.com/reference/android/media/AudioTrack#getFormat()` instead, to obtain an `https://developer.android.com/reference/android/media/AudioFormat`,
which contains both the channel position mask and the channel index mask.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getChannelCount

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getChannelCount ()
```

Returns the configured number of channels.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getCodecProvenance

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public String getCodecProvenance ()
```

Returns the codec provenance of the `AudioTrack` specified at
the time of configuration.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/lang/String` | a media type of the audio codec or an empty string if the codec provenance is not set. This value cannot be `null`. <br /> |

### getDualMonoMode

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getDualMonoMode ()
```

Returns the Dual Mono mode presentation setting.

If no Dual Mono presentation is available for the output device,
then `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_OFF` is returned.

<br />

| Returns ||
|---|---|
| `int` | one of `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_OFF`, `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LR`, `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LL`, `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_RR`. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_OFF` - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LR` - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LL` - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_RR` |

### getFlushWrittenFramesFromPositionSupport

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static int getFlushWrittenFramesFromPositionSupport (AudioFormat format, 
                AudioAttributes attributes)
```

Returns a bit mask representing the current feature support for
`https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` for the AudioTrack in offload mode
that is created with the given `https://developer.android.com/reference/android/media/AudioFormat` and `https://developer.android.com/reference/android/media/AudioAttributes`.

<br />

| Parameters ||
|---|---|
| `format` | `AudioFormat`: the AudioFormat to create AudioTrack. This value cannot be `null`. <br /> |
| `attributes` | `AudioAttributes`: the AudioAttributes to create AudioTrack. This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `int` | a bitmask representing the `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` support level. If `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` is not supported, `0` is returned. Value is either `0` or - `https://developer.android.com/reference/android/media/AudioTrack#FLUSH_WRITTEN_FRAMES_SUPPORTED` |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`

### getFormat

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioFormat getFormat ()
```

Returns the configured `AudioTrack` format.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/AudioFormat` | an `https://developer.android.com/reference/android/media/AudioFormat` containing the `AudioTrack` parameters at the time of configuration. This value cannot be `null`. <br /> |

### getLogSessionId

Added in [API level 31](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public LogSessionId getLogSessionId ()
```

Returns the `https://developer.android.com/reference/android/media/metrics/LogSessionId`.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/metrics/LogSessionId` | This value cannot be `null`. <br /> |

### getMaxVolume

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static float getMaxVolume ()
```

Returns the maximum gain value, which is greater than or equal to 1.0.
Gain values greater than the maximum will be clamped to the maximum.

The word "volume" in the API name is historical; this is actually a gain.
expressed as a linear multiplier on sample values, where a maximum value of 1.0
corresponds to a gain of 0 dB (sample values left unmodified).

<br />

| Returns ||
|---|---|
| `float` | the maximum value, which is greater than or equal to 1.0. <br /> |

### getMetrics

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public PersistableBundle getMetrics ()
```

Return Metrics data about the current AudioTrack instance.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/os/PersistableBundle` | a `https://developer.android.com/reference/android/os/PersistableBundle` containing the set of attributes and values available for the media being handled by this instance of AudioTrack The attributes are descibed in `https://developer.android.com/reference/android/media/AudioTrack.MetricsConstants`. Additional vendor-specific fields may also be present in the return value. <br /> |

### getMinBufferSize

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static int getMinBufferSize (int sampleRateInHz, 
                int channelConfig, 
                int audioFormat)
```

Returns the estimated minimum buffer size required for an AudioTrack
object to be created in the `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` mode.
The size is an estimate because it does not consider either the route or the sink,
since neither is known yet. Note that this size doesn't
guarantee a smooth playback under load, and higher values should be chosen according to
the expected frequency at which the buffer will be refilled with additional data to play.
For example, if you intend to dynamically set the source sample rate of an AudioTrack
to a higher value than the initial source sample rate, be sure to configure the buffer size
based on the highest planned sample rate.

<br />

| Parameters ||
|---|---|
| `sampleRateInHz` | `int`: the source sample rate expressed in Hz. `https://developer.android.com/reference/android/media/AudioFormat#SAMPLE_RATE_UNSPECIFIED` is not permitted. <br /> |
| `channelConfig` | `int`: describes the configuration of the audio channels. See `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_MONO` and `https://developer.android.com/reference/android/media/AudioFormat#CHANNEL_OUT_STEREO` <br /> |
| `audioFormat` | `int`: the format in which the audio data is represented. See `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT` and `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_8BIT`, and `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_FLOAT`. <br /> |

| Returns ||
|---|---|
| `int` | `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if an invalid parameter was passed, or `https://developer.android.com/reference/android/media/AudioTrack#ERROR` if unable to query for output properties, or the minimum buffer size expressed in bytes. <br /> |

### getMinVolume

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static float getMinVolume ()
```

Returns the minimum gain value, which is the constant 0.0.
Gain values less than 0.0 will be clamped to 0.0.

The word "volume" in the API name is historical; this is actually a linear gain.

<br />

| Returns ||
|---|---|
| `float` | the minimum value, which is the constant 0.0. <br /> |

### getNativeOutputSampleRate

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static int getNativeOutputSampleRate (int streamType)
```

Returns the output sample rate in Hz for the specified stream type.

<br />

| Parameters ||
|---|---|
| `streamType` | `int` <br /> |

| Returns ||
|---|---|
| `int` | <br /> |

### getNotificationMarkerPosition

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getNotificationMarkerPosition ()
```

Returns marker position expressed in frames.

<br />

| Returns ||
|---|---|
| `int` | marker position in wrapping frame units similar to `https://developer.android.com/reference/android/media/AudioTrack#getPlaybackHeadPosition()`, or zero if marker is disabled. <br /> |

### getOffloadDelay

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getOffloadDelay ()
```

Return the decoder delay of an offloaded track, expressed in frames, previously set with
`https://developer.android.com/reference/android/media/AudioTrack#setOffloadDelayPadding(int,%20int)`, or 0 if it was never modified.

This delay indicates the number of frames to be ignored at the beginning of the stream.
This value can only be queried on a track successfully initialized with
`https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)`.

<br />

| Returns ||
|---|---|
| `int` | decoder delay expressed in frames. Value is 0 or greater <br /> |

### getOffloadPadding

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getOffloadPadding ()
```

Return the decoder padding of an offloaded track, expressed in frames, previously set with
`https://developer.android.com/reference/android/media/AudioTrack#setOffloadDelayPadding(int,%20int)`, or 0 if it was never modified.

This padding indicates the number of frames to be ignored at the end of the stream.
This value can only be queried on a track successfully initialized with
`https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)`.

<br />

| Returns ||
|---|---|
| `int` | decoder padding expressed in frames. Value is 0 or greater <br /> |

### getPerformanceMode

Added in [API level 26](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getPerformanceMode ()
```

Returns the current performance mode of the `https://developer.android.com/reference/android/media/AudioTrack`.

<br />

| Returns ||
|---|---|
| `int` | one of `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_NONE`, `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_LOW_LATENCY`, or `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_POWER_SAVING`. Use `https://developer.android.com/reference/android/media/AudioTrack.Builder#setPerformanceMode(int)` in the `https://developer.android.com/reference/android/media/AudioTrack.Builder` to enable a performance mode. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_NONE` - `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_LOW_LATENCY` - `https://developer.android.com/reference/android/media/AudioTrack#PERFORMANCE_MODE_POWER_SAVING` |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### getPlayState

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getPlayState ()
```

Returns the playback state of the AudioTrack instance.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_STOPPED`
- `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_PAUSED`
- `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_PLAYING`

### getPlaybackHeadPosition

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getPlaybackHeadPosition ()
```

Returns the playback head position expressed in frames.
Though the "int" type is signed 32-bits, the value should be reinterpreted as if it is
unsigned 32-bits. That is, the next position after 0x7FFFFFFF is (int) 0x80000000.
This is a continuously advancing counter. It will wrap (overflow) periodically,
for example approximately once every 27:03:11 hours:minutes:seconds at 44.1 kHz.
It is reset to zero by `https://developer.android.com/reference/android/media/AudioTrack#flush()`, `https://developer.android.com/reference/android/media/AudioTrack#reloadStaticData()`, and `https://developer.android.com/reference/android/media/AudioTrack#stop()`.
If the track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`, the return value indicates
the total number of frames played since reset,
*not* the current offset within the buffer.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getPlaybackParams

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public PlaybackParams getPlaybackParams ()
```

Returns the current playback parameters.
See `https://developer.android.com/reference/android/media/AudioTrack#setPlaybackParams(android.media.PlaybackParams)` to set playback parameters

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/PlaybackParams` | current `https://developer.android.com/reference/android/media/PlaybackParams`. This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### getPlaybackRate

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getPlaybackRate ()
```

Returns the current playback sample rate rate in Hz.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getPositionNotificationPeriod

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getPositionNotificationPeriod ()
```

Returns the notification update period expressed in frames.
Zero means that no position update notifications are being delivered.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getPreferredDevice

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioDeviceInfo getPreferredDevice ()
```

Returns the selected output specified by `https://developer.android.com/reference/android/media/AudioTrack#setPreferredDevice(android.media.AudioDeviceInfo)`. Note that this
is not guaranteed to correspond to the actual device being used for playback.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/AudioDeviceInfo` | <br /> |

### getRoutedDevice

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public AudioDeviceInfo getRoutedDevice ()
```

Returns an `https://developer.android.com/reference/android/media/AudioDeviceInfo` identifying the current routing of this AudioTrack.
Note: The query is only valid if the AudioTrack is currently playing. If it is not,
`getRoutedDevice()` will return null.
Audio may play on multiple devices simultaneously (e.g. an alarm playing on headphones and
speaker on a phone), so prefer using `https://developer.android.com/reference/android/media/AudioTrack#getRoutedDevices()`.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/android/media/AudioDeviceInfo` | <br /> |

### getRoutedDevices

Added in [API level 36](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public List<AudioDeviceInfo> getRoutedDevices ()
```

Returns a List of `https://developer.android.com/reference/android/media/AudioDeviceInfo` identifying the current routing of this
AudioTrack.
Note: The query is only valid if the AudioTrack is currently playing. If it is not,
`getRoutedDevices()` will return an empty list.

<br />

| Returns ||
|---|---|
| `https://developer.android.com/reference/java/util/List<https://developer.android.com/reference/android/media/AudioDeviceInfo>` | This value cannot be `null`. <br /> |

### getSampleRate

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getSampleRate ()
```

Returns the configured audio source sample rate in Hz.
The initial source sample rate depends on the constructor parameters,
but the source sample rate may change if `https://developer.android.com/reference/android/media/AudioTrack#setPlaybackRate(int)` is called.
If the constructor had a specific sample rate, then the initial sink sample rate is that
value.
If the constructor had `https://developer.android.com/reference/android/media/AudioFormat#SAMPLE_RATE_UNSPECIFIED`,
then the initial sink sample rate is a route-dependent default value based on the source \[sic\].

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getStartThresholdInFrames

Added in [API level 31](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getStartThresholdInFrames ()
```

Returns the streaming start threshold of the `AudioTrack`.

The streaming start threshold is the buffer level that the written audio
data must reach for audio streaming to start after `https://developer.android.com/reference/android/media/AudioTrack#play()` is called.
When an `AudioTrack` is created, the streaming start threshold
is the buffer capacity in frames. If the buffer size in frames is reduced
by `https://developer.android.com/reference/android/media/AudioTrack#setBufferSizeInFrames(int)` to a value smaller than the start threshold
then that value will be used instead for the streaming start threshold.

For compressed streams, the size of a frame is considered to be exactly one byte.

<br />

| Returns ||
|---|---|
| `int` | the current start threshold in frames value. This is an integer between 1 to the buffer capacity (see `https://developer.android.com/reference/android/media/AudioTrack#getBufferCapacityInFrames()`), and might change if the output sink changes after track creation. Value is 1 or greater <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if the track is not initialized or the track is not `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`. |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#setStartThresholdInFrames(int)`

### getState

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getState ()
```

Returns the state of the AudioTrack instance. This is useful after the
AudioTrack instance has been created to check if it was initialized
properly. This ensures that the appropriate resources have been acquired.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#STATE_UNINITIALIZED`
- `https://developer.android.com/reference/android/media/AudioTrack#STATE_INITIALIZED`
- `https://developer.android.com/reference/android/media/AudioTrack#STATE_NO_STATIC_DATA`

### getStreamType

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getStreamType ()
```

Returns the volume stream type of this AudioTrack.
Compare the result against `https://developer.android.com/reference/android/media/AudioManager#STREAM_VOICE_CALL`,
`https://developer.android.com/reference/android/media/AudioManager#STREAM_SYSTEM`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_RING`,
`https://developer.android.com/reference/android/media/AudioManager#STREAM_MUSIC`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_ALARM`,
`https://developer.android.com/reference/android/media/AudioManager#STREAM_NOTIFICATION`, `https://developer.android.com/reference/android/media/AudioManager#STREAM_DTMF` or
`https://developer.android.com/reference/android/media/AudioManager#STREAM_ACCESSIBILITY`.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getTimestamp

Added in [API level 19](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean getTimestamp (AudioTimestamp timestamp)
```

Poll for a timestamp on demand.


If you need to track timestamps during initial warmup or after a routing or mode change,
you should request a new timestamp periodically until the reported timestamps
show that the frame position is advancing, or until it becomes clear that
timestamps are unavailable for this route.


After the clock is advancing at a stable rate,
query for a new timestamp approximately once every 10 seconds to once per minute.
Calling this method more often is inefficient.
It is also counter-productive to call this method more often than recommended,
because the short-term differences between successive timestamp reports are not meaningful.
If you need a high-resolution mapping between frame position and presentation time,
consider implementing that at application level, based on low-resolution timestamps.


The audio data at the returned position may either already have been
presented, or may have not yet been presented but is committed to be presented.
It is not possible to request the time corresponding to a particular position,
or to request the (fractional) position corresponding to a particular time.
If you need such features, consider implementing them at application level.

<br />

| Parameters ||
|---|---|
| `timestamp` | `AudioTimestamp`: a reference to a non-null AudioTimestamp instance allocated and owned by caller. <br /> |

| Returns ||
|---|---|
| `boolean` | true if a timestamp is available, or false if no timestamp is available. If a timestamp is available, the AudioTimestamp instance is filled in with a position in frame units, together with the estimated time when that frame was presented or is committed to be presented. In the case that no timestamp is available, any supplied instance is left unaltered. A timestamp may be temporarily unavailable while the audio clock is stabilizing, or during and immediately after a route change. A timestamp is permanently unavailable for a given route if the route does not support timestamps. In this case, the approximate frame position can be obtained using `https://developer.android.com/reference/android/media/AudioTrack#getPlaybackHeadPosition()`. However, it may be useful to continue to query for timestamps occasionally, to recover after a route change. <br /> |

### getUnderrunCount

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int getUnderrunCount ()
```

Returns the number of underrun occurrences in the application-level write buffer
since the AudioTrack was created.
An underrun occurs if the application does not write audio
data quickly enough, causing the buffer to underflow
and a potential audio glitch or pop.


Underruns are less likely when buffer sizes are large.
It may be possible to eliminate underruns by recreating the AudioTrack with
a larger buffer.
Or by using `https://developer.android.com/reference/android/media/AudioTrack#setBufferSizeInFrames(int)` to dynamically increase the
effective size of the buffer.

<br />

| Returns ||
|---|---|
| `int` | <br /> |

### getWrittenFramesCount

Added in [API level 37](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public long getWrittenFramesCount ()
```

Returns the number of audio frames written to a `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` `https://developer.android.com/reference/android/media/AudioTrack`.

The counter starts from zero and is incremented for every successful
`https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int)` call to a `MODE_STREAM` `AudioTrack`,
and is set to the return value of a successful
`https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)` call.
This counter is not reset when the track is flushed by `https://developer.android.com/reference/android/media/AudioTrack#flush()`,
stopped by `https://developer.android.com/reference/android/media/AudioTrack#stop()`, or paused by `https://developer.android.com/reference/android/media/AudioTrack#pause()`.

The frames returned by this method represents the current frame position
for `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`.
It does not represent the actual frames rendered.

<br />

| Returns ||
|---|---|
| `long` | the number of frames written. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if the track is not initialized or called on a `MODE_STATIC` `AudioTrack`. |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#flushWrittenFramesFromPosition(long,%20int)`

### isDirectPlaybackSupported

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
33](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public static boolean isDirectPlaybackSupported (AudioFormat format, 
                AudioAttributes attributes)
```


**This method was deprecated
in API level 33.**   

Use `https://developer.android.com/reference/android/media/AudioManager#getDirectPlaybackSupport(android.media.AudioFormat,%20android.media.AudioAttributes)`
instead.

Returns whether direct playback of an audio format with the provided attributes is
currently supported on the system.

Direct playback means that the audio stream is not resampled or downmixed
by the framework. Checking for direct support can help the app select the representation
of audio content that most closely matches the capabilities of the device and peripherials
(e.g. A/V receiver) connected to it. Note that the provided stream can still be re-encoded
or mixed with other streams, if needed.

Also note that this query only provides information about the support of an audio format.
It does not indicate whether the resources necessary for the playback are available
at that instant.

<br />

| Parameters ||
|---|---|
| `format` | `AudioFormat`: a non-null `https://developer.android.com/reference/android/media/AudioFormat` instance describing the format of the audio data. <br /> |
| `attributes` | `AudioAttributes`: a non-null `https://developer.android.com/reference/android/media/AudioAttributes` instance. <br /> |

| Returns ||
|---|---|
| `boolean` | true if the given audio format can be played directly. <br /> |

### isOffloadedPlayback

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean isOffloadedPlayback ()
```

Returns whether the track was built with `https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)` set
to `true`.

<br />

| Returns ||
|---|---|
| `boolean` | true if the track is using offloaded playback. <br /> |

### pause

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void pause ()
```

Pauses the playback of the audio data. Data that has not been played
back will not be discarded. Subsequent calls to `https://developer.android.com/reference/android/media/AudioTrack#play()` will play
this data back. See `https://developer.android.com/reference/android/media/AudioTrack#flush()` to discard this data.

<br />

| Throws ||
|---|---|
|   | java.lang.IllegalStateException |
| `https://developer.android.com/reference/java/lang/IllegalStateException` |   |

### play

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void play ()
```

Starts playing an AudioTrack.


If track's creation mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`, you must have called one of
the write methods (`https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int,%20int)`,
`https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int)`, `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)`,
`https://developer.android.com/reference/android/media/AudioTrack#write(float[],%20int,%20int,%20int)`, or `https://developer.android.com/reference/android/media/AudioTrack#write(java.nio.ByteBuffer,%20int,%20int)`) prior to
play().


If the mode is `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`, you can optionally prime the data path prior to
calling play(), by writing up to `bufferSizeInBytes` (from constructor).
If you don't call write() first, or if you call write() but with an insufficient amount of
data, then the track will be in underrun state at play(). In this case,
playback will not actually start playing until the data path is filled to a
device-specific minimum level. This requirement for the path to be filled
to a minimum level is also true when resuming audio playback after calling stop().
Similarly the buffer will need to be filled up again after
the track underruns due to failure to call write() in a timely manner with sufficient data.
For portability, an application should prime the data path to the maximum allowed
by writing data until the write() method returns a short transfer count.
This allows play() to start immediately, and reduces the chance of underrun.


As of `https://developer.android.com/reference/android/os/Build.VERSION_CODES#S` the minimum level to start playing
can be obtained using `https://developer.android.com/reference/android/media/AudioTrack#getStartThresholdInFrames()` and set with
`https://developer.android.com/reference/android/media/AudioTrack#setStartThresholdInFrames(int)`.

<br />

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if the track isn't properly initialized |

### registerStreamEventCallback

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void registerStreamEventCallback (Executor executor, 
                AudioTrack.StreamEventCallback eventCallback)
```

Registers a callback for the notification of stream events.
This callback can only be registered for instances operating in offloaded mode
(see `https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)` and
`https://developer.android.com/reference/android/media/AudioManager#isOffloadedPlaybackSupported(android.media.AudioFormat,%20android.media.AudioAttributes)` for
more details).

<br />

| Parameters ||
|---|---|
| `executor` | `Executor`: `https://developer.android.com/reference/java/util/concurrent/Executor` to handle the callbacks. This value cannot be `null`. Callback and listener events are dispatched through this `https://developer.android.com/reference/java/util/concurrent/Executor`, providing an easy way to control which thread is used. To dispatch events through the main thread of your application, you can use `https://developer.android.com/reference/android/content/Context#getMainExecutor()`. Otherwise, provide an `https://developer.android.com/reference/java/util/concurrent/Executor` that dispatches to an appropriate thread. <br /> |
| `eventCallback` | `AudioTrack.StreamEventCallback`: the callback to receive the stream event notifications. This value cannot be `null`. <br /> |

### release

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void release ()
```

Releases the native AudioTrack resources.

<br />

### reloadStaticData

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int reloadStaticData ()
```

Sets the playback head position within the static buffer to zero,
that is it rewinds to start of static buffer.
The track must be stopped or paused, and
the track's creation mode must be `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC`.


As of `https://developer.android.com/reference/android/os/Build.VERSION_CODES#M`, also resets the value returned by
`https://developer.android.com/reference/android/media/AudioTrack#getPlaybackHeadPosition()` to zero.
For earlier API levels, the reset behavior is unspecified.


Use `https://developer.android.com/reference/android/media/AudioTrack#setPlaybackHeadPosition(int)` with a zero position
if the reset of `getPlaybackHeadPosition()` is not needed.

<br />

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### removeOnCodecFormatChangedListener

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void removeOnCodecFormatChangedListener (AudioTrack.OnCodecFormatChangedListener listener)
```

Removes an `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` which has been previously added
to receive codec format change events.

<br />

| Parameters ||
|---|---|
| `listener` | `AudioTrack.OnCodecFormatChangedListener`: The previously added `https://developer.android.com/reference/android/media/AudioTrack.OnCodecFormatChangedListener` interface to remove. This value cannot be `null`. <br /> |

### removeOnRoutingChangedListener

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void removeOnRoutingChangedListener (AudioTrack.OnRoutingChangedListener listener)
```


**This method was deprecated
in API level 24.**   

users should switch to the general purpose
`https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` class instead.

Removes an `https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener` which has been previously added
to receive rerouting notifications.

<br />

| Parameters ||
|---|---|
| `listener` | `AudioTrack.OnRoutingChangedListener`: The previously added `https://developer.android.com/reference/android/media/AudioTrack.OnRoutingChangedListener` interface to remove. <br /> |

### removeOnRoutingChangedListener

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void removeOnRoutingChangedListener (AudioRouting.OnRoutingChangedListener listener)
```

Removes an `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` which has been previously added
to receive rerouting notifications.

<br />

| Parameters ||
|---|---|
| `listener` | `AudioRouting.OnRoutingChangedListener`: The previously added `https://developer.android.com/reference/android/media/AudioRouting.OnRoutingChangedListener` interface to remove. <br /> |

### setAudioDescriptionMixLeveldB

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean setAudioDescriptionMixLeveldB (float level)
```

Sets the Audio Description mix level in dB.

For AudioTracks incorporating a secondary Audio Description stream
(where such contents may be sent through an Encapsulation Mode
other than `https://developer.android.com/reference/android/media/AudioTrack#ENCAPSULATION_MODE_NONE`).
or internally by a HW channel),
the level of mixing of the Audio Description to the Main Audio stream
is controlled by this method.

Such mixing occurs **prior** to overall volume scaling.

<br />

| Parameters ||
|---|---|
| `level` | `float`: a floating point value between `Float.NEGATIVE_INFINITY` to `+48.f`, where `Float.NEGATIVE_INFINITY` means the Audio Description is not mixed and a level of `0.f` means the Audio Description is mixed without scaling. Value is 48.0f or less <br /> |

| Returns ||
|---|---|
| `boolean` | true on success, false on failure. <br /> |

### setAuxEffectSendLevel

Added in [API level 9](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setAuxEffectSendLevel (float level)
```

Sets the send level of the audio track to the attached auxiliary effect
`https://developer.android.com/reference/android/media/AudioTrack#attachAuxEffect(int)`. Effect levels
are clamped to the closed interval \[0.0, max\] where
max is the value of `https://developer.android.com/reference/android/media/AudioTrack#getMaxVolume()`.
A value of 0.0 results in no effect, and a value of 1.0 is full send.

By default the send level is 0.0f, so even if an effect is attached to the player
this method must be called for the effect to be applied.

Note that the passed level value is a linear scalar. UI controls should be scaled
logarithmically: the gain applied by audio framework ranges from -72dB to at least 0dB,
so an appropriate conversion from linear UI input x to level is:
x == 0 -\> level = 0
0 \< x \<= R -\> level = 10\^(72\*(x-R)/20/R)

<br />

| Parameters ||
|---|---|
| `level` | `float`: linear send level. Value is 0.0f or greater <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR` <br /> |

### setBufferSizeInFrames

Added in [API level 24](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setBufferSizeInFrames (int bufferSizeInFrames)
```

Limits the effective size of the `AudioTrack` buffer
that the application writes to.

A write to this AudioTrack will not fill the buffer beyond this limit.
If a blocking write is used then the write will block until the data
can fit within this limit.

Changing this limit modifies the latency associated with
the buffer for this track. A smaller size will give lower latency
but there may be more glitches due to buffer underruns.

The actual size used may not be equal to this requested size.
It will be limited to a valid range with a maximum of
`https://developer.android.com/reference/android/media/AudioTrack#getBufferCapacityInFrames()`.
It may also be adjusted slightly for internal reasons.
If bufferSizeInFrames is less than zero then `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`
will be returned.

This method is supported for PCM audio at all API levels.
Compressed audio is supported in API levels 33 and above.
For compressed streams the size of a frame is considered to be exactly one byte.

<br />

| Parameters ||
|---|---|
| `bufferSizeInFrames` | `int`: requested buffer size in frames. Value is 0 or greater <br /> |

| Returns ||
|---|---|
| `int` | the actual buffer size in frames or an error code, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### setDualMonoMode

Added in [API level 30](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean setDualMonoMode (int dualMonoMode)
```

Sets the Dual Mono mode presentation on the output device.

The Dual Mono mode is generally applied to stereo audio streams
where the left and right channels come from separate sources.

For compressed audio, where the decoding is done in hardware,
Dual Mono presentation needs to be performed
by the hardware output device
as the PCM audio is not available to the framework.

<br />

| Parameters ||
|---|---|
| `dualMonoMode` | `int`: one of `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_OFF`, `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LR`, `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LL`, `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_RR`. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_OFF` - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LR` - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_LL` - `https://developer.android.com/reference/android/media/AudioTrack#DUAL_MONO_MODE_RR` |

| Returns ||
|---|---|
| `boolean` | true on success, false on failure if the output device does not support Dual Mono mode. <br /> |

### setLogSessionId

Added in [API level 31](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setLogSessionId (LogSessionId logSessionId)
```

Sets a `https://developer.android.com/reference/android/media/metrics/LogSessionId` instance to this AudioTrack for metrics collection.

<br />

| Parameters ||
|---|---|
| `logSessionId` | `LogSessionId`: a `https://developer.android.com/reference/android/media/metrics/LogSessionId` instance which is used to identify this object to the metrics service. Proper generated Ids must be obtained from the Java metrics service and should be considered opaque. Use `https://developer.android.com/reference/android/media/metrics/LogSessionId#LOG_SESSION_ID_NONE` to remove the logSessionId association. This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if AudioTrack not initialized. |

### setLoopPoints

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setLoopPoints (int startInFrames, 
                int endInFrames, 
                int loopCount)
```

Sets the loop points and the loop count. The loop can be infinite.
Similarly to setPlaybackHeadPosition,
the track must be stopped or paused for the loop points to be changed,
and must use the `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC` mode.

<br />

| Parameters ||
|---|---|
| `startInFrames` | `int`: loop start marker expressed in frames. Zero corresponds to start of buffer. The start marker must not be greater than or equal to the buffer size in frames, or negative. Value is 0 or greater <br /> |
| `endInFrames` | `int`: loop end marker expressed in frames. The total buffer size in frames corresponds to end of buffer. The end marker must not be greater than the buffer size in frames. For looping, the end marker must not be less than or equal to the start marker, but to disable looping it is permitted for start marker, end marker, and loop count to all be 0. If any input parameters are out of range, this method returns `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`. If the loop period (endInFrames - startInFrames) is too small for the implementation to support, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` is returned. The loop range is the interval \[startInFrames, endInFrames). As of `https://developer.android.com/reference/android/os/Build.VERSION_CODES#M`, the position is left unchanged, unless it is greater than or equal to the loop end marker, in which case it is forced to the loop start marker. For earlier API levels, the effect on position is unspecified. Value is 0 or greater <br /> |
| `loopCount` | `int`: the number of times the loop is looped; must be greater than or equal to -1. A value of -1 means infinite looping, and 0 disables looping. A value of positive N means to "loop" (go back) N times. For example, a value of one means to play the region two times in total. Value is -1 or greater <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### setNotificationMarkerPosition

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setNotificationMarkerPosition (int markerInFrames)
```

Sets the position of the notification marker. At most one marker can be active.

<br />

| Parameters ||
|---|---|
| `markerInFrames` | `int`: marker position in wrapping frame units similar to `https://developer.android.com/reference/android/media/AudioTrack#getPlaybackHeadPosition()`, or zero to disable the marker. To set a marker at a position which would appear as zero due to wraparound, a workaround is to use a non-zero position near zero, such as -1 or 1. <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### setOffloadDelayPadding

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setOffloadDelayPadding (int delayInFrames, 
                int paddingInFrames)
```

Configures the delay and padding values for the current compressed stream playing
in offload mode.
This can only be used on a track successfully initialized with
`https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)`. The unit is frames, where a
frame indicates the number of samples per channel, e.g. 100 frames for a stereo compressed
stream corresponds to 200 decoded interleaved PCM samples.

<br />

| Parameters ||
|---|---|
| `delayInFrames` | `int`: number of frames to be ignored at the beginning of the stream. A value of 0 indicates no delay is to be applied. Value is 0 or greater <br /> |
| `paddingInFrames` | `int`: number of frames to be ignored at the end of the stream. A value of 0 of 0 indicates no padding is to be applied. Value is 0 or greater <br /> |

### setOffloadEndOfStream

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setOffloadEndOfStream ()
```

Declares that the last write() operation on this track provided the last buffer of this
stream.
After the end of stream, previously set padding and delay values are ignored.
Can only be called only if the AudioTrack is opened in offload mode
see `https://developer.android.com/reference/android/media/AudioTrack.Builder#setOffloadedPlayback(boolean)`.
Can only be called only if the AudioTrack is in state `https://developer.android.com/reference/android/media/AudioTrack#PLAYSTATE_PLAYING`;
see `https://developer.android.com/reference/android/media/AudioTrack#getPlayState()`.
Use this method in the same thread as any write() operation.

<br />

### setPlaybackHeadPosition

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setPlaybackHeadPosition (int positionInFrames)
```

Sets the playback head position within the static buffer.
The track must be stopped or paused for the position to be changed,
and must use the `https://developer.android.com/reference/android/media/AudioTrack#MODE_STATIC` mode.

<br />

| Parameters ||
|---|---|
| `positionInFrames` | `int`: playback head position within buffer, expressed in frames. Zero corresponds to start of buffer. The position must not be greater than the buffer size in frames, or negative. Though this method and `https://developer.android.com/reference/android/media/AudioTrack#getPlaybackHeadPosition()` have similar names, the position values have different meanings. If looping is currently enabled and the new position is greater than or equal to the loop end marker, the behavior varies by API level: as of `https://developer.android.com/reference/android/os/Build.VERSION_CODES#M`, the looping is first disabled and then the position is set. For earlier API levels, the behavior is unspecified. Value is 0 or greater <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### setPlaybackParams

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setPlaybackParams (PlaybackParams params)
```

Sets the playback parameters.
This method returns failure if it cannot apply the playback parameters.
One possible cause is that the parameters for speed or pitch are out of range.
Another possible cause is that the `AudioTrack` is streaming
(see `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`) and the
buffer size is too small. For speeds greater than 1.0f, the `AudioTrack` buffer
on configuration must be larger than the speed multiplied by the minimum size
`https://developer.android.com/reference/android/media/AudioTrack#getMinBufferSize(int,%20int,%20int)`) to allow proper playback.

<br />

| Parameters ||
|---|---|
| `params` | `PlaybackParams`: see `https://developer.android.com/reference/android/media/PlaybackParams`. In particular, speed, pitch, and audio mode should be set. This value cannot be `null`. <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if the parameters are invalid or not accepted. |
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### setPlaybackPositionUpdateListener

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setPlaybackPositionUpdateListener (AudioTrack.OnPlaybackPositionUpdateListener listener, 
                Handler handler)
```

Sets the listener the AudioTrack notifies when a previously set marker is reached or
for each periodic playback head position update.
Use this method to receive AudioTrack events in the Handler associated with another
thread than the one in which you created the AudioTrack instance.

<br />

| Parameters ||
|---|---|
| `handler` | `Handler`: the Handler that will receive the event notification messages. <br /> |

### setPlaybackPositionUpdateListener

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void setPlaybackPositionUpdateListener (AudioTrack.OnPlaybackPositionUpdateListener listener)
```

Sets the listener the AudioTrack notifies when a previously set marker is reached or
for each periodic playback head position update.
Notifications will be received in the same thread as the one in which the AudioTrack
instance was created.

<br />

### setPlaybackRate

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setPlaybackRate (int sampleRateInHz)
```

Sets the playback sample rate for this track. This sets the sampling rate at which
the audio data will be consumed and played back
(as set by the sampleRateInHz parameter in the
`https://developer.android.com/reference/android/media/AudioTrack#AudioTrack(int,%20int,%20int,%20int,%20int,%20int)` constructor),
not the original sampling rate of the
content. For example, setting it to half the sample rate of the content will cause the
playback to last twice as long, but will also result in a pitch shift down by one octave.
The valid sample rate range is from 1 Hz to twice the value returned by
`https://developer.android.com/reference/android/media/AudioTrack#getNativeOutputSampleRate(int)`.
Use `https://developer.android.com/reference/android/media/AudioTrack#setPlaybackParams(android.media.PlaybackParams)` for speed control.

This method may also be used to repurpose an existing `AudioTrack`
for playback of content of differing sample rate,
but with identical encoding and channel mask.

<br />

| Parameters ||
|---|---|
| `sampleRateInHz` | `int`: the sample rate expressed in Hz <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### setPositionNotificationPeriod

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setPositionNotificationPeriod (int periodInFrames)
```

Sets the period for the periodic notification event.

<br />

| Parameters ||
|---|---|
| `periodInFrames` | `int`: update period expressed in frames. Zero period means no position updates. A negative period is not allowed. <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### setPreferredDevice

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public boolean setPreferredDevice (AudioDeviceInfo deviceInfo)
```

Specifies an audio device (via an `https://developer.android.com/reference/android/media/AudioDeviceInfo` object) to route
the output from this AudioTrack.

<br />

| Parameters ||
|---|---|
| `deviceInfo` | `AudioDeviceInfo`: The `https://developer.android.com/reference/android/media/AudioDeviceInfo` specifying the audio sink. If deviceInfo is null, default routing is restored. <br /> |

| Returns ||
|---|---|
| `boolean` | true if succesful, false if the specified `https://developer.android.com/reference/android/media/AudioDeviceInfo` is non-null and does not correspond to a valid audio output device. <br /> |

### setPresentation

Added in [API level 28](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setPresentation (AudioPresentation presentation)
```

Sets the audio presentation.
If the audio presentation is invalid then `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` will be returned.
If a multi-stream decoder (MSD) is not present, or the format does not support
multiple presentations, then `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` will be returned.
`https://developer.android.com/reference/android/media/AudioTrack#ERROR` is returned in case of any other error.

<br />

| Parameters ||
|---|---|
| `presentation` | `AudioPresentation`: see `https://developer.android.com/reference/android/media/AudioPresentation`. In particular, id should be set. This value cannot be `null`. <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if the audio presentation is null. |
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if track is not initialized. |

### setStartThresholdInFrames

Added in [API level 31](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setStartThresholdInFrames (int startThresholdInFrames)
```

Sets the streaming start threshold for an `AudioTrack`.

The streaming start threshold is the buffer level that the written audio
data must reach for audio streaming to start after `https://developer.android.com/reference/android/media/AudioTrack#play()` is called.

For compressed streams, the size of a frame is considered to be exactly one byte.

<br />

| Parameters ||
|---|---|
| `startThresholdInFrames` | `int`: the desired start threshold. Value is 1 or greater <br /> |

| Returns ||
|---|---|
| `int` | the actual start threshold in frames value. This is an integer between 1 to the buffer capacity (see `https://developer.android.com/reference/android/media/AudioTrack#getBufferCapacityInFrames()`), and might change if the output sink changes after track creation. Value is 1 or greater <br /> |

| Throws ||
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalArgumentException` | if startThresholdInFrames is not positive. |
| `https://developer.android.com/reference/java/lang/IllegalStateException` | if the track is not initialized or the track transfer mode is not `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM`. |

**See also:**

- `https://developer.android.com/reference/android/media/AudioTrack#getStartThresholdInFrames()`

### setStereoVolume

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setStereoVolume (float leftGain, 
                float rightGain)
```


**This method was deprecated
in API level 21.**   

Applications should use `https://developer.android.com/reference/android/media/AudioTrack#setVolume(float)` instead, as it
more gracefully scales down to mono, and up to multi-channel content beyond stereo.

Sets the specified left and right output gain values on the AudioTrack.

Gain values are clamped to the closed interval \[0.0, max\] where
max is the value of `https://developer.android.com/reference/android/media/AudioTrack#getMaxVolume()`.
A value of 0.0 results in zero gain (silence), and
a value of 1.0 means unity gain (signal unchanged).
The default value is 1.0 meaning unity gain.

The word "volume" in the API name is historical; this is actually a linear gain.

<br />

| Parameters ||
|---|---|
| `leftGain` | `float`: output gain for the left channel. <br /> |
| `rightGain` | `float`: output gain for the right channel <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### setVolume

Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int setVolume (float gain)
```

Sets the specified output gain value on all channels of this track.

Gain values are clamped to the closed interval \[0.0, max\] where
max is the value of `https://developer.android.com/reference/android/media/AudioTrack#getMaxVolume()`.
A value of 0.0 results in zero gain (silence), and
a value of 1.0 means unity gain (signal unchanged).
The default value is 1.0 meaning unity gain.

This API is preferred over `https://developer.android.com/reference/android/media/AudioTrack#setStereoVolume(float,%20float)`, as it
more gracefully scales down to mono, and up to multi-channel content beyond stereo.

The word "volume" in the API name is historical; this is actually a linear gain.

<br />

| Parameters ||
|---|---|
| `gain` | `float`: output gain for all channels. <br /> |

| Returns ||
|---|---|
| `int` | error code or success, see `https://developer.android.com/reference/android/media/AudioTrack#SUCCESS`, `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` <br /> |

### stop

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void stop ()
```

Stops playing the audio data.
When used on an instance created in `https://developer.android.com/reference/android/media/AudioTrack#MODE_STREAM` mode, audio will stop playing
after the last buffer that was written has been played. For an immediate stop, use
`https://developer.android.com/reference/android/media/AudioTrack#pause()`, followed by `https://developer.android.com/reference/android/media/AudioTrack#flush()` to discard audio data that hasn't been played
back yet.

<br />

| Throws ||
|---|---|
|   | java.lang.IllegalStateException |
| `https://developer.android.com/reference/java/lang/IllegalStateException` |   |

### unregisterStreamEventCallback

Added in [API level 29](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public void unregisterStreamEventCallback (AudioTrack.StreamEventCallback eventCallback)
```

Unregisters the callback for notification of stream events, previously registered
with `https://developer.android.com/reference/android/media/AudioTrack#registerStreamEventCallback(java.util.concurrent.Executor,%20android.media.AudioTrack.StreamEventCallback)`.

<br />

| Parameters ||
|---|---|
| `eventCallback` | `AudioTrack.StreamEventCallback`: the callback to unregister. This value cannot be `null`. <br /> |

### write

Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (float[] audioData, 
                int offsetInFloats, 
                int sizeInFloats, 
                int writeMode)
```

Writes the audio data to the audio sink for playback (streaming mode),
or copies audio data for later playback (static buffer mode).
The format specified in the AudioTrack constructor should be
`https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_FLOAT` to correspond to the data in the array.


In streaming mode, the blocking behavior depends on the write mode. If the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will normally block until all the data has been enqueued
for playback, and will return a full transfer count. However, if the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, or the track is stopped or paused on entry, or another thread
interrupts the write by calling stop or pause, or an I/O error
occurs during the write, then the write may return a short transfer count.


In static buffer mode, copies the data to the buffer starting at offset 0,
and the write mode is ignored.
Note that the actual playback of this data might occur after this function returns.

<br />

| Parameters ||
|---|---|
| `audioData` | `float`: the array that holds the data to write. The implementation does not clip for sample values within the nominal range \[-1.0f, 1.0f\], provided that all gains in the audio pipeline are less than or equal to unity (1.0f), and in the absence of post-processing effects that could add energy, such as reverb. For the convenience of applications that compute samples using filters with non-unity gain, sample values +3 dB beyond the nominal range are permitted. However such values may eventually be limited or clipped, depending on various gains and later processing in the audio path. Therefore applications are encouraged to provide samples values within the nominal range. This value cannot be `null`. <br /> |
| `offsetInFloats` | `int`: the offset, expressed as a number of floats, in audioData where the data to write starts. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `sizeInFloats` | `int`: the number of floats to write in audioData after the offset. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `writeMode` | `int`: one of `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`. It has no effect in static mode. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will block until all data has been written to the audio sink. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, the write will return immediately after queuing as much audio data for playback as possible without blocking. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING` - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING` |

| Returns ||
|---|---|
| `int` | zero or the positive number of floats that were written, or one of the following error codes. The number of floats will be a multiple of the channel count not to exceed sizeInFloats. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error <br /> |

### write

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (short[] audioData, 
                int offsetInShorts, 
                int sizeInShorts)
```

Writes the audio data to the audio sink for playback (streaming mode),
or copies audio data for later playback (static buffer mode).
The format specified in the AudioTrack constructor should be
`https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT` to correspond to the data in the array.


In streaming mode, the write will normally block until all the data has been enqueued for
playback, and will return a full transfer count. However, if the track is stopped or paused
on entry, or another thread interrupts the write by calling stop or pause, or an I/O error
occurs during the write, then the write may return a short transfer count.


In static buffer mode, copies the data to the buffer starting at offset 0.
Note that the actual playback of this data might occur after this function returns.

<br />

| Parameters ||
|---|---|
| `audioData` | `short`: the array that holds the data to play. This value cannot be `null`. <br /> |
| `offsetInShorts` | `int`: the offset expressed in shorts in audioData where the data to play starts. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `sizeInShorts` | `int`: the number of shorts to read in audioData after the offset. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |

| Returns ||
|---|---|
| `int` | zero or the positive number of shorts that were written, or one of the following error codes. The number of shorts will be a multiple of the channel count not to exceed sizeInShorts. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error This is equivalent to `https://developer.android.com/reference/android/media/AudioTrack#write(short[],%20int,%20int,%20int)` with `writeMode` set to `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`. <br /> |

### write

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (byte[] audioData, 
                int offsetInBytes, 
                int sizeInBytes)
```

Writes the audio data to the audio sink for playback (streaming mode),
or copies audio data for later playback (static buffer mode).
The format specified in the AudioTrack constructor should be
`https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_8BIT` to correspond to the data in the array.
The format can be `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT`, but this is deprecated.


In streaming mode, the write will normally block until all the data has been enqueued for
playback, and will return a full transfer count. However, if the track is stopped or paused
on entry, or another thread interrupts the write by calling stop or pause, or an I/O error
occurs during the write, then the write may return a short transfer count.


In static buffer mode, copies the data to the buffer starting at offset 0.
Note that the actual playback of this data might occur after this function returns.

<br />

| Parameters ||
|---|---|
| `audioData` | `byte`: the array that holds the data to play. This value cannot be `null`. <br /> |
| `offsetInBytes` | `int`: the offset expressed in bytes in audioData where the data to write starts. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `sizeInBytes` | `int`: the number of bytes to write in audioData after the offset. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |

| Returns ||
|---|---|
| `int` | zero or the positive number of bytes that were written, or one of the following error codes. The number of bytes will be a multiple of the frame size in bytes not to exceed sizeInBytes. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error This is equivalent to `https://developer.android.com/reference/android/media/AudioTrack#write(byte[],%20int,%20int,%20int)` with `writeMode` set to `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`. <br /> |

### write

Added in [API level 21](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (ByteBuffer audioData, 
                int sizeInBytes, 
                int writeMode)
```

Writes the audio data to the audio sink for playback (streaming mode),
or copies audio data for later playback (static buffer mode).
The audioData in ByteBuffer should match the format specified in the AudioTrack constructor.


In streaming mode, the blocking behavior depends on the write mode. If the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will normally block until all the data has been enqueued
for playback, and will return a full transfer count. However, if the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, or the track is stopped or paused on entry, or another thread
interrupts the write by calling stop or pause, or an I/O error
occurs during the write, then the write may return a short transfer count.


In static buffer mode, copies the data to the buffer starting at offset 0,
and the write mode is ignored.
Note that the actual playback of this data might occur after this function returns.

<br />

| Parameters ||
|---|---|
| `audioData` | `ByteBuffer`: the buffer that holds the data to write, starting at the position reported by `audioData.position()`. Note that upon return, the buffer position (`audioData.position()`) will have been advanced to reflect the amount of data that was successfully written to the AudioTrack. This value cannot be `null`. <br /> |
| `sizeInBytes` | `int`: number of bytes to write. It is recommended but not enforced that the number of bytes requested be a multiple of the frame size (sample size in bytes multiplied by the channel count). Note this may differ from `audioData.remaining()`, but cannot exceed it. <br /> |
| `writeMode` | `int`: one of `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`. It has no effect in static mode. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will block until all data has been written to the audio sink. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, the write will return immediately after queuing as much audio data for playback as possible without blocking. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING` - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING` |

| Returns ||
|---|---|
| `int` | zero or the positive number of bytes that were written, or one of the following error codes. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error <br /> |

### write

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (ByteBuffer audioData, 
                int sizeInBytes, 
                int writeMode, 
                long timestamp)
```

Writes the audio data to the audio sink for playback in streaming mode on a HW_AV_SYNC track.
The blocking behavior will depend on the write mode.

<br />

| Parameters ||
|---|---|
| `audioData` | `ByteBuffer`: the buffer that holds the data to write, starting at the position reported by `audioData.position()`. Note that upon return, the buffer position (`audioData.position()`) will have been advanced to reflect the amount of data that was successfully written to the AudioTrack. This value cannot be `null`. <br /> |
| `sizeInBytes` | `int`: number of bytes to write. It is recommended but not enforced that the number of bytes requested be a multiple of the frame size (sample size in bytes multiplied by the channel count). Note this may differ from `audioData.remaining()`, but cannot exceed it. <br /> |
| `writeMode` | `int`: one of `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will block until all data has been written to the audio sink. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, the write will return immediately after queuing as much audio data for playback as possible without blocking. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING` - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING` |
| `timestamp` | `long`: The timestamp, in nanoseconds, of the first decodable audio frame in the provided audioData. <br /> |

| Returns ||
|---|---|
| `int` | zero or the positive number of bytes that were written, or one of the following error codes. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error <br /> |

### write

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (short[] audioData, 
                int offsetInShorts, 
                int sizeInShorts, 
                int writeMode)
```

Writes the audio data to the audio sink for playback (streaming mode),
or copies audio data for later playback (static buffer mode).
The format specified in the AudioTrack constructor should be
`https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT` to correspond to the data in the array.


In streaming mode, the blocking behavior depends on the write mode. If the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will normally block until all the data has been enqueued
for playback, and will return a full transfer count. However, if the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, or the track is stopped or paused on entry, or another thread
interrupts the write by calling stop or pause, or an I/O error
occurs during the write, then the write may return a short transfer count.


In static buffer mode, copies the data to the buffer starting at offset 0.
Note that the actual playback of this data might occur after this function returns.

<br />

| Parameters ||
|---|---|
| `audioData` | `short`: the array that holds the data to write. This value cannot be `null`. <br /> |
| `offsetInShorts` | `int`: the offset expressed in shorts in audioData where the data to write starts. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `sizeInShorts` | `int`: the number of shorts to read in audioData after the offset. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `writeMode` | `int`: one of `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`. It has no effect in static mode. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will block until all data has been written to the audio sink. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, the write will return immediately after queuing as much audio data for playback as possible without blocking. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING` - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING` |

| Returns ||
|---|---|
| `int` | zero or the positive number of shorts that were written, or one of the following error codes. The number of shorts will be a multiple of the channel count not to exceed sizeInShorts. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error <br /> |

### write

Added in [API level 23](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
public int write (byte[] audioData, 
                int offsetInBytes, 
                int sizeInBytes, 
                int writeMode)
```

Writes the audio data to the audio sink for playback (streaming mode),
or copies audio data for later playback (static buffer mode).
The format specified in the AudioTrack constructor should be
`https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_8BIT` to correspond to the data in the array.
The format can be `https://developer.android.com/reference/android/media/AudioFormat#ENCODING_PCM_16BIT`, but this is deprecated.


In streaming mode, the blocking behavior depends on the write mode. If the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will normally block until all the data has been enqueued
for playback, and will return a full transfer count. However, if the write mode is
`https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, or the track is stopped or paused on entry, or another thread
interrupts the write by calling stop or pause, or an I/O error
occurs during the write, then the write may return a short transfer count.


In static buffer mode, copies the data to the buffer starting at offset 0,
and the write mode is ignored.
Note that the actual playback of this data might occur after this function returns.

<br />

| Parameters ||
|---|---|
| `audioData` | `byte`: the array that holds the data to play. This value cannot be `null`. <br /> |
| `offsetInBytes` | `int`: the offset expressed in bytes in audioData where the data to write starts. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `sizeInBytes` | `int`: the number of bytes to write in audioData after the offset. Must not be negative, or cause the data access to go out of bounds of the array. <br /> |
| `writeMode` | `int`: one of `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`. It has no effect in static mode. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING`, the write will block until all data has been written to the audio sink. With `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING`, the write will return immediately after queuing as much audio data for playback as possible without blocking. Value is one of the following: - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_BLOCKING` - `https://developer.android.com/reference/android/media/AudioTrack#WRITE_NON_BLOCKING` |

| Returns ||
|---|---|
| `int` | zero or the positive number of bytes that were written, or one of the following error codes. The number of bytes will be a multiple of the frame size in bytes not to exceed sizeInBytes. - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_INVALID_OPERATION` if the track isn't properly initialized - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_BAD_VALUE` if the parameters don't resolve to valid data and indexes - `https://developer.android.com/reference/android/media/AudioTrack#ERROR_DEAD_OBJECT` if the AudioTrack is not valid anymore and needs to be recreated. The dead object error code is not returned if some data was successfully transferred. In this case, the error is returned at the next write() - `https://developer.android.com/reference/android/media/AudioTrack#ERROR` in case of other error <br /> |

## Protected methods

### finalize

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
protected void finalize ()
```

Called by the garbage collector on an object when garbage collection
determines that there are no more references to the object.
A subclass overrides the `finalize` method to dispose of
system resources or to perform other cleanup.


The general contract of `finalize` is that it is invoked
if and when the Java virtual
machine has determined that there is no longer any
means by which this object can be accessed by any thread that has
not yet died, except as a result of an action taken by the
finalization of some other object or class which is ready to be
finalized. The `finalize` method may take any action, including
making this object available again to other threads; the usual purpose
of `finalize`, however, is to perform cleanup actions before
the object is irrevocably discarded. For example, the finalize method
for an object that represents an input/output connection might perform
explicit I/O transactions to break the connection before the object is
permanently discarded.


The `finalize` method of class `Object` performs no
special action; it simply returns normally. Subclasses of
`Object` may override this definition.


The Java programming language does not guarantee which thread will
invoke the `finalize` method for any given object. It is
guaranteed, however, that the thread that invokes finalize will not
be holding any user-visible synchronization locks when finalize is
invoked. If an uncaught exception is thrown by the finalize method,
the exception is ignored and finalization of that object terminates.


After the `finalize` method has been invoked for an object, no
further action is taken until the Java virtual machine has again
determined that there is no longer any means by which this object can
be accessed by any thread that has not yet died, including possible
actions by other objects or classes which are ready to be finalized,
at which point the object may be discarded.


The `finalize` method is never invoked more than once by a Java
virtual machine for any given object.


Any exception thrown by the `finalize` method causes
the finalization of this object to be halted, but is otherwise
ignored.

<br />

### getNativeFrameCount

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
19](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
protected int getNativeFrameCount ()
```


**This method was deprecated
in API level 19.**   

Use the identical public method `https://developer.android.com/reference/android/media/AudioTrack#getBufferSizeInFrames()` instead.

Returns the frame count of the native `AudioTrack` buffer.

<br />

| Returns ||
|---|---|
| `int` | current size in frames of the `AudioTrack` buffer. <br /> |

| Throws ||
|---|---|
|   | java.lang.IllegalStateException |

### setState

Added in [API level 3](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)   
Deprecated in [API level
19](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)

```
protected void setState (int state)
```


**This method was deprecated
in API level 19.**   

Only accessible by subclasses, which are not recommended for AudioTrack.

Sets the initialization state of the instance. This method was originally intended to be used
in an AudioTrack subclass constructor to set a subclass-specific post-initialization state.
However, subclasses of AudioTrack are no longer recommended, so this method is obsolete.

<br />

| Parameters ||
|---|---|
| `state` | `int`: the state of the AudioTrack instance <br /> |