Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +27 −16 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading @@ -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: { Loading @@ -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); Loading Loading @@ -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; } Loading @@ -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; Loading @@ -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); Loading services/audiopolicy/managerdefault/AudioPolicyManager.h +9 −0 Original line number Diff line number Diff line Loading @@ -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); Loading Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +27 −16 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading @@ -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: { Loading @@ -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); Loading Loading @@ -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; } Loading @@ -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; Loading @@ -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); Loading
services/audiopolicy/managerdefault/AudioPolicyManager.h +9 −0 Original line number Diff line number Diff line Loading @@ -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); Loading