Форматы аудиоданных 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;