diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/FloatAudioMixingAlgorithmTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/FloatAudioMixingAlgorithmTest.java index d5455f9226..bbc8311d37 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/FloatAudioMixingAlgorithmTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/FloatAudioMixingAlgorithmTest.java @@ -18,6 +18,7 @@ package androidx.media3.transformer; import static androidx.media3.test.utils.TestUtil.createByteBuffer; import static androidx.media3.test.utils.TestUtil.createFloatArray; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; import androidx.media3.common.C; import androidx.media3.common.audio.AudioProcessor.AudioFormat; @@ -33,7 +34,6 @@ public final class FloatAudioMixingAlgorithmTest { new AudioFormat(/* sampleRate= */ 44100, /* channelCount= */ 2, C.ENCODING_PCM_FLOAT); private static final AudioFormat AUDIO_FORMAT_MONO_PCM_FLOAT = new AudioFormat(/* sampleRate= */ 44100, /* channelCount= */ 1, C.ENCODING_PCM_FLOAT); - private static final AudioFormat AUDIO_FORMAT_STEREO_PCM_16BIT = new AudioFormat(/* sampleRate= */ 44100, /* channelCount= */ 2, C.ENCODING_PCM_16BIT); private static final AudioFormat AUDIO_FORMAT_MONO_PCM_16BIT = @@ -45,6 +45,8 @@ public final class FloatAudioMixingAlgorithmTest { ChannelMixingMatrix.create(/* inputChannelCount= */ 1, /* outputChannelCount= */ 2); private static final ChannelMixingMatrix STEREO_TO_MONO = ChannelMixingMatrix.create(/* inputChannelCount= */ 2, /* outputChannelCount= */ 1); + private static final ChannelMixingMatrix MONO_TO_MONO = + ChannelMixingMatrix.create(/* inputChannelCount= */ 1, /* outputChannelCount= */ 1); @Test public void supportsSourceAudioFormatsForStereoMixing() { @@ -76,8 +78,8 @@ public final class FloatAudioMixingAlgorithmTest { STEREO_TO_STEREO.scaleBy(0.5f), /* frameCount= */ 2, mixingBuffer); - assertThat(sourceBuffer.remaining()).isEqualTo(0); - assertThat(mixingBuffer.remaining()).isEqualTo(0); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); mixingBuffer.flip(); assertThat(createFloatArray(mixingBuffer)).isEqualTo(new float[] {0f, -0.125f, 0.375f, -0.25f}); @@ -95,8 +97,8 @@ public final class FloatAudioMixingAlgorithmTest { MONO_TO_STEREO.scaleBy(0.5f), /* frameCount= */ 2, mixingBuffer); - assertThat(sourceBuffer.remaining()).isEqualTo(0); - assertThat(mixingBuffer.remaining()).isEqualTo(0); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); mixingBuffer.flip(); assertThat(createFloatArray(mixingBuffer)).isEqualTo(new float[] {0f, -0.5f, 0.75f, -0.25f}); @@ -114,13 +116,32 @@ public final class FloatAudioMixingAlgorithmTest { STEREO_TO_MONO.scaleBy(0.5f), /* frameCount= */ 2, mixingBuffer); - assertThat(sourceBuffer.remaining()).isEqualTo(0); - assertThat(mixingBuffer.remaining()).isEqualTo(0); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); mixingBuffer.flip(); assertThat(createFloatArray(mixingBuffer)).isEqualTo(new float[] {0.1875f, 0.5625f}); } + @Test + public void mixMonoFloatIntoMonoFloat() { + AudioMixingAlgorithm algorithm = new FloatAudioMixingAlgorithm(AUDIO_FORMAT_MONO_PCM_FLOAT); + + ByteBuffer mixingBuffer = createByteBuffer(new float[] {0.25f, -0.25f}); + ByteBuffer sourceBuffer = createByteBuffer(new float[] {0.5f, 0.25f}); + algorithm.mix( + sourceBuffer, + AUDIO_FORMAT_MONO_PCM_FLOAT, + MONO_TO_MONO.scaleBy(0.5f), + /* frameCount= */ 2, + mixingBuffer); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); + + mixingBuffer.flip(); + assertThat(createFloatArray(mixingBuffer)).isEqualTo(new float[] {0.5f, -0.125f}); + } + @Test public void mixStereoS16IntoStereoFloat() { AudioMixingAlgorithm algorithm = new FloatAudioMixingAlgorithm(AUDIO_FORMAT_STEREO_PCM_FLOAT); @@ -140,8 +161,8 @@ public final class FloatAudioMixingAlgorithmTest { STEREO_TO_STEREO.scaleBy(0.5f), /* frameCount= */ 2, mixingBuffer); - assertThat(sourceBuffer.remaining()).isEqualTo(0); - assertThat(mixingBuffer.remaining()).isEqualTo(0); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); mixingBuffer.flip(); assertThat(createFloatArray(mixingBuffer)) @@ -163,8 +184,8 @@ public final class FloatAudioMixingAlgorithmTest { MONO_TO_STEREO.scaleBy(0.5f), /* frameCount= */ 2, mixingBuffer); - assertThat(sourceBuffer.remaining()).isEqualTo(0); - assertThat(mixingBuffer.remaining()).isEqualTo(0); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); mixingBuffer.flip(); assertThat(createFloatArray(mixingBuffer)) @@ -173,6 +194,59 @@ public final class FloatAudioMixingAlgorithmTest { .inOrder(); } + @Test + public void mixStereoS16IntoMonoFloat() { + AudioMixingAlgorithm algorithm = new FloatAudioMixingAlgorithm(AUDIO_FORMAT_MONO_PCM_FLOAT); + + ByteBuffer mixingBuffer = createByteBuffer(new float[] {0.25f, 0.5f}); + ByteBuffer sourceBuffer = + createByteBuffer( + new short[] { + -16384 /* -0.5f */, + 8192 /* 0.25000762962f */, + -8192 /* -0.25f */, + 16384 /* 0.50001525925f */ + }); + + algorithm.mix( + sourceBuffer, + AUDIO_FORMAT_STEREO_PCM_16BIT, + STEREO_TO_MONO.scaleBy(0.5f), + /* frameCount= */ 2, + mixingBuffer); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); + + mixingBuffer.flip(); + assertThat(createFloatArray(mixingBuffer)) + .usingTolerance(1f / Short.MAX_VALUE) + .containsExactly(new float[] {0.1875f, 0.5625f}) + .inOrder(); + } + + @Test + public void mixMonoS16IntoMonoFloat() { + AudioMixingAlgorithm algorithm = new FloatAudioMixingAlgorithm(AUDIO_FORMAT_MONO_PCM_FLOAT); + + ByteBuffer mixingBuffer = createByteBuffer(new float[] {0.25f, 0.5f}); + ByteBuffer sourceBuffer = + createByteBuffer(new short[] {-16384 /* -0.5f */, 8192 /* 0.25000762962f */}); + algorithm.mix( + sourceBuffer, + AUDIO_FORMAT_MONO_PCM_16BIT, + MONO_TO_MONO.scaleBy(0.5f), + /* frameCount= */ 2, + mixingBuffer); + assertWithMessage("Source buffer").that(sourceBuffer.remaining()).isEqualTo(0); + assertWithMessage("Mixing buffer").that(mixingBuffer.remaining()).isEqualTo(0); + + mixingBuffer.flip(); + assertThat(createFloatArray(mixingBuffer)) + .usingTolerance(1f / Short.MAX_VALUE) + .containsExactly(new float[] {0f, 0.625f}) + .inOrder(); + } + @Test public void doesNotSupportSampleRateConversion() { AudioMixingAlgorithm algorithm =