APC: Disable MMAP when a stream is to be captured
As MMAP does not support APC, it is disabled when a render loopback
policy is installed.
Test: adb shell write_sine_callback -pl # mmap is used
adb shell audiorecorder --target /data/file1.raw &
adb shell write_sine_callback -pl # mmap is NOT used
Bug: 129948989
Change-Id: Ia90c24953890de7e19fd99485bf760788f81126d
Signed-off-by: Kevin Rocard <krocard@google.com>
(cherry picked from commit c1dde631401a9cda122cf3058a99e36274906801)
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index bd53f0f..4d121a0 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -963,10 +963,11 @@
// otherwise, fallback to the dynamic policies, if none match, query the engine.
// Secondary outputs are always found by dynamic policies as the engine do not support them
sp<SwAudioOutputDescriptor> policyDesc;
- if (mPolicyMixes.getOutputForAttr(*resultAttr, uid, policyDesc, secondaryDescs) != NO_ERROR) {
- policyDesc = nullptr; // reset getOutputForAttr in case of failure
- secondaryDescs->clear();
+ status = mPolicyMixes.getOutputForAttr(*resultAttr, uid, *flags, policyDesc, secondaryDescs);
+ if (status != OK) {
+ return status;
}
+
// Explicit routing is higher priority then any dynamic policy primary output
bool usePrimaryOutputFromPolicyMixes = requestedDevice == nullptr && policyDesc != nullptr;
@@ -5064,12 +5065,12 @@
for (size_t i = 0; i < mOutputs.size(); i++) {
const sp<SwAudioOutputDescriptor>& outputDescriptor = mOutputs[i];
for (const sp<TrackClientDescriptor>& client : outputDescriptor->getClientIterable()) {
- // FIXME code duplicated from getOutputForAttrInt
sp<SwAudioOutputDescriptor> desc;
std::vector<sp<SwAudioOutputDescriptor>> secondaryDescs;
- mPolicyMixes.getOutputForAttr(client->attributes(), client->uid(), desc,
- &secondaryDescs);
- if (!std::equal(client->getSecondaryOutputs().begin(),
+ status_t status = mPolicyMixes.getOutputForAttr(client->attributes(), client->uid(),
+ client->flags(), desc, &secondaryDescs);
+ if (status != OK ||
+ !std::equal(client->getSecondaryOutputs().begin(),
client->getSecondaryOutputs().end(),
secondaryDescs.begin(), secondaryDescs.end())) {
streamsToInvalidate.insert(client->stream());