diff --git a/libraries/common/src/test/java/androidx/media3/common/audio/RandomParameterizedSonicTest.java b/libraries/common/src/test/java/androidx/media3/common/audio/RandomParameterizedSonicTest.java index 515d4b5783..cc99465617 100644 --- a/libraries/common/src/test/java/androidx/media3/common/audio/RandomParameterizedSonicTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/audio/RandomParameterizedSonicTest.java @@ -16,7 +16,6 @@ package androidx.media3.common.audio; import static androidx.media3.test.utils.TestUtil.generateFloatInRange; -import static androidx.media3.test.utils.TestUtil.roundToDecimalPlaces; import static com.google.common.truth.Truth.assertThat; import static java.lang.Math.max; @@ -96,15 +95,16 @@ public final class RandomParameterizedSonicTest { */ private static ImmutableList initParams() { ImmutableSet.Builder paramsBuilder = new ImmutableSet.Builder<>(); - ImmutableSet.Builder speedsBuilder = new ImmutableSet.Builder<>(); + ImmutableSet.Builder speedsBuilder = new ImmutableSet.Builder<>(); for (int i = 0; i < PARAM_COUNT; i++) { Range range = SPEED_RANGES.get(i % SPEED_RANGES.size()); - speedsBuilder.add( - (float) - roundToDecimalPlaces(generateFloatInRange(random, range), SPEED_DECIMAL_PRECISION)); + BigDecimal speed = + BigDecimal.valueOf(generateFloatInRange(random, range)) + .setScale(SPEED_DECIMAL_PRECISION, RoundingMode.HALF_EVEN); + speedsBuilder.add(speed); } - ImmutableSet speeds = speedsBuilder.build(); + ImmutableSet speeds = speedsBuilder.build(); ImmutableSet lengths = new ImmutableSet.Builder() @@ -116,7 +116,7 @@ public final class RandomParameterizedSonicTest { .iterator()) .build(); for (long length : lengths) { - for (float speed : speeds) { + for (BigDecimal speed : speeds) { paramsBuilder.add(new Object[] {speed, length}); } } @@ -124,7 +124,7 @@ public final class RandomParameterizedSonicTest { } @Parameter(0) - public float speed; + public BigDecimal speed; @Parameter(1) public long streamLength; @@ -138,8 +138,8 @@ public final class RandomParameterizedSonicTest { new Sonic( /* inputSampleRateHz= */ SAMPLE_RATE, /* channelCount= */ 1, - /* speed= */ speed, - /* pitch= */ speed, + /* speed= */ speed.floatValue(), + /* pitch= */ speed.floatValue(), /* outputSampleRateHz= */ SAMPLE_RATE); long readSampleCount = 0; @@ -164,11 +164,10 @@ public final class RandomParameterizedSonicTest { sonic.flush(); BigDecimal bigSampleRate = new BigDecimal(SAMPLE_RATE); - BigDecimal bigSpeed = new BigDecimal(String.valueOf(speed)); BigDecimal bigLength = new BigDecimal(String.valueOf(streamLength)); - // The scale of expectedSize will always be equal to bigLength. Thus, the result will always - // yield an integer. - BigDecimal expectedSize = bigLength.divide(bigSpeed, RoundingMode.HALF_EVEN); + // The scale of expectedSize will be bigLength.scale() - speed.scale(). Thus, the result should + // always yield an integer. + BigDecimal expectedSize = bigLength.divide(speed, RoundingMode.HALF_EVEN); // Calculate number of times that Sonic accumulates truncation error. Set scale to 20 decimal // places, so that division doesn't return an integral. @@ -179,7 +178,7 @@ public final class RandomParameterizedSonicTest { // inputSampleRate / speed - (int) inputSampleRate / speed. Set scale to 20 decimal places, so // that division doesn't return an integral. BigDecimal individualError = - bigSampleRate.divide(bigSpeed, /* scale */ 20, RoundingMode.HALF_EVEN); + bigSampleRate.divide(speed, /* scale */ 20, RoundingMode.HALF_EVEN); individualError = individualError.subtract(individualError.setScale(/* newScale= */ 0, RoundingMode.FLOOR)); // Calculate total accumulated error = (int) floor(errorCount * individualError). @@ -199,7 +198,7 @@ public final class RandomParameterizedSonicTest { new Sonic( /* inputSampleRateHz= */ SAMPLE_RATE, /* channelCount= */ 1, - speed, + speed.floatValue(), /* pitch= */ 1, /* outputSampleRateHz= */ SAMPLE_RATE); long readSampleCount = 0; @@ -221,12 +220,10 @@ public final class RandomParameterizedSonicTest { } sonic.flush(); - BigDecimal bigSpeed = new BigDecimal(String.valueOf(speed)); BigDecimal bigLength = new BigDecimal(String.valueOf(streamLength)); - // The scale of expectedSampleCount will always be equal to bigLength. Thus, the result will - // always - // yield an integer. - BigDecimal expectedSampleCount = bigLength.divide(bigSpeed, RoundingMode.HALF_EVEN); + // The scale of expectedSampleCount will be bigLength.scale() - speed.scale(). Thus, the result + // should always yield an integer. + BigDecimal expectedSampleCount = bigLength.divide(speed, RoundingMode.HALF_EVEN); // Calculate allowed tolerance and round to nearest integer. BigDecimal allowedTolerance = diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java index b3b6f2fe77..e3c42b555e 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/TestUtil.java @@ -65,8 +65,6 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.math.BigDecimal; -import java.math.RoundingMode; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; @@ -686,18 +684,6 @@ public class TestUtil { return bottom + random.nextFloat() * (top - bottom); } - /** - * Rounds {@code num} to {@code decimalPlaces}, using {@link RoundingMode#HALF_EVEN}. - * - *

The number is converted first into a {@link BigDecimal} on which the scale is set to {@code - * decimalPlaces}. Finally, the method returns the {@link BigDecimal#doubleValue()} of the scaled - * big decimal. - */ - public static double roundToDecimalPlaces(double num, int decimalPlaces) { - BigDecimal bigDecimal = new BigDecimal(Double.toString(num)); - return bigDecimal.setScale(decimalPlaces, RoundingMode.HALF_EVEN).doubleValue(); - } - private static final class NoUidOrShufflingTimeline extends Timeline { private final Timeline delegate;