Add application wide capture policy
Apps were previously forced to set their allowed capture policy from
either their manifest which is not flexible or from each track which is
a very fine grain but difficult when using libraries like exoplayer.
Thus add an application level policy set with AudioManager.
Test: atest android.media.cts.AudioPlaybackCaptureTest
Bug: 111453086
Change-Id: Ic890b5b041affea757fbd3f2707ff2ce18771828
Signed-off-by: Kevin Rocard <krocard@google.com>
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index 0ce2513..f324669 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -1133,6 +1133,12 @@
}
}
+status_t AudioSystem::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) {
+ const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
+ if (aps == nullptr) return PERMISSION_DENIED;
+ return aps->setAllowedCapturePolicy(uid, flags);
+}
+
bool AudioSystem::isOffloadSupported(const audio_offload_info_t& info)
{
ALOGV("isOffloadSupported()");
diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp
index 3bac44f..bf98c60 100644
--- a/media/libaudioclient/IAudioPolicyService.cpp
+++ b/media/libaudioclient/IAudioPolicyService.cpp
@@ -101,7 +101,8 @@
LIST_AUDIO_PRODUCT_STRATEGIES,
GET_STRATEGY_FOR_ATTRIBUTES,
LIST_AUDIO_VOLUME_GROUPS,
- GET_VOLUME_GROUP_FOR_ATTRIBUTES
+ GET_VOLUME_GROUP_FOR_ATTRIBUTES,
+ SET_ALLOWED_CAPTURE_POLICY,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -603,6 +604,15 @@
return status;
}
+ status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) override {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(uid);
+ data.writeInt32(flags);
+ remote()->transact(SET_ALLOWED_CAPTURE_POLICY, data, &reply);
+ return reply.readInt32();
+ }
+
virtual bool isOffloadSupported(const audio_offload_info_t& info)
{
Parcel data, reply;
@@ -2168,7 +2178,7 @@
CHECK_INTERFACE(IAudioPolicyService, data, reply);
bool isSupported = isHapticPlaybackSupported();
reply->writeBool(isSupported);
- return NO_ERROR;
+ return NO_ERROR;
}
case SET_UID_DEVICE_AFFINITY: {
@@ -2285,6 +2295,15 @@
return NO_ERROR;
}
+ case SET_ALLOWED_CAPTURE_POLICY: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ uid_t uid = data.readInt32();
+ audio_flags_mask_t flags = data.readInt32();
+ status_t status = setAllowedCapturePolicy(uid, flags);
+ reply->writeInt32(status);
+ return NO_ERROR;
+ }
+
default:
return BBinder::onTransact(code, data, reply, flags);
}
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index e64f285..05a1d56 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -299,6 +299,8 @@
static status_t setLowRamDevice(bool isLowRamDevice, int64_t totalMemory);
+ static status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags);
+
// Check if hw offload is possible for given format, stream type, sample rate,
// bit rate, duration, video and streaming or offload property is enabled
static bool isOffloadSupported(const audio_offload_info_t& info);
diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h
index 35540f0..95530ac 100644
--- a/media/libaudioclient/include/media/IAudioPolicyService.h
+++ b/media/libaudioclient/include/media/IAudioPolicyService.h
@@ -135,6 +135,7 @@
audio_unique_id_t* id) = 0;
virtual status_t removeSourceDefaultEffect(audio_unique_id_t id) = 0;
virtual status_t removeStreamDefaultEffect(audio_unique_id_t id) = 0;
+ virtual status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) = 0;
// Check if offload is possible for given format, stream type, sample rate,
// bit rate, duration, video and streaming or offload property is enabled
virtual bool isOffloadSupported(const audio_offload_info_t& info) = 0;
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index acbfc9e..a2cf7aa 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -198,6 +198,7 @@
//dump state
virtual status_t dump(int fd) = 0;
+ virtual status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t flags) = 0;
virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo) = 0;
virtual bool isDirectOutputSupported(const audio_config_base_t& config,
const audio_attributes_t& attributes) = 0;
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index e8e9fa6..ee0e1bd 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -945,6 +945,9 @@
if (status != NO_ERROR) {
return status;
}
+ if (auto it = mAllowedCapturePolicies.find(uid); it != end(mAllowedCapturePolicies)) {
+ resultAttr->flags |= it->second;
+ }
*stream = mEngine->getStreamTypeForAttributes(*resultAttr);
ALOGV("%s() attributes=%s stream=%s session %d selectedDeviceId %d", __func__,
@@ -3022,6 +3025,11 @@
mPolicyMixes.dump(dst);
mAudioSources.dump(dst);
+ dst->appendFormat(" AllowedCapturePolicies:\n");
+ for (auto& policy : mAllowedCapturePolicies) {
+ dst->appendFormat(" - uid=%d flag_mask=%#x\n", policy.first, policy.second);
+ }
+
dst->appendFormat("\nPolicy Engine dump:\n");
mEngine->dump(dst);
}
@@ -3034,6 +3042,12 @@
return NO_ERROR;
}
+status_t AudioPolicyManager::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy)
+{
+ mAllowedCapturePolicies[uid] = capturePolicy;
+ return NO_ERROR;
+}
+
// This function checks for the parameters which can be offloaded.
// This can be enhanced depending on the capability of the DSP and policy
// of the system.
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 1c98684..41327bc 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -218,6 +218,7 @@
status_t dump(int fd) override;
+ status_t setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) override;
virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo);
virtual bool isDirectOutputSupported(const audio_config_base_t& config,
@@ -754,6 +755,8 @@
// Surround formats that are enabled manually. Taken into account when
// "encoded surround" is forced into "manual" mode.
std::unordered_set<audio_format_t> mManualSurroundFormats;
+
+ std::unordered_map<uid_t, audio_flags_mask_t> mAllowedCapturePolicies;
private:
// Add or remove AC3 DTS encodings based on user preferences.
void modifySurroundFormats(const sp<DeviceDescriptor>& devDesc, FormatVector *formatsPtr);
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 1ec3262..0dbf652 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -945,6 +945,20 @@
return audioPolicyEffects->removeStreamDefaultEffect(id);
}
+status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
+ Mutex::Autolock _l(mLock);
+ if (mAudioPolicyManager == NULL) {
+ ALOGV("%s() mAudioPolicyManager == NULL", __func__);
+ return NO_INIT;
+ }
+ uint_t callingUid = IPCThreadState::self()->getCallingUid();
+ if (uid != callingUid) {
+ ALOGD("%s() uid invalid %d != %d", __func__, uid, callingUid);
+ return PERMISSION_DENIED;
+ }
+ return mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy);
+}
+
bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
{
if (mAudioPolicyManager == NULL) {
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index a2e75cd..73cb793 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -182,6 +182,7 @@
audio_io_handle_t output,
int delayMs = 0);
virtual status_t setVoiceVolume(float volume, int delayMs = 0);
+ status_t setAllowedCapturePolicy(uint_t uid, audio_flags_mask_t capturePolicy) override;
virtual bool isOffloadSupported(const audio_offload_info_t &config);
virtual bool isDirectOutputSupported(const audio_config_base_t& config,
const audio_attributes_t& attributes);