bluetooth a2dp
bluetooth a2dp
参考文档
a2dp
这里以BondStateMachine为例进行代码跟踪,其他的回调也是类似
* packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/AdapterService.java
├── classInitNative();
│ └── packages/modules/Bluetooth/android/app/jni/com_android_bluetooth_btservice_AdapterService.cpp
│ ├── method_stateChangeCallback = env->GetMethodID(jniCallbackClass, "stateChangeCallback", "(I)V");
│ ├── method_deviceFoundCallback = env->GetMethodID(jniCallbackClass, "deviceFoundCallback", "([B)V");
│ ├── method_pinRequestCallback = env->GetMethodID(jniCallbackClass, "pinRequestCallback", "([B[BIZ)V");
│ ├── method_sspRequestCallback = env->GetMethodID(jniCallbackClass, "sspRequestCallback", "([B[BIII)V");
│ └── method_bondStateChangeCallback = env->GetMethodID(jniCallbackClass, "bondStateChangeCallback", "(I[BII)V");
└── public void onCreate()
├── mJniCallbacks = new JniCallbacks(this, mAdapterProperties);
└── initNative(mUserManager.isGuestUser(), isCommonCriteriaMode(), configCompareResult, getInitFlags(), isAtvDevice, getApplicationInfo().dataDir);
└── int ret = sBluetoothInterface->init(&sBluetoothCallbacks, isGuest == JNI_TRUE ? 1 : 0,isCommonCriteriaMode == JNI_TRUE ? 1 : 0, configCompareResult, flags,isAtvDevice == JNI_TRUE ? 1 : 0, user_data_directory);//这里将回调函数传入
└── static bt_callbacks_t sBluetoothCallbacks = {sizeof(sBluetoothCallbacks),adapter_state_change_callback,adapter_properties_callback,remote_device_properties_callback,device_found_callback,discovery_state_changed_callback,pin_request_callback,ssp_request_callback,bond_state_changed_callback,address_consolidate_callback,acl_state_changed_callback,callback_thread_event,dut_mode_recv_callback,le_test_mode_recv_callback,energy_info_recv_callback,link_quality_report_callback,generate_local_oob_data_callback,switch_buffer_size_callback,switch_codec_callback};
└── static void bond_state_changed_callback(bt_status_t status, RawAddress* bd_addr, bt_bond_state_t state,int fail_reason)
└── sCallbackEnv->CallVoidMethod(sJniCallbacksObj, method_bondStateChangeCallback,(jint)status, addr.get(), (jint)state,(jint)fail_reason);
└── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java
└── void bondStateChangeCallback(int status, byte[] address, int newState, int hciReason)
└── mBondStateMachine.bondStateChangeCallback(status, address, newState, hciReason);
└── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/BondStateMachine.java
└── void bondStateChangeCallback(int status, byte[] address, int newState, int hciReason)
├── Message msg = obtainMessage(BONDING_STATE_CHANGE);
└── sendMessage(msg);
└── sendIntent(dev, newState, reason, false);
└── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/a2dp/A2dpService.java
└── private class BondStateChangedReceiver extends BroadcastReceiver
└── bondStateChanged(device, state)
└── void bondStateChanged(BluetoothDevice device, int bondState)
└── if (bondState != BluetoothDevice.BOND_NONE) return; //到这里最终好像也没处理什么
a2dp connect
* packages/modules/Bluetooth/android/app/src/com/android/bluetooth/a2dp/A2dpStateMachine.java
├── if (!mA2dpNativeInterface.connectA2dp(mDevice))
│ └── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/a2dp/A2dpNativeInterface.java
│ └── public boolean connectA2dp(BluetoothDevice device)
│ └── return connectA2dpNative(getByteAddress(device))
│ └── packages/modules/Bluetooth/android/app/jni/com_android_bluetooth_a2dp.cpp
│ └── static jboolean connectA2dpNative(JNIEnv* env, jobject object, jbyteArray address)
│ └── bt_status_t status = sBluetoothA2dpInterface->connect(bd_addr);
│ ├── sBluetoothA2dpInterface = (btav_source_interface_t*)btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID)// initNative
│ │ └── packages/modules/Bluetooth/system/service/hal/bluetooth_interface.cc
│ │ └── static const void* get_profile_interface(const char* profile_id)
│ │ ├── if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
│ │ └── return btif_av_get_src_interface();
│ │ └── packages/modules/Bluetooth/system/btif/src/btif_av.cc
│ │ └── const btav_source_interface_t* btif_av_get_src_interface(void)
│ │ └── return &bt_av_src_interface;
│ │ └── static const btav_source_interface_t bt_av_src_interface = {sizeof(btav_source_interface_t),init_src, src_connect_sink,src_disconnect_sink, src_set_silence_sink,src_set_active_sink,codec_config_src,cleanup_src, };
│ └── packages/modules/Bluetooth/system/btif/src/btif_av.cc
│ └── static bt_status_t src_connect_sink(const RawAddress& peer_address)
│ └── return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, &peer_address_copy,connect_int);
│ └── packages/modules/Bluetooth/system/btif/src/btif_profile_queue.cc
│ └── bt_status_t btif_queue_connect(uint16_t uuid, const RawAddress* bda, btif_connect_cb_t connect_cb)
│ └── return do_in_jni_thread(FROM_HERE,base::Bind(&queue_int_add, uuid, *bda, connect_cb));
│ └── static void queue_int_add(uint16_t uuid, const RawAddress& bda, btif_connect_cb_t connect_cb)
│ ├── connect_queue.push_back(param);
│ └── btif_queue_connect_next();
└── if (mA2dpService.okToConnect(mDevice, true))
└── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/a2dp/A2dpService.java
└── connectionPolicy = getConnectionPolicy(device);
连接状态改变,同audio 部分挂钩
* packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/JniCallbacks.java
└── void bondStateChangeCallback(int status, byte[] address, int newState, int hciReason)
└── mBondStateMachine.bondStateChangeCallback(status, address, newState, hciReason);
└── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/btservice/BondStateMachine.java
└── void bondStateChangeCallback(int status, byte[] address, int newState, int hciReason)
├── Message msg = obtainMessage(BONDING_STATE_CHANGE);
└── sendMessage(msg);
└── sendIntent(dev, newState, reason, false);
└── packages/modules/Bluetooth/android/app/src/com/android/bluetooth/a2dp/A2dpService.java
└── private class ConnectionStateChangedReceiver extends BroadcastReceiver
└── connectionStateChanged(device, fromState, toState);
└── setActiveDevice(device);
├── final LeAudioService leAudioService = mFactory.getLeAudioService();
├── updateAndBroadcastActiveDevice(device);
│ ├── Intent intent = new Intent(BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED);
│ └── sendBroadcast(intent, BLUETOOTH_CONNECT, Utils.getTempAllowlistBroadcastOptions());
├── if (!mA2dpNativeInterface.setActiveDevice(device))
│ └── static jboolean setActiveDeviceNative(JNIEnv* env, jobject object, jbyteArray address)
│ └── bt_status_t status = sBluetoothA2dpInterface->set_active_device(bd_addr);
│ └── packages/modules/Bluetooth/system/btif/src/btif_av.cc
│ └── static bt_status_t src_set_active_sink(const RawAddress& peer_address)
│ └── bt_status_t status = do_in_main_thread(FROM_HERE, base::BindOnce(&set_active_peer_int,AVDT_TSEP_SNK, peer_address, std::move(peer_ready_promise)));
└── mAudioManager.handleBluetoothActiveDeviceChanged(newActiveDevice,ull,BluetoothProfileConnectionInfo.createA2dpInfo(true,rememberedVolume));
└── frameworks/base/media/java/android/media/AudioManager.java
└── service.handleBluetoothActiveDeviceChanged(newDevice, previousDevice, info);