Filtres d’ondes

Les filtres d’ondes représentent des appareils qui restituent et/ou capturent des données audio numériques au format onde. Les applications accèdent généralement aux fonctionnalités de ces appareils par le biais de l’API DirectSound ou des fonctions multimédias waveOutXxx et waveInXxx de Microsoft Windows. Pour plus d’informations sur les formats d’ondes que les pilotes audio WDM peuvent prendre en charge, consultez WAVEFORMATEX et WAVEFORMATEXTENSIBLE.

Un filtre de rendu d’ondes reçoit en entrée un flux audio numérique d’ondes et génère un signal audio analogique (vers un ensemble de haut-parleurs ou un mixeur externe) ou un flux audio numérique (vers un connecteur S/PDIF, par exemple).

Un filtre de capture d’ondes reçoit en entrée un signal audio analogique (à partir d’un microphone ou d’une prise d’entrée) ou un flux numérique (à partir d’un connecteur S/PDIF, par exemple). Le même filtre génère un flux d’ondes contenant des données audio numériques.

Un filtre à onde unique peut effectuer à la fois le rendu et la capture simultanément. Ce type de filtre peut, par exemple, représenter un périphérique audio qui peut lire de l’audio via un ensemble de haut-parleurs et enregistrer l’audio via un microphone en même temps. Le matériel de rendu d’ondes et de capture d’ondes peut également être représenté sous la forme de filtres d’ondes distincts, comme décrit dans Sous-appareils audio dynamiques.

Un pilote d’adaptateur audio forme un filtre d’ondes en liant un pilote de miniport de vague, que le fournisseur de matériel implémente dans le cadre du pilote de l’adaptateur, avec un pilote de port d’onde, que le système implémente. Le pilote miniport gère toutes les opérations spécifiques au matériel pour le filtre d’ondes, et le pilote de port gère toutes les fonctions génériques de filtre d’ondes.

Le pilote système PortCls (Portcls.sys) implémente trois pilotes de port d’onde : WaveRT, WavePci et WaveCyclique.

Les trois types de filtre d’ondes fonctionnent comme suit :

  • Un filtre WaveRT alloue une mémoire tampon pour les données d’onde et rend cette mémoire tampon directement accessible au client en mode utilisateur. La mémoire tampon peut être constituée de blocs de mémoire contigus ou non contigus, en fonction des fonctionnalités matérielles de l’appareil à ondes. Le client accède à la mémoire tampon en tant que bloc contigu de mémoire virtuelle. La mémoire tampon est cyclique, ce qui signifie que lorsque le pointeur de lecture (pour le rendu) ou d’écriture (pour la capture) de l’appareil atteint la fin de la mémoire tampon, il encapsule automatiquement jusqu’au début de la mémoire tampon.

  • Un filtre WavePci accède directement à la mémoire tampon du client. Bien que le client accède à la mémoire tampon comme un seul bloc contigu de mémoire virtuelle, le filtre WavePci doit y accéder en tant que série de blocs de mémoire éventuellement non incohérents. Les blocs contenant des parties successives du flux de rendu ou de capture sont mis en file d’attente sur l’appareil. Lorsque le pointeur de lecture ou d’écriture de l’appareil atteint la fin d’un bloc, il passe au début du bloc suivant dans la file d’attente.

  • Un filtre WaveCyclique alloue une mémoire tampon composée d’un seul bloc contigu de mémoire à utiliser comme mémoire tampon de sortie (pour le rendu) ou d’entrée (pour la capture). Cette mémoire tampon est cyclique. Étant donné que la mémoire tampon n’est pas directement accessible au client, le pilote doit copier des données entre la mémoire tampon cyclique du pilote et la mémoire tampon en mode utilisateur du client.

WaveRT est préféré à WavePci et WaveCyclique. WavePci et WaveCyclique ont été utilisés avec les versions antérieures de Windows.

Un filtre WaveRT peut représenter un périphérique audio qui réside sur un bus système, tel que PCI ou PCI Express. Le principal avantage d’un filtre WaveRT par rapport à un filtre WaveCyclique ou WavePci est qu’un filtre WaveRT permet à un client en mode utilisateur d’échanger des données audio directement avec le matériel audio. En revanche, les filtres WaveCyclique et WavePci nécessitent une intervention logicielle périodique du pilote, ce qui augmente la latence du flux audio. En outre, les périphériques audio avec et sans fonctionnalités DMA de diffusion/collecte peuvent être représentés sous la forme de filtres WaveRT. Pour plus d’informations, consultez le livre blanc A Wave Port Driver for Real-Time Audio Streaming .

