Fix voice communication audio playback capture

This change fixes the CTS failure in AudioPlaybackCaptureTest caused
by ag/10111312 and ag/10111311.
It contains the following fixes/changes:
  - Mix match for playback capture of USAGE_VOICE_COMMUNICATION now
    also respects a new flag (AudioMix's mVoiceCommunicationCaptureAllowed)
    which is set by AudioService only if the caller explicitly asked
    to capture USAGE_VOICE_COMMUNICATION and have the
    CAPTURE_VOICE_COMMUNICATION_OUTPUT.
  - A permission check on the native side in case
    mVoiceCommunicationCaptureAllowed is set.
  - Code cleanup, mainly in AudioPolicy.h and AudioPolicy.cpp.

This change is accompanied by ag/10242955 on the Java side.

Bug: 148559127
Test: manual
Test: atest PlaybackCaptureTest (with the version prior to ag/10220852)
Test: atest com.google.android.gts.audio.AudioHostTest
Change-Id: I8ae6249f4da1de35e962c838d91f690eb906570e
diff --git a/media/libaudioclient/AudioPolicy.cpp b/media/libaudioclient/AudioPolicy.cpp
index d468239..0522099 100644
--- a/media/libaudioclient/AudioPolicy.cpp
+++ b/media/libaudioclient/AudioPolicy.cpp
@@ -86,6 +86,7 @@
     mDeviceAddress = parcel->readString8();
     mCbFlags = (uint32_t)parcel->readInt32();
     mAllowPrivilegedPlaybackCapture = parcel->readBool();
+    mVoiceCommunicationCaptureAllowed = parcel->readBool();
     size_t size = (size_t)parcel->readInt32();
     if (size > MAX_CRITERIA_PER_MIX) {
         size = MAX_CRITERIA_PER_MIX;
@@ -110,6 +111,7 @@
     parcel->writeString8(mDeviceAddress);
     parcel->writeInt32(mCbFlags);
     parcel->writeBool(mAllowPrivilegedPlaybackCapture);
+    parcel->writeBool(mVoiceCommunicationCaptureAllowed);
     size_t size = mCriteria.size();
     if (size > MAX_CRITERIA_PER_MIX) {
         size = MAX_CRITERIA_PER_MIX;
@@ -206,11 +208,4 @@
             && (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
diff --git a/media/libaudioclient/include/media/AudioPolicy.h b/media/libaudioclient/include/media/AudioPolicy.h
index 20d2c0b..00fe278 100644
--- a/media/libaudioclient/include/media/AudioPolicy.h
+++ b/media/libaudioclient/include/media/AudioPolicy.h
@@ -18,7 +18,6 @@
 #ifndef ANDROID_AUDIO_POLICY_H
 #define ANDROID_AUDIO_POLICY_H
 
-#include <functional>
 #include <binder/Parcel.h>
 #include <media/AudioDeviceTypeAddr.h>
 #include <system/audio.h>
@@ -113,13 +112,6 @@
     /** 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;
@@ -129,6 +121,8 @@
     uint32_t        mCbFlags; // flags indicating which callbacks to use, see kCbFlag*
     /** Ignore the AUDIO_FLAG_NO_MEDIA_PROJECTION */
     bool            mAllowPrivilegedPlaybackCapture = false;
+    /** Indicates if the caller can capture voice communication output */
+    bool            mVoiceCommunicationCaptureAllowed = false;
 };