Composants Wave et DirectSound
Les programmes d’application s’appuient sur une combinaison de composants en mode utilisateur et en mode noyau pour capturer (entrée) et restituer (sortie) les flux d’ondes. Un flux d’ondes est un flux audio numérique dont le format de données est décrit par une structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE .
Une application peut utiliser l’une des interfaces logicielles suivantes pour le rendu et la capture d’ondes :
Fonctions Microsoft Windows Multimedia waveOutXxx et waveInXxx
API DirectSound et DirectSoundCapture
Le comportement des fonctions waveOutXxx et waveInXxx est basé sur les fonctionnalités des pilotes et périphériques d’onde hérités. À compter de Windows 98, le pilote système WDMAud traduit les appels à ces fonctions en commandes en pilotes audio WDM. Toutefois, en émulant le comportement des logiciels et du matériel plus anciens, les fonctions waveOutXxx sacrifient les effets sonores 3D et l’accélération matérielle qui sont désormais disponibles via l’API DirectSound. Pour plus d’informations sur DirectSound et les fonctions d’ondes Multimédia Windows, consultez la documentation Microsoft Windows SDK.
DirectSound et les fonctions d’ondes Multimédia Windows sont des clients du pilote système SysAudio, qui génère les graphiques de filtre audio qui traitent les flux d’ondes et DirectSound. La création de graphiques est transparente pour les applications qui utilisent ces interfaces logicielles.
Composants wave
La figure suivante montre les composants en mode utilisateur et en mode noyau qu’une application d’ondes utilise pour afficher ou capturer un flux audio numérique constitué de données PCM d’ondes.
Les composants de rendu apparaissent sur le côté gauche de la figure précédente, et les composants de capture apparaissent à droite. Les cases représentant le pilote de miniport de vague sont assombries pour indiquer qu’il s’agit de composants fournis par le fournisseur. Les autres composants de la figure sont fournis par le système.
En haut à gauche de la figure, l’application de rendu des ondes (ou « wave-out ») s’interface aux pilotes audio WDM via les fonctions waveOutXxx , qui sont implémentées dans le composant système WinMM en mode utilisateur, Winmm.dll. L’application lit des blocs d’exemples audio d’ondes à partir d’un fichier et appelle la fonction waveOutWrite pour les afficher.
WDMAud, qui se compose à la fois de composants en mode utilisateur et en mode noyau (Wdmaud.drv et Wdmaud.sys), met en mémoire tampon les données d’onde de l’appel waveOutWrite et génère le flux d’ondes vers le pilote système KMixer, qui apparaît sous WDMAud dans la figure.
KMixer est un composant système qui reçoit des flux PCM d’ondes à partir d’une ou plusieurs sources et les combine pour former un flux de sortie unique, qui est également au format PCM d’ondes.
KMixer génère un flux d’ondes vers un appareil WaveCyclique ou WavePci, dont les pilotes de port et de miniport apparaissent sous KMixer sur le côté gauche de la figure précédente. Le pilote miniport se lie au pilote de port pour former le filtre d’ondes qui représente le périphérique de rendu audio sous-jacent. Un périphérique de rendu classique génère un signal analogique qui pilote un ensemble de haut-parleurs ou une unité audio externe. Un périphérique de rendu peut également générer de l’audio numérique via un connecteur S/PDIF. Pour plus d’informations sur WaveCyclique et WavePci, consultez Filtres d’ondes.
KMixer peut également transmettre son flux de sortie à un périphérique audio USB, qui est contrôlé par le pilote système de classe USBAudio (non indiqué dans la figure), au lieu d’un appareil WaveCyclique ou WavePci.
Un pilote d’adaptateur crée une instance d’un pilote de port WaveCyclique ou WavePci en appelant PcNewPort avec une valeur GUID de CLSID_PortWaveCyclic ou CLSID_PortWavePci, respectivement.
Le côté droit de la figure précédente montre les composants nécessaires pour prendre en charge une application qui capture les données d’ondes dans un fichier. L’application de capture d’ondes (ou « wave-in ») communique avec les pilotes audio WDM via les fonctions waveInXxx , qui sont implémentées dans le composant système WinMM.
Dans l’angle inférieur droit de la figure, le dispositif de capture d’ondes est contrôlé par les pilotes de port et de miniport de vague. Les pilotes de port et de miniport, qui peuvent être de type WaveCyclique ou WavePci, se lient pour former un filtre d’onde qui représente le périphérique de capture. Cet appareil capture généralement un signal analogique à partir d’un microphone ou d’une autre source audio et le convertit en flux PCM à ondes. L’appareil peut également entrer un flux audio numérique via un connecteur S/PDIF.
Le pilote de port d’onde génère son flux d’ondes directement à KMixer ou à WDMAud. Le flux doit passer par KMixer s’il doit être converti au taux d’échantillonnage avant que WDMAud ne le reçoive. Un système qui effectue le rendu et la capture simultanés de flux audio peut nécessiter deux instances de KMixer, comme illustré dans la figure. Notez que SysAudio crée automatiquement ces instances à mesure qu’elles sont nécessaires.
La source du flux d’ondes capturé peut également être un périphérique audio USB au lieu d’un appareil WaveCyclique ou WavePci. Dans ce cas, le pilote USBAudio (non indiqué dans la figure) transmet le flux à KMixer.
Que le flux d’ondes soit capturé par un périphérique USB ou par un appareil WaveCyclique ou WavePci, KMixer effectue une conversion à taux d’échantillonnage sur le flux, si nécessaire, mais ne mélange pas avec d’autres flux. KMixer génère le flux obtenu vers Wdmaud.sys, la moitié en mode noyau du pilote système WDMAud. La moitié du mode utilisateur, Wdmaud.drv, génère le flux d’ondes vers le programme d’application via les fonctions waveInXxx , qui sont implémentées dans Winmm.dll. Enfin, en haut de la figure, l’application de capture d’ondes écrit les données de vague dans un fichier.
Au moment où l’application de capture d’ondes appelle la fonction waveInOpen pour ouvrir le flux de capture, elle passe un pointeur vers sa routine de rappel. Lorsqu’un événement de capture d’ondes se produit, le système d’exploitation appelle la routine de rappel avec une mémoire tampon contenant le bloc suivant d’échantillons d’ondes provenant de l’appareil de capture. En réponse au rappel, l’application écrit le bloc suivant de données d’ondes dans le fichier.
Composants DirectSound
La figure suivante montre les composants en mode utilisateur et en mode noyau qui sont utilisés par un programme d’application DirectSound pour afficher ou capturer des données d’ondes.
Les composants de rendu sont affichés dans la moitié gauche de la figure précédente, et les composants de capture apparaissent à droite. Les pilotes de miniport de vague sont affichés sous forme de boîtes sombres pour indiquer qu’il s’agit de composants fournis par le fournisseur. Les autres composants de la figure sont fournis par le système.
En haut à gauche de la figure, une application DirectSound charge les données d’ondes d’un fichier dans une mémoire tampon sonore que le composant système DirectSound en mode utilisateur (Dsound.dll) gère. Ce composant envoie un flux d’ondes à un appareil WaveCyclique ou WavePci, dont les pilotes de port et de miniport apparaissent dans le coin inférieur gauche de la figure. Si une broche de mélangeur matériel est disponible sur l’appareil, le flux passe directement au pilote de port d’onde, en contournant KMixer. Sinon, le flux passe d’abord par KMixer, qui le mélange à n’importe quel autre flux en lecture simultanée. KMixer génère le flux mixte vers le pilote de port.
Comme précédemment, le pilote miniport se lie au pilote de port pour former le filtre d’ondes qui représente le périphérique de rendu audio sous-jacent. Cet appareil peut lire le flux via un ensemble de haut-parleurs, par exemple.
Vous pouvez également afficher le flux d’ondes par un périphérique audio USB au lieu d’un appareil WaveCyclique ou WavePci. Dans ce cas, le flux ne peut pas contourner KMixer ; le pilote système de classe USBAudio (non illustré dans la figure) transmet toujours le flux à KMixer.
Le côté droit de la figure précédente montre les composants qui prennent en charge une application DirectSoundCapture. L’application enregistre les données d’ondes reçues d’un appareil de capture WaveCyclique ou WavePci. Cet appareil convertit un signal analogique d’un microphone, par exemple, en flux d’ondes. Le port d’onde et les pilotes miniport de l’appareil apparaissent dans le coin inférieur droit de la figure. Comme illustré dans la figure, le pilote de port reçoit en tant qu’entrée le flux du pilote miniport et le génère soit directement vers le composant DirectSound en mode utilisateur, Dsound.dll, soit indirectement via KMixer. Cela dépend de la disponibilité ou non d’une broche de capture matérielle à partir de l’appareil de capture.
La source du flux d’ondes capturé peut également être un périphérique audio USB. Dans ce cas, le flux ne peut pas contourner KMixer ; le pilote USBAudio (non illustré dans la figure) transmet toujours le flux à KMixer.
Si KMixer est inséré dans le chemin du flux de capture, il effectue une conversion à taux d’échantillonnage sur le flux, si nécessaire, mais ne mélange pas avec d’autres flux.
En haut à droite de la figure précédente, l’application lit les données d’onde à partir de la mémoire tampon DirectSoundCapture et les écrit dans le fichier.