Dela via


Egenskaper för filter, fäst och nod

Ljuddrivrutiner för Microsoft Windows Driver Model (WDM) representerar en ljudenhet som ett KS-filter, och de representerar en maskinvarubuffert på enheten som en pin-kod i filtret. När en klient skickar en egenskapsbegäran till ett av dessa filter- eller pin-objekt tar portdrivrutinen emot begäran och dirigerar begäran till lämplig egenskapshanterare i portdrivrutinen eller miniportdrivrutinen.

Ljudenheter stöder tre typer av egenskaper:

  • Filteregenskaper

    En filteregenskap är en egenskap för filtret som helhet i stället för en egenskap för en viss pin-kod eller nod i filtret. Begäranden om filteregenskaper anger filterreferenser, men de anger inte nod-ID:t.

  • Pinegenskaper

    En pin-egenskap är en egenskap för en viss pin-instans i filtret. Begäranden för dessa egenskaper specificerar pinhanterare, men de specificerar inte nod-ID:n.

  • Nodegenskaper

    En nodegenskap är en egenskap för en topologinod i filtret. En begäran om en nodegenskap anger ett filterhandtag eller pin-handtag, plus ett nod-ID.

Om en nodegenskapsbegäran anger ett filter- eller pin-handtag beror på om noden är unik för filtret. Mer information finns i avsnittet Nodegenskaper.

Följande bild visar dessa tre typer av egenskapsbegäran: en pin-egenskapsbegäran som skickas till en pin-instans, en nodegenskapsbegäran som skickas till en nod (på ett filter eller en pin-instans) och en begäran om filteregenskap som skickas till en filterinstans.

Diagram som illustrerar begäranden om filter-, pin- och nodegenskaper.

Vanligtvis hanterar portdrivrutinen de flesta begäranden för filter- och pin-egenskaper, och miniportdrivrutinen hanterar begäranden för nodegenskaper.

Portdrivrutinen tillhandahåller sina egna inbyggda hanterare för de filter- och pin-egenskaper som används av SysAudio-systemdrivrutinen (se KSPROPSETID_Sysaudio och KSPROPSETID_Sysaudio_Pin) och WDMAud-systemdrivrutinen. En miniportdrivrutin behöver inte implementera hanterare för egenskaper som portdrivrutinen hanterar. En typisk miniportdrivrutin innehåller få, om några, hanterare för filter- och pin-egenskaper. Miniportdrivrutinen tillhandahåller hanterare för nodegenskaper som representerar maskinvaruberoende funktioner i ljudenheten. Portdrivrutinerna tillhandahåller ingen inbyggd hantering av nodegenskaper, med undantag för KSPROPERTY_TOPOLOGY_NAME.

När både portdrivrutinen och miniportdrivrutinen levererar hanterare för samma egenskap använder portdrivrutinen sin egen hanterare och ignorerar miniportdrivrutinens hanterare.

Filtrera beskrivningar

Portdrivern hämtar pekare till miniportdriverns egenskapshanterare genom att anropa metoden IMiniport::GetDescription. Med den här metoden hämtar portdrivrutinen en pekare till miniportdrivrutinens filterbeskrivning, som är en struktur av typen PCFILTER_DESCRIPTOR. Den här strukturen anger miniportdrivrutinens egenskapshanterare för filter-, pin- och nodegenskaper:

  • PCFILTER_DESCRIPTOR-strukturens AutomationTable-medlem pekar på automationstabellen för filtret. Den här tabellen anger miniportdrivrutinens egenskapshanterare för filteregenskaper.

  • PCFILTER_DESCRIPTOR-strukturens Pins-medlem innehåller automationstabellerna för pinnar. Varje tabell anger egenskapshanterare för pin-egenskaperna för en viss pin-typ.

  • PCFILTER_DESCRIPTOR-strukturens Nodes-medlem innehåller automationstabellerna för topologinoderna i filtret. Varje tabell anger egenskapshanterare för nodegenskaperna för en viss nodtyp.

Filteregenskaper

Portdrivrutinen får tillgång till miniportdrivrutinens filteregenskapshanterare via medlemmen AutomationTable i PCFILTER_DESCRIPTOR. Den här automatiseringstabellen innehåller vanligtvis få hanterare eftersom portdrivrutinen tillhandahåller sina egna inbyggda hanterare för alla filteregenskaper som SysAudio och WDMAud använder för att fråga efter och konfigurera ljudenheter.

Miniport-drivrutinen kan dock tillhandahålla hanterare för filteregenskaper som KSPROPERTY_GENERAL_COMPONENTID som tillhandahåller maskinvaruberoende information som inte är tillgänglig för portdrivrutinen. Två av exempelljuddrivrutinerna i Microsoft Windows Driver Kit (WDK) hanterar egenskapen KSPROPERTY_GENERAL_COMPONENTID. Mer information finns i implementering av miniportdrivrutiner i Sysvad-exempeldrivrutinen, som beskrivs i Exempel på ljuddrivrutiner.

