主要介紹下藍牙協議棧(bluetooth stack)傳統藍牙音頻協議之高質量音頻分布協議(A2DP) 概念介紹,包括在協議棧中的架構,角色以及Source到Sink的發送Audio流程


?
本專欄文章我們會以連載的方式持續更新,本專欄計劃更新內容如下:

第一篇:藍牙綜合介紹 ,主要介紹藍牙的一些概念,產生背景,發展軌跡,市面藍牙介紹,以及藍牙開發板介紹。
第二篇:Transport層介紹,主要介紹藍牙協議棧跟藍牙芯片之前的硬件傳輸協議,比如基于UART的H4,H5,BCSP,基于USB的H2等
第三篇:傳統藍牙controller介紹,主要介紹傳統藍牙芯片的介紹,包括射頻層(RF),基帶層(baseband),鏈路管理層(LMP)等
第四篇:傳統藍牙host介紹,主要介紹傳統藍牙的協議棧,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的協議吧。
第五篇:低功耗藍牙controller介紹,主要介紹低功耗藍牙芯片,包括物理層(PHY),鏈路層(LL)
第六篇:低功耗藍牙host介紹,低功耗藍牙協議棧的介紹,包括HCI,L2CAP,ATT,GATT,SM等
第七篇:藍牙芯片介紹,主要介紹一些藍牙芯片的初始化流程,基于HCI vendor command的擴展
第八篇:附錄,主要介紹以上常用名詞的介紹以及一些特殊流程的介紹等。
另外,開發板如下所示,對于想學習藍牙協議棧的最好人手一套。以便更好的學習藍牙協議棧,相信我,學完這一套視頻你將擁有修改任何協議棧的能力(比如Linux下的bluez,Android下的bluedroid)。

-------------------------------------------------------------------------------------------------------------------------
CSDN學院鏈接(進入選擇你想要學習的課程):
藍牙交流扣扣群:970324688
Github代碼:
入手開發板:
藍牙學習目錄:
--------------------------------------------------------------------------------------------------------------------------
A2DP(Advanced Audio Distribution Profile)是藍牙高音質音頻傳輸協議,用于傳輸單聲道,雙聲道音樂(一般在A2DP中用于stereo雙聲道),典型應用為藍牙耳機。。A2DP不包括遠程控制的功能,遠程控制的功能參考協議AVRCP。整個架構如下:

在我們協議棧的位置見紅框:

A2DP是基于AVDTP協議。

A2DP的角色分為Source(SRC)跟SINK(SNK)
Source (SRC) – A device is the SRC when it acts as a source of a digital audio stream that is delivered to the SNK of the piconet.
Sink (SNK) – A device is the SNK when it acts as a sink of a digital audio stream delivered from the SRC on the same piconet.
上面解釋的也很清楚,說點白話點,就是誰發送音頻數據誰就是Source,誰接收音頻數據誰就是Sink,舉一個例子:假設手機連接藍牙耳機播放音樂,那么手機就是做A2DP source角色,藍牙耳機就是做A2DP sink角色。

官方文檔是給的這個,其實這個有點誤導性(只要是不全),我來重新總結下Audio從source發送到sink的流程。

我們來大體總結下整個流程:
1)A2DP source的發送流程
UL收集到PCM數據,然后發送到A2DP,A2DP經過codec PCM lib(SBC,MPEG-1,2 AudioMPEG-2, 4 AACATRAC family或者自定義encoder pcm lib)壓縮成特定的音頻格式,然后交給AVDTP,AVDTP轉交給L2CAP,L2CAP通過ACL格式轉交給HCI,然后到達BT chip,通過RF射頻出去。
2)A2DP sink的接收流程
BT chip通過RF接收進來數據,然后通過ACL交給HCI,然后交給L2CAP,L2CAP交給AVDTP,AVDTP交給A2DP,A2DP收到的是remote經過壓縮的數據,此時通過codec pcm lib(SBC,MPEG-1,2 AudioMPEG-2, 4 AACATRAC family或者自定義encoder pcm lib)解壓成PCM數據,然后交于聲卡播放
?