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

Commit 29956555 authored by Oscar Azucena's avatar Oscar Azucena
Browse files

Added skip delays when activating user id device affinities

Bug: 269208752
Test: Ran MU workflow observed 90% reduction in audio routing

Change-Id: I000369822c82ac38ff7008fafab8bc569bd762a2
parent 04565568
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -423,6 +423,15 @@ public:
     */
    bool supportsAllDevices(const DeviceVector &devices) const;

    /**
     * @brief supportsAtLeastOne checks if any device in devices is currently supported
     * @param devices to be checked against
     * @return true if the device is weakly supported by type (e.g. for non bus / rsubmix devices),
     *         true if the device is supported (both type and address) for bus / remote submix
     *         false otherwise
     */
    bool supportsAtLeastOne(const DeviceVector &devices) const;

    /**
     * @brief supportsDevicesForPlayback
     * @param devices to be checked against
+1 −1
Original line number Diff line number Diff line
@@ -138,7 +138,7 @@ public:
     */
    status_t setUserIdDeviceAffinities(int userId, const AudioDeviceTypeAddrVector& devices);
    status_t removeUserIdDeviceAffinities(int userId);
    status_t getDevicesForUserId(int userId, Vector<AudioDeviceTypeAddr>& devices) const;
    status_t getDevicesForUserId(int userId, AudioDeviceTypeAddrVector& devices) const;

    void dump(String8 *dst) const;

+5 −0
Original line number Diff line number Diff line
@@ -389,6 +389,11 @@ bool SwAudioOutputDescriptor::supportsAllDevices(const DeviceVector &devices) co
    return supportedDevices().containsAllDevices(devices);
}

bool SwAudioOutputDescriptor::supportsAtLeastOne(const DeviceVector &devices) const
{
    return filterSupportedDevices(devices).size() > 0;
}

bool SwAudioOutputDescriptor::supportsDevicesForPlayback(const DeviceVector &devices) const
{
    // No considering duplicated output
+2 −2
Original line number Diff line number Diff line
@@ -640,7 +640,7 @@ status_t AudioPolicyMixCollection::removeUserIdDeviceAffinities(int userId) {
}

status_t AudioPolicyMixCollection::getDevicesForUserId(int userId,
        Vector<AudioDeviceTypeAddr>& devices) const {
        AudioDeviceTypeAddrVector& devices) const {
    // for each player mix:
    // find rules that don't exclude this userId, and add the device to the list
    for (size_t i = 0; i < size(); i++) {
@@ -658,7 +658,7 @@ status_t AudioPolicyMixCollection::getDevicesForUserId(int userId,
            }
        }
        if (ruleAllowsUserId) {
            devices.add(AudioDeviceTypeAddr(mix->mDeviceType, mix->mDeviceAddress.string()));
            devices.push_back(AudioDeviceTypeAddr(mix->mDeviceType, mix->mDeviceAddress.string()));
        }
    }
    return NO_ERROR;
+64 −12
Original line number Diff line number Diff line
@@ -3782,6 +3782,44 @@ bool AudioPolicyManager::areAllDevicesSupported(
    return true;
}

void AudioPolicyManager::changeOutputDevicesMuteState(
        const AudioDeviceTypeAddrVector& devices) {
    ALOGVV("%s() num devices %zu", __func__, devices.size());

    std::vector<sp<SwAudioOutputDescriptor>> outputs =
            getSoftwareOutputsForDevices(devices);

    for (size_t i = 0; i < outputs.size(); i++) {
        sp<SwAudioOutputDescriptor> outputDesc = outputs[i];
        DeviceVector prevDevices = outputDesc->devices();
        checkDeviceMuteStrategies(outputDesc, prevDevices, 0 /* delayMs */);
    }
}

std::vector<sp<SwAudioOutputDescriptor>> AudioPolicyManager::getSoftwareOutputsForDevices(
        const AudioDeviceTypeAddrVector& devices) const
{
    std::vector<sp<SwAudioOutputDescriptor>> outputs;
    DeviceVector deviceDescriptors;
    for (size_t j = 0; j < devices.size(); j++) {
        sp<DeviceDescriptor> desc = mHwModules.getDeviceDescriptor(
                devices[j].mType, devices[j].getAddress(), String8(), AUDIO_FORMAT_DEFAULT);
        if (desc == nullptr || !audio_is_output_device(devices[j].mType)) {
            ALOGE("%s: device type %#x address %s not supported or not an output device",
                __func__, devices[j].mType, devices[j].getAddress());
                    continue;
        }
        deviceDescriptors.add(desc);
    }
    for (size_t i = 0; i < mOutputs.size(); i++) {
        if (!mOutputs.valueAt(i)->supportsAtLeastOne(deviceDescriptors)) {
            continue;
        }
        outputs.push_back(mOutputs.valueAt(i));
    }
    return outputs;
}

status_t AudioPolicyManager::setUidDeviceAffinities(uid_t uid,
        const AudioDeviceTypeAddrVector& devices) {
    ALOGV("%s() uid=%d num devices %zu", __FUNCTION__, uid, devices.size());
@@ -3848,7 +3886,8 @@ status_t AudioPolicyManager::setDevicesRoleForStrategy(product_strategy_t strate
    return NO_ERROR;
}

void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint32_t delayMs)
void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint32_t delayMs,
    bool skipDelays)
{
    uint32_t waitMs = 0;
    bool wasLeUnicastActive = isLeUnicastActive();
@@ -3874,8 +3913,8 @@ void AudioPolicyManager::updateCallAndOutputRouting(bool forceVolumeReeval, uint
                continue;
            }
            waitMs = setOutputDevices(outputDesc, newDevices, forceRouting, delayMs, nullptr,
                                      true /*requiresMuteCheck*/,
                                      !forceRouting /*requiresVolumeCheck*/);
                                      !skipDelays /*requiresMuteCheck*/,
                                      !forceRouting /*requiresVolumeCheck*/, skipDelays);
            // Only apply special touch sound delay once
            delayMs = 0;
        }
@@ -4060,13 +4099,18 @@ status_t AudioPolicyManager::setUserIdDeviceAffinities(int userId,

    // reevaluate outputs for all devices
    checkForDeviceAndOutputChanges();
    updateCallAndOutputRouting();
    changeOutputDevicesMuteState(devices);
    updateCallAndOutputRouting(false /* forceVolumeReeval */, 0 /* delayMs */,
        true /* skipDelays */);
    changeOutputDevicesMuteState(devices);

    return NO_ERROR;
}

status_t AudioPolicyManager::removeUserIdDeviceAffinities(int userId) {
    ALOGV("%s() userId=%d", __FUNCTION__, userId);
    AudioDeviceTypeAddrVector devices;
    mPolicyMixes.getDevicesForUserId(userId, devices);
    status_t status = mPolicyMixes.removeUserIdDeviceAffinities(userId);
    if (status != NO_ERROR) {
        ALOGE("%s() Could not remove all device affinities fo userId = %d",
@@ -4076,7 +4120,10 @@ status_t AudioPolicyManager::removeUserIdDeviceAffinities(int userId) {

    // reevaluate outputs for all devices
    checkForDeviceAndOutputChanges();
    updateCallAndOutputRouting();
    changeOutputDevicesMuteState(devices);
    updateCallAndOutputRouting(false /* forceVolumeReeval */, 0 /* delayMs */,
        true /* skipDelays */);
    changeOutputDevicesMuteState(devices);

    return NO_ERROR;
}
@@ -7315,7 +7362,8 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>&
                                              bool force,
                                              int delayMs,
                                              audio_patch_handle_t *patchHandle,
                                              bool requiresMuteCheck, bool requiresVolumeCheck)
                                              bool requiresMuteCheck, bool requiresVolumeCheck,
                                              bool skipMuteDelay)
{
    // TODO(b/262404095): Consider if the output need to be reopened.
    ALOGV("%s device %s delayMs %d", __func__, devices.toString().c_str(), delayMs);
@@ -7323,9 +7371,9 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>&

    if (outputDesc->isDuplicated()) {
        muteWaitMs = setOutputDevices(outputDesc->subOutput1(), devices, force, delayMs,
                nullptr /* patchHandle */, requiresMuteCheck);
                nullptr /* patchHandle */, requiresMuteCheck, skipMuteDelay);
        muteWaitMs += setOutputDevices(outputDesc->subOutput2(), devices, force, delayMs,
                nullptr /* patchHandle */, requiresMuteCheck);
                nullptr /* patchHandle */, requiresMuteCheck, skipMuteDelay);
        return muteWaitMs;
    }

@@ -7391,12 +7439,16 @@ uint32_t AudioPolicyManager::setOutputDevices(const sp<SwAudioOutputDescriptor>&

        // Add half reported latency to delayMs when muteWaitMs is null in order
        // to avoid disordered sequence of muting volume and changing devices.
        installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(),
                muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs);
        int actualDelayMs = !skipMuteDelay && muteWaitMs == 0
                ? (delayMs + (outputDesc->latency() / 2)) : delayMs;
        installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), actualDelayMs);
    }

    // Since the mute is skip, also skip the apply stream volume as that will be applied externally
    if (!skipMuteDelay) {
        // update stream volumes according to new device
        applyStreamVolumes(outputDesc, filteredDevices.types(), delayMs);
    }

    return muteWaitMs;
}
Loading