Formats de données audio ACX et listes de formats de données
Cette rubrique décrit comment les types de format ACX sont utilisés par un pilote pour suivre, gérer et comparer les formats de données de signal. Pour avoir un aperçu général d’ACX et une liste des termes communs d’ACX, veuillez consulter la section Aperçu des extensions de classe audio ACX. Pour des informations générales sur les formats de codage audio, veuillez consulter la section Formats de données audio.
Objets ACXDATAFORMAT et ACXDATAFORMATLIST
Deux objets ACX sont utilisés pour travailler avec les formats de données.
- ACXDATAFORMAT qui représente un format de données pris en charge par le périphérique audio.
- ACXDATAFORMATLIST qui est une liste de formats de données audio disponibles à l’utilisation.
Pour plus d’informations sur le travail avec les objets ACX, veuillez consulter la section Résumé des objets ACX.
ACX utilise l’énumération ACX_DATAFORMAT_TYPE, qui référence une structure KSDATAFORMAT pour spécifier un format de données.
ACXDATAFORMAT
ACXDATAFORMAT fournit un handle à un objet de format de données. Les pilotes créent ces objets en utilisant la fonction AcxDataFormatCreate, et peuvent les comparer en utilisant AcxDataFormatIsEqual.
ACXDATAFORMATLIST
ACXDATAFORMATLIST est un conteneur pour les objets de format de données. Lorsque le pilote crée un ACXPIN, ACX crée automatiquement une liste de formats de données vide pour le mode de traitement du signal brut. Un pilote peut accéder à la liste en utilisant AcxPinGetRawDataFormatList. Cela renvoie l’ACXDATAFORMATLIST pour l’ACXPIN spécifié.
Un pilote peut ajouter un format à une liste spécifique en utilisant 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 pilote peut créer des listes de formats de données supplémentaires et les associer à un mode de traitement de signal spécifique en utilisant AcxDataFormatListCreate pour un WDFDEVICE spécifique tel qu’ACXPIN.
NTSTATUS AcxDataFormatListCreate(device, attributes, <format cfg>, &ACXDATAFORMATLIST)
Un pilote peut récupérer une liste de formats associée à une broche spécifique en utilisant AcxPinRetrieveModeDataFormatList.
Un pilote peut supprimer un format d’une liste spécifique en utilisant AcxDataFormatListRemoveDataFormat. Notez que si ce format est également le format par défaut, ACX sélectionne le premier disponible dans la liste comme format par défaut (si un est présent).
Un pilote peut spécifier un format par défaut dans la liste en utilisant AcxDataFormatListAssignDefaultDataFormat. Le format par défaut doit être présent dans la liste, sinon il sera ajouté.
Un pilote peut récupérer un format par défaut dans la liste en utilisant AcxDataFormatListRetrieveDefaultDataFormat.
Un pilote peut itérer sur une liste de formats et apporter des modifications en groupe en utilisant les DDI suivants.
Notez que les modifications ne sont appliquées qu’après que le pilote a terminé l’itération.
VOID AcxDataFormatListBeginIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
NTSTATUS AcxDataFormatListRetrieveNextDataFormat(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR, &ACXFORMAT);
VOID AcxDataFormatListEndIteration(ACXDATAFORMATLIST, PACX_DATAFORMAT_LIST_ITERATOR)
Les DDI ci-dessus éliminent le besoin pour le pilote de mettre en œuvre les rappels suivants :
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;
Les DDI ci-dessus éliminent également le besoin pour le pilote de mettre en œuvre les événements suivants (ACX déclenche cet événement automatiquement après que la liste a été modifiée) :
// 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)
Les DDI ci-dessus éliminent également le besoin pour le pilote de gérer lui-même le stockage des modes et des formats.
Le pilote doit encore prendre en charge le DDI suivant si les formats d’entrée/sortie ne sont pas les mêmes (circuit DSP). Ce DDI est indépendant du flux, spécifique à la broche du circuit et uniquement pris en charge sur les broches de streaming non s/w.
PFN_ACX_PIN_SET_DATAFORMAT EvtAcxPinSetDataFormat;