Loading media/libaudioclient/AudioPolicy.cpp +38 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,10 @@ status_t AudioMixMatchCriterion::readFromParcel(Parcel *parcel) case RULE_EXCLUDE_UID: mValue.mUid = (uid_t) parcel->readInt32(); break; case RULE_MATCH_USERID: case RULE_EXCLUDE_USERID: mValue.mUserId = (int) parcel->readInt32(); break; default: ALOGE("Trying to build AudioMixMatchCriterion from unknown rule %d", mRule); return BAD_VALUE; Loading Loading @@ -163,6 +167,40 @@ bool AudioMix::hasMatchUidRule() const { return false; } void AudioMix::setExcludeUserId(int userId) const { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); } void AudioMix::setMatchUserId(int userId) const { AudioMixMatchCriterion crit; crit.mRule = RULE_MATCH_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); } bool AudioMix::hasUserIdRule(bool match, int userId) 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 && mCriteria[i].mValue.mUserId == userId) { return true; } } return false; } bool AudioMix::hasMatchUserIdRule() const { for (size_t i = 0; i < mCriteria.size(); i++) { if (mCriteria[i].mRule == RULE_MATCH_USERID) { return true; } } return false; } bool AudioMix::isDeviceAffinityCompatible() const { return ((mMixType == MIX_TYPE_PLAYERS) && (mRouteFlags == MIX_ROUTE_FLAG_RENDER)); Loading media/libaudioclient/AudioSystem.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -1359,6 +1359,21 @@ status_t AudioSystem::removeUidDeviceAffinities(uid_t uid) { return aps->removeUidDeviceAffinities(uid); } status_t AudioSystem::setUserIdDeviceAffinities(int userId, const Vector<AudioDeviceTypeAddr>& devices) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->setUserIdDeviceAffinities(userId, devices); } status_t AudioSystem::removeUserIdDeviceAffinities(int userId) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->removeUserIdDeviceAffinities(userId); } status_t AudioSystem::startAudioSource(const struct audio_port_config *source, const audio_attributes_t *attributes, audio_port_handle_t *portId) Loading media/libaudioclient/IAudioPolicyService.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,8 @@ enum { IS_HAPTIC_PLAYBACK_SUPPORTED, SET_UID_DEVICE_AFFINITY, REMOVE_UID_DEVICE_AFFINITY, SET_USERID_DEVICE_AFFINITY, REMOVE_USERID_DEVICE_AFFINITY, GET_OFFLOAD_FORMATS_A2DP, LIST_AUDIO_PRODUCT_STRATEGIES, GET_STRATEGY_FOR_ATTRIBUTES, Loading Loading @@ -1197,6 +1199,52 @@ public: return status; } virtual status_t setUserIdDeviceAffinities(int userId, const Vector<AudioDeviceTypeAddr>& devices) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32((int32_t) userId); size_t size = devices.size(); size_t sizePosition = data.dataPosition(); data.writeInt32((int32_t) size); size_t finalSize = size; for (size_t i = 0; i < size; i++) { size_t position = data.dataPosition(); if (devices[i].writeToParcel(&data) != NO_ERROR) { data.setDataPosition(position); finalSize--; } } if (size != finalSize) { size_t position = data.dataPosition(); data.setDataPosition(sizePosition); data.writeInt32(finalSize); data.setDataPosition(position); } status_t status = remote()->transact(SET_USERID_DEVICE_AFFINITY, data, &reply); if (status == NO_ERROR) { status = (status_t)reply.readInt32(); } return status; } virtual status_t removeUserIdDeviceAffinities(int userId) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32((int32_t) userId); status_t status = remote()->transact(REMOVE_USERID_DEVICE_AFFINITY, data, &reply); if (status == NO_ERROR) { status = (status_t) reply.readInt32(); } return status; } virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies) { Parcel data, reply; Loading Loading @@ -1457,6 +1505,8 @@ status_t BnAudioPolicyService::onTransact( case SET_A11Y_SERVICES_UIDS: case SET_UID_DEVICE_AFFINITY: case REMOVE_UID_DEVICE_AFFINITY: case SET_USERID_DEVICE_AFFINITY: case REMOVE_USERID_DEVICE_AFFINITY: case GET_OFFLOAD_FORMATS_A2DP: case LIST_AUDIO_VOLUME_GROUPS: case GET_VOLUME_GROUP_FOR_ATTRIBUTES: Loading Loading @@ -2379,6 +2429,30 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } case SET_USERID_DEVICE_AFFINITY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); const int userId = (int) data.readInt32(); Vector<AudioDeviceTypeAddr> devices; size_t size = (size_t)data.readInt32(); for (size_t i = 0; i < size; i++) { AudioDeviceTypeAddr device; if (device.readFromParcel((Parcel*)&data) == NO_ERROR) { devices.add(device); } } status_t status = setUserIdDeviceAffinities(userId, devices); reply->writeInt32(status); return NO_ERROR; } case REMOVE_USERID_DEVICE_AFFINITY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); const int userId = (int) data.readInt32(); status_t status = removeUserIdDeviceAffinities(userId); reply->writeInt32(status); return NO_ERROR; } case LIST_AUDIO_PRODUCT_STRATEGIES: { CHECK_INTERFACE(IAudioPolicyService, data, reply); AudioProductStrategyVector strategies; Loading media/libaudioclient/include/media/AudioPolicy.h +11 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <system/audio_policy.h> #include <utils/String8.h> #include <utils/Vector.h> #include <cutils/multiuser.h> namespace android { Loading @@ -33,10 +34,12 @@ namespace android { #define RULE_MATCH_ATTRIBUTE_USAGE 0x1 #define RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET (0x1 << 1) #define RULE_MATCH_UID (0x1 << 2) #define RULE_MATCH_USERID (0x1 << 3) #define RULE_EXCLUDE_ATTRIBUTE_USAGE (RULE_EXCLUSION_MASK|RULE_MATCH_ATTRIBUTE_USAGE) #define RULE_EXCLUDE_ATTRIBUTE_CAPTURE_PRESET \ (RULE_EXCLUSION_MASK|RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET) #define RULE_EXCLUDE_UID (RULE_EXCLUSION_MASK|RULE_MATCH_UID) #define RULE_EXCLUDE_USERID (RULE_EXCLUSION_MASK|RULE_MATCH_USERID) #define MIX_TYPE_INVALID (-1) #define MIX_TYPE_PLAYERS 0 Loading Loading @@ -74,6 +77,7 @@ public: audio_usage_t mUsage; audio_source_t mSource; uid_t mUid; int mUserId; } mValue; uint32_t mRule; }; Loading @@ -99,6 +103,13 @@ public: 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; /** 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 */ bool isDeviceAffinityCompatible() const; Loading media/libaudioclient/include/media/AudioSystem.h +4 −0 Original line number Diff line number Diff line Loading @@ -364,6 +364,10 @@ public: static status_t removeUidDeviceAffinities(uid_t uid); static status_t setUserIdDeviceAffinities(int userId, const Vector<AudioDeviceTypeAddr>& devices); static status_t removeUserIdDeviceAffinities(int userId); static status_t startAudioSource(const struct audio_port_config *source, const audio_attributes_t *attributes, audio_port_handle_t *portId); Loading Loading
media/libaudioclient/AudioPolicy.cpp +38 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,10 @@ status_t AudioMixMatchCriterion::readFromParcel(Parcel *parcel) case RULE_EXCLUDE_UID: mValue.mUid = (uid_t) parcel->readInt32(); break; case RULE_MATCH_USERID: case RULE_EXCLUDE_USERID: mValue.mUserId = (int) parcel->readInt32(); break; default: ALOGE("Trying to build AudioMixMatchCriterion from unknown rule %d", mRule); return BAD_VALUE; Loading Loading @@ -163,6 +167,40 @@ bool AudioMix::hasMatchUidRule() const { return false; } void AudioMix::setExcludeUserId(int userId) const { AudioMixMatchCriterion crit; crit.mRule = RULE_EXCLUDE_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); } void AudioMix::setMatchUserId(int userId) const { AudioMixMatchCriterion crit; crit.mRule = RULE_MATCH_USERID; crit.mValue.mUserId = userId; mCriteria.add(crit); } bool AudioMix::hasUserIdRule(bool match, int userId) 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 && mCriteria[i].mValue.mUserId == userId) { return true; } } return false; } bool AudioMix::hasMatchUserIdRule() const { for (size_t i = 0; i < mCriteria.size(); i++) { if (mCriteria[i].mRule == RULE_MATCH_USERID) { return true; } } return false; } bool AudioMix::isDeviceAffinityCompatible() const { return ((mMixType == MIX_TYPE_PLAYERS) && (mRouteFlags == MIX_ROUTE_FLAG_RENDER)); Loading
media/libaudioclient/AudioSystem.cpp +15 −0 Original line number Diff line number Diff line Loading @@ -1359,6 +1359,21 @@ status_t AudioSystem::removeUidDeviceAffinities(uid_t uid) { return aps->removeUidDeviceAffinities(uid); } status_t AudioSystem::setUserIdDeviceAffinities(int userId, const Vector<AudioDeviceTypeAddr>& devices) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->setUserIdDeviceAffinities(userId, devices); } status_t AudioSystem::removeUserIdDeviceAffinities(int userId) { const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service(); if (aps == 0) return PERMISSION_DENIED; return aps->removeUserIdDeviceAffinities(userId); } status_t AudioSystem::startAudioSource(const struct audio_port_config *source, const audio_attributes_t *attributes, audio_port_handle_t *portId) Loading
media/libaudioclient/IAudioPolicyService.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -97,6 +97,8 @@ enum { IS_HAPTIC_PLAYBACK_SUPPORTED, SET_UID_DEVICE_AFFINITY, REMOVE_UID_DEVICE_AFFINITY, SET_USERID_DEVICE_AFFINITY, REMOVE_USERID_DEVICE_AFFINITY, GET_OFFLOAD_FORMATS_A2DP, LIST_AUDIO_PRODUCT_STRATEGIES, GET_STRATEGY_FOR_ATTRIBUTES, Loading Loading @@ -1197,6 +1199,52 @@ public: return status; } virtual status_t setUserIdDeviceAffinities(int userId, const Vector<AudioDeviceTypeAddr>& devices) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32((int32_t) userId); size_t size = devices.size(); size_t sizePosition = data.dataPosition(); data.writeInt32((int32_t) size); size_t finalSize = size; for (size_t i = 0; i < size; i++) { size_t position = data.dataPosition(); if (devices[i].writeToParcel(&data) != NO_ERROR) { data.setDataPosition(position); finalSize--; } } if (size != finalSize) { size_t position = data.dataPosition(); data.setDataPosition(sizePosition); data.writeInt32(finalSize); data.setDataPosition(position); } status_t status = remote()->transact(SET_USERID_DEVICE_AFFINITY, data, &reply); if (status == NO_ERROR) { status = (status_t)reply.readInt32(); } return status; } virtual status_t removeUserIdDeviceAffinities(int userId) { Parcel data, reply; data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); data.writeInt32((int32_t) userId); status_t status = remote()->transact(REMOVE_USERID_DEVICE_AFFINITY, data, &reply); if (status == NO_ERROR) { status = (status_t) reply.readInt32(); } return status; } virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies) { Parcel data, reply; Loading Loading @@ -1457,6 +1505,8 @@ status_t BnAudioPolicyService::onTransact( case SET_A11Y_SERVICES_UIDS: case SET_UID_DEVICE_AFFINITY: case REMOVE_UID_DEVICE_AFFINITY: case SET_USERID_DEVICE_AFFINITY: case REMOVE_USERID_DEVICE_AFFINITY: case GET_OFFLOAD_FORMATS_A2DP: case LIST_AUDIO_VOLUME_GROUPS: case GET_VOLUME_GROUP_FOR_ATTRIBUTES: Loading Loading @@ -2379,6 +2429,30 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } case SET_USERID_DEVICE_AFFINITY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); const int userId = (int) data.readInt32(); Vector<AudioDeviceTypeAddr> devices; size_t size = (size_t)data.readInt32(); for (size_t i = 0; i < size; i++) { AudioDeviceTypeAddr device; if (device.readFromParcel((Parcel*)&data) == NO_ERROR) { devices.add(device); } } status_t status = setUserIdDeviceAffinities(userId, devices); reply->writeInt32(status); return NO_ERROR; } case REMOVE_USERID_DEVICE_AFFINITY: { CHECK_INTERFACE(IAudioPolicyService, data, reply); const int userId = (int) data.readInt32(); status_t status = removeUserIdDeviceAffinities(userId); reply->writeInt32(status); return NO_ERROR; } case LIST_AUDIO_PRODUCT_STRATEGIES: { CHECK_INTERFACE(IAudioPolicyService, data, reply); AudioProductStrategyVector strategies; Loading
media/libaudioclient/include/media/AudioPolicy.h +11 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <system/audio_policy.h> #include <utils/String8.h> #include <utils/Vector.h> #include <cutils/multiuser.h> namespace android { Loading @@ -33,10 +34,12 @@ namespace android { #define RULE_MATCH_ATTRIBUTE_USAGE 0x1 #define RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET (0x1 << 1) #define RULE_MATCH_UID (0x1 << 2) #define RULE_MATCH_USERID (0x1 << 3) #define RULE_EXCLUDE_ATTRIBUTE_USAGE (RULE_EXCLUSION_MASK|RULE_MATCH_ATTRIBUTE_USAGE) #define RULE_EXCLUDE_ATTRIBUTE_CAPTURE_PRESET \ (RULE_EXCLUSION_MASK|RULE_MATCH_ATTRIBUTE_CAPTURE_PRESET) #define RULE_EXCLUDE_UID (RULE_EXCLUSION_MASK|RULE_MATCH_UID) #define RULE_EXCLUDE_USERID (RULE_EXCLUSION_MASK|RULE_MATCH_USERID) #define MIX_TYPE_INVALID (-1) #define MIX_TYPE_PLAYERS 0 Loading Loading @@ -74,6 +77,7 @@ public: audio_usage_t mUsage; audio_source_t mSource; uid_t mUid; int mUserId; } mValue; uint32_t mRule; }; Loading @@ -99,6 +103,13 @@ public: 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; /** 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 */ bool isDeviceAffinityCompatible() const; Loading
media/libaudioclient/include/media/AudioSystem.h +4 −0 Original line number Diff line number Diff line Loading @@ -364,6 +364,10 @@ public: static status_t removeUidDeviceAffinities(uid_t uid); static status_t setUserIdDeviceAffinities(int userId, const Vector<AudioDeviceTypeAddr>& devices); static status_t removeUserIdDeviceAffinities(int userId); static status_t startAudioSource(const struct audio_port_config *source, const audio_attributes_t *attributes, audio_port_handle_t *portId); Loading