Merge "AudioManager: restore setBluetoothA2dpOn() method" into jb-dev

This commit is contained in:
Eric Laurent
2012-05-24 11:39:36 -07:00
committed by Android (Google) Code Review
4 changed files with 80 additions and 10 deletions

View File

@@ -1270,25 +1270,42 @@ public class AudioManager {
}
/**
* @param on set <var>true</var> to route A2DP audio to/from Bluetooth
* headset; <var>false</var> disable A2DP audio
* Allow or disallow use of Bluetooth A2DP for media.
* <p>The default behavior of the system is to use A2DP for media playback whenever an A2DP sink
* is connected. Applications can use this method to override this behavior.
* Note that the request will not persist after a wired headset or an A2DP sink is connected or
* disconnected:
* - Connection of an A2DP sink automatically enables use of A2DP.
* - Connection of a wired headset automatically disables use of A2DP.
* - Disconnection of a wired headset automatically enables use of A2DP if an A2DP sink is
* connected.
* <p>Requires Permission:
* {@link android.Manifest.permission#MODIFY_AUDIO_SETTINGS}.
* @param on set <var>true</var> to allow use of A2DP for media (default).
* <var>false</var> to disallow use of A2DP for media.
* @deprecated Do not use.
*/
@Deprecated public void setBluetoothA2dpOn(boolean on){
IAudioService service = getService();
try {
service.setBluetoothA2dpOn(on);
} catch (RemoteException e) {
Log.e(TAG, "Dead object in setBluetoothA2dpOn", e);
}
}
/**
* Checks whether A2DP audio routing to the Bluetooth headset is on or off.
* Checks whether use of A2DP sinks is enabled for media.
*
* @return true if A2DP audio is being routed to/from Bluetooth headset;
* false if otherwise
* @return true if use of A2DP is enabled for media, false otherwise.
*/
public boolean isBluetoothA2dpOn() {
if (AudioSystem.getDeviceConnectionState(DEVICE_OUT_BLUETOOTH_A2DP,"")
== AudioSystem.DEVICE_STATE_UNAVAILABLE) {
IAudioService service = getService();
try {
return service.isBluetoothA2dpOn();
} catch (RemoteException e) {
Log.e(TAG, "Dead object in isBluetoothA2dpOn", e);
return false;
} else {
return true;
}
}

View File

@@ -392,6 +392,10 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED;
// Request to override default use of A2DP for media.
private boolean mBluetoothA2dpEnabled;
private final Object mBluetoothA2dpEnabledLock = new Object();
///////////////////////////////////////////////////////////////////////////
// Construction
///////////////////////////////////////////////////////////////////////////
@@ -481,6 +485,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
mMasterVolumeRamp = context.getResources().getIntArray(
com.android.internal.R.array.config_masterVolumeRamp);
}
private void createAudioSystemThread() {
@@ -1651,6 +1656,21 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
return (mForcedUseForComm == AudioSystem.FORCE_BT_SCO);
}
/** @see AudioManager#setBluetoothA2dpOn() */
public void setBluetoothA2dpOn(boolean on) {
if (!checkAudioSettingsPermission("setBluetoothA2dpOn()")) {
return;
}
setBluetoothA2dpOnInt(on);
}
/** @see AudioManager#isBluetoothA2dpOn() */
public boolean isBluetoothA2dpOn() {
synchronized (mBluetoothA2dpEnabledLock) {
return mBluetoothA2dpEnabled;
}
}
/** @see AudioManager#startBluetoothSco() */
public void startBluetoothSco(IBinder cb){
if (!checkAudioSettingsPermission("startBluetoothSco()") ||
@@ -1673,6 +1693,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
}
private class ScoClient implements IBinder.DeathRecipient {
private IBinder mCb; // To be notified of client's death
private int mCreatorPid;
@@ -2894,6 +2915,11 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
setOrientationForAudioSystem();
}
synchronized (mBluetoothA2dpEnabledLock) {
AudioSystem.setForceUse(AudioSystem.FOR_MEDIA,
mBluetoothA2dpEnabled ?
AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
}
// indicate the end of reconfiguration phase to audio HAL
AudioSystem.setParameters("restarting=false");
break;
@@ -2976,6 +3002,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
// must be called synchronized on mConnectedDevices
private void makeA2dpDeviceAvailable(String address) {
// enable A2DP before notifying A2DP connection to avoid unecessary processing in
// audio policy manager
setBluetoothA2dpOnInt(true);
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_AVAILABLE,
address);
@@ -3177,7 +3206,15 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
} else {
device = AudioSystem.DEVICE_OUT_WIRED_HEADPHONE;
}
// enable A2DP before notifying headset disconnection to avoid glitches
if (state == 0) {
setBluetoothA2dpOnInt(true);
}
handleDeviceConnection((state == 1), device, "");
// disable A2DP after notifying headset connection to avoid glitches
if (state != 0) {
setBluetoothA2dpOnInt(false);
}
} else if (action.equals(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG)) {
state = intent.getIntExtra("state", 0);
Log.v(TAG, "Broadcast Receiver: Got ACTION_ANALOG_AUDIO_DOCK_PLUG, state = "+state);
@@ -4655,6 +4692,17 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
// Handles request to override default use of A2DP for media.
public void setBluetoothA2dpOnInt(boolean on) {
synchronized (mBluetoothA2dpEnabledLock) {
mBluetoothA2dpEnabled = on;
sendMsg(mAudioHandler, MSG_SET_FORCE_USE, SENDMSG_QUEUE,
AudioSystem.FOR_MEDIA,
mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP,
null, 0);
}
}
@Override
public void setRingtonePlayer(IRingtonePlayer player) {
mContext.enforceCallingOrSelfPermission(REMOTE_AUDIO_PLAYBACK, null);

View File

@@ -318,7 +318,8 @@ public class AudioSystem
public static final int FORCE_BT_DESK_DOCK = 7;
public static final int FORCE_ANALOG_DOCK = 8;
public static final int FORCE_DIGITAL_DOCK = 9;
private static final int NUM_FORCE_CONFIG = 10;
public static final int FORCE_NO_BT_A2DP = 10;
private static final int NUM_FORCE_CONFIG = 11;
public static final int FORCE_DEFAULT = FORCE_NONE;
// usage for setForceUse, must match AudioSystem::force_use

View File

@@ -96,6 +96,10 @@ interface IAudioService {
boolean isBluetoothScoOn();
oneway void setBluetoothA2dpOn(boolean on);
boolean isBluetoothA2dpOn();
int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb, IAudioFocusDispatcher l,
String clientId, String callingPackageName);