Sdílet prostřednictvím


Filtrování, připnutí a vlastnosti uzlu

Zvukové ovladače Microsoft Windows Driver Model (WDM) představují zvukové zařízení jako filtr KS a představují hardwarovou vyrovnávací paměť na zařízení jako špendlík na filtru. Když klient odešle požadavek na vlastnost některému z těchto objektů filtrů nebo připnutých objektů, ovladač portu obdrží požadavek a směruje jej na příslušnou obslužnou rutinu vlastnosti v ovladači portu nebo miniportu.

Zvuková zařízení podporují tři druhy vlastností:

  • Vlastnosti filtru

    Vlastnost filtru je vlastnost filtru jako celku, nikoli vlastnost určitého špendlíku nebo uzlu ve filtru. Požadavky na vlastnosti filtru určují popisovače filtru, ale nezadávají ID uzlů.

  • Vlastnosti špendlíku

    Vlastnost pinu je vlastnost konkrétní instance pinu na filtru. Požadavky na tyto vlastnosti specifikují popisovače pinů, ale nezadávají ID uzlů.

  • Vlastnosti uzlu

    Vlastnost uzlu je vlastnost uzlu topologie v rámci filtru. Požadavek na vlastnost uzlu určuje popisovač filtru nebo popisovač pinu a ID uzlu.

Záleží na tom, zda je uzel jedinečný pro filtr, aby bylo určeno, jestli požadavek na vlastnost uzlu uvádí filtr nebo ovládací prvek. Další informace najdete v následující části Vlastnosti uzlu.

Následující obrázek znázorňuje tyto tři druhy žádosti o vlastnost: požadavek na vlastnost pinu odeslaný do instance pinu, požadavek na vlastnost uzlu odeslaný do uzlu (v instanci filtru nebo pinu) a požadavek na vlastnost filtru odeslaný do instance filtru.

Diagram znázorňující požadavky na vlastnosti filtru, kolíku a uzlu.

Ovladač portu obvykle zpracovává většinu požadavků na vlastnosti filtru a připnutí a ovladač miniportu zpracovává požadavky na vlastnosti uzlu.

Ovladač portu poskytuje své vlastní integrované obslužné rutiny pro vlastnosti filtru a pinu, které používají ovladač systému SysAudio (viz KSPROPSETID_Sysaudio a KSPROPSETID_Sysaudio_Pin) a systémový ovladač WDMAud. Ovladač miniportu nemusí implementovat obslužné rutiny pro vlastnosti, které ovladač portu zpracovává. Typický ovladač miniportu poskytuje málo, pokud vůbec nějaké, obslužných rutin pro vlastnosti filtru a pinové vlastnosti. Ovladač miniportu poskytuje obsluhy vlastností uzlu, které představují na hardwaru závislé funkce zvukového zařízení. Ovladače portů neobsahují žádné integrované zpracování vlastností uzlu s výjimkou KSPROPERTY_TOPOLOGY_NAME.

Když ovladač portu i miniportu poskytují obslužné rutiny pro stejnou vlastnost, ovladač portu používá svou vlastní obslužnou rutinu a ignoruje obslužnou rutinu miniportu.

Popisovače filtrů

Ovladač portu získá ukazatele na obslužné rutiny vlastností miniport ovladače voláním metody IMiniport::GetDescription. Pomocí této metody ovladač portu načte ukazatel na popisovač filtru miniportu, což je struktura typu PCFILTER_DESCRIPTOR. Tato datová struktura určuje obslužné procedury vlastností ovladače miniportu pro vlastnosti filtru, kolíku a uzlu.

  • Člen AutomationTable struktury PCFILTER_DESCRIPTOR odkazuje na tabulku automatizace pro filtr. Tato tabulka určuje manipulátory vlastností ovladače miniportu pro vlastnosti filtru.

  • Člen Pins struktury PCFILTER_DESCRIPTOR obsahuje automatizační tabulky pro piny. Každá tabulka určuje obslužné rutiny vlastností pinu určitého typu pinu.

  • Člen struktury Nodes struktury PCFILTER_DESCRIPTOR obsahuje tabulky automatizace pro uzly topologie uvnitř filtru. Každá tabulka určuje obslužné rutiny pro vlastnosti určitého typu uzlu.

Vlastnosti filtru

Ovladač portu přistupuje k obslužným rutinám vlastností filtru miniportu prostřednictvím člena AutomationTable PCFILTER_DESCRIPTOR. Tato tabulka automatizace obvykle obsahuje jen málo obslužných rutin, protože ovladač portu poskytuje své vlastní vestavěné obslužné rutiny pro všechny vlastnosti filtru, které SysAudio a WDMAud používají k dotazování a konfiguraci zvukových zařízení.

