[Audio Policy Engine] Allow adding new disabled devices to existing list
Bug: 259094683
Test: atest AudioServiceHostTest AudioHostTest
Change-Id: Ib50b8ac1fb0ebf97b5465e88e94f2ee7ff6f5b87
diff --git a/media/libaudiofoundation/AudioDeviceTypeAddr.cpp b/media/libaudiofoundation/AudioDeviceTypeAddr.cpp
index 4a7e956..ad39d32 100644
--- a/media/libaudiofoundation/AudioDeviceTypeAddr.cpp
+++ b/media/libaudiofoundation/AudioDeviceTypeAddr.cpp
@@ -150,6 +150,20 @@
return remainedDevices;
}
+AudioDeviceTypeAddrVector joinDeviceTypeAddrs(
+ const AudioDeviceTypeAddrVector& devices,
+ const AudioDeviceTypeAddrVector& devicesToJoin) {
+ std::set<AudioDeviceTypeAddr> devicesSet(devices.begin(), devices.end());
+ std::set<AudioDeviceTypeAddr> devicesToJoinSet(devicesToJoin.begin(), devicesToJoin.end());
+ AudioDeviceTypeAddrVector joinedDevices;
+
+ std::set_union(devicesSet.begin(), devicesSet.end(),
+ devicesToJoinSet.begin(), devicesToJoinSet.end(),
+ std::back_inserter(joinedDevices));
+
+ return joinedDevices;
+}
+
std::string dumpAudioDeviceTypeAddrVector(const AudioDeviceTypeAddrVector& deviceTypeAddrs,
bool includeSensitiveInfo) {
std::stringstream stream;
diff --git a/media/libaudiofoundation/include/media/AudioDeviceTypeAddr.h b/media/libaudiofoundation/include/media/AudioDeviceTypeAddr.h
index 11aa222..b2f2bd0 100644
--- a/media/libaudiofoundation/include/media/AudioDeviceTypeAddr.h
+++ b/media/libaudiofoundation/include/media/AudioDeviceTypeAddr.h
@@ -84,6 +84,14 @@
const AudioDeviceTypeAddrVector& devices,
const AudioDeviceTypeAddrVector& devicesToExclude);
+/**
+ * Return a collection of AudioDeviceTypeAddrs that is the union of `devices` and
+ * `devicesToJoin`
+ */
+AudioDeviceTypeAddrVector joinDeviceTypeAddrs(
+ const AudioDeviceTypeAddrVector& devices,
+ const AudioDeviceTypeAddrVector& devicesToJoin);
+
std::string dumpAudioDeviceTypeAddrVector(const AudioDeviceTypeAddrVector& deviceTypeAddrs,
bool includeSensitiveInfo=false);
diff --git a/services/audiopolicy/engine/common/src/EngineBase.cpp b/services/audiopolicy/engine/common/src/EngineBase.cpp
index 9b78758..e34f08b 100644
--- a/services/audiopolicy/engine/common/src/EngineBase.cpp
+++ b/services/audiopolicy/engine/common/src/EngineBase.cpp
@@ -369,13 +369,11 @@
}
switch (role) {
- case DEVICE_ROLE_PREFERRED:
- case DEVICE_ROLE_DISABLED: {
+ case DEVICE_ROLE_PREFERRED: {
tDevicesRoleMap[std::make_pair(t, role)] = devices;
// The preferred devices and disabled devices are mutually exclusive. Once a device is added
// the a list, it must be removed from the other one.
- const device_role_t roleToRemove = role == DEVICE_ROLE_PREFERRED ? DEVICE_ROLE_DISABLED
- : DEVICE_ROLE_PREFERRED;
+ const device_role_t roleToRemove = DEVICE_ROLE_DISABLED;
auto it = tDevicesRoleMap.find(std::make_pair(t, roleToRemove));
if (it != tDevicesRoleMap.end()) {
it->second = excludeDeviceTypeAddrsFrom(it->second, devices);
@@ -384,6 +382,25 @@
}
}
} break;
+ case DEVICE_ROLE_DISABLED: {
+ auto it = tDevicesRoleMap.find(std::make_pair(t, role));
+ if (it != tDevicesRoleMap.end()) {
+ it->second = joinDeviceTypeAddrs(it->second, devices);
+ } else {
+ tDevicesRoleMap[std::make_pair(t, role)] = devices;
+ }
+
+ // The preferred devices and disabled devices are mutually exclusive. Once a device is added
+ // the a list, it must be removed from the other one.
+ const device_role_t roleToRemove = DEVICE_ROLE_PREFERRED;
+ it = tDevicesRoleMap.find(std::make_pair(t, roleToRemove));
+ if (it != tDevicesRoleMap.end()) {
+ it->second = excludeDeviceTypeAddrsFrom(it->second, devices);
+ if (it->second.empty()) {
+ tDevicesRoleMap.erase(it);
+ }
+ }
+ } break;
case DEVICE_ROLE_NONE:
// Intentionally fall-through as it is no need to set device role as none for a strategy.
default: