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

Commit 4e222ef2 authored by Eric Laurent's avatar Eric Laurent Committed by Android (Google) Code Review
Browse files

Merge "audio policy: exclude A2DP and LE Audio whenever SCO is active" into main

parents 493568e8 ffff1f79
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ cc_library_shared {
        "libaudiopolicyengine_config",
    ],
    shared_libs: [
        "com.android.media.audioserver-aconfig-cc",
        "libaudio_aidl_conversion_common_cpp",
        "libaudiofoundation",
        "libaudiopolicy",
+59 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include <PolicyAudioPort.h>
#include <IOProfile.h>
#include <AudioIODescriptorInterface.h>
#include <com_android_media_audioserver.h>
#include <policy.h>
#include <media/AudioContainers.h>
#include <utils/String8.h>
@@ -154,12 +155,58 @@ status_t Engine::setForceUse(audio_policy_force_use_t usage, audio_policy_forced
    return EngineBase::setForceUse(usage, config);
}

bool Engine::isBtScoActive(DeviceVector& availableOutputDevices,
                           const SwAudioOutputCollection &outputs) const {
    if (availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllScoSet()).isEmpty()) {
        return false;
    }
    // SCO is active if:
    // 1) we are in a call and SCO is the preferred device for PHONE strategy
    if (isInCall() && audio_is_bluetooth_out_sco_device(
            getPreferredDeviceTypeForLegacyStrategy(availableOutputDevices, STRATEGY_PHONE))) {
        return true;
    }

    // 2) A strategy for which the preferred device is SCO is active
    for (const auto &ps : getOrderedProductStrategies()) {
        if (outputs.isStrategyActive(ps) &&
            !getPreferredAvailableDevicesForProductStrategy(availableOutputDevices, ps)
                .getDevicesFromTypes(getAudioDeviceOutAllScoSet()).isEmpty()) {
            return true;
        }
    }
    // 3) a ringtone is active and SCO is used for ringing
    if (outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_RING))
          && (getForceUse(AUDIO_POLICY_FORCE_FOR_VIBRATE_RINGING)
                    == AUDIO_POLICY_FORCE_BT_SCO)) {
        return true;
    }
    // 4) an active input is routed from SCO
    DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices();
    const auto &inputs = getApmObserver()->getInputs();
    if (inputs.activeInputsCountOnDevices(availableInputDevices.getDevicesFromType(
            AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) > 0) {
        return true;
    }
    return false;
}

void Engine::filterOutputDevicesForStrategy(legacy_strategy strategy,
                                            DeviceVector& availableOutputDevices,
                                            const SwAudioOutputCollection &outputs) const
{
    DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices();

    if (com::android::media::audioserver::use_bt_sco_for_media()) {
        // remove A2DP and LE Audio devices whenever BT SCO is in use
        if (isBtScoActive(availableOutputDevices, outputs)) {
            availableOutputDevices.remove(
                availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllA2dpSet()));
            availableOutputDevices.remove(
                availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllBleSet()));
        }
    }

    switch (strategy) {
    case STRATEGY_SONIFICATION_RESPECTFUL: {
        if (!(isInCall() || outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_VOICE_CALL)))) {
@@ -418,15 +465,27 @@ DeviceVector Engine::getDevicesForStrategyInt(legacy_strategy strategy,
                        getLastRemovableMediaDevices(GROUP_WIRED, excludedDevices));
            }
        }

        if (com::android::media::audioserver::use_bt_sco_for_media()) {
            if (devices2.isEmpty() && isBtScoActive(availableOutputDevices, outputs)) {
                devices2 = availableOutputDevices.getFirstDevicesFromTypes(
                        { AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT,
                          AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
                          AUDIO_DEVICE_OUT_BLUETOOTH_SCO});
            }
        }

        if ((devices2.isEmpty()) &&
                (getForceUse(AUDIO_POLICY_FORCE_FOR_DOCK) == AUDIO_POLICY_FORCE_ANALOG_DOCK)) {
            devices2 = availableOutputDevices.getDevicesFromType(
                    AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET);
        }

        if (devices2.isEmpty()) {
            devices2 = availableOutputDevices.getFirstDevicesFromTypes({
                        AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_SPEAKER});
        }

        DeviceVector devices3;
        if (strategy == STRATEGY_MEDIA) {
            // ARC, SPDIF and AUX_LINE can co-exist with others.
+3 −0
Original line number Diff line number Diff line
@@ -109,6 +109,9 @@ private:
    DeviceVector getDisabledDevicesForInputSource(
            const DeviceVector& availableInputDevices, audio_source_t inputSource) const;

    bool isBtScoActive(DeviceVector& availableOutputDevices,
                       const SwAudioOutputCollection &outputs) const;

    std::map<product_strategy_t, legacy_strategy> mLegacyStrategyMap;
};
} // namespace audio_policy