Alla portdrivrutiner i Portcls.sys tillhandahåller hantering för de egenskapsuppsättningarna KSPROPSETID_Pin och KSPROPSETID_Topology. Alla egenskaper i dessa uppsättningar är filteregenskaper, med undantag för KSPROPERTY_TOPOLOGY_NAME, som är en nodegenskap (som använder ett filterhandtag, inte ett pin-handtag, för att ange målet för begäran). Portdrivrutinerna stöder följande delmängd av egenskaperna för KSPROPSETID_Pin:

KSPROPERTY_PIN_CATEGORY

KSPROPERTY_PIN_CINSTANCES

KSPROPERTY_PIN_COMMUNICATION

KSPROPERTY_PIN_CONSTRAINEDDATARANGES

KSPROPERTY_PIN_CTYPES

KSPROPERTY_PIN_DATAFLOW

KSPROPERTY_PIN_DATAINTERSECTION

KSPROPERTY_PIN_DATARANGES

KSPROPERTY_PIN_GLOBALCINSTANCES

KSPROPERTY_PIN_INTERFACES

KSPROPERTY_PIN_MEDIUMS

KSPROPERTY_PIN_NAME

KSPROPERTY_PIN_NECESSARYINSTANCES

KSPROPERTY_PIN_PHYSICALCONNECTION

KSPROPERTY_PIN_PROPOSEDATAFORMAT

KSPROPERTY_PIN_PROPOSEDATAFORMAT2

Dessa attribut ger information om stiftfabrikerna som tillhör ett filter. Vanligtvis frågar klienter filtret efter de här egenskaperna innan de skapar pin-instanser. Portdrivrutinerna stöder alla fyra KSPROPSETID_Topology egenskaper, som ger information om filtrets interna topologi.

Dessutom tillhandahåller DMus-portdrivrutinen en hanterare för egenskapen KSPROPERTY_SYNTH_MASTERCLOCK , som är en get-only-egenskap för ett DirectMusic-filter. KSPROPERTY_SYNTH_MASTERCLOCK är medlem i egenskapsuppsättningen KSPROPSETID_SynthClock .

Egenskaper för Pin

Portdrivrutinen kommer åt miniportdrivrutinens pin-egenskapshanterare genom Pins-medlemmen i PCFILTER_DESCRIPTOR. Den här medlemmen pekar på en matris med pin-deskriptorer, och varje deskriptor pekar på automationstabellen för en pin-typ (identifieras med ett pin-ID, vilket helt enkelt är matrisindexet).

Dessa automationstabeller innehåller vanligtvis få poster eftersom portdrivrutinen tillhandahåller sina egna hanterare för alla pin-egenskaper som SysAudio och WDMAud använder. En miniportdrivrutin har möjlighet att tillhandahålla hanterare för en eller flera pin-egenskaper som portdrivrutinen inte hanterar, men endast klienter som känner till dessa egenskaper kan skicka egenskapsförfrågningar för dem.

Med undantag för topologiportdrivrutinen tillhandahåller alla portdrivrutiner i Portcls.sys inbyggda hanterare för följande pin-egenskaper:

KSPROPERTY_CONNECTION_STATE

KSPROPERTY_CONNECTION_DATAFORMAT

KSPROPERTY_CONNECTION_ALLOCATORFRAMING

KSPROPERTY_STREAM_ALLOCATOR

KSPROPERTY_STREAM_MASTERCLOCK

KSPROPERTY_AUDIO_POSITION

KSPROPERTY_DRMAUDIOSTREAM_CONTENTID

Vissa av egenskaperna i den här listan kräver maskinvaruberoende information från miniportdrivrutinen. När portdrivrutinen tar emot en IRP som innehåller en begäran om någon av dessa egenskaper skickar den inte IRP till miniportdrivrutinen. I stället hanterar portdrivrutinen själva begäran, men dess hanterare hämtar den information den behöver genom att anropa en startpunkt i miniportdrivrutinen. Till exempel tillhandahåller portdrivrutinen en egen egenskapshanterare för KSPROPERTY_AUDIO_POSITION-begäranden. Den här hanteraren anropar bara miniport-drivrutinsströmmens GetPosition-metod (till exempel IMiniportWavePciStream::GetPosition) för att hämta den aktuella positionen.

Nodegenskaper

Portdrivrutinen kommer åt miniportdrivrutinens nodegenskapshanterare via Nodes-medlemmen i PCFILTER_DESCRIPTOR. Den här medlemmen pekar på en matris med nodbeskrivningar och varje beskrivning pekar på automationstabellen för en nodtyp (identifieras av ett nod-ID, som helt enkelt är matrisindexet). Normalt finns alla eller de flesta egenskapshanterare som tillhör en miniportdrivrutin i matrisen Noder . En ljuddrivrutin representerar maskinvarukontrollerna på en ljudenhet som topologinoder och använder egenskapsmekanismen för att ge klienter åtkomst till maskinvaruberoende kontrollinställningar.

