Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2512a275 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add support for USAGE_VOICE_COMMUNICATION playback capture"

parents c86fffb6 dbf0a2ee
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
+8 −0
Original line number Diff line number Diff line
@@ -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>
@@ -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;
+9 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -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();
+2 −1
Original line number Diff line number Diff line
@@ -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