Filterfabriker
En drivrutin för ljudadapter tillhandahåller filter för att hantera instansiering av dessa. Varje filterfabrik kan instansiera ett eller flera KS-filter av en viss typ. Om en filtertyp kapslar in en viss maskinvarufunktion begränsas antalet filter av den typen som fabriken kan instansiera av de underliggande maskinvaruresurserna.
Eftersom en filterfabrik hanterar ett i stort sett autonomt block med maskinvarufunktioner kan varje filterfabrik anses vara en enhetsdrivrutin i sig. I själva verket refererar termen adapterdrivrutin som den används i föregående stycke till en samling relaterade drivrutiner – filterfabriker – som paketeras tillsammans för att hantera de olika maskinvarufunktionerna på ett kortkort.
Precis som med andra WDM-drivrutinsdrivrutiner (Microsoft Windows Driver Model) hanterar en filterfabrik energisparfunktioner och konfigurationsfunktioner. Under installationen registrerar INF-filen för drivrutinen ett eller flera filterenhetsnamn (se Enhetsidentifieringssträngar). Den här processen läser in namnen i systemregistret och associerar varje filterfabrik med en eller flera KS-filterkategorier, enligt beskrivningen i Installera enhetsgränssnitt för ett ljudkort. Alla ljudenheter klassificeras under KSCATEGORY_AUDIO, men en ljudenhet kan också klassificeras under ytterligare kategorier, till exempel KSCATEGORY_RENDER (för en ljudåtergivningsenhet) eller KSCATEGORY_CAPTURE (för en ljudinspelningsenhet). Drivrutinen marknadsför enhetens allmänna funktioner genom olika kategorier under vilka den registrerar filtret för enheten. När SysAudio-systemdrivrutinen, till exempel kräver en ljudenhet av en viss typ, letar den i registret efter enheter som tillhör lämpliga kategorier.
Operativsystemet använder installations-API:et enligt beskrivningen i Installation av enhet och drivrutinför att identifiera och räkna upp alla KSCATEGORY_AUDIO filterfabriker i registret. Registerposten för varje fabrik anger både filterfabrikens vänliga namn och dess enhetsnamn, som är en lång sträng och skickas av en klient till anropet create-file som instansierar filtret. Det här anropet kan göras till ZwCreateFile från kernelläge eller till CreateFile från användarläge. Ett filter är ett kärnlägeobjekt och identifieras av ett kärnhandtag. Anropet create-file returnerar en instansreferens som klienter kan använda för att referera till filtret. Klienter i användarläge eller överordnade filter i ljuddiagrammet kan använda det här handtaget för att skicka eller vidarebefordra IOCTL-begäranden till filtret. Mer information om CreateFilefinns i Microsoft Windows SDK-dokumentationen.
Ett typiskt WDM-ljudkort kan till exempel finnas på en PCI-buss och innehålla flera I/O-kontakter för återgivning eller inspelning av vågdata. En enda ljudenhet på det här kortet kan innehålla analoga ljudutgångar för att köra en uppsättning högtalare och en lineout-kabel och analoga ljudin-uttag för att ta emot signaler från en mikrofon och en linein-kabel. WDM-ljudsystemet representerar enheten som ett filter och representerar ljuduttagen som stift på filtret.
Filtret för en ljudenhet implementeras som separata port- och miniportdrivrutiner som är sammanbundna för att fungera unisont:
- Miniportdrivrutinen innehåller den maskinvaruspecifika koden.
- Portdrivrutinen innehåller den allmänna kod som är gemensam för alla filter av en viss typ.
Leverantören skriver miniportdrivrutinen, som innehåller all egen kod som filtret behöver för att hantera ljudmaskinvaran. Operativsystemet tillhandahåller portdrivrutinen, som är tillgänglig via PortCls-systemdrivrutinen (Portcls.sys; se Port Class Adapter Driver och PortCls System Driver). Genom att dela upp filterimplementeringen i port- och miniportdrivrutiner förenklas uppgiften att skriva en drivrutin för en egen enhet.
När en filterfabrik instansierar ett filter skapas först miniportdrivrutinsobjektet för filtret. Filterfabriken skapar sedan en instans av lämpligt portobjekt och binder miniportdrivrutinsobjektet till den instansen för att bilda ett fullständigt fungerande filter. Kodexemplet i Skapande av underenheter illustrerar den här processen. Port- och miniportdrivrutinerna kommunicerar med varandra via väldefinierade programvarugränssnitt. Mer information om dessa gränssnitt finns i Miniport Interfaces och Stöd för en enhet.
Ett ljudfilter exponerar strukturen för den underliggande ljudenheten som en samling pin-fabriker, noder och interna anslutningar. Miniportdrivrutinen konsoliderar den här informationen till en filterbeskrivning, som är en struktur av typen PCFILTER_DESCRIPTOR. Den här strukturen innehåller i sin tur enskilda beskrivningar för filtrets pin-fabriker, noder och interna anslutningar. Dessa beskrivningar är strukturer av följande typer:
För att hämta filterbeskrivningen från miniportdrivrutinen anropar portdrivrutinen metoden IMiniport::GetDescription.
Ett exempel på hur en drivrutin konfigurerar sin PCFILTER_DESCRIPTOR struktur finns i Sysvad-exempeldrivrutinen, som beskrivs i Exempel på ljuddrivrutiner.