Filtres WaveRT

Un filtre WaveRT est implémenté en tant que paire de pilotes port/miniport. Dans Windows Vista et versions ultérieures, une fabrique de filtre WaveRT crée un filtre WaveRT comme suit :

  • Il instancie un objet pilote de miniport WaveRT.

  • Il instancie un objet pilote de port WaveRT en appelant PcNewPort avec la valeur GUID CLSID_PortWaveRT.

  • Il appelle la méthode IPort::Init du pilote de port pour lier le pilote miniport au pilote de port.

L’exemple de code dans Subdevice Creation illustre ce processus. Les pilotes de port et de miniport communiquent entre eux via leurs interfaces IPortWaveRT et IMiniportWaveRT .

Pour plus d’informations, consultez le livre blanc A Wave Port Driver for Real-Time Audio Streaming .

Informations pour les versions précédentes de Windows

Informations wavecycliques pour les versions précédentes de Windows

Un filtre WaveCyclique peut représenter un périphérique audio qui se connecte à un bus système, tel que ISA, PCI, PCI Express ou PCMCIA. Comme le nom « WavePci » l’indique, un filtre WavePci représente généralement un appareil qui se connecte à un bus PCI, bien que, en principe, un appareil WavePci puisse se connecter à un bus ISA, par exemple. Contrairement aux appareils plus simples qui sont pris en charge par WaveCyclique, un appareil pris en charge par WavePci doit avoir des fonctionnalités DMA de nuage de points/de collecte. Un périphérique audio qui réside sur le bus PCI mais qui n’a pas de DMA de nuage de points/de collecte peut être représenté sous la forme d’un filtre WaveCyclique, mais pas en tant que filtre WavePci.

Informations WavePci pour les versions précédentes de Windows

Un appareil WavePci est en mesure d’effectuer des transferts DMA de nuages de points/de collecte vers ou à partir de mémoires tampons qui peuvent se trouver à des adresses mémoire arbitraires et qui commencent et se terminent par des alignements d’octets arbitraires. En revanche, le matériel DMA d’un appareil WaveCyclique nécessite uniquement la possibilité de déplacer des données vers ou à partir d’une seule mémoire tampon que le pilote miniport de l’appareil alloue. Un pilote miniport WaveCyclique est libre d’allouer une mémoire tampon cyclique qui répond aux fonctionnalités limitées de son canal DMA. Par exemple, le canal DMA pour un appareil WaveCyclique classique peut nécessiter une mémoire tampon qui satisfait aux restrictions suivantes :

  • La mémoire tampon se trouve dans une certaine région de l’espace d’adressage physique.

  • La mémoire tampon est contiguë dans l’espace d’adressage physique et virtuel.

  • La mémoire tampon commence et se termine même sur des limites de quatre ou huit octets.

Toutefois, en retour de cette simplicité, un appareil WaveCyclique doit s’appuyer sur la copie logicielle de données vers ou à partir de la mémoire tampon cyclique, tandis qu’un appareil WavePci s’appuie sur les fonctionnalités de diffusion/collecte de son matériel DMA pour éviter une telle copie. Les IRP qui fournissent des données audio de vague à un appareil de rendu ou récupèrent des données à partir d’un périphérique de capture sont accompagnés de mémoires tampons de données, et chacune de ces mémoires tampons contient une partie du flux audio qui est restitué ou capturé. Un appareil WavePci est en mesure d’accéder directement à ces mémoires tampons via son moteur DMA de diffusion/collecte, tandis qu’un appareil WaveCyclique exige que les données soient copiées dans sa mémoire tampon cyclique à partir de l’IRP, ou vice versa.

Filtres WavePci

Remarque : Informations WavePci pour les versions précédentes de Windows

Un filtre WavePci est implémenté en tant que paire de pilotes port/miniport. Une fabrique de filtre WavePci crée un filtre WavePci comme suit :

  • Il instancie un objet pilote de miniport WavePci.

  • Il instancie un objet pilote de port WavePci en appelant PcNewPort avec la valeur GUID CLSID_PortWavePci.

  • Il appelle la méthode IPort::Init du pilote de port pour lier le pilote miniport au pilote de port.

L’exemple de code dans Subdevice Creation illustre ce processus. Les pilotes de port et de miniport communiquent entre eux via leurs interfaces IPortWavePci et IMiniportWavePci .

