音訊側帶 A2DP 卸除
本主題描述從 Windows 11 組建 10.0.22000 for Bluetooth 開始提供的音頻側帶 A2DP 卸除。
音訊側帶 A2DP 卸除的主要目標是降低耗電量,例如在範例音樂播放期間。
本文件假設您已熟悉現有的 HF 側帶解決方案。 請參閱本主題的一節,請參閱音訊驅動程式的藍牙略過指導方針和參考的 A2DP 藍牙規格。
側帶架構設計
音訊側帶 A2DP 卸除是以現有經證實的設計為基礎,透過整合式(內建)喇叭或連接的類比耳機,減少線性音訊內容播放期間的耗電量。 簡言之,這些設計會透過廠商特定的音訊驅動程式,將大量的音訊數據(按一秒的順序)爆入音訊DSP。 主要處理器和其他大多數電路進入低功率狀態,而音訊 DSP 會透過內建喇叭串流高載音訊數據。 當音訊數據幾乎耗盡時,DSP 會向音訊驅動程式引發中斷,以向音訊驅動程式發出訊號,讓OS透過音訊驅動程式將更多音訊數據高載至 DSP。
下圖中的淺灰色元件是由IHV提供。
音訊側帶 A2DP 卸除也建置在藍牙 SCO 音訊路徑的通用設計上,其中相同的音訊 DSP 會直接連線到藍牙控制器。
此連線通常是 I2S 或 PCM 介面,但也可以是更豐富且更複雜的總線,例如 SLIMbus。 Microsoft將此架構 稱為側帶音訊,反映音訊透過替代路徑傳輸至藍牙(或其他)控制器的事實,而不是一般控制器介面(“HCI”)。 在此情況下,音訊驅動程式會將音訊數據從OS傳輸至音訊 DSP、音訊 DSP 會透過側帶連線將資料傳輸到硬體總線控制器,而控制器會將音訊數據傳輸至連接的裝置。 (對於雙向音訊,反向方向也會發生。雖然涉及更多元件,但這在一般控制器介面上可能具有優勢。 在某些使用案例中,整個端對端音訊號路徑會由韌體處理,從主要處理器卸除。 它也可能會為即時/不時程音訊數據傳輸提供較佳的介面,來回傳輸主機軟體。 針對此側帶連線,Microsoft定義音訊驅動程式用來支援具有此實體設計的音訊端點的側帶 DDI。
元件
IHV 音訊驅動程式 (音訊 DS 驅動程式)
此驅動程式可控制整合式音訊端點、行動數據音訊和 HFP/SCO 側帶/卸除。 此功能需要驅動程序也支援 A2DP 卸除。 司機的責任就像 HFP/SCO 的責任一樣。
IHV 藍牙傳輸驅動程式和控制器
A2DP 卸除未定義於任何藍牙 SIG 標準中。 這項功能可增強並新增Microsoft定義的藍牙 HCI 命令。 為了支援這項功能,IHV 的藍牙控制器或 IHV 驅動程式應該支援這些命令。
A2DP 設定檔驅動程式
此驅動程式是由 Windows 提供。 其函式包括下列專案。
- 實作 A2DP 和 AVDTP 規格
- 公開 IHV 音訊驅動程式的 PnP 裝置介面實例(A2DP 側帶介面),以探索、開啟和傳送要求
- 支援本檔中定義的側帶IOCTL要求
- 針對 A2DP 卸除傳送Microsoft定義的藍牙 HCI 命令
IHV 音訊驅動程式 (音訊 DS 驅動程式) 需求
如果系統上的音訊驅動程式已設定為 A2DP 側帶串流,則其應發佈設定為 GUID_SIDEBANDAUDIO_A2DP_SUPPORT_INTERFACE
{2BC51EE4-07AF-49CF-B04B-FB3F1C26AADC} 類別 GUID 的裝置介面。 此裝置介面應該不晚於音訊驅動程式的 PnP 啟動。
Sideband 數據結構
請注意,音訊驅動程式所使用的某些數據結構和常數定義於sidebandaudio.h標頭中。
下列數據結構用於音訊側帶 A2DP 卸除。
裝置描述元 - SIDEBANDAUDIO_DEVICE_DESCRIPTOR
元素 | 描述 |
---|---|
NumberOfEndpoints | 指出連線裝置上的端點數目 |
線上裝置可以是包含多個音訊端點的複合裝置(喇叭、麥克風等)。 音訊驅動程式可以逐一查看每個端點,並取得進一步的詳細數據,以建置每個端點的 KS 篩選器。
端點描述元 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR
SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR的定義如下。
元素 | 描述 |
---|---|
CbSize | 端點描述元的大小總計。 這包括用於儲存字串的緩衝區。 |
ContainerId | 端點的 GUID。 多個端點的通用 GUID 表示這些端點包含在相同的實體容器內。 OS 可以輕鬆地將這類端點與各種案例產生關聯。 |
類別 | KSPIN_DESCRIPTOR。 用來指出每個端點之尺寸的類別。 |
方向 | 指出擷取或轉譯數據流方向。 |
Capabilities | (請參閱下表) |
FriendlyName | 端點要套用至端點 KS 篩選介面上DEVPKEY_DeviceInterface_FriendlyName的易記名稱。 |
VolumePropertyValuesSize | KSPROPERTY_DESCRIPTION結構的大小,描述每個通道的磁碟區逐步執行和範圍。 |
SidetoneVolumePropertyValueSize | KSPROPERTY_DESCRIPTION結構的大小,描述 Sidetone 的每個通道的磁碟區逐步執行和範圍。 |
端點描述元 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR - 功能
功能的定義如下。
元素 | 描述 |
---|---|
體積 | 端點支援磁碟區控制 |
靜音 | 端點支持靜音控制 |
Sidetone | 端點支援 Sidetone 控制件 |
意見反應 | 端點有相關聯的意見反應通道 |
SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2
A2DP 側帶會使用現有SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR結構的更新版本,為 Windows 音訊系統提供端點識別所需的詳細資訊 - SIDEBANDAUDIO_ENDPOINT_DESCRIPTOR2。
// Number of device properties that shall be added to the audio filter factory interface.
ULONG FilterInterfacePropertyCount;
DEVPROPERTY* FilterInterfaceProperties;
音訊驅動程式會使用新的 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2 要求來取得此數據結構。 要求完成後,音訊驅動程式會將這些裝置屬性新增至其拓撲音訊篩選介面。
音訊介面參數
音訊裝置與藍牙控制器之間的音訊傳輸選擇和設計是廠商特定的。 此音訊傳輸通常是 I2S 或 PCM 介面,但也可以是更豐富、更複雜的總線,例如 SLIMbus 或潛在的 SoundWire。 此功能設計不會對音訊傳輸進行特定需求。 不過,如果在音訊 DSP 中實作藍牙編解碼器,藍牙控制器就能夠從透過音訊傳輸傳輸傳輸的數據中擷取編碼的畫面格,將這些畫面封裝到 AVDTP 媒體封包以進行傳輸。
音訊傳輸的安裝和設定(如果有的話)會被視為廠商特定的工作。 這項功能是由此功能中元件之間傳遞的廠商特定音訊介面參數所促進。 廠商特定的參數通常是由音訊驅動程式廠商和藍牙控制器和/或傳輸驅動程式廠商所定義。 音訊裝置和藍牙控制器會使用參數來設定音訊 DSP 與藍牙控制器之間的音訊傳輸。
例如,如果有多個實體或邏輯連線、設定 PCM 介面的訊號,或跨傳輸的音訊數據格式,此數據可能包含傳輸標識符。
音訊驅動程式會使用 SIOP 來設定並取得廠商特定的音訊介面參數,這些參數會使用 GUID 和整數來識別數據。 不過,為了維護更自然的藍牙 HCI 命令集,Microsoft定義的 HCI 命令會使用下列結構傳遞廠商特定的音訊介面參數。
音訊介面參數
欄位 | 八位位元組 |
---|---|
廠商識別碼 | 0..3 |
廠商特定參數標識碼 | 4..5 |
廠商特定值的長度 = (n-9) | 6 |
廠商特定值 | 7.. n |
廠商標識碼如藍牙指派號碼中所定義: https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers。
A2DP 驅動程式會執行廠商-SIOP 之間的直接轉換,後者是音訊驅動程式更自然的數據結構,以及藍牙 HCI 更自然的音訊介面參數。 廠商 SIOP GUID 是從基底 GUID 加上 4 個字元的藍牙廠商標識碼建構而成。 只有廠商標識碼(而非整個 GUID)會通過藍牙 HCI。
基底 GUID 為 SIDEBANDAUDIO_PARAMS_SET_A2DP
。
Microsoft定義的 A2DP SIOP
Microsoft定義 A2DP 的兩個 SIOP,以提供編解碼器資訊。 廠商可以定義其他 SIOP 以支援其實作。
編解碼器(編解碼器-SIOP)
音訊驅動程式會使用此SIOP來表達其支援的A2DP編解碼器清單(如果有的話)。 此 SIOP 的SIDEBANDAUDIO_IO_PARAM_HEADER欄位設定如下。
欄位 | 值 |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C}) |
TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODECS (1) |
大小 | 此標頭後面的編解碼器功能清單大小總計 |
此標頭後面的數據是一連串的(可變大小)編解碼器功能結構,如上述編解碼器功能資訊中所述。
本主題的其餘部分,此參數稱為編解碼器-SIOP。
已設定編解碼器 (configured-codec-SIOP)
音訊驅動程式可以使用這個SIOP擷取目前設定的 A2DP 編解碼器。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER欄位設定如下。
欄位 | 值 |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP ({8FE0297F-3AE6-4384-ACE3-87589E571B9C}) |
TypeId | SIDEANDAUDIO_PARAM_A2DP_CONFIGURED_CODEC (2) |
大小 | 此標頭後面的編解碼器功能大小總計 |
此標頭後面的數據是單一(可變大小)編解碼器功能結構,如上述編解碼器功能資訊中所述。
此 SIOP 是可更新的,這表示音訊驅動程式應該使用 IOCTL_SBAUD_GET_SIOP_UPDATE 要求,以隨時掌握已設定編解碼器中的變更。
本主題的其餘部分,此參數稱為 configured-codec-SIOP。
編解碼器作用中延遲模式 (codec-latency-mode-SIOP)
音訊驅動程式可以使用這個SIOP擷取目前設定之 A2DP 編解碼器的作用中延遲模式。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER欄位設定如下。
欄位 | 值 |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP |
TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODEC_LATENCY_MODE |
大小 | 1 個位元組 |
此標頭後面的數據是單一位元組,會解譯為無符號 8 位整數。 值 SIDEBANDAUDIO_CODEC_MODE_HIGH_QUALITY
表示目前設定的編解碼器是以高品質模式運作,而值 SIDEBANDAUDIO_CODEC_MODE_LOW_LATENCY
則表示編解碼器是以低延遲模式運作。
此 SIOP 是可更新的,這表示音訊驅動程式應該使用 IOCTL_SBAUD_GET_SIOP_UPDATE 要求,以隨時得知延遲模式中的變更。
目前,只有在aptX Adaptive編解碼器處於使用中狀態時,才會使用此SIOP。 如需aptX的詳細資訊,請參閱 Qualcomm aptX Adaptive Audio。
本主題的其餘部分,此參數稱為 codec-latency-mode-SIOP。
編解碼器 L2CAP MTU 大小 (mtu-size-SIOP)
音訊驅動程式可以使用這個SIOP擷取目前的L2CAP MTU大小(以位元組為單位)。 此 SIOP 的 SIDEBANDAUDIO_IO_PARAM_HEADER欄位設定如下。
欄位 | 值 |
---|---|
ParamsSet | SIDEBANDAUDIO_PARAMS_SET_A2DP |
TypeId | SIDEBANDAUDIO_PARAM_A2DP_CODEC_MTU_SIZE |
大小 | 2 個位元組 |
此標頭後面的數據是 2 個字節,會解譯為不帶正負號的 16 位整數。 此 SIOP 是可更新的,這表示音訊驅動程式應該使用 IOCTL_SBAUD_GET_SIOP_UPDATE 要求,以隨時掌握 MTU 大小的變更。
目前,只有在aptX Adaptive編解碼器處於使用中狀態時,才會使用此SIOP。 如需aptX的詳細資訊,請參閱 Qualcomm aptX Adaptive Audio。
本主題的其餘部分,此參數稱為 mtu-size-SIOP。
使用廠商定義的 SIOP
音訊驅動程式可能會設定廠商定義的SIOP。
在開啟側帶介面之後,以及在IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR之前設定 Vendor-SIOP
A2DP 驅動程式會將 SIOP 值儲存在系統設定廠商 SIOP 的集合中。 A2DP 驅動程式會在處理 IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2時,將此集合傳送至藍牙控制器(使用 HCI_VS_MSFT_Avdtp_Capabilities_Configuration)。 藍牙控制器傳回的任何音訊介面參數也會儲存在系統設定廠商 SIOP 的集合中。 音訊驅動程式可以在IOCTL完成之後隨時取得這些值。
在IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2之後設定的廠商SIOP
A2DP 驅動程式會在IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR2之後,讓音訊驅動程式傳送的任何 SIOP 失敗。
廠商 SIOP 在IOCTL_SBAUD_GET_ENDPOINT_DESCRIPTOR之後和IOCTL_SBAUD_STREAM_OPEN之前設定
A2DP 驅動程式會將 SIOP 值儲存在串流設定廠商 SIOP 的集合中。 A2DP 驅動程式會在處理 IOCTL_SBAUD_STREAM_OPEN時,將此集合傳送至藍牙控制器(使用 HCI_VS_MSFT_Avdtp_Open)。 藍牙控制器傳回的任何音訊介面參數也會儲存在串流設定廠商SIOP的集合中。 音訊驅動程式可以在IOCTL完成之後隨時取得這些值。
A2DP 驅動程式會在處理 IOCTL_SBAUD_STREAM_CLOSE時清除串流設定廠商 SIOP 的集合。 (目前還不清楚系統設定廠商 SIOPs 的集合。
A2DP 側帶介面
A2DP 側帶使用泛型IOCTL_SBAUD_* 要求。 如需IOCTLs的完整清單,請參閱sidebandaudio.h標頭。 本節提供 A2DP 特有的資訊。
PnP 介面類別
介面類別適用於 GUID_DEVINTERFACE_A2DP_SIDEBAND_AUDIO
A2DP 側帶藍牙音訊。
用於 KS 針腳狀態轉換的 IOCTL
音訊驅動程式會在特定 KS 針腳狀態轉換上傳送這些要求。
- 在第一次轉換高於KSSTATE_STOP時(通常為KSSTATE_ACQUIRE),傳送 IOCTL_SBAUD_STREAM_OPEN。
- 在轉換至KSSTATE_RUN時,傳送 IOCTL_SBAUD_STREAM_START。
- 在KSSTATE_RUN下方轉換時,傳送 IOCTL_SBAUD_STREAM_SUSPEND。
- 關閉 KS 針腳時,傳送 IOCTL_SBAUD_STREAM_CLOSE。
適用於 A2DP 卸除的Microsoft定義藍牙 HCI 擴充功能
如需目前定義的擴充功能,請參閱 Microsoft定義的藍牙 HCI 延伸 模組。
HCI_VS_MSFT_Read_Supported_Features
音訊側帶 A2DP 卸除可藉由在 Supported_features return 參數中定義另一個位來表示支援 AVDTP 卸除命令,藉以增強HCI_VS_MSFT_Read_Supported_Features命令。 設定此位時,應該支援本節中的其餘命令。
如需命令和傳回參數的描述,請參閱 HCI_VS_MSFT_Read_Supported_Features。
如需Supported_features (8 八位) 值,另請參閱HCI_VS_MSFT_Read_Supported_Features。 額外的值是用來指出控制器支援AVDTP卸除,以及Microsoft定義的AVDTP藍牙 HCI 事件中所述的HCI_VS_MSFT_Avdtp_* 命令。
音訊相關Microsoft定義的藍牙 HCI 擴充功能
藍牙主機控制器介面 (HCI) 會指定主機與藍牙無線電控制器之間的所有互動。 藍牙規格可讓廠商定義的 HCI 命令和事件啟用主機和控制器之間的非標準化互動。 Microsoft定義 Windows 取用的廠商特定 HCI 命令和事件。 下列Microsoft定義 HCI 命令用於音訊側帶卸除。
下列 AVDTP HCI 命令說明於藍牙主題 - Microsoft定義的 AVDTP 藍牙 HCI 事件。
HCI_VS_MSFT_Avdtp_Capabilities_Configuration
子命令 opcode 值:7
設定音訊傳輸介面,並傳回藍牙控制器的編解碼器功能,這是編解碼器資訊區塊的清單。 每個編解碼器資訊區塊都會描述一個支持的編解碼器。 如需詳細資訊,請參閱 HCI_VS_MSFT_Avdtp_Capabilities_Configuration。
HCI_VS_MSFT_Avdtp_Open
子命令 opcode 值:8
配置及設定控制器內的AVDTP卸除資源。 如需詳細資訊,請參閱 HCI_VS_MSFT_Avdtp__Open。
HCI_VS_MSFT_Avdtp_Start
子命令 opcode 值:9
此命令會從音訊傳輸開始音訊串流至傳輸的 AVDTP 媒體封包。 如需詳細資訊,請參閱 HCI_VS_MSFT_Avdtp_Start。
HCI_VS_MSFT_Avdtp_Suspend
子命令 opcode 值:0xA
停止由 HCI_VS_MSFT_Avdtp_Start 起始的串流活動。 如需詳細資訊,請參閱 HCI_VS_MSFT_Avdtp_Suspend。
HCI_VS_MSFT_Avdtp_Close
子命令 opcode 值:0xB
釋放由 HCI_VS_MSFT_Avdtp_Open 配置的AVDTP卸除資源。 如需詳細資訊,請參閱 HCI_VS_MSFT_Avdtp_Close。
音訊 DSP 或藍牙控制器中的藍牙編解碼器
實作會容納裝載於音訊 DSP 和/或藍牙控制器中的藍牙編解碼器。 編解碼器-SIOP 提供音訊驅動程序的機制,以指出支援的編解碼器清單。 同樣地, HCI_VS_MS_Avdtp_Capabilities_Configuration 命令可讓藍牙控制器傳回支援的編解碼器清單。 請注意,至少有一個 A2DP 驅動程式和藍牙控制器應該傳回支援的編解碼器清單。
A2DP 驅動程式無法可靠地交集或合併音訊驅動程式和藍牙控制器所支援的 A2DP 編解碼器清單。 如果兩者都傳回 A2DP 支援的編解碼器,Windows 只會使用藍牙傳輸驅動程式所傳回的清單。
如果 IHV 解決方案需要交集或合併音訊 DS 和藍牙控制器功能的編解碼器相關功能,則音訊驅動程式可以透過編解碼器-SIOP 來指出其功能(如果標準表示法已足夠)或廠商-SIOP。 A2DP 驅動程式會將 SIOP 傳遞至藍牙控制器,以便與功能交集,並從HCI_VS_MSFT_Avdtp_Capabilities_Configuration傳回一組支援的編解碼器。