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

Commit 736a1026 authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: fix configurable engine and dynamic policies

Make sure the Engine is never aware of remote submix devices with non
"0" (legacy) addresses as the Engine does not have to deal with devices
only used by dynamic audio policies.

Bug: 129144725
Test: make
Change-Id: Ifa19c952e22ac18c5d47e731cbfa41f81fe5c32c
parent 08762400
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@ DeviceDescriptor::DeviceDescriptor(audio_devices_t type, const FormatVector &enc
    mTagName(tagName), mDeviceType(type), mEncodedFormats(encodedFormats)
{
    mCurrentEncodedFormat = AUDIO_FORMAT_DEFAULT;
    if (type == AUDIO_DEVICE_IN_REMOTE_SUBMIX || type == AUDIO_DEVICE_OUT_REMOTE_SUBMIX ) {
    if (audio_is_remote_submix_device(type)) {
        mAddress = String8("0");
    }
    /* If framework runs against a pre 5.0 Audio HAL, encoded formats are absent from the config.
+19 −12
Original line number Diff line number Diff line
@@ -169,8 +169,6 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT
                broadcastDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE);
                return INVALID_OPERATION;
            }
            // Propagate device availability to Engine
            mEngine->setDeviceConnectionState(device, state);

            // outputs should never be empty here
            ALOG_ASSERT(outputs.size() != 0, "setDeviceConnectionState():"
@@ -200,8 +198,6 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT
            // Reset active device codec
            device->setEncodedFormat(AUDIO_FORMAT_DEFAULT);

            // Propagate device availability to Engine
            mEngine->setDeviceConnectionState(device, state);
            } break;

        default:
@@ -209,6 +205,9 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT
            return BAD_VALUE;
        }

        // Propagate device availability to Engine
        setEngineDeviceConnectionState(device, state);

        // No need to evaluate playback routing when connecting a remote submix
        // output device used by a dynamic policy of type recorder as no
        // playback use case is affected.
@@ -318,9 +317,6 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT
            if (mAvailableInputDevices.add(device) < 0) {
                return NO_MEMORY;
            }

            // Propagate device availability to Engine
            mEngine->setDeviceConnectionState(device, state);
        } break;

        // handle input device disconnection
@@ -337,9 +333,6 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT

            checkInputsForDevice(device, state, inputs);
            mAvailableInputDevices.remove(device);

            // Propagate device availability to Engine
            mEngine->setDeviceConnectionState(device, state);
        } break;

        default:
@@ -347,6 +340,9 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT
            return BAD_VALUE;
        }

        // Propagate device availability to Engine
        setEngineDeviceConnectionState(device, state);

        closeAllInputs();
        // As the input device list can impact the output device selection, update
        // getDeviceForStrategy() cache
@@ -369,6 +365,17 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t deviceT
    return BAD_VALUE;
}

void AudioPolicyManager::setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
                                      audio_policy_dev_state_t state) {

    // the Engine does not have to know about remote submix devices used by dynamic audio policies
    if (audio_is_remote_submix_device(device->type()) && device->address() != "0") {
        return;
    }
    mEngine->setDeviceConnectionState(device, state);
}


audio_policy_dev_state_t AudioPolicyManager::getDeviceConnectionState(audio_devices_t device,
                                                                      const char *device_address)
{
@@ -4385,7 +4392,7 @@ status_t AudioPolicyManager::initialize() {
                continue;
            }
            // Device is now validated and can be appended to the available devices of the engine
            mEngine->setDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
            setEngineDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_AVAILABLE);
            i++;
        }
    };
+4 −0
Original line number Diff line number Diff line
@@ -844,6 +844,10 @@ private:
                                             const char *device_address,
                                             const char *device_name,
                                             audio_format_t encodedFormat);

        void setEngineDeviceConnectionState(const sp<DeviceDescriptor> device,
                                      audio_policy_dev_state_t state);

        void updateMono(audio_io_handle_t output) {
            AudioParameter param;
            param.addInt(String8(AudioParameter::keyMonoOutput), (int)mMasterMono);