audio policy: fix input preferred device logic
In AudioPolicyManager::getNewInputDevice(), the intention is to allow
and app to specify a preferred device only if no other app is capturing.
The implemented rule was actually preventing an app from specifying a
preferred device if that same app was also capturing.
Bug: 379233370
Test: repro steps in bug
Flag: EXEMPT bug fix.
Change-Id: I6d4b8a461e49088fa2bfb1ec25af8c96caa5d979
diff --git a/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h b/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h
index e519766..918e247 100644
--- a/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h
+++ b/services/audiopolicy/common/managerdefinitions/include/AudioIODescriptorInterface.h
@@ -64,6 +64,21 @@
if (activeClients.size() == activeClientsWithRoute.size()) {
return devices.getDeviceFromId(activeClientsWithRoute[0]->preferredDeviceId());
}
+ if (activeClientsWithRoute.size() == 0) {
+ return nullptr;
+ }
+ uid_t uniqueUid = activeClients[0]->uid();
+ for (const auto &client : activeClients) {
+ if (uniqueUid != client->uid()) {
+ return nullptr;
+ }
+ }
+ for (const auto &client : activeClientsWithRoute) {
+ if (uniqueUid != client->uid()) {
+ return nullptr;
+ }
+ }
+ return devices.getDeviceFromId(activeClientsWithRoute[0]->preferredDeviceId());
}
}
return nullptr;
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 04ebb57..0231d45 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -7829,7 +7829,8 @@
}
// Honor explicit routing requests only if no client using default routing is active on this
- // input: a specific app can not force routing for other apps by setting a preferred device.
+ // input or if all active clients are from the same app: a specific app can not force routing
+ // for other apps by setting a preferred device.
bool active;
device = findPreferredDevice(inputDesc, AUDIO_SOURCE_DEFAULT, active, mAvailableInputDevices);
if (device != nullptr) {