Loading media/java/android/media/audiopolicy/AudioMix.java +4 −4 Original line number Diff line number Diff line Loading @@ -252,10 +252,10 @@ public class AudioMix { if (o == null || getClass() != o.getClass()) return false; final AudioMix that = (AudioMix) o; return (this.mRouteFlags == that.mRouteFlags) && (this.mRule == that.mRule) && (this.mMixType == that.mMixType) && (this.mFormat == that.mFormat); return (mRouteFlags == that.mRouteFlags) && (mMixType == that.mMixType) && Objects.equals(mRule, that.mRule) && Objects.equals(mFormat, that.mFormat); } /** @hide */ Loading media/java/android/media/audiopolicy/AudioPolicyConfig.java +3 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.Parcelable; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Objects; Loading @@ -50,7 +51,8 @@ public class AudioPolicyConfig implements Parcelable { mMixes = conf.mMixes; } AudioPolicyConfig(ArrayList<AudioMix> mixes) { @VisibleForTesting public AudioPolicyConfig(ArrayList<AudioMix> mixes) { mMixes = mixes; } Loading media/tests/AudioPolicyTest/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ android_test { "androidx.test.ext.junit", "androidx.test.rules", "guava", "guava-android-testlib", "hamcrest-library", "platform-test-annotations", ], Loading media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioMixUnitTests.java 0 → 100644 +158 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.audiopolicytest; import static android.media.AudioFormat.CHANNEL_OUT_MONO; import static android.media.AudioFormat.CHANNEL_OUT_STEREO; import static android.media.AudioFormat.ENCODING_PCM_16BIT; import static android.media.audiopolicy.AudioMixingRule.MIX_ROLE_INJECTOR; import static android.media.audiopolicy.AudioMixingRule.MIX_ROLE_PLAYERS; import static android.media.audiopolicy.AudioMixingRule.RULE_MATCH_AUDIO_SESSION_ID; import static android.media.audiopolicy.AudioMixingRule.RULE_MATCH_UID; import android.media.AudioFormat; import android.media.audiopolicy.AudioMix; import android.media.audiopolicy.AudioMixingRule; import android.media.audiopolicy.AudioPolicyConfig; import android.os.Parcel; import android.platform.test.annotations.Presubmit; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.common.testing.EqualsTester; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; /** * Unit tests for AudioMix. * * Run with "atest AudioMixUnitTests". */ @Presubmit @RunWith(AndroidJUnit4.class) public class AudioMixUnitTests { private static final AudioFormat OUTPUT_FORMAT_STEREO_44KHZ_PCM = new AudioFormat.Builder() .setSampleRate(44000) .setChannelMask(CHANNEL_OUT_STEREO) .setEncoding(ENCODING_PCM_16BIT).build(); private static final AudioFormat OUTPUT_FORMAT_MONO_16KHZ_PCM = new AudioFormat.Builder() .setSampleRate(16000) .setChannelMask(CHANNEL_OUT_MONO) .setEncoding(ENCODING_PCM_16BIT).build(); private static final AudioFormat INPUT_FORMAT_MONO_16KHZ_PCM = new AudioFormat.Builder() .setSampleRate(16000) .setChannelMask(AudioFormat.CHANNEL_IN_MONO) .setEncoding(ENCODING_PCM_16BIT).build(); @Test public void testEquals() { final EqualsTester equalsTester = new EqualsTester(); // --- Equality group 1 final AudioMix playbackAudioMixWithSessionId42AndUid123 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(OUTPUT_FORMAT_STEREO_44KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); final AudioMix playbackAudioMixWithUid123AndSessionId42 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_UID, 123) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42).build()) .setFormat(OUTPUT_FORMAT_STEREO_44KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup( playbackAudioMixWithSessionId42AndUid123, playbackAudioMixWithUid123AndSessionId42, writeToAndFromParcel(playbackAudioMixWithSessionId42AndUid123), writeToAndFromParcel(playbackAudioMixWithUid123AndSessionId42)); // --- Equality group 2 final AudioMix recordingAudioMixWithSessionId42AndUid123 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_INJECTOR) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(INPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); final AudioMix recordingAudioMixWithUid123AndSessionId42 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_INJECTOR) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(INPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup(recordingAudioMixWithSessionId42AndUid123, recordingAudioMixWithUid123AndSessionId42, writeToAndFromParcel(recordingAudioMixWithSessionId42AndUid123), writeToAndFromParcel(recordingAudioMixWithUid123AndSessionId42)); // --- Equality group 3 final AudioMix recordingAudioMixWithSessionId42AndUid123Render = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_INJECTOR) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(INPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags( AudioMix.ROUTE_FLAG_LOOP_BACK | AudioMix.ROUTE_FLAG_RENDER).build(); equalsTester.addEqualityGroup(recordingAudioMixWithSessionId42AndUid123Render, writeToAndFromParcel(recordingAudioMixWithSessionId42AndUid123Render)); // --- Equality group 4 final AudioMix playbackAudioMixWithUid123 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(OUTPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup(playbackAudioMixWithUid123, writeToAndFromParcel(playbackAudioMixWithUid123)); // --- Equality group 5 final AudioMix playbackAudioMixWithUid42 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_UID, 42).build()) .setFormat(OUTPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup(playbackAudioMixWithUid42, writeToAndFromParcel(playbackAudioMixWithUid42)); equalsTester.testEquals(); } private static AudioMix writeToAndFromParcel(AudioMix audioMix) { AudioPolicyConfig apc = new AudioPolicyConfig(new ArrayList<>(List.of(audioMix))); Parcel parcel = Parcel.obtain(); apc.writeToParcel(parcel, /*flags=*/0); parcel.setDataPosition(0); AudioMix unmarshalledMix = AudioPolicyConfig.CREATOR.createFromParcel(parcel).getMixes().get(0); parcel.recycle(); return unmarshalledMix; } } Loading
media/java/android/media/audiopolicy/AudioMix.java +4 −4 Original line number Diff line number Diff line Loading @@ -252,10 +252,10 @@ public class AudioMix { if (o == null || getClass() != o.getClass()) return false; final AudioMix that = (AudioMix) o; return (this.mRouteFlags == that.mRouteFlags) && (this.mRule == that.mRule) && (this.mMixType == that.mMixType) && (this.mFormat == that.mFormat); return (mRouteFlags == that.mRouteFlags) && (mMixType == that.mMixType) && Objects.equals(mRule, that.mRule) && Objects.equals(mFormat, that.mFormat); } /** @hide */ Loading
media/java/android/media/audiopolicy/AudioPolicyConfig.java +3 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.os.Parcelable; import android.util.Log; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Objects; Loading @@ -50,7 +51,8 @@ public class AudioPolicyConfig implements Parcelable { mMixes = conf.mMixes; } AudioPolicyConfig(ArrayList<AudioMix> mixes) { @VisibleForTesting public AudioPolicyConfig(ArrayList<AudioMix> mixes) { mMixes = mixes; } Loading
media/tests/AudioPolicyTest/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ android_test { "androidx.test.ext.junit", "androidx.test.rules", "guava", "guava-android-testlib", "hamcrest-library", "platform-test-annotations", ], Loading
media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioMixUnitTests.java 0 → 100644 +158 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.audiopolicytest; import static android.media.AudioFormat.CHANNEL_OUT_MONO; import static android.media.AudioFormat.CHANNEL_OUT_STEREO; import static android.media.AudioFormat.ENCODING_PCM_16BIT; import static android.media.audiopolicy.AudioMixingRule.MIX_ROLE_INJECTOR; import static android.media.audiopolicy.AudioMixingRule.MIX_ROLE_PLAYERS; import static android.media.audiopolicy.AudioMixingRule.RULE_MATCH_AUDIO_SESSION_ID; import static android.media.audiopolicy.AudioMixingRule.RULE_MATCH_UID; import android.media.AudioFormat; import android.media.audiopolicy.AudioMix; import android.media.audiopolicy.AudioMixingRule; import android.media.audiopolicy.AudioPolicyConfig; import android.os.Parcel; import android.platform.test.annotations.Presubmit; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.common.testing.EqualsTester; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; /** * Unit tests for AudioMix. * * Run with "atest AudioMixUnitTests". */ @Presubmit @RunWith(AndroidJUnit4.class) public class AudioMixUnitTests { private static final AudioFormat OUTPUT_FORMAT_STEREO_44KHZ_PCM = new AudioFormat.Builder() .setSampleRate(44000) .setChannelMask(CHANNEL_OUT_STEREO) .setEncoding(ENCODING_PCM_16BIT).build(); private static final AudioFormat OUTPUT_FORMAT_MONO_16KHZ_PCM = new AudioFormat.Builder() .setSampleRate(16000) .setChannelMask(CHANNEL_OUT_MONO) .setEncoding(ENCODING_PCM_16BIT).build(); private static final AudioFormat INPUT_FORMAT_MONO_16KHZ_PCM = new AudioFormat.Builder() .setSampleRate(16000) .setChannelMask(AudioFormat.CHANNEL_IN_MONO) .setEncoding(ENCODING_PCM_16BIT).build(); @Test public void testEquals() { final EqualsTester equalsTester = new EqualsTester(); // --- Equality group 1 final AudioMix playbackAudioMixWithSessionId42AndUid123 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(OUTPUT_FORMAT_STEREO_44KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); final AudioMix playbackAudioMixWithUid123AndSessionId42 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_UID, 123) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42).build()) .setFormat(OUTPUT_FORMAT_STEREO_44KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup( playbackAudioMixWithSessionId42AndUid123, playbackAudioMixWithUid123AndSessionId42, writeToAndFromParcel(playbackAudioMixWithSessionId42AndUid123), writeToAndFromParcel(playbackAudioMixWithUid123AndSessionId42)); // --- Equality group 2 final AudioMix recordingAudioMixWithSessionId42AndUid123 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_INJECTOR) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(INPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); final AudioMix recordingAudioMixWithUid123AndSessionId42 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_INJECTOR) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(INPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup(recordingAudioMixWithSessionId42AndUid123, recordingAudioMixWithUid123AndSessionId42, writeToAndFromParcel(recordingAudioMixWithSessionId42AndUid123), writeToAndFromParcel(recordingAudioMixWithUid123AndSessionId42)); // --- Equality group 3 final AudioMix recordingAudioMixWithSessionId42AndUid123Render = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_INJECTOR) .addMixRule(RULE_MATCH_AUDIO_SESSION_ID, 42) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(INPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags( AudioMix.ROUTE_FLAG_LOOP_BACK | AudioMix.ROUTE_FLAG_RENDER).build(); equalsTester.addEqualityGroup(recordingAudioMixWithSessionId42AndUid123Render, writeToAndFromParcel(recordingAudioMixWithSessionId42AndUid123Render)); // --- Equality group 4 final AudioMix playbackAudioMixWithUid123 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_UID, 123).build()) .setFormat(OUTPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup(playbackAudioMixWithUid123, writeToAndFromParcel(playbackAudioMixWithUid123)); // --- Equality group 5 final AudioMix playbackAudioMixWithUid42 = new AudioMix.Builder(new AudioMixingRule.Builder() .setTargetMixRole(MIX_ROLE_PLAYERS) .addMixRule(RULE_MATCH_UID, 42).build()) .setFormat(OUTPUT_FORMAT_MONO_16KHZ_PCM) .setRouteFlags(AudioMix.ROUTE_FLAG_LOOP_BACK).build(); equalsTester.addEqualityGroup(playbackAudioMixWithUid42, writeToAndFromParcel(playbackAudioMixWithUid42)); equalsTester.testEquals(); } private static AudioMix writeToAndFromParcel(AudioMix audioMix) { AudioPolicyConfig apc = new AudioPolicyConfig(new ArrayList<>(List.of(audioMix))); Parcel parcel = Parcel.obtain(); apc.writeToParcel(parcel, /*flags=*/0); parcel.setDataPosition(0); AudioMix unmarshalledMix = AudioPolicyConfig.CREATOR.createFromParcel(parcel).getMixes().get(0); parcel.recycle(); return unmarshalledMix; } }