ACX 音频数据格式和数据格式列表
本主题介绍驱动程序如何使用 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 还消除了驱动程序自行管理模式和格式化存储的需要。
如果 in/out 格式不相同(DSP 线路),则驱动程序仍需要支持以下 DDI。 此 DDI 独立于流式传输,特定于线路引脚,仅在非 s/w 流式处理引脚上受支持。
PFN_ACX_PIN_SET_DATAFORMAT EvtAcxPinSetDataFormat;