Android A2DP 音频卡顿问题BT HOST策略总结

  1. A2DP发送间隔
    目前Android源生设定,每20ms发送一包音频数据。
    如果收到controller上报的completed evt上报后,也会主动去发送已缓存的音频数据
  2. A2DP数据缓存
    Android M(Android 6.0) 允许缓存11个buffer
    对比Android N 允许缓存21个buffer

    a2dp_list不限长度
    l2cap发送允许缓存5个buffer。

  3. A2DP发送流程
    Android A2DP 音频卡顿问题BT HOST策略总结_第1张图片

    1. A2DP数据卡顿
      TxAaQ达到最大存储时,如果再有数据放入,Android M就会自动丢弃缓存的第一包,Andorid N默认丢弃所有缓存数据包, 这将导致一旦触发,就会出现严重声音丢包问题。
      问题原因,link_xmit_data_q只能发送5个L2CAP包,超出5个部分,将缓存到a2d_list中,如果a2d_list存在数据,那么就不会发送TxAaQ里面的数据,然后就出现数据包丢失和卡顿。
    2. A2DP卡顿log分析
06-20 16:44:26.475  2165  2202 D bt_btif : [media task tx timer] ts 1420105270, diff : 00019989, queue sz 4      
//  20ms  timer触发, 当前TxAaQ长度为4
06-20 16:44:26.475  2165  2192 I bt_btif : BTA got event 0x122f                                                                          // data ready触发发送命令
06-20 16:44:26.475  2165  2192 I bt_l2cap: L2CA_FlushChannel (QUERY)  CID: 0x0044                                      
06-20 16:44:26.475  2165  2192 D bt_l2cap: L2CA_FlushChannel()  flushed: 0 + 0,  num_left: 5                             
//判断当前link_xmit_data_q长度,等于5,就不再出发发送,缓存
06-20 16:44:26.495  2165  2202 D bt_btif : [media task tx timer] ts 1420125259, diff : 00019989, queue sz 5      
// 20ms timer触发,由于上一包数据被缓存,所以现在TxAaQ长度为5
06-20 16:44:26.496  2165  2192 I bt_btif : BTA got event 0x122f                                                                          //data ready出发发送命令
06-20 16:44:26.496  2165  2192 I bt_l2cap: L2CA_FlushChannel (QUERY)  CID: 0x0044  
06-20 16:44:26.496  2165  2192 D bt_l2cap: L2CA_FlushChannel()  flushed: 0 + 0,  num_left: 5                            
//判断当前link_xmit_data_q长度,等于5,就不再出发发送,继续缓存
06-20 16:44:26.515  2165  2202 D bt_btif : [media task tx timer] ts 1420145248, diff : 00019989, queue sz 6      
// 20ms timer触发,上一包数据被缓存,所以现在TxAaQ长度为6
06-20 16:44:26.515  2165  2192 I bt_btif : BTA got event 0x122f                                                                          // data ready触发发送命令
06-20 16:44:26.515  2165  2192 I bt_l2cap: L2CA_FlushChannel (QUERY)  CID: 0x0044
06-20 16:44:26.515  2165  2192 D bt_l2cap: L2CA_FlushChannel()  flushed: 0 + 0,  num_left: 4                           
//判断当前link_xmit_data_q长度,等于4,优先发送a2d_list中数据     
06-20 16:44:26.515  2165  2192 I bt_btif : BTA got event 0x1222                                                                        
//处理收到的确认event,之前link_xmit_data_q变为4,也是因为它       
06-20 16:44:26.515  2165  2192 I bt_l2cap: L2CA_FlushChannel (QUERY)  CID: 0x0044
06-20 16:44:26.515  2165  2192 D bt_l2cap: L2CA_FlushChannel()  flushed: 0 + 0,  num_left: 5
06-20 16:44:26.515  2165  2192 D bt_btif : bta_av_co_audio_src_data_path                                                         
//从TxAaQ中获取一包数据
06-20 16:44:26.535  2165  2202 D bt_btif : [media task tx timer] ts 1420165359, diff : 00020111, queue sz 6     
// 20ms timer触发,刚发送过一包数据,所以现在TxAaQ长度为6



06-20 16:44:39.295  2165  2202 D bt_btif : [media task tx timer] ts 1432925338, diff : 00020080, queue sz 12                            
// 20ms timer触发,TxAaQ长度为12 
06-20 16:44:39.295  2165  2202 W bt_btif : btif_media_aa_prep_2_send() - TX queue buffer count 12/11                                    
//buffer过多警告,删除TxAaQ中超出上限的数据包,直到TxAaQ中长度小于等于11
//如果是Android N,TxAaQ中的长度超过21,则全部删除TxAaQ中的数据,然后TxAaQ就被清空。
06-20 16:44:39.296  2165  2192 I bt_btif : BTA got event 0x122f
06-20 16:44:39.296  2165  2192 I bt_l2cap: L2CA_FlushChannel (QUERY)  CID: 0x0044
06-20 16:44:39.296  2165  2192 D bt_l2cap: L2CA_FlushChannel()  flushed: 0 + 0,  num_left: 5

你可能感兴趣的:(bluetooth,android)