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;

另请参阅

acxdataformat.h 标头

音频数据格式

KSDATAFORMAT 结构

ACX 音频类扩展概述