AudioPolicy: fix AudioMixingRule parceling

Pass full AudioAttributes instead of just usage and capture
preset when parceling AudioMixMatchCriterion to carry AudioAttributes
flags properly from client to server.
Also fix condition in AudioMixingRule.isForCallRedirection().

Bug: 211435595
Test: atest CallAudioInterceptionTest
Test: atest AudioHostTest

Change-Id: I7d0583b867bf1112733dfa929fc72cf236d500c0
This commit is contained in:
Eric Laurent
2021-12-21 17:33:29 +01:00
parent c02266e2aa
commit 53f33b8bfa
2 changed files with 10 additions and 21 deletions

View File

@@ -145,10 +145,8 @@ public class AudioMixingRule {
final int match_rule = mRule & ~RULE_EXCLUSION_MASK;
switch (match_rule) {
case RULE_MATCH_ATTRIBUTE_USAGE:
dest.writeInt(mAttr.getSystemUsage());
break;
case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
dest.writeInt(mAttr.getCapturePreset());
mAttr.writeToParcel(dest, AudioAttributes.FLATTEN_TAGS/*flags*/);
break;
case RULE_MATCH_UID:
case RULE_MATCH_USERID:
@@ -266,12 +264,14 @@ public class AudioMixingRule {
public boolean isForCallRedirection() {
for (AudioMixMatchCriterion criterion : mCriteria) {
if (criterion.mAttr != null
&& (criterion.mRule == RULE_MATCH_ATTRIBUTE_USAGE
&& criterion.mAttr.getUsage() == AudioAttributes.USAGE_VOICE_COMMUNICATION)
&& criterion.mAttr.isForCallRedirection()
&& ((criterion.mRule == RULE_MATCH_ATTRIBUTE_USAGE
&& (criterion.mAttr.getUsage() == AudioAttributes.USAGE_VOICE_COMMUNICATION
|| criterion.mAttr.getUsage()
== AudioAttributes.USAGE_VOICE_COMMUNICATION_SIGNALLING))
|| (criterion.mRule == RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET
&& criterion.mAttr.getCapturePreset()
== MediaRecorder.AudioSource.VOICE_COMMUNICATION)
&& criterion.mAttr.isForCallRedirection()) {
&& (criterion.mAttr.getCapturePreset()
== MediaRecorder.AudioSource.VOICE_COMMUNICATION)))) {
return true;
}
}
@@ -713,19 +713,8 @@ public class AudioMixingRule {
Integer intProp = null;
switch (match_rule) {
case RULE_MATCH_ATTRIBUTE_USAGE:
int usage = in.readInt();
if (AudioAttributes.isSystemUsage(usage)) {
attr = new AudioAttributes.Builder()
.setSystemUsage(usage).build();
} else {
attr = new AudioAttributes.Builder()
.setUsage(usage).build();
}
break;
case RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET:
int preset = in.readInt();
attr = new AudioAttributes.Builder()
.setInternalCapturePreset(preset).build();
attr = AudioAttributes.CREATOR.createFromParcel(in);
break;
case RULE_MATCH_UID:
case RULE_MATCH_USERID:

View File

@@ -9771,7 +9771,7 @@ public class AudioService extends IAudioService.Stub
projection)) {
Slog.w(TAG, "Permission denied to register audio policy for pid "
+ Binder.getCallingPid() + " / uid " + Binder.getCallingUid()
+ ", need MODIFY_AUDIO_ROUTING or MediaProjection that can project audio");
+ ", need system permission or a MediaProjection that can project audio");
return null;
}