# SonicAudioProcessor

Artifact: [androidx.media3:media3-common](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/common/audio/SonicAudioProcessor.java+class:androidx.media3.common.audio.SonicAudioProcessor)

*** ** * ** ***


```
@UnstableApi
public final class SonicAudioProcessor implements AudioProcessor
```

<br />

*** ** * ** ***

An `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor` that uses the Sonic library to modify audio speed/pitch/sample rate.

## Summary

| ### Constants |
|---|---|
| `static final int` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#SAMPLE_RATE_NO_CHANGE() = -1` Indicates that the output sample rate should be the same as the input. |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#SonicAudioProcessor()()` Creates a new Sonic audio processor. |

| ### Public methods |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor.AudioFormat` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#configure(androidx.media3.common.audio.AudioProcessor.AudioFormat)(https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor.AudioFormat inputAudioFormat)` Configures the processor to process input audio with the specified format. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#flush(androidx.media3.common.audio.AudioProcessor.StreamMetadata)(https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor.StreamMetadata streamMetadata)` Prepares the audio processor to receive a new stream of input in the last `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#configure(androidx.media3.common.audio.AudioProcessor.AudioFormat)` and clears any buffered data and pending output. |
| `long` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#getDurationAfterProcessorApplied(long)(long durationUs)` Returns the expected duration of the output stream when the processor is applied given a input `durationUs`. |
| `long` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#getMediaDuration(long)(long playoutDuration)` Returns the media duration corresponding to the specified playout duration, taking speed adjustment into account. |
| `https://developer.android.com/reference/java/nio/ByteBuffer.html` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#getOutput()()` Returns a buffer containing processed output data between its position and limit. |
| `long` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#getPlayoutDuration(long)(long mediaDuration)` Returns the playout duration corresponding to the specified media duration, taking speed adjustment into account. |
| `long` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#getProcessedInputBytes()()` Returns the number of bytes processed since last flush or reset. |
| `boolean` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#isActive()()` Returns whether the processor is configured and will process input buffers. |
| `boolean` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#isEnded()()` Returns whether this processor will return no more output from `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#getOutput()` until `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()` has been called and more input has been queued. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#queueEndOfStream()()` Queues an end of stream signal. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#queueInput(java.nio.ByteBuffer)(https://developer.android.com/reference/java/nio/ByteBuffer.html inputBuffer)` Queues audio data between the position and limit of the `inputBuffer` for processing. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#reset()()` Resets the processor to its unconfigured state, releasing any resources. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#setOutputSampleRateHz(int)(int sampleRateHz)` Sets the sample rate for output audio, in Hertz. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#setPitch(float)(@https://developer.android.com/reference/androidx/annotation/FloatRange(from = 0.0, fromInclusive = false) float pitch)` Sets the target playback pitch. |
| `void` | `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#setSpeed(float)(@https://developer.android.com/reference/androidx/annotation/FloatRange(from = 0.0, fromInclusive = false) float speed)` Sets the target playback speed. |

| ### Inherited Constants |
|---|
| From [androidx.media3.common.audio.AudioProcessor](https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor) |---|---| | `static final https://developer.android.com/reference/java/nio/ByteBuffer.html` | `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#EMPTY_BUFFER()` An empty, direct `https://developer.android.com/reference/java/nio/ByteBuffer.html`. | |

| ### Inherited methods |
|---|
| From [androidx.media3.common.audio.AudioProcessor](https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor) |---|---| | `void` | `[flush](https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush())()` **This method is deprecated.** Use `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush(androidx.media3.common.audio.AudioProcessor.StreamMetadata)` instead. <br /> | |

## Constants

### SAMPLE_RATE_NO_CHANGE

```
public static final int SAMPLE_RATE_NO_CHANGE = -1
```

Indicates that the output sample rate should be the same as the input.

## Public constructors

### SonicAudioProcessor

```
public SonicAudioProcessor()
```

Creates a new Sonic audio processor.

## Public methods

### configure

```
public AudioProcessor.AudioFormat configure(AudioProcessor.AudioFormat inputAudioFormat)
```

Configures the processor to process input audio with the specified format. After calling this method, call `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#isActive()` to determine whether the audio processor is active. Returns the configured output audio format if this instance is active.

After calling this method, it is necessary to `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()` the processor to apply the new configuration. Before applying the new configuration, it is safe to queue input and get output in the old input/output formats. Call `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#queueEndOfStream()` when no more input will be supplied in the old input format.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor.AudioFormat inputAudioFormat` | The format of audio that will be queued after the next call to `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()`. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor.AudioFormat` | The configured output audio format if this instance is `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#isActive()`. |

| Throws |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor.UnhandledAudioFormatException` | Thrown if the specified format can't be handled as input. |

### flush

```
public void flush(AudioProcessor.StreamMetadata streamMetadata)
```

Prepares the audio processor to receive a new stream of input in the last `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#configure(androidx.media3.common.audio.AudioProcessor.AudioFormat)` and clears any buffered data and pending output.

