UID mixing rule support both RECORDERS and PLAYERS mix type

Export API in AudioMixingRule#Builder to allow application specify the mix type when using UID mixing rule.

Bug: 169964607
Test: atest com.google.android.gts.audio.AudioHostTest, manual testing
Change-Id: Icf7c83f280aeec7b11aa3bc43fb31657c863e7fd
This commit is contained in:
yuanjiahsu
2021-03-24 22:36:33 +08:00
parent ae4d48ebec
commit 00eb217258
2 changed files with 40 additions and 4 deletions

View File

@@ -291,7 +291,6 @@ public class AudioMixingRule {
final int match_rule = rule & ~RULE_EXCLUSION_MASK;
switch (match_rule) {
case RULE_MATCH_ATTRIBUTE_USAGE:
case RULE_MATCH_UID:
case RULE_MATCH_USERID:
return true;
default:
@@ -299,6 +298,16 @@ public class AudioMixingRule {
}
}
private static boolean isRecorderRule(int rule) {
final int match_rule = rule & ~RULE_EXCLUSION_MASK;
switch (match_rule) {
case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
return true;
default:
return false;
}
}
private static boolean isAudioAttributeRule(int match_rule) {
switch(match_rule) {
case RULE_MATCH_ATTRIBUTE_USAGE:
@@ -459,6 +468,23 @@ public class AudioMixingRule {
return this;
}
/**
* Set target mix type of the mixing rule.
*
* <p>Note: If the mix type was not specified, it will be decided automatically by mixing
* rule. For {@link #RULE_MATCH_UID}, the default type is {@link AudioMix#MIX_TYPE_PLAYERS}.
*
* @param mixType {@link AudioMix#MIX_TYPE_PLAYERS} or {@link AudioMix#MIX_TYPE_RECORDERS}
* @return the same Builder instance.
*
* @hide
*/
public @NonNull Builder setTargetMixType(int mixType) {
mTargetMixType = mixType;
Log.i("AudioMixingRule", "Builder setTargetMixType " + mixType);
return this;
}
/**
* Add or exclude a rule for the selection of which streams are mixed together.
* Does error checking on the parameters.
@@ -515,11 +541,15 @@ public class AudioMixingRule {
if (mTargetMixType == AudioMix.MIX_TYPE_INVALID) {
if (isPlayerRule(rule)) {
mTargetMixType = AudioMix.MIX_TYPE_PLAYERS;
} else {
} else if (isRecorderRule(rule)) {
mTargetMixType = AudioMix.MIX_TYPE_RECORDERS;
} else {
// For rules which are not player or recorder specific (e.g. RULE_MATCH_UID),
// the default mix type is MIX_TYPE_PLAYERS.
mTargetMixType = AudioMix.MIX_TYPE_PLAYERS;
}
} else if (((mTargetMixType == AudioMix.MIX_TYPE_PLAYERS) && !isPlayerRule(rule))
|| ((mTargetMixType == AudioMix.MIX_TYPE_RECORDERS) && isPlayerRule(rule)))
} else if ((isPlayerRule(rule) && (mTargetMixType != AudioMix.MIX_TYPE_PLAYERS))
|| (isRecorderRule(rule)) && (mTargetMixType != AudioMix.MIX_TYPE_RECORDERS))
{
throw new IllegalArgumentException("Incompatible rule for mix");
}

View File

@@ -100,6 +100,8 @@ public class AudioPolicyConfig implements Parcelable {
dest.writeBoolean(mix.getRule().allowPrivilegedMediaPlaybackCapture());
// write voice communication capture allowed flag
dest.writeBoolean(mix.getRule().voiceCommunicationCaptureAllowed());
// write specified mix type
dest.writeInt(mix.getRule().getTargetMixType());
// write mix rules
final ArrayList<AudioMixMatchCriterion> criteria = mix.getRule().getCriteria();
dest.writeInt(criteria.size());
@@ -134,6 +136,8 @@ public class AudioPolicyConfig implements Parcelable {
ruleBuilder.allowPrivilegedPlaybackCapture(in.readBoolean());
// read voice capture allowed flag
ruleBuilder.voiceCommunicationCaptureAllowed(in.readBoolean());
// read specified mix type
ruleBuilder.setTargetMixType(in.readInt());
// read mix rules
int nbRules = in.readInt();
for (int j = 0 ; j < nbRules ; j++) {
@@ -176,6 +180,8 @@ public class AudioPolicyConfig implements Parcelable {
textDump += " allow voice communication capture="
+ mix.getRule().voiceCommunicationCaptureAllowed() + "\n";
// write mix rules
textDump += " specified mix type="
+ mix.getRule().getTargetMixType() + "\n";
final ArrayList<AudioMixMatchCriterion> criteria = mix.getRule().getCriteria();
for (AudioMixMatchCriterion criterion : criteria) {
switch(criterion.mRule) {