Udostępnij przez


Skrzyżowanie danych

Na grafie filtru audio strumień audio może przepływać od pinu źródłowego jednego filtru do pinu wyjściowego innego filtru tylko wtedy, gdy oba piny obsługują wspólny format dla strumienia. Podobnie klient może wysłać strumień audio do końcówki wyjściowej filtru lub odebrać strumień audio z końcówki wejściowej filtru tylko wtedy, gdy klient i końcówka obsługują wspólny format strumienia. Filtry audio używają techniki zwanej przecięciem zakresów danych w celu zidentyfikowania formatu strumienia, który jest wspólny dwóch zaciskom lub klientowi i zaciskowi.

Na przykład w systemach Windows Server 2003, Windows XP, Windows 2000 i Windows Me/98 sterownik systemowy SysAudio używa techniki przecinania danych do konstruowania grafu filtru audio poprzez połączenie par numerów pinów filtru obsługujących zgodne formaty danych audio.

Komponent pinów określa zestaw formatów, które każdy pin obsługuje jako tablicę zakresów danych, gdzie każdy zakres danych jest strukturą typu KSDATARANGE_AUDIO. Zakres danych określa ogólny typ formatu, który może być KSDATAFORMAT_WAVEFORMATEX lub KSDATAFORMAT_DSOUND. Ponadto zakres danych określa zakres wartości dla każdego z następujących parametrów:

  • Bity na próbce

  • Częstotliwość próbkowania

  • Liczba kanałów

Struktura KSDATARANGE_AUDIO określa zarówno minimalne, jak i maksymalne wartości dla bitów na próbkę i zakresy częstotliwości próbkowania, ale tylko maksimum dla zakresu liczby kanałów. Minimalna liczba kanałów jest niejawnie jedna.

Zadanie negocjowania wspólnego formatu danych dla dwóch pinezek składa się z znajdowania dwóch zakresów danych — jednego z każdego pinezki — które przecinają się ze sobą. Para zakresów danych przecina się, jeśli:

  • Obsługują one ten sam ogólny format fali (KSDATAFORMAT_WAVEFORMATEX lub KSDATAFORMAT_DSOUND).

  • Ich zakresy bitów na próbkę nakładają się na siebie.

  • Ich zakresy częstotliwości próbkowania nakładają się.

Jak wspomniano wcześniej, struktura KSDATAFORMAT_AUDIO sugeruje model sprzętu, w którym minimalna liczba kanałów obsługiwanych przez pin jest zawsze jedna. Zgodnie z tym modelem zakresy liczby kanałów dla wszystkich dwóch wyprowadzeń powinny zawsze nakładać się, ponieważ oba wyprowadzenia obsługują co najmniej jeden kanał. Oczywiście adapter sprzętowy z minimalną liczbą kanałów większą niż jeden nie jest zgodny z tym modelem, ale sterownik adaptera może zawierać zastrzeżoną procedurę obsługi przecinania danych w celu rozwiązania tego typu problemu (zobacz przykład w Proprietary Data-Intersection Handlers).

Po znalezieniu pary przecinających się zakresów danych dla dwóch pinów, program obsługi wybiera wspólny format danych z obszaru przecięcia w następujący sposób:

  • Liczba bitów na próbkę jest wybierana z regionu, w którym nakładają się dwa zakresy bitów na próbkę.

  • Częstotliwość próbki jest wybierana z regionu, w którym nakładają się dwa zakresy częstotliwości próbek.

  • Liczba kanałów jest wybierana z regionu, w którym nakładają się dwa zakresy liczby kanałów.

Na przykład, w trakcie negocjacji wspólnego formatu dla pinu ujścia sterownika portu audio i pinu źródła innego filtra (zazwyczaj sterownika systemowego KMixer), SysAudio najpierw uzyskuje tablicę zakresów danych pinu źródła. Narzędzie SysAudio wysyła następnie żądanie KSPROPERTY_PIN_DATAINTERSECTION do pinu końcowego i dołącza tablicę zakresów danych pinu wejściowego do tego żądania. Warstwa strumieniowania jądra przechwytuje żądanie i iteracyjnie wywołuje obsługę przecięcia danych w sterowniku portu, raz dla każdego kolejnego elementu w tablicy zakresu danych pinu źródłowego, zaczynając od pierwszego elementu, aż do momentu, gdy uda się znaleźć przecięcie danych.

Przy każdym wywołaniu, które SysAudio wykonuje do procedury obsługi przecięcia danych sterownika portu, procedura najpierw uzyskuje tablicę zakresu danych dla pinu wyjściowego od sterownika miniportu. Następnie przechodzi iteracyjnie przez tablicę, zaczynając od pierwszego elementu, szukając przecięcia między zakresem danych pinu ujścia i bieżącym zakresem danych pinu źródła. Procedura obsługi wybiera wspólny format, który znajduje się w obrębie przecięcia i zwraca ten format do obiektu wywołującego.

W każdym kroku iteracji sterownik portu wywołuje zastrzeżoną procedurę obsługi przecięcia danych sterownika miniportu z dwoma zakresami danych – jednym dla każdego z dwóch pinów. Jeśli w jakimkolwiek kroku zastrzeżony program obsługi odmawia obsługi kontroli przecięcia danych między dwoma zakresami danych, program obsługi przecięcia danych sterownika portu wykonuje zamiast tego sprawdzanie.

Podsumowując, wyszukiwanie przecięcia pomiędzy zakresem danych wejściowego pinu źródłowego a pinu ujściowego jest procesem iteracyjnym:

  • W pętli zewnętrznej warstwa przesyłania strumieniowego jądra iteruje przez kolejne elementy w tablicy zakresów pinów źródła, rozpoczynając od pierwszego elementu.

  • W pętli wewnętrznej sterownik portu iteruje przez kolejne elementy w tablicy zakresów danych ujścia, począwszy od pierwszego elementu tablicy.

Wyszukiwanie zatrzymuje się po znalezieniu pierwszego przecięcia danych. Ten sposób działania ma tendencję do faworyzowania elementów na początku tablicy zakresów danych każdego pinu. Podczas określania tablicy zakresów danych dla pinu, sterownik karty powinien porządkować elementy tablicy, umieszczając zakresy danych dla preferowanych formatów na początku tablicy.