diff options
author | Chen Chen <cncn@google.com> | 2022-01-25 13:45:00 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-01-25 13:45:00 +0000 |
commit | ed2bc6fa008e2617e0644428293429f113583212 (patch) | |
tree | 29cb982b9c4db349f62f1533987924d18ca916d5 | |
parent | 73c9ebec84913d8f1fbf115d7f5f23b4204d7a45 (diff) | |
parent | a81d2c64bbf3fa6e318538152d277423fe3aa506 (diff) |
SpatialAudio: Add API to switch buffer size am: a81d2c64bb
Original change: https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/1954936
Change-Id: Id4e979c4f018ab6fed12359d6e8a7711e1029a6d
-rw-r--r-- | android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp | 35 | ||||
-rw-r--r-- | android/app/res/values/config.xml | 6 | ||||
-rw-r--r-- | android/app/src/com/android/bluetooth/btservice/AdapterService.java | 14 | ||||
-rw-r--r-- | android/app/src/com/android/bluetooth/btservice/JniCallbacks.java | 4 | ||||
-rw-r--r-- | framework/java/android/bluetooth/BluetoothDevice.java | 30 | ||||
-rw-r--r-- | system/btif/include/btif_common.h | 3 | ||||
-rw-r--r-- | system/btif/src/bluetooth.cc | 12 | ||||
-rw-r--r-- | system/gd/rust/topshim/src/btif.rs | 2 | ||||
-rw-r--r-- | system/include/hardware/bluetooth.h | 5 | ||||
-rw-r--r-- | system/service/hal/bluetooth_interface.cc | 18 | ||||
-rw-r--r-- | system/service/hal/bluetooth_interface.h | 3 | ||||
-rw-r--r-- | system/test/headless/headless.cc | 7 |
12 files changed, 137 insertions, 2 deletions
diff --git a/android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp b/android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp index 5e3a2971a0..e8e2643fec 100644 --- a/android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp +++ b/android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp @@ -71,6 +71,7 @@ static jmethodID method_addressConsolidateCallback; static jmethodID method_aclStateChangeCallback; static jmethodID method_discoveryStateChangeCallback; static jmethodID method_linkQualityReportCallback; +static jmethodID method_switchBufferSizeCallback; static jmethodID method_setWakeAlarm; static jmethodID method_acquireWakeLock; static jmethodID method_releaseWakeLock; @@ -598,6 +599,34 @@ static void link_quality_report_callback( (jint)negative_acknowledgement_count); } +static void switch_buffer_size_callback(RawAddress* bd_addr, + bool is_low_latency_buffer_size) { + + if (!bd_addr) { + ALOGE("Address is null in %s", __func__); + return; + } + CallbackEnv sCallbackEnv(__func__); + if (!sCallbackEnv.valid()) return; + + ScopedLocalRef<jbyteArray> addr( + sCallbackEnv.get(), sCallbackEnv->NewByteArray(sizeof(RawAddress))); + if (!addr.get()) { + ALOGE("Error while allocating in: %s", __func__); + return; + } + + sCallbackEnv->SetByteArrayRegion(addr.get(), 0, sizeof(RawAddress), + (jbyte*)bd_addr); + + ALOGV("%s: SwitchBufferSizeCallback: %s", __func__, + is_low_latency_buffer_size ? "true" : "false"); + + sCallbackEnv->CallVoidMethod( + sJniCallbacksObj, method_switchBufferSizeCallback, addr.get(), + (jboolean)is_low_latency_buffer_size); +} + static void callback_thread_event(bt_cb_thread_evt event) { if (event == ASSOCIATE_JVM) { JavaVMAttachArgs args; @@ -674,7 +703,8 @@ static bt_callbacks_t sBluetoothCallbacks = {sizeof(sBluetoothCallbacks), le_test_mode_recv_callback, energy_info_recv_callback, link_quality_report_callback, - generate_local_oob_data_callback}; + generate_local_oob_data_callback, + switch_buffer_size_callback}; // The callback to call when the wake alarm fires. static alarm_cb sAlarmCallback; @@ -893,6 +923,9 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_linkQualityReportCallback = env->GetMethodID( jniCallbackClass, "linkQualityReportCallback", "(JIIIIII)V"); + method_switchBufferSizeCallback = + env->GetMethodID(jniCallbackClass, "switchBufferSizeCallback", "([BZ)V"); + method_setWakeAlarm = env->GetMethodID(clazz, "setWakeAlarm", "(JZ)Z"); method_acquireWakeLock = env->GetMethodID(clazz, "acquireWakeLock", "(Ljava/lang/String;)Z"); diff --git a/android/app/res/values/config.xml b/android/app/res/values/config.xml index 4653c9198f..1f86bc3c68 100644 --- a/android/app/res/values/config.xml +++ b/android/app/res/values/config.xml @@ -145,4 +145,10 @@ --> <bool name="enable_gd_up_to_scanning_layer">true</bool> + <!-- Package of fastpair service --> + <string name="peripheral_link_package">com.google.android.gms</string> + <!-- Service name of fastpair--> + <string name="peripheral_link_service">.nearby.discovery.service.DiscoveryService</string> + + </resources> diff --git a/android/app/src/com/android/bluetooth/btservice/AdapterService.java b/android/app/src/com/android/bluetooth/btservice/AdapterService.java index a206b7a638..58faee23f1 100644 --- a/android/app/src/com/android/bluetooth/btservice/AdapterService.java +++ b/android/app/src/com/android/bluetooth/btservice/AdapterService.java @@ -811,6 +811,20 @@ public class AdapterService extends Service { } } + void switchBufferSizeCallback(byte[] address, boolean isLowLatencyBufferSize) { + BluetoothDevice device = getDeviceFromByte(address); + // Send intent to fastpair + Intent switchBufferSizeIntent = new Intent(BluetoothDevice.ACTION_SWITCH_BUFFER_SIZE); + switchBufferSizeIntent.setClassName( + getString(com.android.bluetooth.R.string.peripheral_link_package), + getString(com.android.bluetooth.R.string.peripheral_link_package) + + getString(com.android.bluetooth.R.string.peripheral_link_service)); + switchBufferSizeIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, device); + switchBufferSizeIntent.putExtra( + BluetoothDevice.EXTRA_LOW_LATENCY_BUFFER_SIZE, isLowLatencyBufferSize); + sendBroadcast(switchBufferSizeIntent); + } + /** * Enable/disable BluetoothInCallService * diff --git a/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java b/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java index 03d9264679..5d7b49d109 100644 --- a/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java +++ b/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java @@ -106,4 +106,8 @@ final class JniCallbacks { packets_not_receive_count, negative_acknowledgement_count); } + void switchBufferSizeCallback(byte[] mac_address, boolean is_low_latency_buffer_size) { + mAdapterService.switchBufferSizeCallback(mac_address, is_low_latency_buffer_size); + } + } diff --git a/framework/java/android/bluetooth/BluetoothDevice.java b/framework/java/android/bluetooth/BluetoothDevice.java index 4c138f87f8..89ec4b246f 100644 --- a/framework/java/android/bluetooth/BluetoothDevice.java +++ b/framework/java/android/bluetooth/BluetoothDevice.java @@ -232,6 +232,25 @@ public final class BluetoothDevice implements Parcelable, Attributable { "android.bluetooth.device.action.BATTERY_LEVEL_CHANGED"; /** + * Broadcast Action: Indicates the audio buffer size should be switched + * between a low latency buffer size and a higher and larger latency buffer size. + * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link + * #EXTRA_LOW_LATENCY_BUFFER_SIZE}. + * + * @hide + */ + @SuppressLint("ActionValue") + @RequiresBluetoothConnectPermission + @RequiresPermission(allOf = { + android.Manifest.permission.BLUETOOTH_CONNECT, + android.Manifest.permission.BLUETOOTH_PRIVILEGED, + }) + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + @SystemApi + public static final String ACTION_SWITCH_BUFFER_SIZE = + "android.bluetooth.device.action.SWITCH_BUFFER_SIZE"; + + /** * Used as an Integer extra field in {@link #ACTION_BATTERY_LEVEL_CHANGED} * intent. It contains the most recently retrieved battery level information * ranging from 0% to 100% for a remote device, {@link #BATTERY_LEVEL_UNKNOWN} @@ -310,6 +329,17 @@ public final class BluetoothDevice implements Parcelable, Attributable { */ public static final String EXTRA_PREVIOUS_BOND_STATE = "android.bluetooth.device.extra.PREVIOUS_BOND_STATE"; + + /** + * Used as a boolean extra field to indicate if audio buffer size is low latency or not + * + * @hide + */ + @SuppressLint("ActionValue") + @SystemApi + public static final String EXTRA_LOW_LATENCY_BUFFER_SIZE = + "android.bluetooth.device.extra.LOW_LATENCY_BUFFER_SIZE"; + /** * Indicates the remote device is not bonded (paired). * <p>There is no shared link key with the remote device, so communication diff --git a/system/btif/include/btif_common.h b/system/btif/include/btif_common.h index f932c04809..3782b506b1 100644 --- a/system/btif/include/btif_common.h +++ b/system/btif/include/btif_common.h @@ -232,4 +232,7 @@ void invoke_link_quality_report_cb( int retransmission_count, int packets_not_receive_count, int negative_acknowledgement_count); +void invoke_switch_buffer_size_cb(RawAddress remote_addr, + bool is_low_latency_buffer_size); + #endif /* BTIF_COMMON_H */ diff --git a/system/btif/src/bluetooth.cc b/system/btif/src/bluetooth.cc index 9b5f5d3a63..7d7a2f8e74 100644 --- a/system/btif/src/bluetooth.cc +++ b/system/btif/src/bluetooth.cc @@ -895,3 +895,15 @@ void invoke_link_quality_report_cb( timestamp, report_id, rssi, snr, retransmission_count, packets_not_receive_count, negative_acknowledgement_count)); } + +void invoke_switch_buffer_size_cb(RawAddress remote_addr, + bool is_low_latency_buffer_size) { + do_in_jni_thread( + FROM_HERE, + base::BindOnce( + [](RawAddress remote_addr, bool is_low_latency_buffer_size) { + HAL_CBACK(bt_hal_cbacks, switch_buffer_size_cb, &remote_addr, + is_low_latency_buffer_size); + }, + remote_addr, is_low_latency_buffer_size)); +} diff --git a/system/gd/rust/topshim/src/btif.rs b/system/gd/rust/topshim/src/btif.rs index 34283ff1b3..e854f570a4 100644 --- a/system/gd/rust/topshim/src/btif.rs +++ b/system/gd/rust/topshim/src/btif.rs @@ -699,6 +699,7 @@ pub enum BaseCallbacks { // energy_info_cb // link_quality_report_cb // generate_local_oob_data_cb + // switch_buffer_size_cb } pub struct BaseCallbacksDispatcher { @@ -814,6 +815,7 @@ impl BluetoothInterface { energy_info_cb: None, link_quality_report_cb: None, generate_local_oob_data_cb: None, + switch_buffer_size_cb: None, }); let rawcb: *mut bindings::bt_callbacks_t = &mut *callbacks; diff --git a/system/include/hardware/bluetooth.h b/system/include/hardware/bluetooth.h index c174d91783..d907dbe652 100644 --- a/system/include/hardware/bluetooth.h +++ b/system/include/hardware/bluetooth.h @@ -469,6 +469,10 @@ typedef void (*link_quality_report_callback)( int retransmission_count, int packets_not_receive_count, int negative_acknowledgement_count); +/** Switch the buffer size callback */ +typedef void (*switch_buffer_size_callback)(RawAddress* remote_addr, + bool is_low_latency_buffer_size); + typedef enum { ASSOCIATE_JVM, DISASSOCIATE_JVM } bt_cb_thread_evt; /** Thread Associate/Disassociate JVM Callback */ @@ -526,6 +530,7 @@ typedef struct { energy_info_callback energy_info_cb; link_quality_report_callback link_quality_report_cb; generate_local_oob_data_callback generate_local_oob_data_cb; + switch_buffer_size_callback switch_buffer_size_cb; } bt_callbacks_t; typedef void (*alarm_cb)(void* data); diff --git a/system/service/hal/bluetooth_interface.cc b/system/service/hal/bluetooth_interface.cc index 2e5b83a8ed..c47a3edf35 100644 --- a/system/service/hal/bluetooth_interface.cc +++ b/system/service/hal/bluetooth_interface.cc @@ -217,6 +217,16 @@ void LinkQualityReportCallback(uint64_t timestamp, int report_id, int rssi, packets_not_receive_count, negative_acknowledgement_count)); } +void SwitchBufferSizeCallback(RawAddress* remote_addr, + bool is_low_latency_buffer_size) { + shared_lock<shared_mutex_impl> lock(g_instance_lock); + VERIFY_INTERFACE_OR_RETURN(); + LOG(WARNING) << __func__ << " - is_low_latency_buffer_size: " + << is_low_latency_buffer_size; + FOR_EACH_BLUETOOTH_OBSERVER( + SwitchBufferSizeCallback(remote_addr, is_low_latency_buffer_size)); +} + // The HAL Bluetooth DM callbacks. bt_callbacks_t bt_callbacks = { sizeof(bt_callbacks_t), @@ -235,7 +245,8 @@ bt_callbacks_t bt_callbacks = { nullptr, /* le_test_mode_cb */ nullptr, /* energy_info_cb */ LinkQualityReportCallback, - nullptr /* generate_local_oob_data_cb */ + nullptr /* generate_local_oob_data_cb */, + SwitchBufferSizeCallback }; bt_os_callouts_t bt_os_callouts = {sizeof(bt_os_callouts_t), @@ -425,6 +436,11 @@ void BluetoothInterface::Observer::LinkQualityReportCallback( // Do nothing. } +void BluetoothInterface::Observer::SwitchBufferSizeCallback( + RawAddress* /* remote_addr */, bool /* is_low_latency_buffer_size */) { + // Do nothing. +} + // static bool BluetoothInterface::Initialize() { unique_lock<shared_mutex_impl> lock(g_instance_lock); diff --git a/system/service/hal/bluetooth_interface.h b/system/service/hal/bluetooth_interface.h index 0390cb0085..50c35f656d 100644 --- a/system/service/hal/bluetooth_interface.h +++ b/system/service/hal/bluetooth_interface.h @@ -83,6 +83,9 @@ class BluetoothInterface { int retransmission_count, int packets_not_receive_count, int negative_acknowledgement_count); + virtual void SwitchBufferSizeCallback(RawAddress* remote_addr, + bool is_low_latency_buffer_size); + // TODO(armansito): Complete the list of callbacks. }; diff --git a/system/test/headless/headless.cc b/system/test/headless/headless.cc index fd6a35ef84..d9b12fd2f7 100644 --- a/system/test/headless/headless.cc +++ b/system/test/headless/headless.cc @@ -136,6 +136,12 @@ void link_quality_report(uint64_t timestamp, int report_id, int rssi, int snr, LOG_INFO("%s", __func__); } +/** Switch buffer size callback */ +void switch_buffer_size(RawAddress* remote_addr, + bool is_low_latency_buffer_size) { + LOG_INFO("%s", __func__); +} + void thread_event(bt_cb_thread_evt evt) { LOG_INFO("%s", __func__); } void dut_mode_recv(uint16_t opcode, uint8_t* buf, uint8_t len) { @@ -169,6 +175,7 @@ bt_callbacks_t bt_callbacks{ .le_test_mode_cb = le_test_mode, .energy_info_cb = energy_info, .link_quality_report_cb = link_quality_report, + .switch_buffer_size_cb = switch_buffer_size, }; // HAL HARDWARE CALLBACKS |