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
gugelfrei
Jean-Michel Trivi 6 years ago
parent 33d6adcebb
commit 17dc17828f

@ -143,11 +143,18 @@ status_t AudioMix::writeToParcel(Parcel *parcel) const
return NO_ERROR; return NO_ERROR;
} }
void AudioMix::excludeUid(uid_t uid) const { void AudioMix::setExcludeUid(uid_t uid) const {
AudioMixMatchCriterion crit; AudioMixMatchCriterion crit;
crit.mRule = RULE_EXCLUDE_UID; crit.mRule = RULE_EXCLUDE_UID;
crit.mValue.mUid = uid; crit.mValue.mUid = uid;
mCriteria.add(crit); 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 } // namespace android

@ -100,7 +100,8 @@ public:
status_t readFromParcel(Parcel *parcel); status_t readFromParcel(Parcel *parcel);
status_t writeToParcel(Parcel *parcel) const; 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<AudioMixMatchCriterion> mCriteria; mutable Vector<AudioMixMatchCriterion> mCriteria;
uint32_t mMixType; uint32_t mMixType;

@ -360,10 +360,12 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid,
break; break;
} }
} }
if (!deviceMatch) { if (deviceMatch) {
mix->setMatchUid(uid);
} else {
// this mix doesn't go to one of the listed devices for the given uid, // this mix doesn't go to one of the listed devices for the given uid,
// modify its rules to exclude the 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++) { for (size_t j = 0; j < mix->mCriteria.size(); j++) {
const uint32_t rule = mix->mCriteria[j].mRule; const uint32_t rule = mix->mCriteria[j].mRule;
// is this rule affecting the uid? // 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) { && uid == mix->mCriteria[j].mValue.mUid) {
foundUidRule = true; foundUidRule = true;
criteriaToRemove.push_back(j); criteriaToRemove.push_back(j);

Loading…
Cancel
Save