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

Commit ae5f8900 authored by Ramjee Singh's avatar Ramjee Singh
Browse files

policy-hal: squash multiple changes/fixes to custom policy

This commit is a squash of below changes. Only relevant
changes have been ported and the other required changes
are in base policy manager.

audiopolicy: support extended feature in audiopolicymanager
Change-Id: I1925339b591cd29f11a71c287a2e53c0627e9e62

audiopolicy: additional change for extended feature
Change-Id: I9bad6a294ddd7aee72f6f6a314666b892b730c8e

audiopolicy: Do not route audio to HDMI if HDMI not connected
Change-Id: I1c76ba3c3a1438463461ea7c41799633bd977283

audiopolicy: Fix for device selection during concurrent audio playback
Change-Id: Ibf3c1bfd05b68d70c6cb9e8b9b95e989f27c2e75

Change-Id: I00470a057cdeefff7bba3bffd333fb556f3d97e6
parent 9fcb0552
Loading
Loading
Loading
Loading
+12 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,18 @@ LOCAL_SHARED_LIBRARIES := \
LOCAL_STATIC_LIBRARIES := \
LOCAL_STATIC_LIBRARIES := \
    libmedia_helper \
    libmedia_helper \


ifeq ($(strip $(AUDIO_FEATURE_ENABLED_EXTN_FORMATS)),true)
LOCAL_CFLAGS += -DAUDIO_EXTN_FORMATS_ENABLED
endif

ifeq ($(strip $(AUDIO_FEATURE_ENABLED_HDMI_SPK)),true)
LOCAL_CFLAGS += -DAUDIO_EXTN_HDMI_SPK_ENABLED
endif

ifeq ($(strip $(AUDIO_FEATURE_ENABLED_PROXY_DEVICE)),true)
LOCAL_CFLAGS += -DAUDIO_EXTN_AFE_PROXY_ENABLED
endif

LOCAL_MODULE := libaudiopolicymanager
LOCAL_MODULE := libaudiopolicymanager


include $(BUILD_SHARED_LIBRARY)
include $(BUILD_SHARED_LIBRARY)
+59 −33
Original line number Original line Diff line number Diff line
@@ -96,6 +96,15 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d
        // handle output device connection
        // handle output device connection
        case AUDIO_POLICY_DEVICE_STATE_AVAILABLE: {
        case AUDIO_POLICY_DEVICE_STATE_AVAILABLE: {
            if (index >= 0) {
            if (index >= 0) {
#ifdef AUDIO_EXTN_HDMI_SPK_ENABLED
                if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_AUX_DIGITAL)) {
                   if (!strncmp(device_address, "hdmi_spkr", 9)) {
                        mHdmiAudioDisabled = false;
                    } else {
                        mHdmiAudioEvent = true;
                    }
                }
#endif
                ALOGW("setDeviceConnectionState() device already connected: %x", device);
                ALOGW("setDeviceConnectionState() device already connected: %x", device);
                return INVALID_OPERATION;
                return INVALID_OPERATION;
            }
            }
@@ -103,6 +112,20 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d


            // register new device as available
            // register new device as available
            index = mAvailableOutputDevices.add(devDesc);
            index = mAvailableOutputDevices.add(devDesc);
#ifdef AUDIO_EXTN_HDMI_SPK_ENABLED
            if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_AUX_DIGITAL)) {
                if (!strncmp(device_address, "hdmi_spkr", 9)) {
                    mHdmiAudioDisabled = false;
                } else {
                    mHdmiAudioEvent = true;
                }
                if (mHdmiAudioDisabled || !mHdmiAudioEvent) {
                    mAvailableOutputDevices.remove(devDesc);
                    ALOGW("HDMI sink not connected, do not route audio to HDMI out");
                    return INVALID_OPERATION;
                }
            }
