diff options
| author | 2023-03-07 22:15:36 +0000 | |
|---|---|---|
| committer | 2023-03-07 22:15:36 +0000 | |
| commit | 980553d23c52be9bce3baf0e53ba6b9a6415e6fb (patch) | |
| tree | 3e74f58ebfa785f8dd4add64700014a04bf96e4b | |
| parent | 69e566b31444d468d843997855499d6c40f3c4be (diff) | |
| parent | d22b7e185c487c0fc334803249277386d8474cf2 (diff) | |
Merge "Fix AudioPolicy.detachMixes" into udc-dev
4 files changed, 166 insertions, 5 deletions
diff --git a/media/java/android/media/audiopolicy/AudioMix.java b/media/java/android/media/audiopolicy/AudioMix.java index f85bdee18967..5f5e214357ea 100644 --- a/media/java/android/media/audiopolicy/AudioMix.java +++ b/media/java/android/media/audiopolicy/AudioMix.java @@ -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 */ diff --git a/media/java/android/media/audiopolicy/AudioPolicyConfig.java b/media/java/android/media/audiopolicy/AudioPolicyConfig.java index 440447e5ec1d..ce9773312a10 100644 --- a/media/java/android/media/audiopolicy/AudioPolicyConfig.java +++ b/media/java/android/media/audiopolicy/AudioPolicyConfig.java @@ -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; @@ -50,7 +51,8 @@ public class AudioPolicyConfig implements Parcelable { mMixes = conf.mMixes; } - AudioPolicyConfig(ArrayList<AudioMix> mixes) { + @VisibleForTesting + public AudioPolicyConfig(ArrayList<AudioMix> mixes) { mMixes = mixes; } diff --git a/media/tests/AudioPolicyTest/Android.bp b/media/tests/AudioPolicyTest/Android.bp index 63292ce766f8..4624dfe70756 100644 --- a/media/tests/AudioPolicyTest/Android.bp +++ b/media/tests/AudioPolicyTest/Android.bp @@ -14,6 +14,7 @@ android_test { "androidx.test.ext.junit", "androidx.test.rules", "guava", + "guava-android-testlib", "hamcrest-library", "platform-test-annotations", ], diff --git a/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioMixUnitTests.java b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioMixUnitTests.java new file mode 100644 index 000000000000..bbca8823dde4 --- /dev/null +++ b/media/tests/AudioPolicyTest/src/com/android/audiopolicytest/AudioMixUnitTests.java @@ -0,0 +1,158 @@ +/* + * 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; + } +} |