Dela via


Datakorsning

I ett ljudfilterdiagram kan en ljudström flöda från källstiftet för ett filter till mottagarstiftet för ett annat filter endast om de två stiften stöder ett gemensamt format för strömmen. På samma sätt kan en klient skicka en ljudström till en mottagarstift på ett filter eller ta emot en ljudström från en källstift på ett filter endast om klienten och pin-koden stöder ett gemensamt strömformat. Ljudfilter använder en teknik som kallas dataintersektion (förkortning för dataintervalssnitt) för att identifiera ett strömformat som är gemensamt för två pinnar eller för en klient och en pinne.

I Windows Server 2003, Windows XP, Windows 2000 och Windows Me/98 använder SysAudio-systemdrivrutinen datakorsningstekniken för att konstruera ett ljudfilterdiagram genom att ansluta par med filterpinnar som stöder kompatibla ljudformat.

En pin-fabrik anger den uppsättning format som varje stift stöder som en matris med dataområden, där varje dataintervall är en struktur av typen KSDATARANGE_AUDIO. Ett dataintervall anger en allmän formattyp som kan vara KSDATAFORMAT_WAVEFORMATEX eller KSDATAFORMAT_DSOUND. Dessutom anger dataområdet ett värdeintervall för var och en av följande parametrar:

  • Bitar per exempel

  • Exempelfrekvens

  • Antal kanaler

Den KSDATARANGE_AUDIO strukturen anger både lägsta och högsta värden för intervallen bits-per-sample och sample-frequency, men endast ett maxvärde för antalet kanaler. Det minsta antalet kanaler är implicit en.

Jobbet med att förhandla fram ett gemensamt dataformat för två stift består av att hitta två dataintervall – ett från varje stift – som korsar varandra. Ett par dataområden korsar varandra om:

  • De stöder samma allmänna vågformat (KSDATAFORMAT_WAVEFORMATEX eller KSDATAFORMAT_DSOUND).

  • Deras bit-per-sample-intervall överlappar varandra.

  • Deras urvalsfrekvensintervall överlappar varandra.

Som tidigare nämnts innebär KSDATAFORMAT_AUDIO-strukturen en maskinvarumodell där det minsta antalet kanaler som stöds av en pin-kod alltid är en. Enligt den här modellen bör antalet kanaler för två stift alltid överlappa eftersom båda stiften stöder minst en kanal. Det är uppenbart att en hårdvaruadapter med ett minimiantal kanaler större än ett inte överensstämmer med den här modellen, men adapterdrivrutinen kan innehålla en proprietär dataskärningshanterare för att hantera den här typen av problem (se exemplet i Proprietära Data-Intersection-hanterare).

Vid upptäckten av ett par korsande dataintervall för de två pinnarna väljer hanteraren ett gemensamt dataformat från skärningsområdets region enligt följande:

  • Antalet bitar per exempel väljs från den region där de två bit-per-sample-intervallen överlappar varandra.

  • Urvalsfrekvensen väljs från den region där de två urvalsfrekvensintervallen överlappar varandra.

  • Antalet kanaler väljs från den region där de två kanalantalen överlappar varandra.

När du till exempel förhandlar om ett gemensamt format för en ljudportdrivrutins mottagarstift och källstiftet för ett annat filter (vanligtvis KMixer-systemdrivrutinen), hämtar SysAudio först källstiftets dataområdesmatris. SysAudio skickar sedan en KSPROPERTY_PIN_DATAINTERSECTION begäran till sink-pin och bifogar källstiftets dataräckviddsmatris i den här begäran. Kernel-streaming-lagret fångar upp begäran och anropar iterativt portdrivrutinens dataskärningshanterare en gång för varje efterföljande element i källstiftets dataområdesmatris, som börjar med det första elementet, tills hanteraren lyckas hitta en datakorsning.

Med varje anrop som SysAudio gör till portdrivrutinens dataskärningshanterare hämtar hanteraren först mottagarstiftets dataområdesmatris från miniportdrivrutinen. Den itererar sedan genom matrisen, som börjar med det första elementet, tills den lyckas hitta en skärningspunkt mellan ett dataintervall med mottagarstift och det aktuella källstiftsdataintervallet. Hanteraren väljer ett gemensamt format som ligger i skärningspunkten och matar ut det här formatet till anroparen.

Vid varje steg i iterationen anropar portdrivrutinen miniportdrivrutinens proprietära dataskärningshanterare med de två dataintervallen – ett för var och en av de två stiften. Om den proprietära hanteraren i något steg avböjer att hantera en dataskärningskontroll mellan de två dataintervallen utför portdrivrutinens dataskärningshanterare kontrollen i stället.

För att sammanfatta är sökningen efter en skärningspunkt mellan ett källstiftsdataintervall och ett dataintervall med mottagarstift en iterativ process:

  • I den yttre loopen itererar det kernel-strömmande lagret genom efterföljande element i källstiftets dataområdesmatris, från och med det första matriselementet.

  • I den inre loopen itererar portdrivrutinen genom efterföljande element i mottagarstiftets dataområdesmatris, som börjar med det första matriselementet.

Sökningen stoppas när den första dataskärningspunkten hittas. Den här processen tenderar att gynna elementen mot början av varje stifts dataintervallmatris. När du anger en matris med dataintervall för en pin-kod bör en adapterdrivrutin sortera matriselementen genom att placera dataintervall för önskade format i början av matrisen.