Loading services/core/java/com/android/server/audio/AudioDeviceBroker.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -1218,6 +1218,10 @@ import java.util.concurrent.atomic.AtomicBoolean; sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs); sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs); } } /*package*/ void setLeAudioTimeout(String address, int device, int delayMs) { sendILMsg(MSG_IL_BTLEAUDIO_TIMEOUT, SENDMSG_QUEUE, device, address, delayMs); } /*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) { /*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) { synchronized (mDeviceStateLock) { synchronized (mDeviceStateLock) { mBtHelper.setAvrcpAbsoluteVolumeSupported(supported); mBtHelper.setAvrcpAbsoluteVolumeSupported(supported); Loading Loading @@ -1422,6 +1426,13 @@ import java.util.concurrent.atomic.AtomicBoolean; mDeviceInventory.onMakeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1); mDeviceInventory.onMakeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1); } } break; break; case MSG_IL_BTLEAUDIO_TIMEOUT: // msg.obj == address of LE Audio device synchronized (mDeviceStateLock) { mDeviceInventory.onMakeLeAudioDeviceUnavailableNow( (String) msg.obj, msg.arg1); } break; case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: final BluetoothDevice btDevice = (BluetoothDevice) msg.obj; final BluetoothDevice btDevice = (BluetoothDevice) msg.obj; synchronized (mDeviceStateLock) { synchronized (mDeviceStateLock) { Loading Loading @@ -1648,11 +1659,14 @@ import java.util.concurrent.atomic.AtomicBoolean; // process set volume for Le Audio, obj is BleVolumeInfo // process set volume for Le Audio, obj is BleVolumeInfo private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; private static final int MSG_IL_BTLEAUDIO_TIMEOUT = 49; private static boolean isMessageHandledUnderWakelock(int msgId) { private static boolean isMessageHandledUnderWakelock(int msgId) { switch(msgId) { switch(msgId) { case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTLEAUDIO_TIMEOUT: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_TOGGLE_HDMI: case MSG_TOGGLE_HDMI: case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: Loading Loading @@ -1743,6 +1757,7 @@ import java.util.concurrent.atomic.AtomicBoolean; case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTLEAUDIO_TIMEOUT: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: if (sLastDeviceConnectMsgTime >= time) { if (sLastDeviceConnectMsgTime >= time) { // add a little delay to make sure messages are ordered as expected // add a little delay to make sure messages are ordered as expected Loading services/core/java/com/android/server/audio/AudioDeviceInventory.java +19 −4 Original line number Original line Diff line number Diff line Loading @@ -374,7 +374,7 @@ public class AudioDeviceInventory { case BluetoothProfile.LE_AUDIO: case BluetoothProfile.LE_AUDIO: case BluetoothProfile.LE_AUDIO_BROADCAST: case BluetoothProfile.LE_AUDIO_BROADCAST: if (switchToUnavailable) { if (switchToUnavailable) { makeLeAudioDeviceUnavailable(address, btInfo.mAudioSystemDevice); makeLeAudioDeviceUnavailableNow(address, btInfo.mAudioSystemDevice); } else if (switchToAvailable) { } else if (switchToAvailable) { makeLeAudioDeviceAvailable(address, BtHelper.getName(btInfo.mDevice), makeLeAudioDeviceAvailable(address, BtHelper.getName(btInfo.mDevice), streamType, btInfo.mVolume == -1 ? -1 : btInfo.mVolume * 10, streamType, btInfo.mVolume == -1 ? -1 : btInfo.mVolume * 10, Loading Loading @@ -486,6 +486,12 @@ public class AudioDeviceInventory { } } } } /*package*/ void onMakeLeAudioDeviceUnavailableNow(String address, int device) { synchronized (mDevicesLock) { makeLeAudioDeviceUnavailableNow(address, device); } } /*package*/ void onReportNewRoutes() { /*package*/ void onReportNewRoutes() { int n = mRoutesObservers.beginBroadcast(); int n = mRoutesObservers.beginBroadcast(); if (n > 0) { if (n > 0) { Loading Loading @@ -883,10 +889,11 @@ public class AudioDeviceInventory { new MediaMetrics.Item(mMetricsId + "disconnectLeAudio") new MediaMetrics.Item(mMetricsId + "disconnectLeAudio") .record(); .record(); if (toRemove.size() > 0) { if (toRemove.size() > 0) { final int delay = checkSendBecomingNoisyIntentInt(device, 0, final int delay = checkSendBecomingNoisyIntentInt(device, AudioService.CONNECTION_STATE_DISCONNECTED, AudioSystem.DEVICE_NONE); AudioSystem.DEVICE_NONE); toRemove.stream().forEach(deviceAddress -> toRemove.stream().forEach(deviceAddress -> makeLeAudioDeviceUnavailable(deviceAddress, device) makeLeAudioDeviceUnavailableLater(deviceAddress, device, delay) ); ); } } } } Loading Loading @@ -1222,7 +1229,7 @@ public class AudioDeviceInventory { } } @GuardedBy("mDevicesLock") @GuardedBy("mDevicesLock") private void makeLeAudioDeviceUnavailable(String address, int device) { private void makeLeAudioDeviceUnavailableNow(String address, int device) { if (device != AudioSystem.DEVICE_NONE) { if (device != AudioSystem.DEVICE_NONE) { final int res = AudioSystem.setDeviceConnectionState(new AudioDeviceAttributes( final int res = AudioSystem.setDeviceConnectionState(new AudioDeviceAttributes( device, address), device, address), Loading @@ -1245,6 +1252,14 @@ public class AudioDeviceInventory { setCurrentAudioRouteNameIfPossible(null, false /*fromA2dp*/); setCurrentAudioRouteNameIfPossible(null, false /*fromA2dp*/); } } @GuardedBy("mDevicesLock") private void makeLeAudioDeviceUnavailableLater(String address, int device, int delayMs) { // the device will be made unavailable later, so consider it disconnected right away mConnectedDevices.remove(DeviceInfo.makeDeviceListKey(device, address)); // send the delayed message to make the device unavailable later mDeviceBroker.setLeAudioTimeout(address, device, delayMs); } @GuardedBy("mDevicesLock") @GuardedBy("mDevicesLock") private void setCurrentAudioRouteNameIfPossible(String name, boolean fromA2dp) { private void setCurrentAudioRouteNameIfPossible(String name, boolean fromA2dp) { synchronized (mCurAudioRoutes) { synchronized (mCurAudioRoutes) { Loading Loading
services/core/java/com/android/server/audio/AudioDeviceBroker.java +15 −0 Original line number Original line Diff line number Diff line Loading @@ -1218,6 +1218,10 @@ import java.util.concurrent.atomic.AtomicBoolean; sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs); sendILMsg(MSG_IL_BTA2DP_TIMEOUT, SENDMSG_QUEUE, a2dpCodec, address, delayMs); } } /*package*/ void setLeAudioTimeout(String address, int device, int delayMs) { sendILMsg(MSG_IL_BTLEAUDIO_TIMEOUT, SENDMSG_QUEUE, device, address, delayMs); } /*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) { /*package*/ void setAvrcpAbsoluteVolumeSupported(boolean supported) { synchronized (mDeviceStateLock) { synchronized (mDeviceStateLock) { mBtHelper.setAvrcpAbsoluteVolumeSupported(supported); mBtHelper.setAvrcpAbsoluteVolumeSupported(supported); Loading Loading @@ -1422,6 +1426,13 @@ import java.util.concurrent.atomic.AtomicBoolean; mDeviceInventory.onMakeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1); mDeviceInventory.onMakeA2dpDeviceUnavailableNow((String) msg.obj, msg.arg1); } } break; break; case MSG_IL_BTLEAUDIO_TIMEOUT: // msg.obj == address of LE Audio device synchronized (mDeviceStateLock) { mDeviceInventory.onMakeLeAudioDeviceUnavailableNow( (String) msg.obj, msg.arg1); } break; case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: final BluetoothDevice btDevice = (BluetoothDevice) msg.obj; final BluetoothDevice btDevice = (BluetoothDevice) msg.obj; synchronized (mDeviceStateLock) { synchronized (mDeviceStateLock) { Loading Loading @@ -1648,11 +1659,14 @@ import java.util.concurrent.atomic.AtomicBoolean; // process set volume for Le Audio, obj is BleVolumeInfo // process set volume for Le Audio, obj is BleVolumeInfo private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; private static final int MSG_II_SET_LE_AUDIO_OUT_VOLUME = 46; private static final int MSG_IL_BTLEAUDIO_TIMEOUT = 49; private static boolean isMessageHandledUnderWakelock(int msgId) { private static boolean isMessageHandledUnderWakelock(int msgId) { switch(msgId) { switch(msgId) { case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTLEAUDIO_TIMEOUT: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_TOGGLE_HDMI: case MSG_TOGGLE_HDMI: case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: case MSG_L_A2DP_DEVICE_CONNECTION_CHANGE_EXT: Loading Loading @@ -1743,6 +1757,7 @@ import java.util.concurrent.atomic.AtomicBoolean; case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_BT_ACTIVE_DEVICE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTA2DP_TIMEOUT: case MSG_IL_BTLEAUDIO_TIMEOUT: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: case MSG_L_A2DP_DEVICE_CONFIG_CHANGE: if (sLastDeviceConnectMsgTime >= time) { if (sLastDeviceConnectMsgTime >= time) { // add a little delay to make sure messages are ordered as expected // add a little delay to make sure messages are ordered as expected Loading
services/core/java/com/android/server/audio/AudioDeviceInventory.java +19 −4 Original line number Original line Diff line number Diff line Loading @@ -374,7 +374,7 @@ public class AudioDeviceInventory { case BluetoothProfile.LE_AUDIO: case BluetoothProfile.LE_AUDIO: case BluetoothProfile.LE_AUDIO_BROADCAST: case BluetoothProfile.LE_AUDIO_BROADCAST: if (switchToUnavailable) { if (switchToUnavailable) { makeLeAudioDeviceUnavailable(address, btInfo.mAudioSystemDevice); makeLeAudioDeviceUnavailableNow(address, btInfo.mAudioSystemDevice); } else if (switchToAvailable) { } else if (switchToAvailable) { makeLeAudioDeviceAvailable(address, BtHelper.getName(btInfo.mDevice), makeLeAudioDeviceAvailable(address, BtHelper.getName(btInfo.mDevice), streamType, btInfo.mVolume == -1 ? -1 : btInfo.mVolume * 10, streamType, btInfo.mVolume == -1 ? -1 : btInfo.mVolume * 10, Loading Loading @@ -486,6 +486,12 @@ public class AudioDeviceInventory { } } } } /*package*/ void onMakeLeAudioDeviceUnavailableNow(String address, int device) { synchronized (mDevicesLock) { makeLeAudioDeviceUnavailableNow(address, device); } } /*package*/ void onReportNewRoutes() { /*package*/ void onReportNewRoutes() { int n = mRoutesObservers.beginBroadcast(); int n = mRoutesObservers.beginBroadcast(); if (n > 0) { if (n > 0) { Loading Loading @@ -883,10 +889,11 @@ public class AudioDeviceInventory { new MediaMetrics.Item(mMetricsId + "disconnectLeAudio") new MediaMetrics.Item(mMetricsId + "disconnectLeAudio") .record(); .record(); if (toRemove.size() > 0) { if (toRemove.size() > 0) { final int delay = checkSendBecomingNoisyIntentInt(device, 0, final int delay = checkSendBecomingNoisyIntentInt(device, AudioService.CONNECTION_STATE_DISCONNECTED, AudioSystem.DEVICE_NONE); AudioSystem.DEVICE_NONE); toRemove.stream().forEach(deviceAddress -> toRemove.stream().forEach(deviceAddress -> makeLeAudioDeviceUnavailable(deviceAddress, device) makeLeAudioDeviceUnavailableLater(deviceAddress, device, delay) ); ); } } } } Loading Loading @@ -1222,7 +1229,7 @@ public class AudioDeviceInventory { } } @GuardedBy("mDevicesLock") @GuardedBy("mDevicesLock") private void makeLeAudioDeviceUnavailable(String address, int device) { private void makeLeAudioDeviceUnavailableNow(String address, int device) { if (device != AudioSystem.DEVICE_NONE) { if (device != AudioSystem.DEVICE_NONE) { final int res = AudioSystem.setDeviceConnectionState(new AudioDeviceAttributes( final int res = AudioSystem.setDeviceConnectionState(new AudioDeviceAttributes( device, address), device, address), Loading @@ -1245,6 +1252,14 @@ public class AudioDeviceInventory { setCurrentAudioRouteNameIfPossible(null, false /*fromA2dp*/); setCurrentAudioRouteNameIfPossible(null, false /*fromA2dp*/); } } @GuardedBy("mDevicesLock") private void makeLeAudioDeviceUnavailableLater(String address, int device, int delayMs) { // the device will be made unavailable later, so consider it disconnected right away mConnectedDevices.remove(DeviceInfo.makeDeviceListKey(device, address)); // send the delayed message to make the device unavailable later mDeviceBroker.setLeAudioTimeout(address, device, delayMs); } @GuardedBy("mDevicesLock") @GuardedBy("mDevicesLock") private void setCurrentAudioRouteNameIfPossible(String name, boolean fromA2dp) { private void setCurrentAudioRouteNameIfPossible(String name, boolean fromA2dp) { synchronized (mCurAudioRoutes) { synchronized (mCurAudioRoutes) { Loading