From 337e59e733ffa6bdc5b9badbcff6d143ceb3e4e6 Mon Sep 17 00:00:00 2001 From: ivanbuper Date: Fri, 11 Oct 2024 07:58:46 -0700 Subject: [PATCH] Move util methods in `SpeedChangingAudioProcessor`to `Util` This CL is prework for implementing `RandomParameterizedSpeedChangingAudioProcessorTest`, which will build on logic present in `RandomParameterizedSonicTest`. This is a non-functional change. PiperOrigin-RevId: 684838017 --- .../audio/RandomParameterizedSonicTest.java | 17 ++++----- .../androidx/media3/test/utils/TestUtil.java | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 11 deletions(-) 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 cb474f2d50..515d4b5783 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 @@ -15,6 +15,8 @@ */ 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; @@ -97,8 +99,10 @@ public final class RandomParameterizedSonicTest { ImmutableSet.Builder speedsBuilder = new ImmutableSet.Builder<>(); for (int i = 0; i < PARAM_COUNT; i++) { - Range r = SPEED_RANGES.get(i % SPEED_RANGES.size()); - speedsBuilder.add(round(generateFloatInRange(r))); + Range range = SPEED_RANGES.get(i % SPEED_RANGES.size()); + speedsBuilder.add( + (float) + roundToDecimalPlaces(generateFloatInRange(random, range), SPEED_DECIMAL_PRECISION)); } ImmutableSet speeds = speedsBuilder.build(); @@ -235,13 +239,4 @@ public final class RandomParameterizedSonicTest { assertThat(readSampleCount).isWithin(tolerance).of(expectedSampleCount.longValueExact()); } - - private static float round(float num) { - BigDecimal bigDecimal = new BigDecimal(Float.toString(num)); - return bigDecimal.setScale(SPEED_DECIMAL_PRECISION, RoundingMode.HALF_EVEN).floatValue(); - } - - private static float generateFloatInRange(Range r) { - return r.lowerEndpoint() + random.nextFloat() * (r.upperEndpoint() - r.lowerEndpoint()); - } } 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 6552b2d411..b3b6f2fe77 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 @@ -51,7 +51,9 @@ import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.PositionHolder; import androidx.media3.extractor.SeekMap; import androidx.media3.extractor.metadata.MetadataInputBuffer; +import com.google.common.collect.BoundType; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Range; import com.google.common.io.ByteStreams; import com.google.common.primitives.Bytes; import com.google.common.primitives.UnsignedBytes; @@ -63,6 +65,8 @@ 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; @@ -663,6 +667,37 @@ public class TestUtil { return checkNotNull(parcel.readBundle(throwingClassLoader)); } + /** + * Returns a randomly generated float within the specified range, using {@code random} as random + * number generator. + * + *

{@code range} must be a bounded range. + */ + public static float generateFloatInRange(Random random, Range range) { + float bottom = + range.lowerBoundType() == BoundType.OPEN + ? Math.nextUp(range.lowerEndpoint()) + : range.lowerEndpoint(); + float top = + range.upperBoundType() == BoundType.OPEN + ? Math.nextDown(range.upperEndpoint()) + : range.upperEndpoint(); + + 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;