am 52f545c7: Merge change Ibe55f880 into eclair-mr2

Merge commit '52f545c7fd427610cf06d8215fde434cbbf55d81' into eclair-mr2-plus-aosp

* commit '52f545c7fd427610cf06d8215fde434cbbf55d81':
  Bluetooth A2DP suspend-resume improvements.
This commit is contained in:
Eric Laurent
2009-10-20 00:40:20 -07:00
committed by Android Git Automerger

View File

@@ -72,8 +72,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
private final AudioManager mAudioManager;
private final BluetoothService mBluetoothService;
private final BluetoothAdapter mAdapter;
private boolean mSuspending;
private boolean mResuming;
private int mTargetA2dpState;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
@@ -151,8 +150,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
if (mBluetoothService.isEnabled())
onBluetoothEnable();
mSuspending = false;
mResuming = false;
mTargetA2dpState = -1;
}
@Override
@@ -341,10 +339,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
public synchronized boolean suspendSink(BluetoothDevice device) {
mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
"Need BLUETOOTH_ADMIN permission");
if (DBG) log("suspendSink(" + device + "), mSuspending: "+mSuspending+", mResuming: "+mResuming);
if (mSuspending) {
return true;
}
if (DBG) log("suspendSink(" + device + "), mTargetA2dpState: "+mTargetA2dpState);
if (device == null || mAudioDevices == null) {
return false;
}
@@ -353,28 +348,15 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
if (path == null || state == null) {
return false;
}
switch (state.intValue()) {
case BluetoothA2dp.STATE_CONNECTED:
if (mResuming) {
mSuspending = true;
}
return true;
case BluetoothA2dp.STATE_PLAYING:
mAudioManager.setParameters("A2dpSuspended=true");
mSuspending = suspendSinkNative(path);
return mSuspending;
default:
return false;
}
mTargetA2dpState = BluetoothA2dp.STATE_CONNECTED;
return checkSinkSuspendState(state.intValue());
}
public synchronized boolean resumeSink(BluetoothDevice device) {
mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
"Need BLUETOOTH_ADMIN permission");
if (DBG) log("resumeSink(" + device + "), mResuming: "+mResuming+", mSuspending: "+mSuspending);
if (mResuming) {
return true;
}
if (DBG) log("resumeSink(" + device + "), mTargetA2dpState: "+mTargetA2dpState);
if (device == null || mAudioDevices == null) {
return false;
}
@@ -383,19 +365,8 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
if (path == null || state == null) {
return false;
}
switch (state.intValue()) {
case BluetoothA2dp.STATE_PLAYING:
if (mSuspending) {
mResuming = true;
}
return true;
case BluetoothA2dp.STATE_CONNECTED:
mResuming = resumeSinkNative(path);
mAudioManager.setParameters("A2dpSuspended=false");
return mResuming;
default:
return false;
}
mTargetA2dpState = BluetoothA2dp.STATE_PLAYING;
return checkSinkSuspendState(state.intValue());
}
public synchronized BluetoothDevice[] getConnectedSinks() {
@@ -458,10 +429,6 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
}
private void handleSinkStateChange(BluetoothDevice device, int prevState, int state) {
if (state == BluetoothA2dp.STATE_DISCONNECTED) {
mSuspending = false;
mResuming = false;
}
if (state != prevState) {
if (state == BluetoothA2dp.STATE_DISCONNECTED ||
state == BluetoothA2dp.STATE_DISCONNECTING) {
@@ -477,28 +444,11 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
}
mAudioDevices.put(device, state);
if (state == BluetoothA2dp.STATE_CONNECTED && prevState == BluetoothA2dp.STATE_PLAYING) {
if (DBG) log("handleSinkStateChange() STATE_PLAYING -> STATE_CONNECTED: mSuspending: "
+mSuspending+", mResuming: "+mResuming);
if (mSuspending) {
mSuspending = false;
if (mResuming) {
mResuming = false;
resumeSink(device);
}
}
}
if (state == BluetoothA2dp.STATE_PLAYING && prevState == BluetoothA2dp.STATE_CONNECTED) {
if (DBG) log("handleSinkStateChange() STATE_CONNECTED -> STATE_PLAYING: mSuspending: "
+mSuspending+", mResuming: "+mResuming);
checkSinkSuspendState(state);
mTargetA2dpState = -1;
if (mResuming) {
mResuming = false;
if (mSuspending) {
mSuspending = false;
suspendSink(device);
}
}
if (state == BluetoothA2dp.STATE_CONNECTING) {
mAudioManager.setParameters("A2dpSuspended=false");
}
Intent intent = new Intent(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
@@ -527,6 +477,23 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
return sinks;
}
private boolean checkSinkSuspendState(int state) {
boolean result = true;
if (state != mTargetA2dpState) {
if (state == BluetoothA2dp.STATE_PLAYING &&
mTargetA2dpState == BluetoothA2dp.STATE_CONNECTED) {
mAudioManager.setParameters("A2dpSuspended=true");
} else if (state == BluetoothA2dp.STATE_CONNECTED &&
mTargetA2dpState == BluetoothA2dp.STATE_PLAYING) {
mAudioManager.setParameters("A2dpSuspended=false");
} else {
result = false;
}
}
return result;
}
@Override
protected synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (mAudioDevices.isEmpty()) return;