Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0c96fc88 authored by Paul Wang's avatar Paul Wang
Browse files

[Audio Policy Engine] Allow adding new disabled devices to existing list

Bug: 259094683
Test: atest AudioServiceHostTest AudioHostTest

Change-Id: Ib50b8ac1fb0ebf97b5465e88e94f2ee7ff6f5b87
parent c7dc2139
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -150,6 +150,20 @@ AudioDeviceTypeAddrVector excludeDeviceTypeAddrsFrom(
    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;
+8 −0
Original line number Diff line number Diff line
@@ -84,6 +84,14 @@ AudioDeviceTypeAddrVector excludeDeviceTypeAddrsFrom(
        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);

+21 −4
Original line number Diff line number Diff line
@@ -369,13 +369,11 @@ status_t setDevicesRoleForT(
    }

    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 @@ status_t setDevicesRoleForT(
            }
        }
    } 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: