Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Sterownik portu WavePci obsługuje buforowanie strumienia audio inaczej niż sterownik WaveCyclic.
Jeśli sterownik miniportu WavePci zapewnia mieszanie sprzętowe, DirectSound przesyła IRP do sterownika portu WavePci, który zawiera cały strumień fal DirectSound w jednym buforze cyklicznym. DirectSound przydziela bufor jako ciągły blok pamięci wirtualnej. Aby uniknąć kopiowania buforu DirectSound, warstwa strumieniowania jądra mapuje bufor na wirtualną pamięć trybu jądra i generuje listę deskryptorów pamięci (MDL), która określa zarówno wirtualne, jak i fizyczne adresy stron pamięci w buforze cyklicznym. Sterownik portu WavePci dzieli bufor cykliczny na sekwencję ramek alokacyjnych (zobacz Alokatory KS). Sterownik miniportu określa preferowany rozmiar ramki alokatora, gdy jego IMiniportWavePciStream::GetAllocatorFraming metoda jest wywoływana przez sterownik portu podczas inicjowania strumienia. Jednak SysAudio, konstruktor grafu systemowego, może zastąpić preferencje sterownika miniportu, aby dostosować się do wymagań innych składników na wykresie filtru audio.
Sterownik portu WavePci udostępnia cykliczny bufor sterownikowi miniportu w postaci sekwencji mapowań. Mapowanie to cała ramka alokacji lub część ramki. Jeśli określona ramka alokacji znajduje się całkowicie na stronie, sterownik portu przedstawia tę ramkę sterownikowi miniportu jako pojedyncze mapowanie. Jeśli ramka alokacji przechodzi przez jedną lub więcej granic stron, sterownik portu dzieli ramkę na każdej granicy strony i przedstawia je jako dwa lub więcej odwzorowań. Każde wywołanie metody IPortWavePciStream::GetMapping daje kolejne mapowanie w szeregu.
W przeciwieństwie do przypadku WaveCyclic, gdzie sterownik miniportu ma niewielką kontrolę nad tym, ile milisekund danych jest buforowanych na sprzęcie, sterownik WavePci miniport ma znaczną kontrolę nad liczbą mapowań, które zostały otwarte w dowolnym momencie. Liczba otwartych mapowań zwiększa się o jedną z każdym wywołaniem metody GetMapping i zmniejsza się o jedną z każdym wywołaniem metody ReleaseMapping. (Wywołanie GetMapping może oczywiście zakończyć się niepowodzeniem, więc sterownik ma mniejszą niż całkowitą kontrolę nad liczbą mapowań). Kontrolując liczbę otwartych mapowań i śledząc skumulowany rozmiar mapowań, sterownik miniportu może określić (w ramach tolerancji zależnej od rozmiaru mapowania) liczbę milisekund buforowania, które są dostępne dla sprzętu. Sterownik miniportu WavePci powinien zażądać wystarczającej liczby mapowań stron, aby zmniejszyć prawdopodobieństwo głodu do akceptowalnych poziomów.
Jeśli zgodnie z polityką sterownika miniportu dane mają być buforowane przez maksymalnie 50 milisekund, na przykład pomiędzy wskaźnikami odczytu i zapisu, pamiętaj, że ten limit określa największą ilość danych, jakie sterownik będzie gromadzić, ale nie powinien i nie może reprezentować wkładu sterownika w opóźnienie strumienia. Sterownik powinien być zaprojektowany tak, aby jego opóźnienie było możliwie najmniejsze. Gdy sterownik miniportu uzyskuje swój początkowy zestaw mapowań przed rozpoczęciem odtwarzania nowego strumienia, sterownik miniportu może nadal żądać mapowań, dopóki nie osiągnie limitu buforu (50 milisekund w tym przykładzie) lub nie więcej mapowań jest natychmiast dostępnych. W tym drugim przypadku jednak sterownik miniportu nie może czekać, aż więcej mapowań stanie się dostępnych przed rozpoczęciem odtwarzania strumienia. Zamiast tego sterownik powinien natychmiast rozpocząć odtwarzanie mapowań, które już uzyskał. Później, w miarę dostępności większej liczby mapowań, sterownik może nadal uzyskiwać dodatkowe mapowania, dopóki nie osiągnie limitu rozmiaru buforu lub nie będą natychmiast dostępne żadne mapowania.
Ogólnie rzecz biorąc, sprzęt DMA urządzenia WavePci powinien być zaprojektowany tak, aby bezpośrednio uzyskiwać dostęp do ramek dźwiękowych, które są przechowywane przy dowolnym wyrównaniu bajtów i które przekraczają granice między nieciągłymi stronami pamięci fizycznej. Jeśli masz urządzenie, które wymaga, aby odwzorowania miały całkowitą liczbę ramek dźwiękowych, to urządzenie jest ograniczone pod względem obsługiwanych formatów audio. Oczywiście urządzenie z tym ograniczeniem powinno nadal obsługiwać rozmiar ramki audio, który jest mocą dwóch.
Na przykład urządzenie z czterema kanałami i 16-bitowym rozmiarem próbki wymaga rozmiaru ramki audio o rozmiarze ośmiu bajtów. Całkowita liczba ramek dźwiękowych mieści się starannie na stronie (lub w dowolnym innym rozmiarze ramki alokacji, który jest wielokrotnością ośmiu bajtów). Jednak w przypadku strumienia 5.1-kanałowego z próbkami 16-bitowymi rozmiar ramki audio wynosi 12 bajtów, a strumień, który przekracza rozmiar pojedynczej strony, musi zawierać ramki audio, które przekraczają granice strony. (Liczby w filtrach falowych ilustrują ten problem). Sprzęt, który nie może obsłużyć dowolnych wyrównań bajtów i dowolne mapowania długości bajtów, musi zależeć od sterownika do wykonania kopii pośredniej, co obniża wydajność.
Sterownik przykładowej karty Ac97 w zestawie Microsoft Windows Driver Kit (WDK) implementuje metodę GetAllocatorFraming. Sterownik miniportu używa tej metody do komunikowania preferowanego rozmiaru alokacji ramek. W systemach Windows 2000 i Windows Me sterownik portu wywołuje tę metodę tylko wtedy, gdy sterownik systemowy Splitter (Splitter.sys) jest tworzony powyżej wyjściowego pinu. W systemie Windows XP i nowszym sterownik portu wywołuje również tę metodę dla strumieni wejściowych. Pamiętaj, że program SysAudio może zignorować preferencje sterownika miniportu podczas podejmowania decyzji o rozmiarze alokacji ramek.