Partially fix bug 2111240 Detect docking / undocking event by reporting
to the AudioPolicyManager a new forced usage AudioSystem::FOR_DOCK which can take the FORCE_NONE, FORCE_BT_DOCK or FORCE_WIRED_ACCESSORY values. This CL is complemented by an update of the APM to take into account the FOR_DOCK usage.
This commit is contained in:
@ -282,6 +282,7 @@ public:
|
|||||||
FORCE_BT_SCO,
|
FORCE_BT_SCO,
|
||||||
FORCE_BT_A2DP,
|
FORCE_BT_A2DP,
|
||||||
FORCE_WIRED_ACCESSORY,
|
FORCE_WIRED_ACCESSORY,
|
||||||
|
FORCE_BT_DOCK,
|
||||||
NUM_FORCE_CONFIG,
|
NUM_FORCE_CONFIG,
|
||||||
FORCE_DEFAULT = FORCE_NONE
|
FORCE_DEFAULT = FORCE_NONE
|
||||||
};
|
};
|
||||||
@ -291,6 +292,7 @@ public:
|
|||||||
FOR_COMMUNICATION,
|
FOR_COMMUNICATION,
|
||||||
FOR_MEDIA,
|
FOR_MEDIA,
|
||||||
FOR_RECORD,
|
FOR_RECORD,
|
||||||
|
FOR_DOCK,
|
||||||
NUM_FORCE_USE
|
NUM_FORCE_USE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -111,6 +111,9 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
private Object mSettingsLock = new Object();
|
private Object mSettingsLock = new Object();
|
||||||
private boolean mMediaServerOk;
|
private boolean mMediaServerOk;
|
||||||
|
|
||||||
|
/** cached value of the BT dock address to recognize undocking events */
|
||||||
|
private static String sBtDockAddress;
|
||||||
|
|
||||||
private SoundPool mSoundPool;
|
private SoundPool mSoundPool;
|
||||||
private Object mSoundEffectsLock = new Object();
|
private Object mSoundEffectsLock = new Object();
|
||||||
private static final int NUM_SOUNDPOOL_CHANNELS = 4;
|
private static final int NUM_SOUNDPOOL_CHANNELS = 4;
|
||||||
@ -1399,6 +1402,10 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
|
|
||||||
if (isConnected &&
|
if (isConnected &&
|
||||||
state != BluetoothA2dp.STATE_CONNECTED && state != BluetoothA2dp.STATE_PLAYING) {
|
state != BluetoothA2dp.STATE_CONNECTED && state != BluetoothA2dp.STATE_PLAYING) {
|
||||||
|
if (address.equals(sBtDockAddress)) {
|
||||||
|
Log.v(TAG, "Recognized undocking from BT dock");
|
||||||
|
AudioSystem.setForceUse(AudioSystem.FOR_DOCK, AudioSystem.FORCE_NONE);
|
||||||
|
}
|
||||||
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
|
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
|
||||||
AudioSystem.DEVICE_STATE_UNAVAILABLE,
|
AudioSystem.DEVICE_STATE_UNAVAILABLE,
|
||||||
address);
|
address);
|
||||||
@ -1406,6 +1413,11 @@ public class AudioService extends IAudioService.Stub {
|
|||||||
} else if (!isConnected &&
|
} else if (!isConnected &&
|
||||||
(state == BluetoothA2dp.STATE_CONNECTED ||
|
(state == BluetoothA2dp.STATE_CONNECTED ||
|
||||||
state == BluetoothA2dp.STATE_PLAYING)) {
|
state == BluetoothA2dp.STATE_PLAYING)) {
|
||||||
|
if (btDevice.isBluetoothDock()) {
|
||||||
|
Log.v(TAG, "Recognized docking to BT dock");
|
||||||
|
sBtDockAddress = address;
|
||||||
|
AudioSystem.setForceUse(AudioSystem.FOR_DOCK, AudioSystem.FORCE_BT_DOCK);
|
||||||
|
}
|
||||||
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
|
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
|
||||||
AudioSystem.DEVICE_STATE_AVAILABLE,
|
AudioSystem.DEVICE_STATE_AVAILABLE,
|
||||||
address);
|
address);
|
||||||
|
@ -271,12 +271,14 @@ public class AudioSystem
|
|||||||
public static final int FORCE_BT_SCO = 3;
|
public static final int FORCE_BT_SCO = 3;
|
||||||
public static final int FORCE_BT_A2DP = 4;
|
public static final int FORCE_BT_A2DP = 4;
|
||||||
public static final int FORCE_WIRED_ACCESSORY = 5;
|
public static final int FORCE_WIRED_ACCESSORY = 5;
|
||||||
|
public static final int FORCE_BT_DOCK = 6;
|
||||||
public static final int FORCE_DEFAULT = FORCE_NONE;
|
public static final int FORCE_DEFAULT = FORCE_NONE;
|
||||||
|
|
||||||
// usage for serForceUse
|
// usage for serForceUse
|
||||||
public static final int FOR_COMMUNICATION = 0;
|
public static final int FOR_COMMUNICATION = 0;
|
||||||
public static final int FOR_MEDIA = 1;
|
public static final int FOR_MEDIA = 1;
|
||||||
public static final int FOR_RECORD = 2;
|
public static final int FOR_RECORD = 2;
|
||||||
|
public static final int FOR_DOCK = 3;
|
||||||
|
|
||||||
public static native int setDeviceConnectionState(int device, int state, String device_address);
|
public static native int setDeviceConnectionState(int device, int state, String device_address);
|
||||||
public static native int getDeviceConnectionState(int device, String device_address);
|
public static native int getDeviceConnectionState(int device, String device_address);
|
||||||
|
Reference in New Issue
Block a user