Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Golffilters vertegenwoordigen apparaten die geformatteerde digitale audiogegevens weergeven en/of vastleggen. Toepassingen hebben doorgaans toegang tot de mogelijkheden van deze apparaten via de DirectSound API of via de Microsoft Windows multimedia waveOutXxx en waveInXxx-functies. Zie WAVEFORMATEX en WAVEFORMATEXTENSIBLE voor informatie over de wave-indelingen die WDM-audiostuurprogramma's kunnen ondersteunen.
Een golfrenderingsfilter ontvangt als invoer een digitale golfaudiostroom en voert een analoog audiosignaal (bijvoorbeeld naar een set luidsprekers of externe mixer) of een digitale audiostream (bijvoorbeeld naar een S/PDIF-connector) uit.
Een wave-capture-filter ontvangt als invoer een analoog audiosignaal (van een microfoon of ingangsaansluiting) of een digitale stroom (bijvoorbeeld van een S/PDIF-connector). Hetzelfde filter voert een golfstroom uit die digitale audiogegevens bevat.
Eén golffilter kan zowel rendering als vastleggen tegelijk uitvoeren. Dit type filter kan bijvoorbeeld een audioapparaat vertegenwoordigen dat audio kan afspelen via een set luidsprekers en audio tegelijk kan opnemen via een microfoon. De hardware voor golfweergave en wave-capture kan ook worden weergegeven als afzonderlijke golffilters, zoals beschreven in dynamische audiosubdevices.
Een audio-adapterstuurprogramma vormt een golffilter door een wave-miniportstuurprogramma, dat door de hardwareleverancier wordt geïmplementeerd als onderdeel van het adapterstuurprogramma, te koppelen aan een golfpoortstuurprogramma, dat door het systeem wordt geïmplementeerd. Het minipoortstuurprogramma verwerkt alle hardwarespecifieke bewerkingen voor het golffilter en het poortstuurprogramma beheert alle algemene functies voor golffilters.
Het PortCls-systeemstuurprogramma (Portcls.sys) implementeert drie wave-poortstuurprogramma's: WaveRT, WavePci en WaveCyclic.
De drie typen golffilters werken als volgt:
Een WaveRT-filter wijst een buffer toe voor golfgegevens en maakt die buffer rechtstreeks toegankelijk voor de client in de gebruikersmodus. De buffer kan bestaan uit aaneengesloten of niet-aaneengesloten geheugenblokken, afhankelijk van de hardwaremogelijkheden van het golfapparaat. De client opent de buffer als een aaneengesloten blok virtueel geheugen. De buffer is cyclische, wat betekent dat wanneer de aanwijzer voor lezen (voor rendering) of schrijven (voor vastleggen) van het apparaat het einde van de buffer bereikt, deze automatisch terugloopt naar het begin van de buffer.
Een WavePci-filter heeft rechtstreeks toegang tot de buffer van de client. Hoewel de client toegang heeft tot de buffer als één, aaneengesloten blok van virtueel geheugen, moet het WavePci-filter toegang krijgen tot de buffer als een reeks mogelijk niet-aaneengesloten geheugenblokken. Blokken die opeenvolgende gedeelten van de rendering- of capturestream bevatten, worden in de wachtrij op het apparaat geplaatst. Wanneer de aanwijzer voor lezen of schrijven van het apparaat het einde van één blok bereikt, wordt het naar het begin van het volgende blok in de wachtrij verplaatst.
Een WaveCyclic-filter wijst een buffer toe die bestaat uit één aaneengesloten blok geheugen voor gebruik als uitvoerbuffer (voor rendering) of invoer (voor vastleggen). Deze buffer is cyclisch. Omdat de buffer niet rechtstreeks toegankelijk is voor de client, moet het stuurprogramma gegevens kopiëren tussen de cyclische buffer van het stuurprogramma en de buffer in de gebruikersmodus van de client.
WaveRT heeft de voorkeur boven WavePci en WaveCyclic. WavePci en WaveCyclic werden gebruikt met eerdere versies van Windows.
Een WaveRT-filter kan een audioapparaat vertegenwoordigen dat zich op een systeembus bevindt, zoals PCI of PCI Express. Het belangrijkste voordeel van een WaveRT-filter boven een WaveCyclic- of WavePci-filter is dat een WaveRT-filter een client in de gebruikersmodus toestaat om audiogegevens rechtstreeks met de audiohardware uit te wisselen. Daarentegen vereisen WaveCyclic- en WavePci-filters periodieke software-interventie door het stuurprogramma, waardoor de latentie van de audiostream toeneemt. Daarnaast kunnen audioapparaten met en zonder spreidings-/verzamel DMA-mogelijkheden worden weergegeven als WaveRT-filters. Zie het white paper A Wave Port Driver voor Real-Time Audio Streaming voor meer informatie.
WaveRT-filters
Een WaveRT-filter wordt geïmplementeerd als een paring van een poortstuurprogramma en een minipoortstuurprogramma. In Windows Vista en hoger maakt een WaveRT-filterfactory als volgt een WaveRT-filter:
Er wordt een WaveRT-minipoortstuurprogrammaobject geïnstantieerd.
Er wordt een WaveRT-poortstuurprogrammaobject geïnstitueerd door PcNewPort aan te roepen met de GUID-waarde CLSID_PortWaveRT.
Hiermee wordt de IPort::Init-methode van het poortstuurprogramma aangeroepen om het minipoortstuurprogramma aan het poortstuurprogramma te binden.
Het codevoorbeeld in Subdevice Creation illustreert dit proces. De poort- en minipoortstuurprogramma's communiceren met elkaar via hun IPortWaveRT - en IMiniportWaveRT-interfaces .
Zie het white paper A Wave Port Driver voor Real-Time Audio Streaming voor meer informatie.
Informatie voor eerdere versies van Windows
WaveCyclic Information voor eerdere versies van Windows
Een WaveCyclic-filter kan een audioapparaat vertegenwoordigen dat verbinding maakt met een systeembus, zoals ISA, PCI, PCI Express of PCMCIA. Zoals de naam WavePci al aangeeft, vertegenwoordigt een WavePci-filter meestal een apparaat dat verbinding maakt met een PCI-bus, hoewel een WavePci-apparaat in principe verbinding kan maken met een ISA-bus, bijvoorbeeld. In tegenstelling tot de eenvoudigere apparaten die worden ondersteund door WaveCyclic, moet een apparaat dat door WavePci wordt ondersteund, spreidings- en verzamel DMA-mogelijkheden hebben. Een audioapparaat dat zich op PCI-bus bevindt, maar geen spreidings- en verzamel-DMA's bevat, kan worden weergegeven als een WaveCyclic-filter, maar niet als een WavePci-filter.
WavePci-informatie voor eerdere versies van Windows
Een WavePci-apparaat kan spreidings-/verzamel DMA-overdrachten uitvoeren naar of van buffers die zich op willekeurige geheugenadressen kunnen bevinden en die beginnen en eindigen met willekeurige byte-uitlijningen. Daarentegen vereist de DMA-hardware voor een WaveCyclic-apparaat alleen de mogelijkheid om gegevens te verplaatsen naar of van één buffer die het minipoortstuurprogramma van het apparaat toewijst. Een WaveCyclic minipoortstuurprogramma heeft de vrijheid om een cyclische buffer toe te wijzen die past bij de beperkte mogelijkheden van het DMA-kanaal. Het DMA-kanaal voor een typisch WaveCyclic-apparaat kan bijvoorbeeld een buffer vereisen die voldoet aan de volgende beperkingen:
De buffer bevindt zich in een bepaalde regio van de fysieke adresruimte.
De buffer is aaneengesloten in zowel fysieke als virtuele adresruimte.
De buffer begint en eindigt op zelfs vier- of acht-bytegrenzen.
Voor deze eenvoud moet een WaveCyclic-apparaat echter afhankelijk zijn van software die gegevens kopieert naar of van de cyclische buffer, terwijl een WavePci-apparaat afhankelijk is van de spreidings-/verzamelmogelijkheden van de DMA-hardware om dergelijke kopie te voorkomen. De IRP's die golfaudiogegevens leveren aan een renderingapparaat of gegevens ophalen van een opnameapparaat, worden vergezeld van gegevensbuffers en elk van deze buffers bevat een deel van de audiostream die wordt weergegeven of vastgelegd. Een WavePci-apparaat heeft rechtstreeks toegang tot deze buffers via de spreidings-/verzamel DMA-engine, terwijl een WaveCyclic-apparaat vereist dat de gegevens vanuit de IRP naar de cyclische buffer worden gekopieerd, of omgekeerd.
WavePci-filters
Opmerking: WavePci-informatie voor eerdere versies van Windows
Een WavePci-filter wordt geïmplementeerd als een poort-/minipoort-stuurprogramma-paar. Een WavePci-filterfactory maakt als volgt een WavePci-filter:
Het instantieert een WavePci-minipoortstuurprogrammaobject.
Er wordt een WavePci-poortstuurprogrammaobject geïnstitueerd door PcNewPort aan te roepen met de GUID-waarde CLSID_PortWavePci.
Hiermee wordt de IPort::Init-methode van het poortstuurprogramma aangeroepen om het minipoortstuurprogramma aan het poortstuurprogramma te binden.
Het codevoorbeeld in Subdevice Creation illustreert dit proces. De poort- en minipoortstuurprogramma's communiceren met elkaar via hun IPortWavePci - en IMiniportWavePci-interfaces .
Zie Implementatieproblemen voor WavePci-apparaten voor meer informatie.
WaveCyclic filters
Opmerking
Microsoft ondersteunt een diverse en inclusieve omgeving. Dit artikel bevat verwijzingen naar terminologie die door de Microsoft-stijlgids voor vooroordelenvrije communicatie wordt herkend als uitsluiting. Het woord of de woordgroep wordt in dit artikel gebruikt voor consistentie omdat het momenteel in de software wordt weergegeven. Wanneer de software wordt bijgewerkt om de taal te verwijderen, wordt dit artikel bijgewerkt zodat deze in overeenstemming is.
Opmerking: WaveCyclic Information voor eerdere versies van Windows
Een WaveCyclic-filter wordt geïmplementeerd als een stuurprogrammapaar van een poort en een minipoort. Een WaveCyclic-filterfactory creëert als volgt een WaveCyclic-filter:
Het instantiateert een WaveCyclic miniport driver object.
Er wordt een WaveCyclic-poortstuurprogrammaobject geïnstitueerd door PcNewPort aan te roepen met de GUID-waarde CLSID_PortWaveCyclic.
Hiermee wordt de IPort::Init-methode van het poortstuurprogramma aangeroepen om het minipoortstuurprogramma aan het poortstuurprogramma te binden.
Het codevoorbeeld in Subdevice Creation illustreert dit proces. De poort- en minipoortstuurprogramma's communiceren met elkaar via hun IPortWaveCyclic - en IMiniportWaveCyclic-interfaces .
De cyclische buffer van het WaveCyclic-filter bestaat altijd uit een aaneengesloten blok van virtueel geheugen. De implementatie van het poortstuurprogramma van de methode IDmaChannel::AllocateBuffer wijst altijd een buffer toe die aaneengesloten is in zowel fysieke als virtuele geheugenadresruimte. Als, zoals eerder vermeld, de DMA-engine van het WaveCyclic-apparaat extra beperkingen oplegt voor het buffergeheugen, is het minipoortstuurprogramma vrij om zijn eigen buffertoewijzingsmethode te implementeren om aan deze beperkingen te voldoen.
Een WaveCyclic-minipoortstuurprogramma dat vraagt om een grote buffer (bijvoorbeeld acht fysiek aaneengesloten geheugenpagina's) moet worden voorbereid om te voldoen aan een kleinere buffergrootte als het besturingssysteem de oorspronkelijke aanvraag weigert. Een audioapparaat kan af en toe worden verwijderd en opnieuw worden geladen om systeembronnen opnieuw te verdelen (zie Een apparaat stoppen om resources opnieuw te verdelen).
Een WaveCyclic-apparaat met ingebouwde, busmastering DMA-hardware wordt een hoofdapparaat genoemd. Een WaveCyclic-apparaat kan ook een ondergeschikt apparaat zijn zonder ingebouwde DMA-hardwaremogelijkheden. Een ondergeschikt apparaat moet afhankelijk zijn van de DMA-controller van het systeem om gegevensoverdrachten uit te voeren die nodig zijn. Zie IDmaChannel enIDmaChannelSlave voor meer informatie over hoofd- en ondergeschikte apparaten.
Een WaveCyclic-minipoortstuurprogramma kan een eigen DMA-kanaalobject implementeren in plaats van het standaard-DMA-kanaalobject te gebruiken, dat wordt gemaakt door een van de nieuwe DmaChannel-methoden van het poortstuurprogramma:
IPortWaveCyclic::NewMasterDmaChannel
IPortWaveCyclic::NewSlaveDmaChannel
De aangepaste IDmaChannel-implementatie van het adapterstuurprogramma kan aangepaste verwerking van gegevens uitvoeren om te voldoen aan speciale hardwarebeperkingen. De Windows Multimedia-functies maken bijvoorbeeld gebruik van golfindelingen waarin 16-bits voorbeelden altijd ondertekende waarden zijn, maar de audiorenderingshardware kan zijn ontworpen voor het gebruik van niet-ondertekende 16-bits waarden. In dit geval kan de aangepaste IDmaChannel::CopyTo-methode van het stuurprogramma worden geschreven om de ondertekende bronwaarden te converteren naar de niet-ondertekende doelwaarden die de hardware nodig heeft. Hoewel deze techniek nuttig kan zijn voor het omzeilen van hardwareontwerpfouten, kan het ook aanzienlijke kosten met zich meebrengen door software-overhead.
Zie de Sb16-voorbeeldaudioadapter in eerdere versies van de WDK voor een voorbeeld van een stuurprogramma dat een eigen DMA-kanaalobject implementeert. Als de constante OVERRIDE_DMA_CHANNEL is gedefinieerd als TRUE, maken de voorwaardelijke compilatie-instructies in de broncode de implementatie mogelijk van een eigen IDmaChannel-object , dat het stuurprogramma gebruikt in plaats van het standaard-IDmaChannel-object van de aanroep IPortWaveCyclic::NewXxxDmaChannel.