Loading media/libaudioclient/AudioPolicy.cpp +10 −9 Original line number Diff line number Diff line Loading @@ -91,10 +91,11 @@ status_t AudioMix::readFromParcel(Parcel *parcel) if (size > MAX_CRITERIA_PER_MIX) { size = MAX_CRITERIA_PER_MIX; } mCriteria.reserve(size); for (size_t i = 0; i < size; i++) { AudioMixMatchCriterion criterion; if (criterion.readFromParcel(parcel) == NO_ERROR) { mCriteria.add(criterion); mCriteria.push_back(criterion); } } return NO_ERROR; Loading Loading @@ -135,18 +136,18 @@ status_t AudioMix::writeToParcel(Parcel *parcel) const return NO_ERROR; } void AudioMix::setExcludeUid(uid_t uid) const { void AudioMix::setExcludeUid(uid_t uid) { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_UID; crit.mValue.mUid = uid; mCriteria.add(crit); mCriteria.push_back(crit); } void AudioMix::setMatchUid(uid_t uid) const { void AudioMix::setMatchUid(uid_t uid) { AudioMixMatchCriterion crit; crit.mRule = RULE_MATCH_UID; crit.mValue.mUid = uid; mCriteria.add(crit); mCriteria.push_back(crit); } bool AudioMix::hasUidRule(bool match, uid_t uid) const { Loading @@ -169,18 +170,18 @@ bool AudioMix::hasMatchUidRule() const { return false; } void AudioMix::setExcludeUserId(int userId) const { void AudioMix::setExcludeUserId(int userId) { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); mCriteria.push_back(crit); } void AudioMix::setMatchUserId(int userId) const { void AudioMix::setMatchUserId(int userId) { AudioMixMatchCriterion crit; crit.mRule = RULE_MATCH_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); mCriteria.push_back(crit); } bool AudioMix::hasUserIdRule(bool match, int userId) const { Loading media/libaudioclient/include/media/AudioPolicy.h +8 −7 Original line number Diff line number Diff line Loading @@ -88,23 +88,24 @@ public: static const uint32_t kCbFlagNotifyActivity = 0x1; AudioMix() {} AudioMix(Vector<AudioMixMatchCriterion> criteria, uint32_t mixType, audio_config_t format, uint32_t routeFlags, String8 registrationId, uint32_t flags) : AudioMix(const std::vector<AudioMixMatchCriterion> &criteria, uint32_t mixType, audio_config_t format, uint32_t routeFlags,const String8 ®istrationId, uint32_t flags) : mCriteria(criteria), mMixType(mixType), mFormat(format), mRouteFlags(routeFlags), mDeviceAddress(registrationId), mCbFlags(flags){} status_t readFromParcel(Parcel *parcel); status_t writeToParcel(Parcel *parcel) const; void setExcludeUid(uid_t uid) const; void setMatchUid(uid_t uid) const; void setExcludeUid(uid_t uid); void setMatchUid(uid_t uid); /** returns true if this mix has a rule to match or exclude the given uid */ bool hasUidRule(bool match, uid_t uid) const; /** returns true if this mix has a rule for uid match (any uid) */ bool hasMatchUidRule() const; void setExcludeUserId(int userId) const; void setMatchUserId(int userId) const; void setExcludeUserId(int userId); void setMatchUserId(int userId); /** returns true if this mix has a rule to match or exclude the given userId */ bool hasUserIdRule(bool match, int userId) const; /** returns true if this mix has a rule for userId match (any userId) */ Loading @@ -112,7 +113,7 @@ public: /** returns true if this mix can be used for uid-device affinity routing */ bool isDeviceAffinityCompatible() const; mutable Vector<AudioMixMatchCriterion> mCriteria; std::vector<AudioMixMatchCriterion> mCriteria; uint32_t mMixType; audio_config_t mFormat; uint32_t mRouteFlags; Loading media/libaudioclient/tests/audioclient_serialization_tests.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -189,12 +189,13 @@ TEST_F(SerializationTest, AudioVolumeGroupBinderization) { TEST_F(SerializationTest, AudioMixBinderization) { for (int j = 0; j < 512; j++) { const std::string msg{"Test AMBinderization for seed::" + std::to_string(mSeed)}; Vector<AudioMixMatchCriterion> criteria; std::vector<AudioMixMatchCriterion> criteria; criteria.reserve(16); for (int i = 0; i < 16; i++) { AudioMixMatchCriterion ammc{kUsages[rand() % kUsages.size()], kInputSources[rand() % kInputSources.size()], kMixMatchRules[rand() % kMixMatchRules.size()]}; criteria.add(ammc); criteria.push_back(ammc); } audio_config_t config{}; config.sample_rate = 48000; Loading services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h +1 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public: status_t getAudioPolicyMix(audio_devices_t deviceType, const String8& address, sp<AudioPolicyMix> &policyMix) const; status_t registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc); status_t registerMix(const AudioMix& mix, const sp<SwAudioOutputDescriptor>& desc); status_t unregisterMix(const AudioMix& mix); Loading services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +31 −42 Original line number Diff line number Diff line Loading @@ -26,6 +26,16 @@ namespace android { namespace { template <typename Predicate> void EraseCriteriaIf(std::vector<AudioMixMatchCriterion>& v, const Predicate& predicate) { v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end()); } } // namespace void AudioPolicyMix::dump(String8 *dst, int spaces, int index) const { dst->appendFormat("%*sAudio Policy Mix %d (%p):\n", spaces, "", index + 1, this); Loading Loading @@ -78,7 +88,8 @@ void AudioPolicyMix::dump(String8 *dst, int spaces, int index) const } } status_t AudioPolicyMixCollection::registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc) status_t AudioPolicyMixCollection::registerMix(const AudioMix& mix, const sp<SwAudioOutputDescriptor>& desc) { for (size_t i = 0; i < size(); i++) { const sp<AudioPolicyMix>& registeredMix = itemAt(i); Loading @@ -89,12 +100,12 @@ status_t AudioPolicyMixCollection::registerMix(AudioMix mix, sp<SwAudioOutputDes return BAD_VALUE; } } sp<AudioPolicyMix> policyMix = new AudioPolicyMix(mix); sp<AudioPolicyMix> policyMix = sp<AudioPolicyMix>::make(mix); add(policyMix); ALOGD("registerMix(): adding mix for dev=0x%x addr=%s", policyMix->mDeviceType, policyMix->mDeviceAddress.string()); if (desc != 0) { if (desc != nullptr) { desc->mPolicyMix = policyMix; policyMix->setOutput(desc); } Loading Loading @@ -501,7 +512,7 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, // AND it doesn't have a "match uid" rule // THEN add a rule to exclude the uid for (size_t i = 0; i < size(); i++) { const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -531,27 +542,16 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, status_t AudioPolicyMixCollection::removeUidDeviceAffinities(uid_t uid) { // for each player mix: remove existing rules that match or exclude this uid for (size_t i = 0; i < size(); i++) { bool foundUidRule = false; const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } std::vector<size_t> criteriaToRemove; for (size_t j = 0; j < mix->mCriteria.size(); j++) { const uint32_t rule = mix->mCriteria[j].mRule; // is this rule excluding the uid? (not considering uid match rules // as those are not used for uid-device affinity) if (rule == RULE_EXCLUDE_UID && uid == mix->mCriteria[j].mValue.mUid) { foundUidRule = true; criteriaToRemove.insert(criteriaToRemove.begin(), j); } } if (foundUidRule) { for (size_t j = 0; j < criteriaToRemove.size(); j++) { mix->mCriteria.removeAt(criteriaToRemove[j]); } } EraseCriteriaIf(mix->mCriteria, [uid](const AudioMixMatchCriterion& c) { return c.mRule == RULE_EXCLUDE_UID && c.mValue.mUid == uid; }); } return NO_ERROR; } Loading Loading @@ -586,7 +586,7 @@ status_t AudioPolicyMixCollection::setUserIdDeviceAffinities(int userId, // "match userId" rule for this userId, return an error // (adding a userId-device affinity would result in contradictory rules) for (size_t i = 0; i < size(); i++) { const AudioPolicyMix* mix = itemAt(i).get(); AudioPolicyMix* mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading @@ -603,7 +603,7 @@ status_t AudioPolicyMixCollection::setUserIdDeviceAffinities(int userId, // AND it doesn't have a "match userId" rule // THEN add a rule to exclude the userId for (size_t i = 0; i < size(); i++) { const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -633,27 +633,16 @@ status_t AudioPolicyMixCollection::setUserIdDeviceAffinities(int userId, status_t AudioPolicyMixCollection::removeUserIdDeviceAffinities(int userId) { // for each player mix: remove existing rules that match or exclude this userId for (size_t i = 0; i < size(); i++) { bool foundUserIdRule = false; const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } std::vector<size_t> criteriaToRemove; for (size_t j = 0; j < mix->mCriteria.size(); j++) { const uint32_t rule = mix->mCriteria[j].mRule; // is this rule excluding the userId? (not considering userId match rules // as those are not used for userId-device affinity) if (rule == RULE_EXCLUDE_USERID && userId == mix->mCriteria[j].mValue.mUserId) { foundUserIdRule = true; criteriaToRemove.insert(criteriaToRemove.begin(), j); } } if (foundUserIdRule) { for (size_t j = 0; j < criteriaToRemove.size(); j++) { mix->mCriteria.removeAt(criteriaToRemove[j]); } } EraseCriteriaIf(mix->mCriteria, [userId](const AudioMixMatchCriterion& c) { return c.mRule == RULE_EXCLUDE_USERID && c.mValue.mUserId == userId; }); } return NO_ERROR; } Loading Loading
media/libaudioclient/AudioPolicy.cpp +10 −9 Original line number Diff line number Diff line Loading @@ -91,10 +91,11 @@ status_t AudioMix::readFromParcel(Parcel *parcel) if (size > MAX_CRITERIA_PER_MIX) { size = MAX_CRITERIA_PER_MIX; } mCriteria.reserve(size); for (size_t i = 0; i < size; i++) { AudioMixMatchCriterion criterion; if (criterion.readFromParcel(parcel) == NO_ERROR) { mCriteria.add(criterion); mCriteria.push_back(criterion); } } return NO_ERROR; Loading Loading @@ -135,18 +136,18 @@ status_t AudioMix::writeToParcel(Parcel *parcel) const return NO_ERROR; } void AudioMix::setExcludeUid(uid_t uid) const { void AudioMix::setExcludeUid(uid_t uid) { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_UID; crit.mValue.mUid = uid; mCriteria.add(crit); mCriteria.push_back(crit); } void AudioMix::setMatchUid(uid_t uid) const { void AudioMix::setMatchUid(uid_t uid) { AudioMixMatchCriterion crit; crit.mRule = RULE_MATCH_UID; crit.mValue.mUid = uid; mCriteria.add(crit); mCriteria.push_back(crit); } bool AudioMix::hasUidRule(bool match, uid_t uid) const { Loading @@ -169,18 +170,18 @@ bool AudioMix::hasMatchUidRule() const { return false; } void AudioMix::setExcludeUserId(int userId) const { void AudioMix::setExcludeUserId(int userId) { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); mCriteria.push_back(crit); } void AudioMix::setMatchUserId(int userId) const { void AudioMix::setMatchUserId(int userId) { AudioMixMatchCriterion crit; crit.mRule = RULE_MATCH_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); mCriteria.push_back(crit); } bool AudioMix::hasUserIdRule(bool match, int userId) const { Loading
media/libaudioclient/include/media/AudioPolicy.h +8 −7 Original line number Diff line number Diff line Loading @@ -88,23 +88,24 @@ public: static const uint32_t kCbFlagNotifyActivity = 0x1; AudioMix() {} AudioMix(Vector<AudioMixMatchCriterion> criteria, uint32_t mixType, audio_config_t format, uint32_t routeFlags, String8 registrationId, uint32_t flags) : AudioMix(const std::vector<AudioMixMatchCriterion> &criteria, uint32_t mixType, audio_config_t format, uint32_t routeFlags,const String8 ®istrationId, uint32_t flags) : mCriteria(criteria), mMixType(mixType), mFormat(format), mRouteFlags(routeFlags), mDeviceAddress(registrationId), mCbFlags(flags){} status_t readFromParcel(Parcel *parcel); status_t writeToParcel(Parcel *parcel) const; void setExcludeUid(uid_t uid) const; void setMatchUid(uid_t uid) const; void setExcludeUid(uid_t uid); void setMatchUid(uid_t uid); /** returns true if this mix has a rule to match or exclude the given uid */ bool hasUidRule(bool match, uid_t uid) const; /** returns true if this mix has a rule for uid match (any uid) */ bool hasMatchUidRule() const; void setExcludeUserId(int userId) const; void setMatchUserId(int userId) const; void setExcludeUserId(int userId); void setMatchUserId(int userId); /** returns true if this mix has a rule to match or exclude the given userId */ bool hasUserIdRule(bool match, int userId) const; /** returns true if this mix has a rule for userId match (any userId) */ Loading @@ -112,7 +113,7 @@ public: /** returns true if this mix can be used for uid-device affinity routing */ bool isDeviceAffinityCompatible() const; mutable Vector<AudioMixMatchCriterion> mCriteria; std::vector<AudioMixMatchCriterion> mCriteria; uint32_t mMixType; audio_config_t mFormat; uint32_t mRouteFlags; Loading
media/libaudioclient/tests/audioclient_serialization_tests.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -189,12 +189,13 @@ TEST_F(SerializationTest, AudioVolumeGroupBinderization) { TEST_F(SerializationTest, AudioMixBinderization) { for (int j = 0; j < 512; j++) { const std::string msg{"Test AMBinderization for seed::" + std::to_string(mSeed)}; Vector<AudioMixMatchCriterion> criteria; std::vector<AudioMixMatchCriterion> criteria; criteria.reserve(16); for (int i = 0; i < 16; i++) { AudioMixMatchCriterion ammc{kUsages[rand() % kUsages.size()], kInputSources[rand() % kInputSources.size()], kMixMatchRules[rand() % kMixMatchRules.size()]}; criteria.add(ammc); criteria.push_back(ammc); } audio_config_t config{}; config.sample_rate = 48000; Loading
services/audiopolicy/common/managerdefinitions/include/AudioPolicyMix.h +1 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public: status_t getAudioPolicyMix(audio_devices_t deviceType, const String8& address, sp<AudioPolicyMix> &policyMix) const; status_t registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc); status_t registerMix(const AudioMix& mix, const sp<SwAudioOutputDescriptor>& desc); status_t unregisterMix(const AudioMix& mix); Loading
services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +31 −42 Original line number Diff line number Diff line Loading @@ -26,6 +26,16 @@ namespace android { namespace { template <typename Predicate> void EraseCriteriaIf(std::vector<AudioMixMatchCriterion>& v, const Predicate& predicate) { v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end()); } } // namespace void AudioPolicyMix::dump(String8 *dst, int spaces, int index) const { dst->appendFormat("%*sAudio Policy Mix %d (%p):\n", spaces, "", index + 1, this); Loading Loading @@ -78,7 +88,8 @@ void AudioPolicyMix::dump(String8 *dst, int spaces, int index) const } } status_t AudioPolicyMixCollection::registerMix(AudioMix mix, sp<SwAudioOutputDescriptor> desc) status_t AudioPolicyMixCollection::registerMix(const AudioMix& mix, const sp<SwAudioOutputDescriptor>& desc) { for (size_t i = 0; i < size(); i++) { const sp<AudioPolicyMix>& registeredMix = itemAt(i); Loading @@ -89,12 +100,12 @@ status_t AudioPolicyMixCollection::registerMix(AudioMix mix, sp<SwAudioOutputDes return BAD_VALUE; } } sp<AudioPolicyMix> policyMix = new AudioPolicyMix(mix); sp<AudioPolicyMix> policyMix = sp<AudioPolicyMix>::make(mix); add(policyMix); ALOGD("registerMix(): adding mix for dev=0x%x addr=%s", policyMix->mDeviceType, policyMix->mDeviceAddress.string()); if (desc != 0) { if (desc != nullptr) { desc->mPolicyMix = policyMix; policyMix->setOutput(desc); } Loading Loading @@ -501,7 +512,7 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, // AND it doesn't have a "match uid" rule // THEN add a rule to exclude the uid for (size_t i = 0; i < size(); i++) { const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -531,27 +542,16 @@ status_t AudioPolicyMixCollection::setUidDeviceAffinities(uid_t uid, status_t AudioPolicyMixCollection::removeUidDeviceAffinities(uid_t uid) { // for each player mix: remove existing rules that match or exclude this uid for (size_t i = 0; i < size(); i++) { bool foundUidRule = false; const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } std::vector<size_t> criteriaToRemove; for (size_t j = 0; j < mix->mCriteria.size(); j++) { const uint32_t rule = mix->mCriteria[j].mRule; // is this rule excluding the uid? (not considering uid match rules // as those are not used for uid-device affinity) if (rule == RULE_EXCLUDE_UID && uid == mix->mCriteria[j].mValue.mUid) { foundUidRule = true; criteriaToRemove.insert(criteriaToRemove.begin(), j); } } if (foundUidRule) { for (size_t j = 0; j < criteriaToRemove.size(); j++) { mix->mCriteria.removeAt(criteriaToRemove[j]); } } EraseCriteriaIf(mix->mCriteria, [uid](const AudioMixMatchCriterion& c) { return c.mRule == RULE_EXCLUDE_UID && c.mValue.mUid == uid; }); } return NO_ERROR; } Loading Loading @@ -586,7 +586,7 @@ status_t AudioPolicyMixCollection::setUserIdDeviceAffinities(int userId, // "match userId" rule for this userId, return an error // (adding a userId-device affinity would result in contradictory rules) for (size_t i = 0; i < size(); i++) { const AudioPolicyMix* mix = itemAt(i).get(); AudioPolicyMix* mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading @@ -603,7 +603,7 @@ status_t AudioPolicyMixCollection::setUserIdDeviceAffinities(int userId, // AND it doesn't have a "match userId" rule // THEN add a rule to exclude the userId for (size_t i = 0; i < size(); i++) { const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } Loading Loading @@ -633,27 +633,16 @@ status_t AudioPolicyMixCollection::setUserIdDeviceAffinities(int userId, status_t AudioPolicyMixCollection::removeUserIdDeviceAffinities(int userId) { // for each player mix: remove existing rules that match or exclude this userId for (size_t i = 0; i < size(); i++) { bool foundUserIdRule = false; const AudioPolicyMix *mix = itemAt(i).get(); AudioPolicyMix *mix = itemAt(i).get(); if (!mix->isDeviceAffinityCompatible()) { continue; } std::vector<size_t> criteriaToRemove; for (size_t j = 0; j < mix->mCriteria.size(); j++) { const uint32_t rule = mix->mCriteria[j].mRule; // is this rule excluding the userId? (not considering userId match rules // as those are not used for userId-device affinity) if (rule == RULE_EXCLUDE_USERID && userId == mix->mCriteria[j].mValue.mUserId) { foundUserIdRule = true; criteriaToRemove.insert(criteriaToRemove.begin(), j); } } if (foundUserIdRule) { for (size_t j = 0; j < criteriaToRemove.size(); j++) { mix->mCriteria.removeAt(criteriaToRemove[j]); } } EraseCriteriaIf(mix->mCriteria, [userId](const AudioMixMatchCriterion& c) { return c.mRule == RULE_EXCLUDE_USERID && c.mValue.mUserId == userId; }); } return NO_ERROR; } Loading