#endif
            if (index >= 0) {
            if (index >= 0) {
                sp<HwModule> module = mHwModules.getModuleForDevice(device);
                sp<HwModule> module = mHwModules.getModuleForDevice(device);
                if (module == 0) {
                if (module == 0) {
@@ -138,6 +161,15 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d
        // handle output device disconnection
        // handle output device disconnection
        case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE: {
        case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE: {
            if (index < 0) {
            if (index < 0) {
#ifdef AUDIO_EXTN_HDMI_SPK_ENABLED
                if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_AUX_DIGITAL)) {
                    if (!strncmp(device_address, "hdmi_spkr", 9)) {
                        mHdmiAudioDisabled = true;
                    } else {
                        mHdmiAudioEvent = false;
                    }
                }
#endif
                ALOGW("setDeviceConnectionState() device not connected: %x", device);
                ALOGW("setDeviceConnectionState() device not connected: %x", device);
                return INVALID_OPERATION;
                return INVALID_OPERATION;
            }
            }
@@ -151,7 +183,15 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d


            // remove device from available output devices
            // remove device from available output devices
            mAvailableOutputDevices.remove(devDesc);
            mAvailableOutputDevices.remove(devDesc);

#ifdef AUDIO_EXTN_HDMI_SPK_ENABLED
            if ((popcount(device) == 1) && (device & AUDIO_DEVICE_OUT_AUX_DIGITAL)) {
                if (!strncmp(device_address, "hdmi_spkr", 9)) {
                    mHdmiAudioDisabled = true;
                } else {
                    mHdmiAudioEvent = false;
                }
            }
#endif
            checkOutputsForDevice(devDesc, state, outputs, devDesc->mAddress);
            checkOutputsForDevice(devDesc, state, outputs, devDesc->mAddress);


            // Propagate device availability to Engine
            // Propagate device availability to Engine
@@ -451,6 +491,7 @@ void AudioPolicyManagerCustom::setPhoneState(audio_mode_t state)
{
{
    ALOGV("setPhoneState() state %d", state);
    ALOGV("setPhoneState() state %d", state);
    // store previous phone state for management of sonification strategy below
    // store previous phone state for management of sonification strategy below
    audio_devices_t newDevice = AUDIO_DEVICE_NONE;
    int oldState = mEngine->getPhoneState();
    int oldState = mEngine->getPhoneState();


    if (mEngine->setPhoneState(state) != NO_ERROR) {
    if (mEngine->setPhoneState(state) != NO_ERROR) {
@@ -546,7 +587,14 @@ void AudioPolicyManagerCustom::setPhoneState(audio_mode_t state)
            setOutputDevice(mPrimaryOutput, rxDevice, force, 0);
            setOutputDevice(mPrimaryOutput, rxDevice, force, 0);
        }
        }
    }
    }

    //update device for all non-primary outputs
    for (size_t i = 0; i < mOutputs.size(); i++) {
        audio_io_handle_t output = mOutputs.keyAt(i);
        if (output != mPrimaryOutput->mIoHandle) {
            newDevice = getNewOutputDevice(mOutputs.valueFor(output), false /*fromCache*/);
            setOutputDevice(mOutputs.valueFor(output), newDevice, (newDevice != AUDIO_DEVICE_NONE));
        }
    }
    // if entering in call state, handle special case of active streams
    // if entering in call state, handle special case of active streams
    // pertaining to sonification strategy see handleIncallSonification()
    // pertaining to sonification strategy see handleIncallSonification()
    if (isStateInCall(state)) {
    if (isStateInCall(state)) {
@@ -578,10 +626,10 @@ status_t AudioPolicyManagerCustom::stopSource(sp<SwAudioOutputDescriptor> output
    handleEventForBeacon(stream == AUDIO_STREAM_TTS ? STOPPING_BEACON : STOPPING_OUTPUT);
    handleEventForBeacon(stream == AUDIO_STREAM_TTS ? STOPPING_BEACON : STOPPING_OUTPUT);


    // handle special case for sonification while in call
    // handle special case for sonification while in call
    if (isInCall()) {
    if (isInCall() && (outputDesc->mRefCount[stream] == 1)) {
        if (outputDesc->isDuplicated()) {
        if (outputDesc->isDuplicated()) {
            handleIncallSonification(stream, false, false, outputDesc->mIoHandle);
            handleIncallSonification(stream, false, false, outputDesc->mOutput1->mIoHandle);
            handleIncallSonification(stream, false, false, outputDesc->mIoHandle);
            handleIncallSonification(stream, false, false, outputDesc->mOutput2->mIoHandle);
        }
        }
        handleIncallSonification(stream, false, false, outputDesc->mIoHandle);
        handleIncallSonification(stream, false, false, outputDesc->mIoHandle);
    }
    }
@@ -610,8 +658,10 @@ status_t AudioPolicyManagerCustom::stopSource(sp<SwAudioOutputDescriptor> output
                        desc->isActive() &&
                        desc->isActive() &&
                        outputDesc->sharesHwModuleWith(desc) &&
                        outputDesc->sharesHwModuleWith(desc) &&
                        (newDevice != desc->device())) {
                        (newDevice != desc->device())) {
                        audio_devices_t dev = getNewOutputDevice(mOutputs.valueFor(curOutput), false
 /*fromCache*/);
                        setOutputDevice(desc,
                        setOutputDevice(desc,
                                    getNewOutputDevice(desc, false /*fromCache*/),
                                    dev,
                                    true,
                                    true,
                                    outputDesc->latency()*2);
                                    outputDesc->latency()*2);
                }
                }
@@ -897,6 +947,7 @@ audio_io_handle_t AudioPolicyManagerCustom::getOutputForDevice(
        ALOGE("Offloading only allowed with music stream");
        ALOGE("Offloading only allowed with music stream");
        return 0;
        return 0;
    }
    }
#ifdef AUDIO_EXTN_AFE_PROXY_ENABLED
    /*
    /*
    * WFD audio routes back to target speaker when starting a ringtone playback.
    * WFD audio routes back to target speaker when starting a ringtone playback.
    * This is because primary output is reused for ringtone, so output device is
    * This is because primary output is reused for ringtone, so output device is
@@ -916,6 +967,7 @@ audio_io_handle_t AudioPolicyManagerCustom::getOutputForDevice(
        else //route every thing else to ULL path
        else //route every thing else to ULL path
            flags = AUDIO_OUTPUT_FLAG_FAST;
            flags = AUDIO_OUTPUT_FLAG_FAST;
    }
    }
#endif
    // open a direct output if required by specified parameters
    // open a direct output if required by specified parameters
    //force direct flag if offload flag is set: offloading implies a direct output stream
    //force direct flag if offload flag is set: offloading implies a direct output stream
    // and all common behaviors are driven by checking only the direct flag
    // and all common behaviors are driven by checking only the direct flag
@@ -1077,30 +1129,4 @@ non_direct_output:
    return output;
    return output;
}
}


audio_devices_t AudioPolicyManagerCustom::getDeviceForStrategy(routing_strategy strategy, bool fromCache)
{
    audio_devices_t availableOutputDeviceTypes = mAvailableOutputDevices.types();
    audio_devices_t device = AUDIO_DEVICE_NONE;
    switch (strategy) {
        case STRATEGY_SONIFICATION:
        case STRATEGY_ENFORCED_AUDIBLE:
        case STRATEGY_ACCESSIBILITY:
        case STRATEGY_REROUTING:
        case STRATEGY_MEDIA:
            if (strategy != STRATEGY_SONIFICATION){
                // no sonification on WFD sink
                device |= availableOutputDeviceTypes & AUDIO_DEVICE_OUT_PROXY;
                if (device != AUDIO_DEVICE_NONE) {
                    ALOGV("Found proxy for strategy %d", strategy);
                    return device;
                }
            }
            break;
        default:
            ALOGV("getDeviceForStrategy() unknown strategy: %d", strategy);
            break;
    }
    device = AudioPolicyManager::getDeviceForStrategy(strategy, fromCache);
    return device;
}
}
}
+1 −4
Original line number Original line Diff line number Diff line
@@ -40,8 +40,7 @@ namespace android {
#ifndef APE_OFFLOAD_ENABLED
#ifndef APE_OFFLOAD_ENABLED
#define AUDIO_FORMAT_APE 0x20000000UL
#define AUDIO_FORMAT_APE 0x20000000UL
#endif
#endif

#ifndef AUDIO_EXTN_AFE_PROXY_ENABLED
#ifndef AFE_PROXY_ENABLED
#define AUDIO_DEVICE_OUT_PROXY 0x1000000
#define AUDIO_DEVICE_OUT_PROXY 0x1000000
#endif
#endif
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
@@ -63,12 +62,10 @@ public:
                                          const char *device_name);
                                          const char *device_name);
        virtual void setPhoneState(audio_mode_t state);
        virtual void setPhoneState(audio_mode_t state);



        virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo);
        virtual bool isOffloadSupported(const audio_offload_info_t& offloadInfo);


        // true if given state represents a device in a telephony or VoIP call
        // true if given state represents a device in a telephony or VoIP call


        virtual audio_devices_t getDeviceForStrategy(routing_strategy strategy, bool fromCache);
protected:
protected:


         status_t checkAndSetVolume(audio_stream_type_t stream,
         status_t checkAndSetVolume(audio_stream_type_t stream,