From c30a3e8d1cb266b75c347bb1e51df3e2ba914d32 Mon Sep 17 00:00:00 2001 From: weichinweng Date: Tue, 9 Oct 2018 18:02:17 +0800 Subject: [PATCH] AudioService: Add Hearing Aid Switch Control 1) Add setBluetoothHearingAidDeviceConnectionState interface to control suppressNoisyIntent flag. 2) Add check to confirm the previous device is active or not when want to clean it. Bug: 112279820 Test: Build Pass, BT off/on when play A2DP, Switch active device Change-Id: I73f1236d44213c6cf4a2708f3c96144416cfa67d --- media/java/android/media/AudioManager.java | 19 ++++++-- media/java/android/media/IAudioService.aidl | 5 ++- .../android/server/audio/AudioService.java | 45 ++++++++++--------- 3 files changed, 43 insertions(+), 26 deletions(-) diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index bbc51ce37a525..aec45204ef086 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3932,18 +3932,31 @@ public class AudioManager { } /** - * Indicate Hearing Aid connection state change. + * Indicate Hearing Aid 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 musicDevice Default get system volume for the connecting device. + * (either {@link android.bluetooth.BluetoothProfile.hearingaid} or + * {@link android.bluetooth.BluetoothProfile.HEARING_AID}) + * @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 + * BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED intent. * {@hide} */ - public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state) { + public int setBluetoothHearingAidDeviceConnectionState( + BluetoothDevice device, int state, boolean suppressNoisyIntent, + int musicDevice) { final IAudioService service = getService(); + int delay = 0; try { - service.setHearingAidDeviceConnectionState(device, state); + delay = service.setBluetoothHearingAidDeviceConnectionState(device, + state, suppressNoisyIntent, musicDevice); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } + return delay; } /** diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 569db16c312ec..abd64119de619 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -151,8 +151,6 @@ interface IAudioService { void setWiredDeviceConnectionState(int type, int state, String address, String name, String caller); - void setHearingAidDeviceConnectionState(in BluetoothDevice device, int state); - int setBluetoothA2dpDeviceConnectionState(in BluetoothDevice device, int state, int profile); void handleBluetoothA2dpDeviceConfigChange(in BluetoothDevice device); @@ -210,6 +208,9 @@ interface IAudioService { oneway void playerHasOpPlayAudio(in int piid, in boolean hasOpPlayAudio); + int setBluetoothHearingAidDeviceConnectionState(in BluetoothDevice device, + int state, boolean suppressNoisyIntent, int musicDevice); + int setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(in BluetoothDevice device, int state, int profile, boolean suppressNoisyIntent, int a2dpVolume); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d05652318ea93..40f14374c8507 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4661,22 +4661,15 @@ public class AudioService extends IAudioService.Stub } } - @Override - public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state) - { - mDeviceLogger.log((new AudioEventLogger.StringEvent( - "setHearingAidDeviceConnectionState state=" + state - + " addr=" + device.getAddress())).printLog(TAG)); - - setBluetoothHearingAidDeviceConnectionState( - device, state, false /* suppressNoisyIntent */, AudioSystem.DEVICE_NONE); - } - public int setBluetoothHearingAidDeviceConnectionState( BluetoothDevice device, int state, boolean suppressNoisyIntent, int musicDevice) { int delay; + mDeviceLogger.log((new AudioEventLogger.StringEvent( + "setHearingAidDeviceConnectionState state=" + state + + " addr=" + device.getAddress() + + " supprNoisy=" + suppressNoisyIntent)).printLog(TAG)); synchronized (mConnectedDevices) { if (!suppressNoisyIntent) { int intState = (state == BluetoothHearingAid.STATE_CONNECTED) ? 1 : 0; @@ -5866,6 +5859,7 @@ public class AudioService extends IAudioService.Stub address)); sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE, AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, null, 0); + setCurrentAudioRouteNameIfPossible(name); } private void onSendBecomingNoisyIntent() { @@ -5887,7 +5881,7 @@ public class AudioService extends IAudioService.Stub mConnectedDevices.remove( makeDeviceListKey(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, address)); // Remove A2DP routes as well - setCurrentAudioRouteName(null); + setCurrentAudioRouteNameIfPossible(null); if (mDockAddress == address) { mDockAddress = null; } @@ -5957,6 +5951,7 @@ public class AudioService extends IAudioService.Stub sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE, AudioSystem.DEVICE_OUT_HEARING_AID, 0, mStreamStates[AudioSystem.STREAM_MUSIC], 0); + setCurrentAudioRouteNameIfPossible(name); } // must be called synchronized on mConnectedDevices @@ -5966,7 +5961,7 @@ public class AudioService extends IAudioService.Stub mConnectedDevices.remove( makeDeviceListKey(AudioSystem.DEVICE_OUT_HEARING_AID, address)); // Remove Hearing Aid routes as well - setCurrentAudioRouteName(null); + setCurrentAudioRouteNameIfPossible(null); } // must be called synchronized on mConnectedDevices @@ -6011,7 +6006,6 @@ public class AudioService extends IAudioService.Stub } else { makeA2dpDeviceUnavailableNow(address); } - setCurrentAudioRouteName(null); } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) { if (btDevice.isBluetoothDock()) { // this could be a reconnection after a transient disconnection @@ -6035,7 +6029,6 @@ public class AudioService extends IAudioService.Stub } makeA2dpDeviceAvailable(address, btDevice.getName(), "onSetA2dpSinkConnectionState"); - setCurrentAudioRouteName(btDevice.getAliasName()); } } } @@ -6087,25 +6080,35 @@ public class AudioService extends IAudioService.Stub if (isConnected && state != BluetoothProfile.STATE_CONNECTED) { makeHearingAidDeviceUnavailable(address); - setCurrentAudioRouteName(null); } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) { makeHearingAidDeviceAvailable(address, btDevice.getName(), "onSetHearingAidConnectionState"); - setCurrentAudioRouteName(btDevice.getAliasName()); } } } - private void setCurrentAudioRouteName(String name){ + private void setCurrentAudioRouteNameIfPossible(String name) { synchronized (mCurAudioRoutes) { if (!TextUtils.equals(mCurAudioRoutes.bluetoothName, name)) { - mCurAudioRoutes.bluetoothName = name; - sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, - SENDMSG_NOOP, 0, 0, null, 0); + if (name != null || !isCurrentDeviceConnected()) { + mCurAudioRoutes.bluetoothName = name; + sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, + SENDMSG_NOOP, 0, 0, null, 0); + } } } } + private boolean isCurrentDeviceConnected() { + for (int i = 0; i < mConnectedDevices.size(); i++) { + DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i); + if (TextUtils.equals(deviceSpec.mDeviceName, mCurAudioRoutes.bluetoothName)) { + return true; + } + } + return false; + } + private void onBluetoothA2dpDeviceConfigChange(BluetoothDevice btDevice) { if (DEBUG_DEVICES) {