From 17dc17828f0aedb037cf974daeb44645f390cb49 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Thu, 10 Jan 2019 19:00:05 -0800 Subject: [PATCH] Audio policy: uid device affinity deterministic rule When setting a uid device affinity, make the rules deterministic by applying an "exclude" rule on all mixes that don't reach the devices (existing), but also a "match" on the mixes that do (new). Bug: 111647296 Test: requires device with routing policy started by CarService Change-Id: I3bb844156ade75e4b9576c1e18200ca90ce26cf9 --- media/libaudioclient/AudioPolicy.cpp | 9 ++++++++- media/libaudioclient/include/media/AudioPolicy.h | 3 ++- .../common/managerdefinitions/src/AudioPolicyMix.cpp | 8 +++++--- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/media/libaudioclient/AudioPolicy.cpp b/media/libaudioclient/AudioPolicy.cpp index 9601d6dd87..3ab38cd259 100644 --- a/media/libaudioclient/AudioPolicy.cpp +++ b/media/libaudioclient/AudioPolicy.cpp @@ -143,11 +143,18 @@ status_t AudioMix::writeToParcel(Parcel *parcel) const return NO_ERROR; } -void AudioMix::excludeUid(uid_t uid) const { +void AudioMix::setExcludeUid(uid_t uid) const { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_UID; crit.mValue.mUid = uid; mCriteria.add(crit); } +void AudioMix::setMatchUid(uid_t uid) const { + AudioMixMatchCriterion crit; + crit.mRule = RULE_MATCH_UID; + crit.mValue.mUid = uid; + mCriteria.add(crit); +} + } // namespace android diff --git a/media/libaudioclient/include/media/AudioPolicy.h b/media/libaudioclient/include/media/AudioPolicy.h index 96e1235e9b..786fb9ab34 100644 --- a/media/libaudioclient/include/media/AudioPolicy.h +++ b/media/libaudioclient/include/media/AudioPolicy.h @@ -100,7 +100,8 @@ public: status_t readFromParcel(Parcel *parcel); status_t writeToParcel(Parcel *parcel) const; - void excludeUid(uid_t uid) const; + void setExcludeUid(uid_t uid) const; + void setMatchUid(uid_t uid) const; mutable Vector mCriteria; uint32_t mMixType; diff --git a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp index 776d98f850..4d0916ebd3 100644 --- a/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +++ b/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp @@ -360,10 +360,12 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, break; } } - if (!deviceMatch) { + if (deviceMatch) { + mix->setMatchUid(uid); + } else { // this mix doesn't go to one of the listed devices for the given uid, // modify its rules to exclude the uid - mix->excludeUid(uid); + mix->setExcludeUid(uid); } } @@ -382,7 +384,7 @@ status_t AudioPolicyMixCollection::removeUidDeviceAffinities(uid_t uid) { for (size_t j = 0; j < mix->mCriteria.size(); j++) { const uint32_t rule = mix->mCriteria[j].mRule; // is this rule affecting the uid? - if (rule == RULE_EXCLUDE_UID + if ((rule == RULE_EXCLUDE_UID || rule == RULE_MATCH_UID) && uid == mix->mCriteria[j].mValue.mUid) { foundUidRule = true; criteriaToRemove.push_back(j);