藍牙 | 軟體:獲取藍牙codec支持列表

關鍵字 :高通藍牙QualcommADKcodea2dp

         在手機開發者選項中,有一個配置項可以選擇藍牙音頻的編碼格式,這是作為發射端的權利,而接收端只能被動接受。然而,在高通的source工程中,並沒有提供這樣的UI界面讓用戶自由選擇編碼格式。默認情況下,系統會按照SEP表中的排序優先級來選擇編碼格式。底層代碼會根據這個SEP表逐一與遠端的SEP進行比對,當雙方都能兼容時,就會使用該編碼格式進行傳輸。低優先級的編碼格式甚至不會被讀取,這就限制了用戶的選擇空間,尤其是對於帶屏的source設備來說,更無法全面感知接收端的能力。

       要獲取完整的編碼格式支持列表,首先需要了解如何獲取這些信息。通過抓包分析A2DP協議建立時的通信過程,發射端會詢問接收端支持多少種編碼格式,接收端會回復其支持的所有編碼格式對應的SEID。

藍牙 | 軟體:獲取藍牙codec支持列表

        這個SEID並不是具體的編碼格式,而是接收端SEP表中的索引。因此,需要再發送一個指令,詢問該SEID具體的編碼能力。接收端會返回該SEID索引對應的編碼格式類型,以及其支持的採樣率、採樣位數、模式等參數,這些參數就是我們需要的信息。

藍牙 | 軟體:獲取藍牙codec支持列表

因此,我們需要重複發送這個指令,遍歷整個SEID列表,提取接收端的編碼格式支持參數。在代碼中(這裡以3056代碼為例,3086等新版本ADK的代碼結構可能不同,但邏輯相同),當找到合適的編碼格式時,系統會直接進行下一步配置,而不是繼續獲取參數。因此,我們需要在獲取參數後中斷這個過程,保存所需的參數,然後發起下一個獲取動作。

藍牙 | 軟體:獲取藍牙codec支持列表


藍牙 | 軟體:獲取藍牙codec支持列表

       在這段代碼中,我們最重要的是知道前面獲取的SEID列表存放在哪裡。ADK會通過block存儲管理機制,將接收端的SEID列表保存在`data_block_list_discovered_remote_seids`的block中。我們需要將這些SEID一個個提取出來,放在全局變量中,通過其自身的機制自動完成獲取編碼格式內容的動作。這個機制比較複雜,大家可以通過`continueStreamConnect`這個函數來跟蹤整體流程進行學習。

 

       以上是本期博文的全部內容,如有疑問就在博文下方評論留言,或者聯繫我們,我們會儘量安排上(o´ω`o)و。謝謝大家瀏覽,我們下期再見。

 

FAQ 1:有現成代碼碼?

A1:請聯繫我們支持團隊獲取。

FAQ 2:什麼是SEP表?

A2:SEP表是藍牙A2DP協議中的一個表格,用於記錄設備支持的編碼格式及其優先級。

FAQ 3:什麼是SEID?

A3:SEID是Service Endpoint Identifier的縮寫,是藍牙A2DP協議中用於標識服務端點的唯一標識符。

FAQ 4: 如何抓包分析A2DP協議?

A4: 可以使用Wireshark等網絡分析工具,通過藍牙適配器捕獲A2DP協議的通信數據進行分析。我這是安裝ellisys軟體裡面默認的參考數據

FAQ 5:aptx的codec怎麼看?

A5: 可以學習一下areVendorCodecsCompatible函數相關的代碼

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論