在手機開發者選項中,有一個配置項可以選擇藍牙音頻的編碼格式,這是作為發射端的權利,而接收端只能被動接受。然而,在高通的source工程中,並沒有提供這樣的UI界面讓用戶自由選擇編碼格式。默認情況下,系統會按照SEP表中的排序優先級來選擇編碼格式。底層代碼會根據這個SEP表逐一與遠端的SEP進行比對,當雙方都能兼容時,就會使用該編碼格式進行傳輸。低優先級的編碼格式甚至不會被讀取,這就限制了用戶的選擇空間,尤其是對於帶屏的source設備來說,更無法全面感知接收端的能力。
要獲取完整的編碼格式支持列表,首先需要了解如何獲取這些信息。通過抓包分析A2DP協議建立時的通信過程,發射端會詢問接收端支持多少種編碼格式,接收端會回復其支持的所有編碼格式對應的SEID。

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

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

在這段代碼中,我們最重要的是知道前面獲取的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函數相關的代碼
評論