diff options
author | Eric Laurent <elaurent@google.com> | 2011-02-22 12:05:20 -0800 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2011-02-28 09:13:00 -0800 |
commit | 854938a72d968c1bc0de4e2b0ea87777cfebc045 (patch) | |
tree | ee52f33cd12460474d96d728301b29b46810c6d8 /media | |
parent | dd1ddc3b1626f8bc335b6e54a73e8dc18bc71bb5 (diff) | |
download | frameworks_base-854938a72d968c1bc0de4e2b0ea87777cfebc045.zip frameworks_base-854938a72d968c1bc0de4e2b0ea87777cfebc045.tar.gz frameworks_base-854938a72d968c1bc0de4e2b0ea87777cfebc045.tar.bz2 |
Fix issue 3388354.
Release all sco audio clients when the intent indicating
STATE_AUDIO_DISCONNECTED state is received.
Also clear mScoClients array when clients are released.
Change-Id: I63ec9d70fe72a102e09a4a473a367fb2e550b171
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/AudioService.java | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 1fe3ccc..5a73d2d 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -1218,7 +1218,7 @@ public class AudioService extends IAudioService.Stub { if (!checkAudioSettingsPermission("startBluetoothSco()")) { return; } - ScoClient client = getScoClient(cb); + ScoClient client = getScoClient(cb, true); client.incCount(); } @@ -1227,8 +1227,10 @@ public class AudioService extends IAudioService.Stub { if (!checkAudioSettingsPermission("stopBluetoothSco()")) { return; } - ScoClient client = getScoClient(cb); - client.decCount(); + ScoClient client = getScoClient(cb, false); + if (client != null) { + client.decCount(); + } } private class ScoClient implements IBinder.DeathRecipient { @@ -1355,27 +1357,38 @@ public class AudioService extends IAudioService.Stub { } } - public ScoClient getScoClient(IBinder cb) { + private ScoClient getScoClient(IBinder cb, boolean create) { synchronized(mScoClients) { - ScoClient client; + ScoClient client = null; int size = mScoClients.size(); for (int i = 0; i < size; i++) { client = mScoClients.get(i); if (client.getBinder() == cb) return client; } - client = new ScoClient(cb); - mScoClients.add(client); + if (create) { + client = new ScoClient(cb); + mScoClients.add(client); + } return client; } } public void clearAllScoClients(IBinder exceptBinder, boolean stopSco) { synchronized(mScoClients) { + ScoClient savedClient = null; int size = mScoClients.size(); for (int i = 0; i < size; i++) { - if (mScoClients.get(i).getBinder() != exceptBinder) - mScoClients.get(i).clearCount(stopSco); + ScoClient cl = mScoClients.get(i); + if (cl.getBinder() != exceptBinder) { + cl.clearCount(stopSco); + } else { + savedClient = cl; + } + } + mScoClients.clear(); + if (savedClient != null) { + mScoClients.add(savedClient); } } } @@ -2320,6 +2333,7 @@ public class AudioService extends IAudioService.Stub { case BluetoothHeadset.STATE_AUDIO_DISCONNECTED: audioState = AudioManager.SCO_AUDIO_STATE_DISCONNECTED; mScoAudioState = SCO_STATE_INACTIVE; + clearAllScoClients(null, false); break; case BluetoothHeadset.STATE_AUDIO_CONNECTING: if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL) { |