2015年1月26日 星期一

Android藍芽協議棧BlueDroid分析(3)-a2dp初始化(使能) (轉)

歡迎轉載opendevkit文章, 更好排版和效果, 請關注文章原始地址: http://www.opendevkit.com/?e=113


a2dp作為分析的實例很合適,包括l2cap連接的使用, sdp註冊等,完整的使用了 btif, bta等模組!

0. 背景


藍芽有個特點是,不同種類profile可以在同一時刻在兩個設備間存在連結!所以分析一個profile的過程是可以的,不必考慮會影響其他profile!

android上藍芽操作,搜索和連接是分開的,也就是初始化和連接只需要拿到對應的設備即可。

基本框架:

bt interface (有自己的狀態機,傳遞一個回調給) -> bta (有狀態機,每個狀態都有跳轉表) , bta的請求都是以事件的方式發給btu_task,再根據模組調用回調,回調裡再跳轉到對應的處理函數) -> bta向下直接調用stack的接口 -> bta處理完成後,會調用bt interface的接口傳遞狀態!

1. a2dp profile初始化


(1) A2dpStateMachine類構造的時候,調用了initNative

(2) com_android_bluetooth_a2dp.cpp的initNative獲取了a2dp bt interface

  158     if ( (sBluetoothA2dpInterface = (btav_interface_t *)
  159           btInf->get_profile_interface(BT_PROFILE_ADVANCED_AUDIO_ID))

接着調用了   sBluetoothA2dpInterface->init(&sBluetoothA2dpCallbacks))
初始化a2dp bt interface!

(3) btif_av.c的init操作

  814 static const btav_interface_t bt_av_interface = {
  815     sizeof(btav_interface_t),
  816     init,                 
  692 bt_status_t btif_av_init(void)
  693 {
  694     if (btif_av_cb.sm_handle == NULL)
  695     {
  696         if (btif_a2dp_start_media_task() != GKI_SUCCESS) // 創建media task
  697             return BT_STATUS_FAIL;       
  698
  699         btif_enable_service(BTA_A2DP_SERVICE_ID); // 使能a2dp service
  700
  701         /* Initialize the AVRC CB */ 
  702         btif_rc_init();
  703                                                                                                                                        
  704         /* Also initialize the AV state machine */
  705         btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); // 創建a2dp bt interface狀態機
  706  
  707         btif_a2dp_on_init();
  708
  709         return BT_STATUS_SUCCESS;                                                                                                      
  710     }                 
  711
  712     return BT_STATUS_DONE;
  713 }

[1] btif_enable_service(BTA_A2DP_SERVICE_ID); 使能服務

btif_enable_service -> btif_transfer_context -> btif_dm_execute_service_request -> btif_in_execute_service_request -> btif_av_execute_service
btif_av_execute_service分別調用:BTA_AvEnable和BTA_AvRegister完成使能和服務註冊。

[2] 創建a2dp bt interface狀態機

btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); // 創建a2dp bt interface狀態機


創建一個狀態機賦值狀態回調和初始化狀態,以後就可以調用類似btif_sm_dispatch(btif_av_cb.sm_handle, event, (void*)p_param);這個接口來事件驅動狀態機了!

沒有留言:

張貼留言