Som tidigare beskrivits skickar en klient en filteregenskapsbegäran till ett filterhandtag och en pin-egenskapsbegäran till ett pin-handtag. Till skillnad från ett filter eller en pin-instans är en nod inte ett kernelobjekt och har inget handtag. En klient skickar en nodegenskapsbegäran till antingen ett pin-handtag eller ett filterhandtag, men begäran anger också ett nod-ID som anger att begäran gäller för en nodegenskap i stället för en pin-egenskap eller filteregenskap.

Följande är allmänna regler för att avgöra om en nodegenskap ska använda ett filterhandtag eller pin-handtag:

  • Om ett filter innehåller flera instanser av en viss pin-typ och varje pin-kod av den typen innehåller en nod med ett visst nod-ID, innehåller varje pin-instans en instans av noden. I det här fallet måste en nodegenskapsbegäran ange ett pin-handtag (i stället för bara ett filterhandtag) för att skilja mellan flera instanser av samma nodtyp. Kombinationen av pin-handtag och nod-ID identifierar otvetydigt en viss nodinstans som mål för begäran.

  • Om ett filter bara innehåller en instans av en viss nod anger en nodegenskapsbegäran ett filterhandtag. Kombinationen av filterhandtag och nod-ID räcker för att entydigt identifiera den nod som är målet för begäran.

Innan du implementerar en hanterare för en viss nodegenskap bör drivrutinsskrivaren dock referera till Egenskapsuppsättningar för ljuddrivrutiner för att kontrollera om målet för egenskapen ska anges som ett filterhandtag eller pin-handtag.

Portdrivrutinerna i Portcls.sys tillhandahåller för närvarande inte inbyggd hantering av nodegenskaper, med undantag för KSPROPERTY_TOPOLOGY_NAME.

Överpecificerade och underpecificerade egenskapsbegäranden

Förare bör vara beredda att hantera förfrågningar om egenskaper från klienter som inte följer föregående regler. Begäranden kan antingen vara överpecificerade eller underpecificerade:

  • Överspecifika begäranden

    Om en egenskapsbegäran endast kräver ett filterhandtag, men klienten skickar begäran till ett pin-handtag i stället, är målet för begäran överspecificerat. Drivrutiner behandlar dock vanligtvis begäran som giltig. Det innebär att de behandlar begäran som om den hade skickats till filtret som innehåller pin-koden.

  • Underspecifika begäranden

    Om en egenskapsbegäran kräver ett pin-handtag, men en klient skickar begäran till ett filterhandtag i stället, är målet för begäran underspecifikt. Om ett filter till exempel innehåller flera pin-instanser med samma nodtyp och en klient skickar en begäran om en egenskap av den nodtypen till ett filterhandtag i stället för ett pin-handtag, kan drivrutinen inte avgöra vilken nodinstans som ska ta emot begäran. I det här fallet beror beteendet på drivrutinen. Istället för att automatiskt avvisa alla underspecificerade begäranden hanterar vissa drivrutiner en underspecificerad begäran om set-egenskap som giltig. I det här fallet är tolkningen att begäran anger standardvärdet för det angivna nod-ID:t. När en pin-fabrik skapar en ny nodinstans initieras egenskapen som tillhör den nya noden till standardvärdet. En begäran som ändrar standardvärdet har ingen effekt på nodinstanser som skapades före begäran. Dessutom misslyckas drivrutinerna enhetligt med underspecificerade begäranden om egenskaper eftersom hanteraren inte har något sätt att avgöra från vilken nodinstans att fråga egenskapen.

Undantag till reglerna

Av historiska skäl har några ljudegenskaper beteendemässiga egenheter som bryter mot dessa allmänna regler. Följande är exempel:

  • Som beskrivs i Tillämpa Speaker-Configuration-inställningar kan en klient ändra en ljudenhets talarkonfiguration genom att ange egenskapen KSPROPERTY_AUDIO_CHANNEL_CONFIG för en 3D-nod (KSNODETYPE_3D_EFFECTS). Inställningen för talarkonfiguration är global eftersom den ändrar talarkonfigurationen för alla strömmar som ingår i mixen som enheten spelar genom högtalarna. Enligt den allmänna regeln ska en nodegenskapsbegäran som påverkar filtret som helhet ange ett filterhandtag (plus ett nod-ID). Den här egenskapen kräver dock ett pin-handtag i stället för ett filterhandtag. Pin-handtaget anger den pin-instans som innehåller den 3D-nod som är målet för begäran.

  • KSPROPERTY_SYNTH_VOLUME och KSPROPERTY_SYNTH_MASTERCLOCK är egenskaper för en syntnod (KSNODETYPE_SYNTHESIZER). Även om båda är nodegenskaper inkluderar begäranden för dessa egenskaper inte nod-ID:t. (Observera att egenskapsbeskrivningen för begäran är en struktur av typen KSPROPERTY, inte KSNODEPROPERTY.) Det här beteendet bryter mot den allmänna regeln att en nodegenskap kräver ett nod-ID. Trots den här avvikelsen bör en miniportdrivrutin som stöder någon av egenskaperna tillhandahålla egenskapshanteraren via Nodes-medlemmen i PCFILTER_DESCRIPTOR (i stället för pins-medlemmen ).