From 53f33b8bfa9f27ab7f2c9843622c5f545878b227 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 21 Dec 2021 17:33:29 +0100 Subject: [PATCH] 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 --- .../media/audiopolicy/AudioMixingRule.java | 29 ++++++------------- .../android/server/audio/AudioService.java | 2 +- 2 files changed, 10 insertions(+), 21 deletions(-) diff --git a/media/java/android/media/audiopolicy/AudioMixingRule.java b/media/java/android/media/audiopolicy/AudioMixingRule.java index c91275941200c..1f89f9990e753 100644 --- a/media/java/android/media/audiopolicy/AudioMixingRule.java +++ b/media/java/android/media/audiopolicy/AudioMixingRule.java @@ -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: diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 8615393dbfec1..902cdb932cdb4 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -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; }