Formatos de datos de audio de ACX y listas de formatos de datos
En este tema se describe cómo se usan los tipos de formato ACX a través de un controlador para supervisar, administrar y comparar formatos de datos de señal. Para obtener información general sobre ACX y ver la lista de términos comunes de ACX, consulte Introducción a las extensiones de clase de audio (ACX). Para obtener información general sobre los formatos de codificación de audio, consulte Formatos de datos de audio.
Objetos ACXDATAFORMAT y ACXDATAFORMATLIST
Se usan dos objetos de ACX para trabajar con formatos de datos.
- ACXDATAFORMAT, que representa un formato de datos compatible con el dispositivo de audio.
- ACXDATAFORMATLIST, que es una lista de formatos de datos de audio disponibles para usar.
Para obtener más información sobre cómo trabajar con objetos de ACX, consulte Resumen de objetos de ACX.
ACX usa la enumeración ACX_DATAFORMAT_TYPE, que hace referencia a la estructura KSDATAFORMAT para especificar un formato de datos.
ACXDATAFORMAT
ACXDATAFORMAT facilita un identificador para un objeto de formato de datos. Los controladores crean estos objetos mediante la función AcxDataFormatCreate y pueden compararlos mediante AcxDataFormatIsEqual.
ACXDATAFORMATLIST
ACXDATAFORMATLIST es un contenedor para objetos de formato de datos. Cuando el controlador crea un ACXPIN, ACX crea automáticamente una lista de formato de datos vacío en el modo de procesamiento de señal sin procesar. Un controlador puede acceder a la lista mediante AcxPinGetRawDataFormatList. Devuelve ACXDATAFORMATLIST en el ACXPIN indicado.
Un controlador puede agregar un formato a una lista específica mediante 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));
Un controlador puede crear listas de formato de datos adicionales y asociarlas a un modo de procesamiento de señal específico mediante AcxDataFormatListCreate en un WDFDEVICE específico, como ACXPIN.
NTSTATUS AcxDataFormatListCreate(device, attributes, <format cfg>, &ACXDATAFORMATLIST)
Un controlador puede recuperar una lista de formatos asociada a un pin específico mediante AcxPinRetrieveModeDataFormatList.
Un controlador puede quitar un formato de una lista específica mediante AcxDataFormatListRemoveDataFormat. Tenga en cuenta que si este formato también es el formato predeterminado, ACX seleccionará el primero disponible en la lista como predeterminado (si hay uno presente).
Un controlador puede especificar un formato predeterminado en la lista mediante AcxDataFormatListAssignDefaultDataFormat. El formato predeterminado debe estar incluido en la lista; de lo contrario, se agregará.
Un controlador puede recuperar un formato predeterminado en la lista mediante AcxDataFormatListRetrieveDefaultDataFormat.
Un controlador puede iterar en una lista de formatos y realizar cambios como un grupo mediante los siguientes DDI.
Tenga en cuenta que los cambios se aplican solo después de que el controlador finalice la iteración.
VOID AcxDataFormatListBeginIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
NTSTATUS AcxDataFormatListRetrieveNextDataFormat(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR, &ACXFORMAT);
VOID AcxDataFormatListEndIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
Los DDI anteriores hacen que no sea necesario que el controlador implemente las siguientes devoluciones de llamada:
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;
Los DDI anteriores también contribuyen a que el controlador no tenga que implementar los siguientes eventos (ACX activa este evento automáticamente después de que la lista haya cambiado):
// 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)
Los DDI anteriores también hacen que el controlador no tenga que administrar los modos y aplica un formato al almacenamiento por sí mismo.
Aun así, el controlador necesita aceptar el siguiente DDI si los formatos de entrada y salida no son los mismos (circuito DSP). Esta DDI es independiente de la transmisión, el pin del circuito específico y solo se admite en pines de streaming sin software.
PFN_ACX_PIN_SET_DATAFORMAT EvtAcxPinSetDataFormat;