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
This commit is contained in:
Eric Laurent
2016-09-13 11:22:52 -07:00
parent d28f5d5e5a
commit 383dc532f3

View File

@@ -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;