Commit 886fe910 by andrewlewis Committed by Oliver Woodman

Avoid potential ArrayStoreException with audio processors

The app is able to pass a more specialized array type, so the Arrays.copyOf call
produces an array into which it's not valid to store arbitrary AudioProcessors.

Create a new array and copy into it to avoid this problem.

PiperOrigin-RevId: 264779164
parent 9e3bee89
...@@ -37,7 +37,6 @@ import java.nio.ByteBuffer; ...@@ -37,7 +37,6 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
/** /**
...@@ -122,7 +121,15 @@ public final class DefaultAudioSink implements AudioSink { ...@@ -122,7 +121,15 @@ public final class DefaultAudioSink implements AudioSink {
* audioProcessors} applied before silence skipping and playback parameters. * audioProcessors} applied before silence skipping and playback parameters.
*/ */
public DefaultAudioProcessorChain(AudioProcessor... audioProcessors) { public DefaultAudioProcessorChain(AudioProcessor... audioProcessors) {
this.audioProcessors = Arrays.copyOf(audioProcessors, audioProcessors.length + 2); // The passed-in type may be more specialized than AudioProcessor[], so allocate a new array
// rather than using Arrays.copyOf.
this.audioProcessors = new AudioProcessor[audioProcessors.length + 2];
System.arraycopy(
/* src= */ audioProcessors,
/* srcPos= */ 0,
/* dest= */ this.audioProcessors,
/* destPos= */ 0,
/* length= */ audioProcessors.length);
silenceSkippingAudioProcessor = new SilenceSkippingAudioProcessor(); silenceSkippingAudioProcessor = new SilenceSkippingAudioProcessor();
sonicAudioProcessor = new SonicAudioProcessor(); sonicAudioProcessor = new SonicAudioProcessor();
this.audioProcessors[audioProcessors.length] = silenceSkippingAudioProcessor; this.audioProcessors[audioProcessors.length] = silenceSkippingAudioProcessor;
......
...@@ -68,6 +68,13 @@ public final class DefaultAudioSinkTest { ...@@ -68,6 +68,13 @@ public final class DefaultAudioSinkTest {
} }
@Test @Test
public void handlesSpecializedAudioProcessorArray() {
defaultAudioSink =
new DefaultAudioSink(
AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES, new TeeAudioProcessor[0]);
}
@Test
public void handlesBufferAfterReset() throws Exception { public void handlesBufferAfterReset() throws Exception {
configureDefaultAudioSink(CHANNEL_COUNT_STEREO); configureDefaultAudioSink(CHANNEL_COUNT_STEREO);
defaultAudioSink.handleBuffer(createDefaultSilenceBuffer(), /* presentationTimeUs= */ 0); defaultAudioSink.handleBuffer(createDefaultSilenceBuffer(), /* presentationTimeUs= */ 0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment