Udostępnij przez


Przesunięcia dla prefetch

Sterownik miniportu WavePci wywołuje metodę IPreFetchOffset::SetPreFetchOffset, aby określić przesunięcie wstępnego pobierania w strumieniu wyjściowym DirectSound przyspieszonym sprzętowo. To przesunięcie to liczba bajtów danych oddzielających kursor zapisu od kursora odtwarzania w buforze sprzętowym urządzenia audio. Kursor zapisu określa położenie buforu, w którym aplikacja DirectSound może bezpiecznie napisać następny przykład dźwięku. Kursor odtwarzania określa położenie buforu próbki dźwięku, która jest obecnie odtwarzana przez urządzenie audio.

DirectSound pyta sterownik portu WavePci o bieżące pozycje kursora odtwarzania i zapisu, wysyłając żądanie właściwości KSPROPERTY_AUDIO_POSITION. W odpowiedzi na to żądanie sterownik portu uzyskuje bieżącą pozycję odtwarzania ze sterownika miniportu, wywołując element IMiniportWavePciStream::GetPosition. Sposób, w jaki sterownik portu określa położenie zapisu, zależy od tego, czy element SetPreFetchOffset został wywołany.

Domyślnie sterownik portu umieszcza kursor zapisu w ostatnim mapowaniu żądanym przez sterownik miniportu. Każde wywołanie IPortWavePciStream::GetMapping zwiększa domyślne przesunięcie prefetchu. Jeśli sterownik miniportu WavePci uzyskuje dużą liczbę mapowań, domyślne przesunięcie może znacznie wzrosnąć.

Wywołanie metody SetPreFetchOffset zastępuje wartość domyślną. Zgodnie z tym wywołaniem sterownik portu oblicza pozycję zapisu przez dodanie określonego przesunięcia pobierania wstępnego do pozycji odtwarzania (biorąc pod uwagę zawijanie na końcu buforu DirectSound).

Sterownik miniportu może przydzielić dużą liczbę mapowań z kilku powodów. Jednym z nich jest zmniejszenie obciążenia związanego z operacjami audio na procesorze systemowym. Przy większej liczbie mapowań sterownik wymaga mniejszej liczby przerwań, aby urządzenie audio było stale zaopatrywane w dane. Innym powodem jest to, że przydzielanie większej liczby mapowań zmniejsza prawdopodobieństwo, że odtwarzanie dźwięku będzie doświadczać usterek, gdy nieprawidłowo działające sterowniki urządzeń blokują system na krótkie okresy.

Jednym z problemów z dużym przesunięciem początkowym (prefetch offset) jest to, że niektóre aplikacje DirectSound mogą mieć trudności z określeniem względnych pozycji kursorów odtwarzania i zapisu. W systemie Windows 95/98 audio VxDs utrzymują stosunkowo małe przesunięcie pobierania wstępnego, a aplikacje DirectSound napisane dla tych systemów operacyjnych mogą nie działać poprawnie, jeśli przesunięcie jest większe niż oczekiwano.

Na przykład aplikacja może podzielić bufor DirectSound na górną i dolną połowę, a następnie wymieniać te dwie połowy pomiędzy aplikacją a urządzeniem. Kiedy kursor zapisu po raz pierwszy wejdzie w górną lub dolną połowę bufora, zapisuje ilość danych równą połowie bufora do tej części bufora. W tym schemacie przyjęto założenie, że kursor odtwarzania jest zawsze umieszczony w drugiej połowie buforu — połowa, do której nie jest zapisywana. Należy pamiętać, że to założenie jest nieprawidłowe, jeśli przesunięcie wstępnego pobierania przekracza połowę rozmiaru buforu. W takim przypadku, gdy kursor zapisu osiągnie koniec buforu DirectSound i zawinie się z powrotem na początek, znajdzie się w tej samej połowie buforu co kursor odtwarzania. Gdy aplikacja zapisuje ilość danych równą połowie buforu na nową pozycję kursora zapisu, kończy się na zastąpieniu pozycji kursora odtwarzania i zniszczeniu danych, które nie zostały jeszcze odtworzone.

Mimo że sama aplikacja może być z pewnością obwiniana za ten typ awarii, sterownik miniportu WavePci może wyeliminować tryb awarii po prostu przez wywołanie SetPreFetchOffset, aby ustawić przesunięcie przed pobraniem na mniejszą wartość.

Ustawienie przesunięcia przed pobraniem na mniejszą wartość powoduje przesunięcie wynikowego kursora zapisu bliżej kursora odtwarzania. Należy skonfigurować offset pobierania wstępnego na rozmiar FIFO sprzętu. Typowe przesunięcie prefiksu wynosi około 64 próbek, w zależności od sprzętowego projektu silnika DMA.

Aby zachować zgodność z niektórymi starszymi aplikacjami DirectSound, DirectSound obecnie wypełnia kursory zapisu sprzętowo przyspieszanych pinów o 10 milisekund. Należy pamiętać, że ilość wypełnienia może w przyszłości ulec zmianie.

Aby uzyskać dodatkowe informacje na temat zarządzania kursorami zapisu i odtwarzania kursorów na poziomie sterownika, zobacz Właściwość położenia dźwięku.