Entwickeln eines WaveRT-Miniporttreibers
In diesem Thema werden die Software- und Hardware-bezogenen Punkte vorgestellt, die Sie berücksichtigen müssen, wenn Sie sich für die Entwicklung eines eigenen WaveRT-Miniporttreibers entscheiden.
Microsoft hat eine Reihe von Hardwareentwurfsrichtlinien für eine Universelle Audioarchitektur (UAA) entwickelt, und die Richtlinien enthalten die Features, die wir für ein WaveRT-Audiogerät empfehlen. Die UAA-Richtlinien basieren eng auf der von Intel entwickelten High Definition(HD)-Audiospezifikation.
Windows Vista und höhere Windows-Betriebssysteme bieten einen HD-Audiotreiber für UAA-kompatible Audiogeräte. Wenn Ihr Audiogerät also UAA-konform ist, müssen Sie keinen eigenen WaveRT-Miniporttreiber entwickeln. Für Audiogeräte, die über proprietäre, nicht UAA-Hardwarefeatures verfügen, müssen Sie jedoch einen eigenen WaveRT-Miniporttreiber entwickeln, um die proprietären Features zu unterstützen.
Um Ihnen bei der Entwicklung Ihres eigenen WaveRT-Miniporttreibers zu helfen, empfehlen wir Ihnen, zuerst den Beispieladaptertreiber zu überprüfen und dann die WaveRT-freundlichen UAA-Features zu überprüfen.
Der Beispieladaptertreiber
Informationen zum Beispieltreiber finden Sie unter Beispielaudiotreiber.
Die WaveRT-freundlichen Features
Nachdem Sie den Beispieladaptertreiber überprüft und mit dem Entwerfen Ihres WaveRT-Miniporttreibers begonnen haben, müssen Sie überprüfen, ob er die folgenden Software- und Hardwarefeatures unterstützt. Dadurch wird der von Ihnen erstellten Miniporttreiber mit dem vom System bereitgestellten WaveRT-Porttreiber und mit dem Betriebsmodus der Windows Vista-Audio-Engine kompatibel.
Geringe Hardwarelatenz. Ein WaveRT-Miniporttreiber muss eine voll funktionsfähige Implementierung der IMiniportWaveRTStream::GetHWLatency-Methode bereitstellen. Diese Methode ist erforderlich, um die KSPROPERTY_RTAUDIO_HWLATENCY-Eigenschaft zu unterstützen.
FIFO-Unterbrechungen. Ein WaveRT-Miniporttreiber muss automatisch Interrupts generieren, wenn FIFO-Überschreitungen und -Unterläufe auftreten. Dieses Feature ermöglicht die Erkennung von Störungen im Audiodatenstrom, wenn Sie Tests für das Audiogerät und die Treibersoftware ausführen. Ohne Hardwareunterstützung (d. h. FIFO-Unterbrechungen) gibt es keine bequeme und zuverlässige Methode zum Abrufen von Fehlerinformationen.
Scatter-Gather DMA und Pufferschleife. Wenn Ihr Miniporttreiber einen DMA-Controller mit Funktionen zum Sammeln von Punktdaten unterstützt, können Daten in den und aus dem zyklischen Puffer verschoben werden, ohne dass der Miniporttreiber eingreifen muss.
Wenn Ihr Miniporttreiber einen DMA-Controller unterstützt, der Pufferschleifen ausführen kann, kann der DMA-Controller automatisch bis zum Anfang des Puffers umschließen, nachdem er das Ende des Puffers mit einem Lese- oder Schreibvorgang erreicht hat. Es kann den Umbruch ausführen, ohne dass Ihr Miniporttreiber eingreifen muss.
Beachten Sie, dass der WaveRT-Porttreiber vorhandene Hardwaredesigns unterstützt, die nicht in der Lage sind, Scatter-Gather-Übertragungen oder automatische Pufferschleifen durchzuführen.
Wenn ein Audiogerät keine Scatter-Gather-Funktion aufweist, muss der WaveRT-Miniporttreiber zuerst zyklische Puffer zuordnen, die aus Seiten bestehen, die physisch im Arbeitsspeicher zusammenhängend sind. Der Miniporttreiber verwendet dann Hilfsfunktionen im WaveRT-Porttreiber, um die Datenübertragungen und die automatische Pufferschleife durchzuführen. Der Nachteil besteht darin, dass bei zunehmender Fragmentierung des nicht auslagerten Arbeitsspeicherpools eines Systems eine Anforderung zum Zuweisen eines großen Blocks zusammenhängenden physischen Arbeitsspeichers wahrscheinlicher fehlschlägt. Ein Gerät mit der Funktion "Scatter-Gather" ist von der Speicherfragmentierung nicht betroffen.
Wenn ein Audiogerät Pufferschleifen nicht automatisch ausführen kann, wenn der DMA-Kanal das Ende des zyklischen Puffers erreicht, muss der WaveRT-Miniporttreiber eingreifen und den Kanal so konfigurieren, dass die Übertragung von Daten am Anfang des Puffers beginnt.
Positionsregister. Für neue Designs sollten Hardwareimplementierer ein Positionsregister für jeden DMA-Kanal enthalten. Ein Positionsregister gibt die aktuelle Pufferposition als Byteoffset vom Anfang des zyklischen Puffers an. Der Wert des Positionsregisters ist null am Anfang des Puffers. Wenn das Positionsregister das Ende des zyklischen Puffers erreicht, wird es automatisch bis zum Anfang des Puffers umschließen (wird auf 0 zurückgesetzt) und steigt weiter, wenn die Pufferposition voranschreitet.
Positionsregister können dem virtuellen Arbeitsspeicher zugeordnet werden, damit Clients die Register direkt lesen können.
Idealerweise sollten Positionsregister die Pufferposition der Proben angeben, die sich derzeit über die Digital-Analog- und Analog-Digital-Konverter (DACs und ADCs) des Audiogeräts bewegen.
Diese Informationen sind jedoch möglicherweise nicht direkt von einem Audiochipsatz verfügbar, der die digitalen und analogen Funktionen in separate Buscontroller- und Encoder-/Decoder-Chips (Codec) unterteilt. In der Regel befinden sich die Positionsregister auf dem Buscontroller-Chip, und jedes Register gibt die Position der Audiodaten an, die der Controller schreibt oder aus den Codecs liest.
Nach dem Abrufen eines Werts aus diesem Typ von Positionsregister kann der Client die aktuelle Position der Beispiele schätzen, die sich durch die DACs oder ADCs bewegen, indem die Verzögerung durch den Codec hinzugefügt oder subtrahiert wird. Der Client ruft die Codecverzögerung von der KSPROPERTY_RTAUDIO_HWLATENCY-Eigenschaftsanforderung ab. Aus diesem Grund muss ein WaveRT-Miniporttreiber die Codecverzögerung genau melden, wenn der Porttreiber die IMiniportWaveRTStream::GetHardwareLatency-Methode als Antwort auf diese Art von Eigenschaftsanforderung aufruft.
Beachten Sie, dass der WaveRT-Porttreiber vorhandene Hardwaredesigns ohne Positionsregister unterstützt. Bei einem Gerät mit dieser Einschränkung muss der WaveRT-Miniporttreiber die IMiniportWaveRTStream::GetPositionRegister-Methode nicht aufrufen, indem er den STATUS_NOT_SUPPORTED Fehlercode zurückgibt, wodurch der Porttreiber dazu zwingt, KSPROPERTY_RTAUDIO_POSITIONREGISTER Eigenschaftenanforderungen fehlzuschlagen. In diesem Fall müssen Clients die aktuelle Position über die KSPROPERTY_AUDIO_POSITION-Eigenschaft abrufen, was den Mehraufwand für einen Übergang zwischen dem Benutzermodus und dem Kernelmodus für jede Positionslesung verursacht.
Uhr registrieren. Ein Uhrenregister ist ein optionales, aber nützliches Hardwarefeature für ein WaveRT-kompatibles Audiogerät. Audioanwendungsprogramme können Uhrenregister verwenden, um Audiostreams auf zwei oder mehr unabhängigen Audiogeräten zu synchronisieren, die über separate und nicht synchronisierte Hardwareuhren verfügen. Ohne Uhrenregister kann eine Anwendung die Drift zwischen den Hardwareuhren nicht erkennen und kompensieren.
Die Beispieluhr, die die Audiohardware zum Takten von Audiodaten über die Digital-zu-Analog- oder Analog-Digital-Konverter verwendet, sollte von der internen Uhr abgeleitet werden, die das Taktregister erhöht. Ein Uhrenregister, das inkrementiert mit einer Rate, die in Bezug auf die Beispieluhr asynchron ist, ist für die Synchronisierung nicht von Nutzen und sollte nicht verfügbar gemacht werden.
Ähnlich wie bei den Positionsregistern kann das Uhrenregister dem virtuellen Arbeitsspeicher zugeordnet werden, sodass Clients das Register direkt lesen können.
Audioverarbeitungsobjekte. Ein gut konzipierter WaveRT-Miniporttreiber darf die Audiodaten im zyklischen Puffer eines Audiogeräts niemals berühren. Die Hardware sollte so konzipiert sein, dass Audiodaten direkt zwischen dem Client und der Audiohardware fließen, ohne dass die Audiotreibersoftware zugreift.
APOs sind nur für die Verwendung mit Audiostreams im freigegebenen Modus verfügbar. Bei Datenströmen im exklusiven Modus tauschen Anwendungen Daten direkt mit WaveRT-Hardwaregeräten über zyklische Puffer aus, und keine anderen Komponenten können die Daten in den Puffern berühren.
Weitere Informationen finden Sie unter Windows-Audioverarbeitungsobjekte.