This method is a no-op if the processor is not `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#isActive()`.

### getDurationAfterProcessorApplied

```
public long getDurationAfterProcessorApplied(long durationUs)
```

Returns the expected duration of the output stream when the processor is applied given a input `durationUs`.

This method assumes `durationUs` of input is applied from the beginning of the stream (i.e. after a `flush(StreamMetadata.DEFAULT)` call).

### getMediaDuration

```
public long getMediaDuration(long playoutDuration)
```

Returns the media duration corresponding to the specified playout duration, taking speed adjustment into account.

The scaling performed by this method will use the actual playback speed achieved by the audio processor, on average, since it was last flushed. This may differ very slightly from the target playback speed.

| Parameters |
|---|---|
| `long playoutDuration` | The playout duration to scale. |

| Returns |
|---|---|
| `long` | The corresponding media duration, in the same units as `duration`. |

### getOutput

```
public ByteBuffer getOutput()
```

Returns a buffer containing processed output data between its position and limit. The buffer will always be a direct byte buffer with native byte order. Calling this method invalidates any previously returned buffer. The buffer will be empty if no output is available.

| Returns |
|---|---|
| `https://developer.android.com/reference/java/nio/ByteBuffer.html` | A buffer containing processed output data between its position and limit. |

### getPlayoutDuration

```
public long getPlayoutDuration(long mediaDuration)
```

Returns the playout duration corresponding to the specified media duration, taking speed adjustment into account.

The scaling performed by this method will use the actual playback speed achieved by the audio processor, on average, since it was last flushed. This may differ very slightly from the target playback speed.

| Parameters |
|---|---|
| `long mediaDuration` | The media duration to scale. |

| Returns |
|---|---|
| `long` | The corresponding playout duration, in the same units as `mediaDuration`. |

### getProcessedInputBytes

```
public long getProcessedInputBytes()
```

Returns the number of bytes processed since last flush or reset.

### isActive

```
public boolean isActive()
```

Returns whether the processor is configured and will process input buffers.

### isEnded

```
public boolean isEnded()
```

Returns whether this processor will return no more output from `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#getOutput()` until `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()` has been called and more input has been queued.

### queueEndOfStream

```
public void queueEndOfStream()
```

Queues an end of stream signal. After this method has been called, `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#queueInput(java.nio.ByteBuffer)` may not be called until after the next call to `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()`. Calling `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#getOutput()` will return any remaining output data. Multiple calls may be required to read all of the remaining output data. `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#isEnded()` will return `true` once all remaining output data has been read.

### queueInput

```
public void queueInput(ByteBuffer inputBuffer)
```

Queues audio data between the position and limit of the `inputBuffer` for processing. After calling this method, processed output may be available via `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#getOutput()`. Calling `queueInput(ByteBuffer)` again invalidates any pending output.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/nio/ByteBuffer.html inputBuffer` | The input buffer to process. It must be a direct byte buffer with native byte order. Its contents are treated as read-only. Its position will be advanced by the number of bytes consumed (which may be zero). The caller retains ownership of the provided buffer. |

### reset

```
public void reset()
```

Resets the processor to its unconfigured state, releasing any resources.

### setOutputSampleRateHz

```
public void setOutputSampleRateHz(int sampleRateHz)
```

Sets the sample rate for output audio, in Hertz. Pass `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#SAMPLE_RATE_NO_CHANGE()` to output audio at the same sample rate as the input. After calling this method, call `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#configure(androidx.media3.common.audio.AudioProcessor.AudioFormat)` to configure the processor with the new sample rate.

| Parameters |
|---|---|
| `int sampleRateHz` | The sample rate for output audio, in Hertz. |

| See also |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#configure(androidx.media3.common.audio.AudioProcessor.AudioFormat)` |   |

### setPitch

```
public void setPitch(@FloatRange(from = 0.0, fromInclusive = false) float pitch)
```

Sets the target playback pitch. This method may only be called after draining data through the processor. The value returned by `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#isActive()` may change, and the processor must be `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()` before queueing more data.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/FloatRange(from = 0.0, fromInclusive = false) float pitch` | The target pitch. |

### setSpeed

```
public void setSpeed(@FloatRange(from = 0.0, fromInclusive = false) float speed)
```

Sets the target playback speed. This method may only be called after draining data through the processor. The value returned by `https://developer.android.com/reference/androidx/media3/common/audio/SonicAudioProcessor#isActive()` may change, and the processor must be `https://developer.android.com/reference/androidx/media3/common/audio/AudioProcessor#flush()` before queueing more data.

| Parameters |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/FloatRange(from = 0.0, fromInclusive = false) float speed` | The target factor by which playback should be sped up. |