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;
}
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

@ -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<AudioMixMatchCriterion> mCriteria;
uint32_t mMixType;

@ -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);

Loading…
Cancel
Save