Merge "Prevent AudioService dead lock issue."

This commit is contained in:
Jean-Michel Trivi
2015-01-16 17:23:36 +00:00
committed by Gerrit Code Review

View File

@ -508,6 +508,7 @@ public class AudioService extends IAudioService.Stub {
// Reference to BluetoothA2dp to query for AbsoluteVolume. // Reference to BluetoothA2dp to query for AbsoluteVolume.
private BluetoothA2dp mA2dp; private BluetoothA2dp mA2dp;
// lock always taken synchronized on mConnectedDevices
private final Object mA2dpAvrcpLock = new Object(); private final Object mA2dpAvrcpLock = new Object();
// If absolute volume is supported in AVRCP device // If absolute volume is supported in AVRCP device
private boolean mAvrcpAbsVolSupported = false; private boolean mAvrcpAbsVolSupported = false;
@ -2731,12 +2732,12 @@ public class AudioService extends IAudioService.Stub {
List<BluetoothDevice> deviceList; List<BluetoothDevice> deviceList;
switch(profile) { switch(profile) {
case BluetoothProfile.A2DP: case BluetoothProfile.A2DP:
synchronized (mConnectedDevices) {
synchronized (mA2dpAvrcpLock) { synchronized (mA2dpAvrcpLock) {
mA2dp = (BluetoothA2dp) proxy; mA2dp = (BluetoothA2dp) proxy;
deviceList = mA2dp.getConnectedDevices(); deviceList = mA2dp.getConnectedDevices();
if (deviceList.size() > 0) { if (deviceList.size() > 0) {
btDevice = deviceList.get(0); btDevice = deviceList.get(0);
synchronized (mConnectedDevices) {
int state = mA2dp.getConnectionState(btDevice); int state = mA2dp.getConnectionState(btDevice);
int delay = checkSendBecomingNoisyIntent( int delay = checkSendBecomingNoisyIntent(
AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
@ -2831,9 +2832,9 @@ public class AudioService extends IAudioService.Stub {
public void onServiceDisconnected(int profile) { public void onServiceDisconnected(int profile) {
switch(profile) { switch(profile) {
case BluetoothProfile.A2DP: case BluetoothProfile.A2DP:
synchronized (mConnectedDevices) {
synchronized (mA2dpAvrcpLock) { synchronized (mA2dpAvrcpLock) {
mA2dp = null; mA2dp = null;
synchronized (mConnectedDevices) {
if (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)) { if (mConnectedDevices.containsKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)) {
makeA2dpDeviceUnavailableNow( makeA2dpDeviceUnavailableNow(
mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); mConnectedDevices.get(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP));