From 383dc532f3c993ab6111d4fc55eba62ff0f926ec Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Tue, 13 Sep 2016 11:22:52 -0700 Subject: [PATCH] AudioService: restore A2DP/wired headset auto selection Restore automatic routing behavior when wired headset or BT headset is connected. This behavior was changed by commit 0234587b This change mostly reverts 0234587b but keeps public methods setBluetoothA2dpOn() and isBluetoothA2dpOn() deprecated with stub implementations. Bug: 30963785 Bug: 31424965 Change-Id: I90ea04584df595a778993595ad0076fef809ed98 --- .../android/server/audio/AudioService.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index da0c05eefb924..b4606bb652cff 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -510,8 +510,11 @@ public class AudioService extends IAudioService.Stub { private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED; // Request to override default use of A2DP for media. - // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore private boolean mBluetoothA2dpEnabled; + // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore + // state of bluetooth A2DP enable request sen by deprecated APIs setBluetoothA2dpOn() and + // isBluettohA2dpOn() + private boolean mBluetoothA2dpEnabledExternal; private final Object mBluetoothA2dpEnabledLock = new Object(); // Monitoring of audio routes. Protected by mCurAudioRoutes. @@ -840,6 +843,12 @@ public class AudioService extends IAudioService.Stub { RotationHelper.updateOrientation(); } + synchronized (mBluetoothA2dpEnabledLock) { + AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, + mBluetoothA2dpEnabled ? + AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); + } + synchronized (mSettingsLock) { AudioSystem.setForceUse(AudioSystem.FOR_DOCK, mDockAudioMediaEnabled ? @@ -2706,7 +2715,7 @@ public class AudioService extends IAudioService.Stub { * @deprecated * */ public void setBluetoothA2dpOn(boolean on) { - mBluetoothA2dpEnabled = on; + mBluetoothA2dpEnabledExternal = on; Log.e(TAG, "setBluetoothA2dpOn() is deprecated, now a no-op", new Exception("Deprecated use of setBluetoothA2dpOn()")); } @@ -2716,7 +2725,7 @@ public class AudioService extends IAudioService.Stub { * @deprecated * */ public boolean isBluetoothA2dpOn() { - return mBluetoothA2dpEnabled; + return mBluetoothA2dpEnabledExternal; } /** @see AudioManager#startBluetoothSco() */ @@ -3787,6 +3796,11 @@ public class AudioService extends IAudioService.Stub { Slog.i(TAG, "setWiredDeviceConnectionState(" + state + " nm: " + name + " addr:" + address + ")"); } + if ((state == 0) && ((type == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || + (type == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) || + (type == AudioSystem.DEVICE_OUT_LINE))) { + setBluetoothA2dpOnInt(true); + } int delay = checkSendBecomingNoisyIntent(type, state); queueMsgUnderWakeLock(mAudioHandler, MSG_SET_WIRED_DEVICE_CONNECTION_STATE, @@ -4767,6 +4781,7 @@ public class AudioService extends IAudioService.Stub { VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC]; sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, streamState, 0); + setBluetoothA2dpOnInt(true); AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, AudioSystem.DEVICE_STATE_AVAILABLE, address, name); // Reset A2DP suspend state each time a new sink is connected @@ -5004,6 +5019,7 @@ public class AudioService extends IAudioService.Stub { devices |= dev; } } + if (devices == device) { sendMsg(mAudioHandler, MSG_BROADCAST_AUDIO_BECOMING_NOISY, @@ -5107,6 +5123,11 @@ public class AudioService extends IAudioService.Stub { return; } if (state != 0) { + if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) || + (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) || + (device == AudioSystem.DEVICE_OUT_LINE)) { + setBluetoothA2dpOnInt(false); + } if ((device & mSafeMediaVolumeDevices) != 0) { sendMsg(mAudioHandler, MSG_CHECK_MUSIC_ACTIVE, @@ -5572,9 +5593,26 @@ public class AudioService extends IAudioService.Stub { } } + // Handles request to override default use of A2DP for media. + // Must be called synchronized on mConnectedDevices + public void setBluetoothA2dpOnInt(boolean on) { + synchronized (mBluetoothA2dpEnabledLock) { + mBluetoothA2dpEnabled = on; + setForceUseInt_SyncDevices(AudioSystem.FOR_MEDIA, + mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP); + } + } + // Must be called synchronized on mConnectedDevices private void setForceUseInt_SyncDevices(int usage, int config) { switch (usage) { + case AudioSystem.FOR_MEDIA: + if (config == AudioSystem.FORCE_NO_BT_A2DP) { + mBecomingNoisyIntentDevices &= ~AudioSystem.DEVICE_OUT_ALL_A2DP; + } else { // config == AudioSystem.FORCE_NONE + mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ALL_A2DP; + } + break; case AudioSystem.FOR_DOCK: if (config == AudioSystem.FORCE_ANALOG_DOCK) { mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET;