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

Commit 06c38ca4 authored by François Gaffie's avatar François Gaffie Committed by android-build-merger
Browse files

Merge "audio policy: broadcast device connect event before refreshing profiles"

am: 0431f4ad

* commit '0431f4ad':
  audio policy: broadcast device connect event before refreshing profiles

Change-Id: Ia6d94a710b6e179deb162fcc4f6fe10a6b887650
parents 5f192681 0431f4ad
Loading
Loading
Loading
Loading
+27 −16
Original line number Diff line number Diff line
@@ -55,6 +55,17 @@ status_t AudioPolicyManager::setDeviceConnectionState(audio_devices_t device,
    return setDeviceConnectionStateInt(device, state, device_address, device_name);
}

void AudioPolicyManager::broadcastDeviceConnectionState(audio_devices_t device,
                                                        audio_policy_dev_state_t state,
                                                        const String8 &device_address)
{
    AudioParameter param(device_address);
    const String8 key(state == AUDIO_POLICY_DEVICE_STATE_AVAILABLE ?
                AUDIO_PARAMETER_DEVICE_CONNECT : AUDIO_PARAMETER_DEVICE_DISCONNECT);
    param.addInt(key, device);
    mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
}

status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
                                                         audio_policy_dev_state_t state,
                                                         const char *device_address,
@@ -103,8 +114,15 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
                return NO_MEMORY;
            }

            // Before checking outputs, broadcast connect event to allow HAL to retrieve dynamic
            // parameters on newly connected devices (instead of opening the outputs...)
            broadcastDeviceConnectionState(device, state, devDesc->mAddress);

            if (checkOutputsForDevice(devDesc, state, outputs, devDesc->mAddress) != NO_ERROR) {
                mAvailableOutputDevices.remove(devDesc);

                broadcastDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
                                               devDesc->mAddress);
                return INVALID_OPERATION;
            }
            // Propagate device availability to Engine
@@ -116,11 +134,6 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
            ALOGV("setDeviceConnectionState() checkOutputsForDevice() returned %zu outputs",
                  outputs.size());

            // Send connect to HALs
            AudioParameter param = AudioParameter(devDesc->mAddress);
            param.addInt(String8(AUDIO_PARAMETER_DEVICE_CONNECT), device);
            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());

            } break;
        // handle output device disconnection
        case AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE: {
@@ -132,9 +145,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
            ALOGV("setDeviceConnectionState() disconnecting output device %x", device);

            // Send Disconnect to HALs
            AudioParameter param = AudioParameter(devDesc->mAddress);
            param.addInt(String8(AUDIO_PARAMETER_DEVICE_DISCONNECT), device);
            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
            broadcastDeviceConnectionState(device, state, devDesc->mAddress);

            // remove device from available output devices
            mAvailableOutputDevices.remove(devDesc);
@@ -213,7 +224,14 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
                      device);
                return INVALID_OPERATION;
            }

            // Before checking intputs, broadcast connect event to allow HAL to retrieve dynamic
            // parameters on newly connected devices (instead of opening the inputs...)
            broadcastDeviceConnectionState(device, state, devDesc->mAddress);

            if (checkInputsForDevice(devDesc, state, inputs, devDesc->mAddress) != NO_ERROR) {
                broadcastDeviceConnectionState(device, AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE,
                                               devDesc->mAddress);
                return INVALID_OPERATION;
            }

@@ -224,11 +242,6 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
                return NO_MEMORY;
            }

            // Set connect to HALs
            AudioParameter param = AudioParameter(devDesc->mAddress);
            param.addInt(String8(AUDIO_PARAMETER_DEVICE_CONNECT), device);
            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());

            // Propagate device availability to Engine
            mEngine->setDeviceConnectionState(devDesc, state);
        } break;
@@ -243,9 +256,7 @@ status_t AudioPolicyManager::setDeviceConnectionStateInt(audio_devices_t device,
            ALOGV("setDeviceConnectionState() disconnecting input device %x", device);

            // Set Disconnect to HALs
            AudioParameter param = AudioParameter(devDesc->mAddress);
            param.addInt(String8(AUDIO_PARAMETER_DEVICE_DISCONNECT), device);
            mpClientInterface->setParameters(AUDIO_IO_HANDLE_NONE, param.toString());
            broadcastDeviceConnectionState(device, state, devDesc->mAddress);

            checkInputsForDevice(devDesc, state, inputs, devDesc->mAddress);
            mAvailableInputDevices.remove(devDesc);
+9 −0
Original line number Diff line number Diff line
@@ -572,6 +572,15 @@ protected:
        // Audio Policy Engine Interface.
        AudioPolicyManagerInterface *mEngine;
private:
        // Notify the policy client of any change of device state with AUDIO_IO_HANDLE_NONE,
        // so that the client interprets it as global to audio hardware interfaces.
        // It can give a chance to HAL implementer to retrieve dynamic capabilities associated
        // to this device for example.
        // TODO avoid opening stream to retrieve capabilities of a profile.
        void broadcastDeviceConnectionState(audio_devices_t device,
                                            audio_policy_dev_state_t state,
                                            const String8 &device_address);

        // updates device caching and output for streams that can influence the
        //    routing of notifications
        void handleNotificationRoutingForStream(audio_stream_type_t stream);