Disallowed explicit routing for user device affinities conflicts
If user id device affinities for a particular device
disallows playback for a user id, then the explicit audio
routing (#setPreferredDevice) is disallowed. Otherwise,
the explicity routing is allowed.
Bug: 237733218
Test: atest audiopolicy_tests
Change-Id: I823e7e59e86303f80808d4953b52efad5da8e779
diff --git a/media/libaudioclient/AudioPolicy.cpp b/media/libaudioclient/AudioPolicy.cpp
index 6bb0cbe..750ce1c 100644
--- a/media/libaudioclient/AudioPolicy.cpp
+++ b/media/libaudioclient/AudioPolicy.cpp
@@ -203,9 +203,10 @@
return false;
}
-bool AudioMix::hasMatchUserIdRule() const {
+bool AudioMix::hasUserIdRule(bool match) const {
+ const uint32_t rule = match ? RULE_MATCH_USERID : RULE_EXCLUDE_USERID;
for (size_t i = 0; i < mCriteria.size(); i++) {
- if (mCriteria[i].mRule == RULE_MATCH_USERID) {
+ if (mCriteria[i].mRule == rule) {
return true;
}
}
diff --git a/media/libaudioclient/include/media/AudioPolicy.h b/media/libaudioclient/include/media/AudioPolicy.h
index 61f2069..3fd438e 100644
--- a/media/libaudioclient/include/media/AudioPolicy.h
+++ b/media/libaudioclient/include/media/AudioPolicy.h
@@ -61,7 +61,10 @@
#define MIX_ROUTE_FLAG_LOOP_BACK (0x1 << 1)
/** Loop back some audio while it is rendered */
#define MIX_ROUTE_FLAG_LOOP_BACK_AND_RENDER (MIX_ROUTE_FLAG_RENDER | MIX_ROUTE_FLAG_LOOP_BACK)
-#define MIX_ROUTE_FLAG_ALL (MIX_ROUTE_FLAG_RENDER | MIX_ROUTE_FLAG_LOOP_BACK)
+/** Control if audio routing disallows preferred device routing **/
+#define MIX_ROUTE_FLAG_DISALLOWS_PREFERRED_DEVICE (0x1 << 2)
+#define MIX_ROUTE_FLAG_ALL (MIX_ROUTE_FLAG_RENDER | MIX_ROUTE_FLAG_LOOP_BACK | \
+ MIX_ROUTE_FLAG_DISALLOWS_PREFERRED_DEVICE)
#define MAX_MIXES_PER_POLICY 10
#define MAX_CRITERIA_PER_MIX 20
@@ -112,9 +115,9 @@
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) */
- bool hasMatchUserIdRule() const;
- /** returns true if this mix can be used for uid-device affinity routing */
+ /** returns true if this mix has a rule to match or exclude (any userId) */
+ bool hasUserIdRule(bool match) const;
+ /** returns true if this mix has a rule for userId exclude (any userId) */
bool isDeviceAffinityCompatible() const;
std::vector<AudioMixMatchCriterion> mCriteria;
@@ -147,6 +150,11 @@
== MIX_ROUTE_FLAG_LOOP_BACK;
}
+static inline bool is_mix_disallows_preferred_device(uint32_t routeFlags) {
+ return (routeFlags & MIX_ROUTE_FLAG_DISALLOWS_PREFERRED_DEVICE)
+ == MIX_ROUTE_FLAG_DISALLOWS_PREFERRED_DEVICE;
+}
+
}; // namespace android
#endif // ANDROID_AUDIO_POLICY_H