diff options
author | Eric Laurent <elaurent@google.com> | 2009-12-14 03:45:41 -0800 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2009-12-14 03:45:41 -0800 |
commit | da4cc34308d65730c404b669926a92e37b378555 (patch) | |
tree | f6b554ebc694a89a7cc4bdce29ec1ba639e96074 /services | |
parent | 54bb575e85d1e40efbfbb868f37553cdd8ed318f (diff) | |
download | frameworks_base-da4cc34308d65730c404b669926a92e37b378555.zip frameworks_base-da4cc34308d65730c404b669926a92e37b378555.tar.gz frameworks_base-da4cc34308d65730c404b669926a92e37b378555.tar.bz2 |
Fix issue 2324029: In-call (and other) audio screwed up after using Pandora (ERD72).
The problem is due to spurious headset connection indications received from event observer when a 3.5mm headset w/o mic is connected.
In this particular case, The HeadsetObserver first received a valid indication of headset with mic connection, followed by a headset with mic disconnection and finally a headset w/o mic connection.
The HeadsetObserver delays the headset disconnection intent to leave time to music app to pause music before the output path is switched.
As the last headset w/o mic connection indication is received from the event observer before the intent corresponding to the spurious headset with mic disconnection is broadcast, the later is discarded. Results a state where the headset with mic is always considered as connected.
The fix consists in not canceling pending intents when a new headset state is received and carrying the HeadsetObserver state with the delayed message triggering the broacast of the disconnection intent.
Diffstat (limited to 'services')
-rw-r--r-- | services/java/com/android/server/HeadsetObserver.java | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/services/java/com/android/server/HeadsetObserver.java b/services/java/com/android/server/HeadsetObserver.java index 43de36b..a935131 100644 --- a/services/java/com/android/server/HeadsetObserver.java +++ b/services/java/com/android/server/HeadsetObserver.java @@ -49,7 +49,6 @@ class HeadsetObserver extends UEventObserver { private int mHeadsetState; private int mPrevHeadsetState; private String mHeadsetName; - private boolean mPendingIntent; private final Context mContext; private final WakeLock mWakeLock; // held while there is a pending route change @@ -114,7 +113,6 @@ class HeadsetObserver extends UEventObserver { mHeadsetName = newName; mPrevHeadsetState = mHeadsetState; mHeadsetState = headsetState; - mPendingIntent = true; if (headsetState == 0) { Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY); @@ -126,25 +124,28 @@ class HeadsetObserver extends UEventObserver { // This could be improved once the audio sub-system provides an // interface to clear the audio pipeline. mWakeLock.acquire(); - mHandler.sendEmptyMessageDelayed(0, 1000); + mHandler.sendMessageDelayed(mHandler.obtainMessage(0, + mHeadsetState, + mPrevHeadsetState, + mHeadsetName), + 1000); } else { - sendIntents(); - mPendingIntent = false; + sendIntents(mHeadsetState, mPrevHeadsetState, mHeadsetName); } } - private synchronized final void sendIntents() { + private synchronized final void sendIntents(int headsetState, int prevHeadsetState, String headsetName) { int allHeadsets = SUPPORTED_HEADSETS; for (int curHeadset = 1; allHeadsets != 0; curHeadset <<= 1) { if ((curHeadset & allHeadsets) != 0) { - sendIntent(curHeadset); + sendIntent(curHeadset, headsetState, prevHeadsetState, headsetName); allHeadsets &= ~curHeadset; } } } - private final void sendIntent(int headset) { - if ((mHeadsetState & headset) != (mPrevHeadsetState & headset)) { + private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) { + if ((headsetState & headset) != (prevHeadsetState & headset)) { // Pack up the values and broadcast them to everyone Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); @@ -154,14 +155,14 @@ class HeadsetObserver extends UEventObserver { if ((headset & HEADSETS_WITH_MIC) != 0) { microphone = 1; } - if ((mHeadsetState & headset) != 0) { + if ((headsetState & headset) != 0) { state = 1; } intent.putExtra("state", state); - intent.putExtra("name", mHeadsetName); + intent.putExtra("name", headsetName); intent.putExtra("microphone", microphone); - if (LOG) Log.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+mHeadsetName+" mic: "+microphone); + if (LOG) Log.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone); // TODO: Should we require a permission? ActivityManagerNative.broadcastStickyIntent(intent, null); } @@ -170,12 +171,8 @@ class HeadsetObserver extends UEventObserver { private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { - if (mPendingIntent) { - sendIntents(); - mPendingIntent = false; - } + sendIntents(msg.arg1, msg.arg2, (String)msg.obj); mWakeLock.release(); } }; - } |