summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-02-22 12:05:20 -0800
committerEric Laurent <elaurent@google.com>2011-02-28 09:13:00 -0800
commit854938a72d968c1bc0de4e2b0ea87777cfebc045 (patch)
treeee52f33cd12460474d96d728301b29b46810c6d8 /media
parentdd1ddc3b1626f8bc335b6e54a73e8dc18bc71bb5 (diff)
downloadframeworks_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.java32
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) {