Ovladač miniportu však může poskytovat obslužné rutiny pro vlastnosti filtru, jako je KSPROPERTY_GENERAL_COMPONENTID , které poskytují informace závislé na hardwaru, které nejsou pro ovladač portu k dispozici. Dva z ukázkových zvukových ovladačů v sadě Microsoft Windows Driver Kit (WDK) zpracovávají vlastnost KSPROPERTY_GENERAL_COMPONENTID. Další informace najdete v implementacích ovladačů miniportu v ukázkovém ovladači Sysvad, který je popsán v ukázkových zvukových ovladačích.

Všechny ovladače portů v Portcls.sys poskytují zpracování sad vlastností KSPROPSETID_Pin a KSPROPSETID_Topology. Všechny vlastnosti v těchto sadách jsou vlastnosti filtru, s výjimkou KSPROPERTY_TOPOLOGY_NAME, což je vlastnost uzlu (která používá popisovač filtru, nikoli popisovač pinů, k určení cíle požadavku). Ovladače portů podporují následující podmnožinu vlastností 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

Tyto vlastnosti poskytují informace o továrnách na piny, které patří ke filtru. Klienti se obvykle dotazují na filtr těchto vlastností před vytvořením instancí pinů. Ovladače portů podporují všechny čtyři vlastnosti KSPROPSETID_Topology, které poskytují informace o interní topologii filtru.

Ovladač portu DMus navíc poskytuje obslužnou rutinu pro vlastnost KSPROPERTY_SYNTH_MASTERCLOCK , což je vlastnost get-only filtru DirectMusic. KSPROPERTY_SYNTH_MASTERCLOCK je členem sady vlastností KSPROPSETID_SynthClock .

Vlastnosti pinu

Ovladač portu přistupuje k obslužným rutinám pinů miniportu prostřednictvím člena Pins PCFILTER_DESCRIPTOR. Tento člen odkazuje na pole popisovačů pinů a každý popisovač odkazuje na automatizační tabulku pro typ pinu (identifikovaný podle ID pinu, což je jednoduše index pole).

Tyto tabulky automatizace obvykle obsahují několik položek, protože ovladač portu poskytuje své vlastní obslužné rutiny pro všechny vlastnosti pinů, které používá SysAudio a WDMAud. Ovladač miniportu má možnost zadat obslužné rutiny pro jednu nebo více vlastností připnutí, které ovladač portu nezpracovává, ale pouze klienti, kteří o těchto vlastnostech vědí, mohou za ně odesílat žádosti o vlastnosti.

S výjimkou ovladače portu Topology všechny ovladače portů v Portcls.sys poskytují integrované obslužné rutiny pro následující pinové vlastnosti:

KSPROPERTY_CONNECTION_STATE

KSPROPERTY_CONNECTION_DATAFORMAT

KSPROPERTY_CONNECTION_ALLOCATORFRAMING

KSPROPERTY_STREAM_ALLOCATOR

KSPROPERTY_STREAM_MASTERCLOCK

KSPROPERTY_AUDIO_POSITION

KSPROPERTY_DRMAUDIOSTREAM_CONTENTID

Některé vlastnosti v tomto seznamu vyžadují informace závislé na hardwaru z ovladače miniportu. Když ovladač portu obdrží IRP obsahující požadavek na jednu z těchto vlastností, nepředá IRP ovladači miniportu. Místo toho ovladač portu zpracovává samotný požadavek, ale jeho obslužná rutina získá informace, které potřebuje, voláním vstupního bodu v ovladači miniportu. Například ovladač portu poskytuje vlastní zpracování vlastností pro požadavky KSPROPERTY_AUDIO_POSITION. Tato obslužná rutina jednoduše volá metodu GetPosition datového proudu miniportu (například IMiniportWavePciStream::GetPosition) pro získání aktuální pozice.

Vlastnosti uzlu

Ovladač portu přistupuje k obslužným rutinám pro vlastnosti uzlu ovladače miniportu prostřednictvím člena Nodes v PCFILTER_DESCRIPTOR. Tento člen odkazuje na pole popisovačů uzlů a každý popisovač odkazuje na tabulku automatizace pro typ uzlu (identifikovaný ID uzlu, což je jednoduše index pole). Obvykle se v poli Nodes nacházejí všechny nebo většina obslužných rutin vlastností, které patří k ovladači miniportu. Ovladač zvuku představuje hardwarové ovládací prvky ve zvukovém zařízení jako uzly topologie a používá mechanismus vlastností k poskytování klientů s přístupem k nastavení ovládacího prvku závislého na hardwaru.

Jak jsme popsali dříve, klient odešle požadavek na vlastnost filtru na popisovač filtru a požadavek na vlastnost pinu na popisovač pinu. Na rozdíl od instance filtru nebo připojení není uzel objektem jádra a nemá popisovač. Klient odešle požadavek na vlastnost uzlu na popisovač připnutí nebo popisovač filtru, ale požadavek také určuje ID uzlu, které označuje, že požadavek je pro vlastnost uzlu, nikoli vlastnost připnutí nebo filtru.

