本主題說明驅動程式如何使用 ACX 格式類型來追蹤、管理和比較訊號資料格式。 如需 ACX 的一般概觀,以及常見 ACX 術語的清單,請參閱 ACX 音訊類別延伸模組概觀。 如需音訊編碼格式的一般資訊,請參閱 音訊資料格式。
ACXDATAFORMAT 和 ACXDATAFORMATLIST 物件
兩個 ACX 物件可用來處理資料格式。
- ACXDATAFORMAT ,代表音訊裝置支援的資料格式。
- ACXDATAFORMATLIST,這是可供使用的音訊資料格式清單。
如需使用 ACX 物件的詳細資訊,請參閱 ACX 物件摘要。
ACX 會使用 ACX_DATAFORMAT_TYPE 列舉,其會參考 KSDATAFORMAT 結構 來指定資料格式。
ACXDATAFORMAT
ACXDATAFORMAT 提供資料格式物件的控制碼。 驅動程式會使用 AcxDataFormatCreate 函式建立這些物件,並可以使用 AcxDataFormatIsEqual 來比較它們。
ACXDATAFORMATLIST
ACXDATAFORMATLIST 是資料格式物件的容器。 當驅動程式建立 ACXPIN 時,ACX 會自動為原始訊號處理模式建立空白的數據格式清單。 驅動程式可以使用 AcxPinGetRawDataFormatList 來存取清單。 它會返回針對指定 ACXPIN 的 ACXDATAFORMATLIST。
驅動程式可以使用 AcxDataFormatListAddDataFormat 將格式新增至特定清單。
// The raw processing mode list is associated with each single circuit
// by ACX. A driver uses AcxPinGetRawDataFormatList to retrieve the built-in raw
// data-format list.
//
RETURN_NTSTATUS_IF_TRUE(CodecCaptureHostPin >= CodecCapturePinCount, STATUS_INVALID_PARAMETER);
formatList = AcxPinGetRawDataFormatList(Pin[CodecCaptureHostPin]);
RETURN_NTSTATUS_IF_TRUE(formatList == nullptr, STATUS_INSUFFICIENT_RESOURCES);
//
// The driver uses AcxDataFormatListAddDataFormat to add data formats to the raw
// processing mode list associated with the current circuit.
//
RETURN_NTSTATUS_IF_FAILED(AcxDataFormatListAddDataFormat(formatList, formatPcm44100c1));
RETURN_NTSTATUS_IF_FAILED(AcxDataFormatListAddDataFormat(formatList, formatPcm48000c1));
驅動程式可以使用 AcxDataFormatListCreate 建立額外的數據格式清單,並針對特定 WDFDEVICE(例如 ACXPIN)將其關聯至特定的訊號處理模式。
NTSTATUS AcxDataFormatListCreate(device, attributes, <format cfg>, &ACXDATAFORMATLIST)
驅動程式可以使用 AcxPinRetrieveModeDataFormatList 擷取與特定針腳相關聯的格式清單。
驅動程式可以使用 AcxDataFormatListRemoveDataFormat 從特定清單中移除格式。 請注意,如果此格式也是預設格式,ACX 會選取清單中第一個可用的格式作為預設格式 (如果存在的話)。
驅動程式可以使用 AcxDataFormatListAssignDefaultDataFormat 在清單中指定預設格式。 預設格式必須存在於清單中,否則將新增它。
驅動程式可以使用 AcxDataFormatListRetrieveDefaultDataFormat 擷取清單中的預設格式。
驅動程式可以逐一查看格式清單,並使用下列 DDI 進行群組變更。
請注意,只有在驅動程式結束反覆專案之後,才會套用變更。
VOID AcxDataFormatListBeginIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
NTSTATUS AcxDataFormatListRetrieveNextDataFormat(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR, &ACXFORMAT);
VOID AcxDataFormatListEndIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
上述 DDI 消除驅動程式需要實作下列回呼的需求:
PFN_ACX_PIN_GET_SIGNALPROCESSING_MODES EvtAcxPinGetSignalProcessingModes;
PFN_ACX_PIN_GET_DATAFORMATS EvtAcxPinGetDataFormats;
PFN_ACX_PIN_GET_DEFAULT_DATAFORMAT EvtAcxPinGetDefaultDataFormat;
PFN_ACX_PIN_PROPOSE_DATAFORMAT EvtAcxPinProposeDataFormat;
上述 DDI 也不需要驅動程式實作下列事件 (ACX 會在清單變更之後自動觸發此事件) :
// Clients enable this event to receive format change notifications. Drivers fire this even when it detects a dynamic format change on the specified pin (h/w pin).
//
KSEVENT_PINCAPS_FORMATCHANGE(pin)
上述 DDI 也消除驅動程式自行管理模式和格式的儲存需求。
如果輸入/輸出格式不相同,驅動程式仍需要支援下列 DDI (DSP 線路) 。 此 DDI 與串流無關、特定於電路引腳,且僅支援非軟體串流引腳。
PFN_ACX_PIN_SET_DATAFORMAT EvtAcxPinSetDataFormat;