Поделиться через


Форматы аудиоданных 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. Он возвращает ACXDATAFORMATLIST для указанного ACXPIN.

Драйвер может добавить формат в определенный список с помощью 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.

Драйвер может выполнять итерацию по списку форматов и вносить изменения в группу с помощью следующих DDIs.

Обратите внимание, что изменения применяются только после завершения итерации драйвера.

VOID AcxDataFormatListBeginIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
NTSTATUS AcxDataFormatListRetrieveNextDataFormat(ACXDATAFORMATLIST,  PACX_DATAFORMAT_LIST_ITERATOR, &ACXFORMAT);
VOID AcxDataFormatListEndIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)

Приведенные выше DDIs устраняют необходимость реализации следующих обратных вызовов драйвера:

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;

Приведенные выше DDIs также удаляют необходимость реализации следующих событий драйвера (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)

Приведенные выше DDIs также устраняют необходимость управления режимами и форматами хранилища драйвера самостоятельно.

Драйвер по-прежнему должен поддерживать следующий DDI, если форматы в/out не совпадают (канал DSP). Этот DDI является независимым потоком, закреплением канала и поддерживается только для пин-кодов потоковой передачи, отличных от потоковой передачи.

PFN_ACX_PIN_SET_DATAFORMAT              EvtAcxPinSetDataFormat;

См. также

заголовок acxdataformat.h

Форматы звуковых данных

Структура KSDATAFORMAT

Общие сведения о расширениях класса АУДИО ACX