Merge "Allow to specify remote submix device as target for RENDER AudioMix." into udc-dev am: fa12147381

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23692131

Change-Id: I691bfaa79a8b05033b30038ff054b425e74e31f0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Ján Sebechlebský
2023-06-19 08:55:18 +00:00
committed by Automerger Merge Worker
2 changed files with 87 additions and 0 deletions

View File

@@ -455,6 +455,11 @@ public class AudioMix {
if (mRule.getTargetMixType() != AudioMix.MIX_TYPE_PLAYERS) {
throw new IllegalArgumentException("Unsupported device on non-playback mix");
}
} else if (mDeviceSystemType == AudioSystem.DEVICE_OUT_REMOTE_SUBMIX) {
if (mRule.getTargetMixType() != AudioMix.MIX_TYPE_PLAYERS) {
throw new IllegalArgumentException(
"DEVICE_OUT_REMOTE_SUBMIX device is not supported on non-playback mix");
}
} else {
if ((mRouteFlags & ROUTE_FLAG_SUPPORTED) == ROUTE_FLAG_RENDER) {
throw new IllegalArgumentException(

View File

@@ -24,7 +24,11 @@ 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 static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThrows;
import android.media.AudioFormat;
import android.media.AudioSystem;
import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioMixingRule;
import android.media.audiopolicy.AudioPolicyConfig;
@@ -145,6 +149,84 @@ public class AudioMixUnitTests {
equalsTester.testEquals();
}
@Test
public void buildRenderToRemoteSubmix_success() {
final String deviceAddress = "address";
final AudioMix audioMix = 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_RENDER)
.setDevice(AudioSystem.DEVICE_OUT_REMOTE_SUBMIX, /*address=*/deviceAddress).build();
assertEquals(deviceAddress, audioMix.getRegistration());
assertEquals(OUTPUT_FORMAT_MONO_16KHZ_PCM, audioMix.getFormat());
assertEquals(AudioMix.ROUTE_FLAG_RENDER, audioMix.getRouteFlags());
}
@Test
public void buildLoopbackAndRenderToRemoteSubmix_success() {
final String deviceAddress = "address";
final AudioMix audioMix = 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_RENDER)
.setDevice(AudioSystem.DEVICE_OUT_REMOTE_SUBMIX, /*address=*/deviceAddress).build();
assertEquals(deviceAddress, audioMix.getRegistration());
assertEquals(OUTPUT_FORMAT_MONO_16KHZ_PCM, audioMix.getFormat());
assertEquals(AudioMix.ROUTE_FLAG_LOOP_BACK_RENDER, audioMix.getRouteFlags());
}
@Test
public void buildRenderToSpeaker_success() {
final AudioMix audioMix = 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_RENDER)
.setDevice(AudioSystem.DEVICE_OUT_SPEAKER, /*address=*/"").build();
assertEquals(OUTPUT_FORMAT_MONO_16KHZ_PCM, audioMix.getFormat());
assertEquals(AudioMix.ROUTE_FLAG_RENDER, audioMix.getRouteFlags());
}
@Test
public void buildLoopbackForPlayerMix_success() {
final AudioMix audioMix = 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();
assertEquals(OUTPUT_FORMAT_MONO_16KHZ_PCM, audioMix.getFormat());
assertEquals(AudioMix.ROUTE_FLAG_LOOP_BACK, audioMix.getRouteFlags());
}
@Test
public void buildLoopbackWithDevice_throws() {
assertThrows(IllegalArgumentException.class, () -> 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)
.setDevice(AudioSystem.DEVICE_OUT_SPEAKER, /*address=*/"").build());
}
@Test
public void buildRenderWithoutDevice_throws() {
assertThrows(IllegalArgumentException.class, () -> 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_RENDER).build());
}
private static AudioMix writeToAndFromParcel(AudioMix audioMix) {
AudioPolicyConfig apc = new AudioPolicyConfig(new ArrayList<>(List.of(audioMix)));
Parcel parcel = Parcel.obtain();