Pour plus d’informations, consultez Problèmes d’implémentation pour les appareils WavePci.

Filtres wavecycliques

Notes

Microsoft prend en charge un environnement diversifié et inclusif. Cet article contient des références à la terminologie que le guide de style Microsoft pour la communication sans préjugés reconnaît comme une exclusion. Le mot ou l’expression est utilisé dans cet article à des fins de cohérence, car il apparaît actuellement dans le logiciel. Lorsque le logiciel est mis à jour pour supprimer la langue, cet article est mis à jour pour être aligné.

Remarque : Informations wavecycliques pour les versions précédentes de Windows

Un filtre WaveCyclique est implémenté en tant que paire de pilotes port/miniport. Une fabrique de filtre WaveCyclique crée un filtre WaveCyclique comme suit :

  • Il instancie un objet pilote miniport WaveCyclique.

  • Il instancie un objet pilote de port WaveCyclique en appelant PcNewPort avec la valeur GUID CLSID_PortWaveCyclic.

  • Il appelle la méthode IPort::Init du pilote de port pour lier le pilote miniport au pilote de port.

L’exemple de code dans Subdevice Creation illustre ce processus. Les pilotes de port et de miniport communiquent entre eux via leurs interfaces IPortWaveCyclique et IMiniportWaveCyclique .

La mémoire tampon cyclique du filtre WaveCyclique se compose toujours d’un bloc contigu de mémoire virtuelle. L’implémentation par le pilote de port de la méthode IDmaChannel::AllocateBuffer alloue toujours une mémoire tampon contiguë dans l’espace d’adressage de mémoire physique et virtuelle. Si, comme mentionné précédemment, le moteur DMA de l’appareil WaveCyclic impose des contraintes supplémentaires sur la mémoire tampon, le pilote miniport est libre d’implémenter sa propre méthode d’allocation de mémoire tampon pour répondre à ces contraintes.

Un pilote de miniport WaveCyclic qui demande une mémoire tampon volumineuse (par exemple, huit pages de mémoire contiguës physiquement) doit être prêt à se contenter d’une taille de mémoire tampon plus petite si le système d’exploitation refuse la demande d’origine. Un périphérique audio peut parfois être déchargé et rechargé pour rééquilibrer les ressources système (voir Arrêter un appareil pour rééquilibrer les ressources).

Un appareil WaveCyclic avec du matériel DMA intégré et de gestion de bus est appelé appareil master. Un appareil WaveCyclic peut également être un appareil subordonné sans fonctionnalités matérielles DMA intégrées. Un appareil subordonné doit s’appuyer sur le contrôleur DMA système pour effectuer tous les transferts de données dont il a besoin. Pour plus d’informations sur les appareils master et subordonnés, consultez IDmaChannel et IDmaChannelSlave.

Un pilote miniport WaveCyclic peut implémenter son propre objet de canal DMA au lieu d’utiliser l’objet de canal DMA par défaut, qui est créé par l’une des méthodes NewXxxDmaChannel du pilote de port :

IPortWaveCyclic::NewMasterDmaChannel

IPortWaveCyclic::NewSlaveDmaChannel

L’implémentation IDmaChannel personnalisée du pilote d’adaptateur peut effectuer une gestion personnalisée des données pour répondre à des contraintes matérielles spéciales. Par exemple, les fonctions Multimédia Windows utilisent des formats wave dans lesquels les exemples 16 bits sont toujours des valeurs signées, mais le matériel de rendu audio peut être conçu pour utiliser des valeurs 16 bits non signées à la place. Dans ce cas, la méthode IDmaChannel::CopyTo personnalisée du pilote peut être écrite pour convertir les valeurs sources signées en valeurs de destination non signées requises par le matériel. Bien que cette technique puisse être utile pour contourner les défauts de conception matérielle, elle peut également entraîner un coût important en matière de surcharge logicielle.

Pour obtenir un exemple de pilote qui implémente son propre objet de canal DMA, consultez l’exemple de carte audio Sb16 dans les versions antérieures du WDK. Si la constante OVERRIDE_DMA_CHANNEL est définie sur TRUE, les instructions de compilation conditionnelle dans le code source permettent l’implémentation d’un objet IDmaChannel propriétaire, que le pilote utilise à la place de l’objet IDmaChannel par défaut de l’appel IPortWaveCyclic::NewXxxDmaChannel.