DefaultAudioMixer


@UnstableApi
public final class DefaultAudioMixer implements AudioMixer


An AudioMixer that incrementally mixes source audio into a fixed size mixing buffer.

By default, the output signal is guaranteed to be in the range corresponding to its encoding. This range is [MIN_VALUE, MAX_VALUE] for ENCODING_PCM_16BIT, and [-1.0, 1.0] for ENCODING_PCM_FLOAT. Before adding a value to the output buffer, it is first converted to the output encoding (in the corresponding range). It is then added to the output buffer value, and the result is clipped by moving it to the closest value in this range.

Summary

Nested types

public final class DefaultAudioMixer.Factory implements AudioMixer.Factory

An AudioMixer.Factory implementation for DefaultAudioMixer instances.

Public methods

int
addSource(AudioProcessor.AudioFormat sourceFormat, long startTimeUs)

Adds an audio source to mix starting at the given time.

void
configure(
    AudioProcessor.AudioFormat outputAudioFormat,
    int bufferSizeMs,
    long startTimeUs
)

Configures the mixer.

ByteBuffer

Returns a buffer containing output audio data between its position and limit.

boolean
hasSource(int sourceId)

Returns whether there is an added source with the given sourceId.

boolean

Returns whether the mixer can accept more input or produce more output, based on the end time.

void
queueInput(int sourceId, ByteBuffer sourceBuffer)

Queues audio data between the position and limit of the sourceBuffer.

void
removeSource(int sourceId)

Removes an audio source.

void

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

void
setEndTimeUs(long endTimeUs)

Sets the end time of the output audio.

void
setSourceVolume(int sourceId, float volume)

Sets the volume applied to future samples queued from the given source.

boolean

Indicates whether the mixer supports mixing sources with the given audio format.

Inherited methods

From androidx.media3.transformer.AudioMixer
static AudioMixer

This method is deprecated.

Use create.

Public methods

addSource

public int addSource(AudioProcessor.AudioFormat sourceFormat, long startTimeUs)

Adds an audio source to mix starting at the given time.

If the mixer has already output samples past the startTimeUs, audio from this source will be discarded up to the last output end timestamp.

If the source start time is earlier than the configured mixer start time then audio from this source will be discarded up to the mixer start time.

All audio sources start with a volume of 1.0 on all channels.

Parameters
AudioProcessor.AudioFormat sourceFormat

Audio format of source buffers.

long startTimeUs

Source start time in microseconds.

Returns
int

Non-negative integer identifying the source (sourceId).

configure

public void configure(
    AudioProcessor.AudioFormat outputAudioFormat,
    int bufferSizeMs,
    long startTimeUs
)

Configures the mixer.

The mixer must be configured before use and can only be reconfigured after a call to reset.

The mixing buffer size is set by bufferSizeMs and indicates how much audio can be queued before getOutput is called.

Parameters
AudioProcessor.AudioFormat outputAudioFormat

The audio format of buffers returned from getOutput.

int bufferSizeMs

The optional mixing buffer size in milliseconds, or LENGTH_UNSET.

long startTimeUs

The start time of the mixer output in microseconds.

Throws
androidx.media3.common.audio.AudioProcessor.UnhandledAudioFormatException

If the output audio format is not supported.

getOutput

public ByteBuffer getOutput()

Returns a buffer containing output audio data between its position and limit.

The buffer will be no larger than the configured buffer size and will include no more than the frames that have been queued from all sources, up to the end time. Silence will be generated for any periods with no sources.

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
ByteBuffer

A buffer containing output data between its position and limit.

hasSource

public boolean hasSource(int sourceId)

Returns whether there is an added source with the given sourceId.

isEnded

public boolean isEnded()

Returns whether the mixer can accept more input or produce more output, based on the end time.

Note: If no end time is set this will always return false.

queueInput

public void queueInput(int sourceId, ByteBuffer sourceBuffer)

Queues audio data between the position and limit of the sourceBuffer.

After calling this method output may be available via getOutput if all sources have queued data.

Parameters
int sourceId

Source identifier from addSource.

ByteBuffer sourceBuffer

The source buffer to mix. 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.

removeSource

public void removeSource(int sourceId)

Removes an audio source.

No more audio can be queued from this source. All audio queued before removal will be output.

Parameters
int sourceId

Source identifier from addSource.

reset

public void reset()

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

setEndTimeUs

public void setEndTimeUs(long endTimeUs)

Sets the end time of the output audio.

The mixer will not accept input nor produce output past this point.

Parameters
long endTimeUs

The end time in microseconds.

Throws
java.lang.IllegalArgumentException

If endTimeUs is before the configured start time.

setSourceVolume

public void setSourceVolume(int sourceId, float volume)

Sets the volume applied to future samples queued from the given source.

Parameters
int sourceId

Source identifier from addSource.

float volume

Non-negative scalar applied to all source channels.

supportsSourceAudioFormat

public boolean supportsSourceAudioFormat(AudioProcessor.AudioFormat sourceFormat)

Indicates whether the mixer supports mixing sources with the given audio format.