- Artikel
Anwendungsprogramme basieren auf einer Kombination aus Benutzermodus- und Kernelmoduskomponenten zum Erfassen (Eingabe) und Rendern (Ausgabe) von Wellenströmen. Ein Wellenstrom ist ein Digital-Audiostream, dessen Datenformat durch eine WAVEFORMATEX - oder WAVEFORMATEXTENSIBLE-Struktur beschrieben wird.
Eine Anwendung kann eine der folgenden Softwareschnittstellen zum Rendern und Aufzeichnen von Wellen verwenden:
Microsoft Windows Multimedia waveOutXxx- und waveInXxx-Funktionen
DirectSound- und DirectSoundCapture-APIs
Das Verhalten der Funktionen waveOutXxx und waveInXxx basiert auf den Funktionen älterer Wellentreiber und -geräte. Ab Windows 98 übersetzt der WDMAud-Systemtreiber Aufrufe dieser Funktionen in Befehle in WDM-Audiotreiber. Durch das Emulieren des Verhaltens älterer Software und Hardware opfern die waveOutXxx-Funktionen jedoch die 3D-Soundeffekte und die Hardwarebeschleunigung, die jetzt über die DirectSound-API verfügbar sind. Weitere Informationen zu DirectSound und den Windows Multimedia Wave-Funktionen finden Sie in der Microsoft Windows SDK-Dokumentation.
DirectSound und die Windows Multimedia-Wellenfunktionen sind Clients des SysAudio-Systemtreibers, der die Audiofilterdiagramme erstellt, die die Wave- und DirectSound-Streams verarbeiten. Die Grapherstellung ist für die Anwendungen transparent, die diese Softwareschnittstellen verwenden.
Wave-Komponenten
Die folgende Abbildung zeigt die Komponenten für den Benutzermodus und den Kernelmodus, die eine Wave-Anwendung zum Rendern oder Erfassen eines digitalen Audiodatenstroms verwendet, der aus PCM-Daten für Wellen besteht.
Die Renderingkomponenten werden auf der linken Seite der vorherigen Abbildung und die Erfassungskomponenten auf der rechten Seite angezeigt. Die Felder, die den Wave-Miniporttreiber darstellen, werden abgedunkelt, um anzugeben, dass es sich um vom Anbieter bereitgestellte Komponenten handelt. Die anderen Komponenten in der Abbildung werden vom System bereitgestellt.
Oben links in der Abbildung schnittstellen die Wave-Rendering-Anwendung (oder "Wave-Out") mit den WDM-Audiotreibern über die waveOutXxx-Funktionen , die in der WinMM-Systemkomponente des Benutzermodus implementiert werden, Winmm.dll. Die Anwendung liest Blöcke von Wave-Audiobeispielen aus einer Datei und ruft die waveOutWrite-Funktion auf, um sie zu rendern.
WDMAud, das sowohl aus Benutzermodus- als auch Kernelmoduskomponenten (Wdmaud.drv und Wdmaud.sys) besteht, puffert die Wellendaten aus dem waveOutWrite-Aufruf und gibt den Wellendatenstrom an den KMixer-Systemtreiber aus, der unter WDMAud in der Abbildung angezeigt wird.
KMixer ist eine Systemkomponente, die Wellen-PCM-Datenströme von einer oder mehreren Quellen empfängt und diese zu einem einzelnen Ausgabedatenstrom mischt, der ebenfalls im Wellen-PCM-Format vorliegt.
KMixer gibt einen Wellenstrom an ein WaveCyclic- oder WavePci-Gerät aus, dessen Port- und Miniporttreiber unter KMixer auf der linken Seite der vorherigen Abbildung angezeigt werden. Der Miniporttreiber bindet sich an den Porttreiber, um den Wellenfilter zu bilden, der das zugrunde liegende Audiorenderinggerät darstellt. Ein typisches Renderinggerät gibt ein analoges Signal aus, das eine Reihe von Lautsprechern oder eine externe Audioeinheit antreibt. Ein Renderinggerät kann auch digitales Audio über einen S/PDIF-Connector ausgeben. Weitere Informationen zu WaveCyclic und WavePci finden Sie unter Wellenfilter.
Alternativ kann KMixer seinen Ausgabedatenstrom an ein USB-Audiogerät übergeben, das vom USBAudio-Klassensystemtreiber (nicht in abbildung dargestellt) gesteuert wird, anstelle eines WaveCyclic- oder WavePci-Geräts.
Ein Adaptertreiber erstellt eine instance eines WaveCyclic- oder WavePci-Porttreibers, indem PcNewPort mit dem GUID-Wert CLSID_PortWaveCyclic bzw. CLSID_PortWavePci aufgerufen wird.
Die rechte Seite der vorherigen Abbildung zeigt die Komponenten, die erforderlich sind, um eine Anwendung zu unterstützen, die Wellendaten in einer Datei erfasst. Die Wave-Capture-Anwendung (oder "Wave-In") kommuniziert mit den WDM-Audiotreibern über die waveInXxx-Funktionen , die in der WinMM-Systemkomponente implementiert sind.
In der unteren rechten Ecke der Abbildung wird das Wave-Capture-Gerät von Wave-Miniport- und Porttreibern gesteuert. Die Port- und Miniporttreiber, die vom Typ WaveCyclic oder WavePci sein können, binden zusammen, um einen Wellenfilter zu bilden, der das Erfassungsgerät darstellt. Dieses Gerät erfasst in der Regel ein analoges Signal von einem Mikrofon oder einer anderen Audioquelle und konvertiert es in einen PcM-Wellenstrom. Das Gerät kann auch einen digitalen Audiostream über einen S/PDIF-Anschluss eingeben.
Der Wellenporttreiber gibt seinen Wellenstrom entweder an KMixer oder direkt an WDMAud aus. Der Stream muss KMixer durchlaufen, wenn er konvertiert werden muss, bevor WDMAud ihn empfängt. Ein System, das gleichzeitiges Rendern und Aufzeichnen von Audiostreams ausführt, erfordert möglicherweise zwei Instanzen von KMixer, wie in der Abbildung dargestellt. Beachten Sie, dass SysAudio diese Instanzen automatisch bei Bedarf erstellt.
Alternativ kann die Quelle des erfassten Wellenstroms ein USB-Audiogerät anstelle eines WaveCyclic- oder WavePci-Geräts sein. In diesem Fall übergibt der USBAudio-Treiber (nicht in Abbildung dargestellt) den Stream an KMixer.
Unabhängig davon, ob der Wellenstrom von einem USB-Gerät oder einem WaveCyclic- oder WavePci-Gerät erfasst wird, führt KMixer bei Bedarf eine Konvertierung der Samplerate für den Stream durch, mischt sich aber nicht mit anderen Streams. KMixer gibt den resultierenden Stream an Wdmaud.sys aus, der Kernelmodushälfte des WDMAud-Systemtreibers. Die Benutzermodushälfte, Wdmaud.drv, gibt den Wellenstrom über die waveInXxx-Funktionen an das Anwendungsprogramm aus, die in Winmm.dll implementiert werden. Schließlich schreibt die Wave-Capture-Anwendung oben in der Abbildung die Wellendaten in eine Datei.
Zu dem Zeitpunkt, zu dem die Wave-Capture-Anwendung die waveInOpen-Funktion aufruft, um den Erfassungsdatenstrom zu öffnen, übergibt sie einen Zeiger an ihre Rückrufroutine. Wenn ein Wave-Capture-Ereignis auftritt, ruft das Betriebssystem die Rückrufroutine mit einem Puffer auf, der den nächsten Block von Wellenbeispielen vom Erfassungsgerät enthält. Als Reaktion auf den Rückruf schreibt die Anwendung den nächsten Block der Wellendaten in die Datei.
DirectSound-Komponenten
Die folgende Abbildung zeigt die Komponenten des Benutzermodus und des Kernelmodus, die von einem DirectSound-Anwendungsprogramm zum Rendern oder Erfassen von Wellendaten verwendet werden.
Die Renderingkomponenten sind in der linken Hälfte der vorherigen Abbildung dargestellt, und die Erfassungskomponenten werden auf der rechten Seite angezeigt. Die Wave-Miniporttreiber werden als abgedunkelte Felder angezeigt, um anzugeben, dass es sich um vom Anbieter bereitgestellte Komponenten handelt. Die anderen Komponenten in der Abbildung werden vom System bereitgestellt.
Oben links in der Abbildung lädt eine DirectSound-Anwendung Wellendaten aus einer Datei in einen Soundpuffer, den die Benutzermodus-DirectSound-Systemkomponente (Dsound.dll) verwaltet. Diese Komponente sendet einen Wellenstrom an ein WaveCyclic- oder WavePci-Gerät, dessen Port- und Miniporttreiber unten links in der Abbildung angezeigt werden. Wenn ein Hardwaremixer-Pin auf dem Gerät verfügbar ist, wird der Stream direkt an den Wave-Port-Treiber übergeben, wobei KMixer umgangen wird. Andernfalls durchläuft der Stream zuerst KMixer, der ihn mit allen anderen gleichzeitig wiedergegebenen Streams mischt. KMixer gibt den gemischten Stream an den Porttreiber aus.
Wie zuvor bindet sich der Miniporttreiber an den Porttreiber, um den Wellenfilter zu bilden, der das zugrunde liegende Audiorenderinggerät darstellt. Dieses Gerät kann den Stream z. B. über eine Reihe von Lautsprechern wiedergeben.
Alternativ kann der Wellenstrom von einem USB-Audiogerät anstelle eines WaveCyclic- oder WavePci-Geräts gerendert werden. In diesem Fall kann der Stream KMixer nicht umgehen. Der USBAudio-Klassensystemtreiber (nicht in abbildung dargestellt) übergibt den Stream immer an KMixer.
Die rechte Seite der vorherigen Abbildung zeigt die Komponenten, die eine DirectSoundCapture-Anwendung unterstützen. Die Anwendung zeichnet Wellendaten auf, die von einem WaveCyclic- oder WavePci-Erfassungsgerät empfangen werden. Dieses Gerät wandelt beispielsweise ein analoges Signal von einem Mikrofon in einen Wellenstrom um. Die Wellenport- und Miniporttreiber des Geräts werden in der unteren rechten Ecke der Abbildung angezeigt. Wie in der Abbildung dargestellt, empfängt der Porttreiber als Eingabe den Stream vom Miniporttreiber und gibt ihn entweder direkt an die DirectSound-Komponente des Benutzermodus, Dsound.dll oder indirekt über KMixer aus. Dies hängt davon ab, ob ein Hardwareerfassungspin auf dem Erfassungsgerät verfügbar ist.
Alternativ kann die Quelle des erfassten Wellenstroms ein USB-Audiogerät sein. In diesem Fall kann der Stream KMixer nicht umgehen. der USBAudio-Treiber (nicht in Abbildung dargestellt) übergibt den Stream immer an KMixer.
Wenn KMixer in den Pfad des Erfassungsstreams eingefügt wird, führt er bei Bedarf eine Konvertierung der Samplerate für den Stream durch, mischt sich jedoch nicht mit anderen Datenströmen.
In der oberen rechten Ecke der vorherigen Abbildung liest die Anwendung die Wellendaten aus dem DirectSoundCapture-Puffer und schreibt sie in die Datei.