summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorJohn Spurlock <jspurlock@google.com>2015-04-23 21:32:37 -0400
committerJohn Spurlock <jspurlock@google.com>2015-04-23 21:32:37 -0400
commit8c3dc85de5d6c2ab15a5d9a43feefe608df3cb35 (patch)
tree2663d2fdcab197c76dec41769d301e70534f9ab2 /services
parent052324c13774ffcbeeacfcdf4c5b559fc89e060d (diff)
downloadframeworks_base-8c3dc85de5d6c2ab15a5d9a43feefe608df3cb35.zip
frameworks_base-8c3dc85de5d6c2ab15a5d9a43feefe608df3cb35.tar.gz
frameworks_base-8c3dc85de5d6c2ab15a5d9a43feefe608df3cb35.tar.bz2
AudioService: Fix mConnectedDevices iteration issues.
- Don't remove from the map while iterating. - Use ArrayMap and tighten up all iterations to avoid unnecessary allocations. Bug: 20523001 Change-Id: I2587d0f9778b38d96afdfd0e61b00b06911837ae
Diffstat (limited to 'services')
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java45
1 files changed, 26 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 9a30f0d..6b56279 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -86,6 +86,8 @@ import android.provider.Settings;
import android.provider.Settings.System;
import android.telecom.TelecomManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Log;
import android.util.MathUtils;
import android.util.Slog;
@@ -110,10 +112,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
-import java.util.Set;
/**
* The implementation of the volume manager service.
@@ -407,8 +407,7 @@ public class AudioService extends IAudioService.Stub {
return "0x" + Integer.toHexString(device) + ":" + deviceAddress;
}
- private final HashMap<String, DeviceListSpec> mConnectedDevices =
- new HashMap<String, DeviceListSpec>();
+ private final ArrayMap<String, DeviceListSpec> mConnectedDevices = new ArrayMap<>();
// Forced device usage for communications
private int mForcedUseForComm;
@@ -2830,16 +2829,22 @@ public class AudioService extends IAudioService.Stub {
}
}
public void onServiceDisconnected(int profile) {
+ ArraySet<String> toRemove = null;
switch (profile) {
case BluetoothProfile.A2DP:
synchronized (mConnectedDevices) {
synchronized (mA2dpAvrcpLock) {
// Disconnect ALL DEVICE_OUT_BLUETOOTH_A2DP devices
- for(Map.Entry<String, DeviceListSpec> entry
- : mConnectedDevices.entrySet()) {
- DeviceListSpec deviceSpec = entry.getValue();
+ for (int i = 0; i < mConnectedDevices.size(); i++) {
+ DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
if (deviceSpec.mDeviceType == AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP) {
- makeA2dpDeviceUnavailableNow(deviceSpec.mDeviceAddress);
+ toRemove = toRemove != null ? toRemove : new ArraySet<String>();
+ toRemove.add(deviceSpec.mDeviceAddress);
+ }
+ }
+ if (toRemove != null) {
+ for (int i = 0; i < toRemove.size(); i++) {
+ makeA2dpDeviceUnavailableNow(toRemove.valueAt(i));
}
}
}
@@ -2849,11 +2854,16 @@ public class AudioService extends IAudioService.Stub {
case BluetoothProfile.A2DP_SINK:
synchronized (mConnectedDevices) {
// Disconnect ALL DEVICE_IN_BLUETOOTH_A2DP devices
- for(Map.Entry<String, DeviceListSpec> entry
- : mConnectedDevices.entrySet()) {
- DeviceListSpec deviceSpec = entry.getValue();
+ for(int i = 0; i < mConnectedDevices.size(); i++) {
+ DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i);
if (deviceSpec.mDeviceType == AudioSystem.DEVICE_IN_BLUETOOTH_A2DP) {
- makeA2dpSrcUnavailable(deviceSpec.mDeviceAddress);
+ toRemove = toRemove != null ? toRemove : new ArraySet<String>();
+ toRemove.add(deviceSpec.mDeviceAddress);
+ }
+ }
+ if (toRemove != null) {
+ for (int i = 0; i < toRemove.size(); i++) {
+ makeA2dpSrcUnavailable(toRemove.valueAt(i));
}
}
}
@@ -4147,11 +4157,8 @@ public class AudioService extends IAudioService.Stub {
// Restore device connection states
synchronized (mConnectedDevices) {
- Set set = mConnectedDevices.entrySet();
- Iterator i = set.iterator();
- while (i.hasNext()) {
- Map.Entry device = (Map.Entry)i.next();
- DeviceListSpec spec = (DeviceListSpec)device.getValue();
+ for (int i = 0; i < mConnectedDevices.size(); i++) {
+ DeviceListSpec spec = mConnectedDevices.valueAt(i);
AudioSystem.setDeviceConnectionState(
spec.mDeviceType,
AudioSystem.DEVICE_STATE_AVAILABLE,
@@ -4600,8 +4607,8 @@ public class AudioService extends IAudioService.Stub {
int delay = 0;
if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) {
int devices = 0;
- for (String key : mConnectedDevices.keySet()) {
- int dev = mConnectedDevices.get(key).mDeviceType;
+ for (int i = 0; i < mConnectedDevices.size(); i++) {
+ int dev = mConnectedDevices.valueAt(i).mDeviceType;
if (((dev & AudioSystem.DEVICE_BIT_IN) == 0)
&& ((dev & mBecomingNoisyIntentDevices) != 0)) {
devices |= dev;