Níže jsou uvedená obecná pravidla pro určení, jestli má vlastnost uzlu používat popisovač filtru nebo popisovač pro pin:

  • Pokud filtr obsahuje několik instancí určitého typu pinu a každý pin tohoto typu obsahuje uzel s konkrétním ID uzlu, pak každá instance pinu obsahuje instanci tohoto uzlu. V tomto případě musí požadavek na vlastnost uzlu zadat popisovač připínáčku (nikoli pouze popisovač filtru), aby bylo možné rozlišovat mezi několika instancemi stejného typu uzlu. Kombinace držadla kolíku a ID uzlu jednoznačně identifikuje konkrétní instanci uzlu jako cíl požadavku.

  • Pokud filtr obsahuje pouze jednu instanci určitého uzlu, požadavek na vlastnost uzlu určuje popisovač filtru. Kombinace popisovače filtru a ID uzlu stačí k jednoznačné identifikaci uzlu, který je cílem požadavku.

Před implementací obslužné rutiny pro konkrétní vlastnost uzlu by však zapisovač ovladačů měl odkazovat na Audio Drivers Property Sets a zkontrolovat, zda má být cíl vlastnosti zadán jako popisovač filtru nebo popisovač pinů.

Ovladače portů v Portcls.sys momentálně neposkytují integrované zpracování vlastností uzlu s výjimkou KSPROPERTY_TOPOLOGY_NAME.

Příliš specifikovaná a málo specifikovaná žádost o vlastnosti

Řidiči by měli být připraveni řešit požadavky na majetek od klientů, kteří nedodržují předchozí pravidla. Požadavky mohou být buď příliš specifikované, nebo nedostatečně specifikované.

  • Nadměrně specifikované požadavky

    Pokud požadavek na vlastnost vyžaduje pouze popisovač filtru, ale klient odešle požadavek na popisovač konektoru, cíl požadavku je příliš specifikován. Ovladače však s žádostí obvykle zachází jako s platnou; to znamená, že žádost považují, jako by byla odeslána do filtru obsahujícího pin.

  • Nedostatečně specifikované požadavky

    Pokud požadavek na vlastnost vyžaduje popisovač připnutí, ale klient odešle požadavek na popisovač filtru, není cíl požadavku specifikován dostatečně jasně. Pokud například filtr obsahuje několik instancí pinu se stejným typem uzlu a klient odešle žádost o vlastnost tohoto typu uzlu do popisovače filtru místo popisovače pinu, ovladač nemá možnost určit, která instance uzlu by měla žádost přijmout. V tomto případě chování závisí na ovladači. Místo automatického selhání všech neúplně specifikovaných požadavků považují některé ovladače požadavek na nastavení vlastnosti za platný. V tomto případě interpretace spočívá v tom, že požadavek nastaví výchozí hodnotu pro zadané ID uzlu. Když továrna na piny vytvoří novou instanci uzlu, vlastnost náležící novému uzlu se inicializuje na výchozí hodnotu. Požadavek, který změní výchozí hodnotu, nemá žádný vliv na instance uzlů vytvořené před požadavkem. Kromě toho ovladače jednotně selhávají při nedostatečně specifikovaných get-property dotazech, protože obslužná rutina nemá způsob, jak určit instanci uzlu, která se má na vlastnost dotazovat.

Výjimky pravidel

Z historických důvodů mají některé zvukové vlastnosti chování, které se odchylují od těchto obecných pravidel. Následují příklady:

  • Jak je popsáno v části Použití nastavení Speaker-Configuration, klient může změnit konfiguraci reproduktorů zvukového zařízení nastavením vlastnosti KSPROPERTY_AUDIO_CHANNEL_CONFIG 3D uzlu (KSNODETYPE_3D_EFFECTS). Nastavení konfigurace mluvčího je globální, protože změní konfiguraci mluvčího pro všechny streamy, které jsou součástí mixu, který zařízení přehrává prostřednictvím reproduktorů. Podle obecného pravidla by měl požadavek na vlastnost uzlu, který ovlivňuje filtr jako celek, uvádět popisovač filtru (plus ID uzlu). Tato konkrétní vlastnost však vyžaduje ovladač s kolíkem místo ovladače s filtrem. Popisovač pinu určuje instanci pinu obsahující 3-D uzel, který je cílovým uzlem požadavku.

  • KSPROPERTY_SYNTH_VOLUME a KSPROPERTY_SYNTH_MASTERCLOCK jsou vlastnosti syntetového uzlu (KSNODETYPE_SYNTHESIZER). I když oba jsou vlastnosti uzlu, požadavky na tyto vlastnosti nezahrnují ID uzlů. (Všimněte si, že popisovač vlastnosti pro požadavek je struktura typu KSPROPERTY, nikoli KSNODEPROPERTY.) Toto chování porušuje obecné pravidlo, že vlastnost uzlu vyžaduje ID uzlu. Navzdory této nesrovnalosti by miniportový ovladač, který podporuje jednu z těchto vlastností, měl prostřednictvím člena Nodes PCFILTER_DESCRIPTOR (místo člena Pins) poskytnout obslužnou rutinu vlastnosti.