Merge "Avoid race condition when broadcasting device list changed." into pi-dev
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 3057501..6c9a01b 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -4717,7 +4717,7 @@
NativeEventHandlerDelegate delegate =
new NativeEventHandlerDelegate(callback, handler);
mDeviceCallbacks.put(callback, delegate);
- broadcastDeviceListChange(delegate.getHandler());
+ broadcastDeviceListChange_sync(delegate.getHandler());
}
}
}
@@ -4836,9 +4836,9 @@
/**
* Internal method to compute and generate add/remove messages and then send to any
- * registered callbacks.
+ * registered callbacks. Must be called synchronized on mDeviceCallbacks.
*/
- private void broadcastDeviceListChange(Handler handler) {
+ private void broadcastDeviceListChange_sync(Handler handler) {
int status;
// Get the new current set of ports
@@ -4860,20 +4860,18 @@
AudioDeviceInfo[] removed_devices =
calcListDeltas(current_ports, mPreviousPorts, GET_DEVICES_ALL);
if (added_devices.length != 0 || removed_devices.length != 0) {
- synchronized (mDeviceCallbacks) {
- for (int i = 0; i < mDeviceCallbacks.size(); i++) {
- handler = mDeviceCallbacks.valueAt(i).getHandler();
- if (handler != null) {
- if (removed_devices.length != 0) {
- handler.sendMessage(Message.obtain(handler,
- MSG_DEVICES_DEVICES_REMOVED,
- removed_devices));
- }
- if (added_devices.length != 0) {
- handler.sendMessage(Message.obtain(handler,
- MSG_DEVICES_DEVICES_ADDED,
- added_devices));
- }
+ for (int i = 0; i < mDeviceCallbacks.size(); i++) {
+ handler = mDeviceCallbacks.valueAt(i).getHandler();
+ if (handler != null) {
+ if (removed_devices.length != 0) {
+ handler.sendMessage(Message.obtain(handler,
+ MSG_DEVICES_DEVICES_REMOVED,
+ removed_devices));
+ }
+ if (added_devices.length != 0) {
+ handler.sendMessage(Message.obtain(handler,
+ MSG_DEVICES_DEVICES_ADDED,
+ added_devices));
}
}
}
@@ -4889,7 +4887,9 @@
private class OnAmPortUpdateListener implements AudioManager.OnAudioPortUpdateListener {
static final String TAG = "OnAmPortUpdateListener";
public void onAudioPortListUpdate(AudioPort[] portList) {
- broadcastDeviceListChange(null);
+ synchronized (mDeviceCallbacks) {
+ broadcastDeviceListChange_sync(null);
+ }
}
/**
@@ -4903,7 +4903,9 @@
* Callback method called when the mediaserver dies
*/
public void onServiceDied() {
- broadcastDeviceListChange(null);
+ synchronized (mDeviceCallbacks) {
+ broadcastDeviceListChange_sync(null);
+ }
}
}