Multi-A2DP support - add a new internal API to suppress Audio Noisy intent
The new API setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent()
is similar to the existing setBluetoothA2dpDeviceConnectionState()
except that it takes one extra argument that indicates whether the
AudioManager.ACTION_AUDIO_BECOMING_NOISY intent will be sent:
setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
..., boolean suppressNoisyIntent)
This API is needed so the Active A2DP Sink device can be changed
while audio is streaming, and the audio continues playing on the new
Active Device.
Bug: 69269748
Test: Manual: multiple connected A2DP devices, and selecting each as
the Active Device.
Change-Id: I75766a58d9e6b42b3ce68bd9ad3a7a72ca5a1023
(cherry picked from commit 82e06463f2)
This commit is contained in:
@@ -3628,6 +3628,33 @@ public class AudioManager {
|
||||
return delay;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicate A2DP source or sink connection state change and eventually suppress
|
||||
* the {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent.
|
||||
* @param device Bluetooth device connected/disconnected
|
||||
* @param state new connection state (BluetoothProfile.STATE_xxx)
|
||||
* @param profile profile for the A2DP device
|
||||
* (either {@link android.bluetooth.BluetoothProfile.A2DP} or
|
||||
* {@link android.bluetooth.BluetoothProfile.A2DP_SINK})
|
||||
* @param suppressNoisyIntent if true the
|
||||
* {@link AudioManager.ACTION_AUDIO_BECOMING_NOISY} intent will not be sent.
|
||||
* @return a delay in ms that the caller should wait before broadcasting
|
||||
* BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED intent.
|
||||
* {@hide}
|
||||
*/
|
||||
public int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
|
||||
BluetoothDevice device, int state, int profile, boolean suppressNoisyIntent) {
|
||||
final IAudioService service = getService();
|
||||
int delay = 0;
|
||||
try {
|
||||
delay = service.setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(device,
|
||||
state, profile, suppressNoisyIntent);
|
||||
} catch (RemoteException e) {
|
||||
throw e.rethrowFromSystemServer();
|
||||
}
|
||||
return delay;
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicate A2DP device configuration has changed.
|
||||
* @param device Bluetooth device whose configuration has changed.
|
||||
|
||||
@@ -203,5 +203,8 @@ interface IAudioService {
|
||||
|
||||
oneway void playerHasOpPlayAudio(in int piid, in boolean hasOpPlayAudio);
|
||||
|
||||
int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(in BluetoothDevice device,
|
||||
int state, int profile, boolean suppressNoisyIntent);
|
||||
|
||||
// WARNING: read warning at top of file, it is recommended to add new methods at the end
|
||||
}
|
||||
|
||||
@@ -4102,23 +4102,31 @@ public class AudioService extends IAudioService.Stub
|
||||
}
|
||||
|
||||
public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile)
|
||||
{
|
||||
return setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
|
||||
device, state, profile, false /* suppressNoisyIntent */);
|
||||
}
|
||||
|
||||
public int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(BluetoothDevice device,
|
||||
int state, int profile, boolean suppressNoisyIntent)
|
||||
{
|
||||
if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, device)) {
|
||||
return 0;
|
||||
}
|
||||
return setBluetoothA2dpDeviceConnectionStateInt(
|
||||
device, state, profile, AudioSystem.DEVICE_NONE);
|
||||
device, state, profile, suppressNoisyIntent, AudioSystem.DEVICE_NONE);
|
||||
}
|
||||
|
||||
public int setBluetoothA2dpDeviceConnectionStateInt(
|
||||
BluetoothDevice device, int state, int profile, int musicDevice)
|
||||
BluetoothDevice device, int state, int profile, boolean suppressNoisyIntent,
|
||||
int musicDevice)
|
||||
{
|
||||
int delay;
|
||||
if (profile != BluetoothProfile.A2DP && profile != BluetoothProfile.A2DP_SINK) {
|
||||
throw new IllegalArgumentException("invalid profile " + profile);
|
||||
}
|
||||
synchronized (mConnectedDevices) {
|
||||
if (profile == BluetoothProfile.A2DP) {
|
||||
if (profile == BluetoothProfile.A2DP && !suppressNoisyIntent) {
|
||||
int intState = (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0;
|
||||
delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
|
||||
intState, musicDevice);
|
||||
@@ -5368,7 +5376,7 @@ public class AudioService extends IAudioService.Stub
|
||||
// consistent with audio policy manager state
|
||||
setBluetoothA2dpDeviceConnectionStateInt(
|
||||
btDevice, BluetoothA2dp.STATE_DISCONNECTED, BluetoothProfile.A2DP,
|
||||
musicDevice);
|
||||
false /* suppressNoisyIntent */, musicDevice);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user