Loading media/libaudioclient/AudioPolicy.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -168,4 +168,11 @@ bool AudioMix::isDeviceAffinityCompatible() const { && (mRouteFlags == MIX_ROUTE_FLAG_RENDER)); } bool AudioMix::hasMatchingRuleForUsage(std::function<bool (audio_usage_t)>const& func) const { return std::any_of(mCriteria.begin(), mCriteria.end(), [func](auto& criterion) { return criterion.mRule == RULE_MATCH_ATTRIBUTE_USAGE && func(criterion.mValue.mUsage); }); } } // namespace android media/libaudioclient/include/media/AudioPolicy.h +8 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #ifndef ANDROID_AUDIO_POLICY_H #define ANDROID_AUDIO_POLICY_H #include <functional> #include <binder/Parcel.h> #include <media/AudioDeviceTypeAddr.h> #include <system/audio.h> Loading Loading @@ -101,6 +102,13 @@ public: /** returns true if this mix can be used for uid-device affinity routing */ bool isDeviceAffinityCompatible() const; /** * returns true if the mix has a capture rule for a usage that * matches the given predicate */ bool hasMatchingRuleForUsage( std::function<bool (audio_usage_t)>const& func) const; mutable Vector<AudioMixMatchCriterion> mCriteria; uint32_t mMixType; audio_config_t mFormat; Loading media/utils/ServiceUtilities.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,15 @@ bool captureMediaOutputAllowed(pid_t pid, uid_t uid) { return ok; } bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid) { if (isAudioServerOrRootUid(uid)) return true; static const String16 sCaptureVoiceCommOutput( "android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT"); bool ok = PermissionCache::checkPermission(sCaptureVoiceCommOutput, pid, uid); if (!ok) ALOGE("Request requires android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT"); return ok; } bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid) { // CAPTURE_AUDIO_HOTWORD permission implies RECORD_AUDIO permission bool ok = recordingAllowed(opPackageName, pid, uid); Loading media/utils/include/mediautils/ServiceUtilities.h +1 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid); void finishRecording(const String16& opPackageName, uid_t uid); bool captureAudioOutputAllowed(pid_t pid, uid_t uid); bool captureMediaOutputAllowed(pid_t pid, uid_t uid); bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid); bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid); bool settingsAllowed(); bool modifyAudioRoutingAllowed(); Loading services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -223,7 +223,8 @@ AudioPolicyMixCollection::MixMatchStatus AudioPolicyMixCollection::mixMatch( } if (!(attributes.usage == AUDIO_USAGE_UNKNOWN || attributes.usage == AUDIO_USAGE_MEDIA || attributes.usage == AUDIO_USAGE_GAME)) { attributes.usage == AUDIO_USAGE_GAME || attributes.usage == AUDIO_USAGE_VOICE_COMMUNICATION)) { return MixMatchStatus::NO_MATCH; } } Loading Loading
media/libaudioclient/AudioPolicy.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -168,4 +168,11 @@ bool AudioMix::isDeviceAffinityCompatible() const { && (mRouteFlags == MIX_ROUTE_FLAG_RENDER)); } bool AudioMix::hasMatchingRuleForUsage(std::function<bool (audio_usage_t)>const& func) const { return std::any_of(mCriteria.begin(), mCriteria.end(), [func](auto& criterion) { return criterion.mRule == RULE_MATCH_ATTRIBUTE_USAGE && func(criterion.mValue.mUsage); }); } } // namespace android
media/libaudioclient/include/media/AudioPolicy.h +8 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #ifndef ANDROID_AUDIO_POLICY_H #define ANDROID_AUDIO_POLICY_H #include <functional> #include <binder/Parcel.h> #include <media/AudioDeviceTypeAddr.h> #include <system/audio.h> Loading Loading @@ -101,6 +102,13 @@ public: /** returns true if this mix can be used for uid-device affinity routing */ bool isDeviceAffinityCompatible() const; /** * returns true if the mix has a capture rule for a usage that * matches the given predicate */ bool hasMatchingRuleForUsage( std::function<bool (audio_usage_t)>const& func) const; mutable Vector<AudioMixMatchCriterion> mCriteria; uint32_t mMixType; audio_config_t mFormat; Loading
media/utils/ServiceUtilities.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -145,6 +145,15 @@ bool captureMediaOutputAllowed(pid_t pid, uid_t uid) { return ok; } bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid) { if (isAudioServerOrRootUid(uid)) return true; static const String16 sCaptureVoiceCommOutput( "android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT"); bool ok = PermissionCache::checkPermission(sCaptureVoiceCommOutput, pid, uid); if (!ok) ALOGE("Request requires android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT"); return ok; } bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid) { // CAPTURE_AUDIO_HOTWORD permission implies RECORD_AUDIO permission bool ok = recordingAllowed(opPackageName, pid, uid); Loading
media/utils/include/mediautils/ServiceUtilities.h +1 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid); void finishRecording(const String16& opPackageName, uid_t uid); bool captureAudioOutputAllowed(pid_t pid, uid_t uid); bool captureMediaOutputAllowed(pid_t pid, uid_t uid); bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid); bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid); bool settingsAllowed(); bool modifyAudioRoutingAllowed(); Loading
services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -223,7 +223,8 @@ AudioPolicyMixCollection::MixMatchStatus AudioPolicyMixCollection::mixMatch( } if (!(attributes.usage == AUDIO_USAGE_UNKNOWN || attributes.usage == AUDIO_USAGE_MEDIA || attributes.usage == AUDIO_USAGE_GAME)) { attributes.usage == AUDIO_USAGE_GAME || attributes.usage == AUDIO_USAGE_VOICE_COMMUNICATION)) { return MixMatchStatus::NO_MATCH; } } Loading