Udostępnij przez


Deskryptory rozszerzalne Wave-Format

Na poniższej ilustracji przedstawiono deskryptor formatu danych dla strumienia dźwięku falowego.

Diagram ilustrujący deskryptor formatu fali dla strumienia audio.

Jak wskazano na rysunku, ilość dodatkowych informacji o formacie po strukturze KSDATAFORMAT różni się w zależności od formatu danych.

Systemy audio używają tego typu deskryptora formatu na kilka sposobów:

  • Deskryptor formatu, taki jak ten pokazany na powyższym rysunku, jest przekazywany jako parametr wywołania do metody NewStream sterownika miniportu (na przykład zobacz IMiniportWaveCyclic::NewStream).

  • Parametr ResultantFormat metody IMiniport::D ataRangeIntersection wskazuje bufor, w którym metoda zapisuje deskryptor formatu, taki jak ten pokazany na poprzedniej ilustracji.

  • Żądanie uzyskania właściwości KSPROPERTY_PIN_DATAINTERSECTION pobiera deskryptor formatu, taki jak ten przedstawiony na powyższym rysunku.

  • Żądanie KSPROPERTY_PIN_PROPOSEDATAFORMAT set-property akceptuje deskryptor formatu, taki jak ten pokazany na poprzedniej ilustracji.

  • Podobny format jest używany dla parametru wywołania Connect funkcji KsCreatePin. Ten parametr wskazuje strukturę KSPIN_CONNECT na początku buforu, który zawiera również deskryptor formatu. Deskryptor formatu, który jest bezpośrednio zgodny ze strukturą KSPIN_CONNECT, zaczyna się od struktury KSDATAFORMAT, takiej jak ta pokazana na powyższym rysunku.

Informacje o formacie, które są zgodne ze strukturą KSDATAFORMAT, powinny być strukturą WAVEFORMATEXTENSIBLE . WAVEFORMATEXTENSIBLE to rozszerzona wersja programu WAVEFORMATEX, która może opisywać szerszy zakres formatów niż WAVEFORMATEX.

WAVEFORMAT jest przestarzały i nie jest obsługiwany przez podsystem audio WDM w żadnej wersji systemu Microsoft Windows. Struktura PCMWAVEFORMAT to rozszerzona wersja formatu WAVEFORMAT, która jest również przestarzała.

Cztery struktury formatu fali — WAVEFORMAT, PCMWAVEFORMAT, WAVEFORMATEX i WAVEFORMATEXTENSIBLE — wszystko zaczyna się od tych samych pięciu elementów członkowskich, począwszy od elementu wFormatTag. Na powyższej ilustracji przedstawiono te cztery struktury nałożone na siebie, aby podkreślić części struktur, które są identyczne.

WaveFormatExtensible rozszerza strukturę WaveFormatEx, dodając trzy elementy członkowskie, począwszy od Samples.wValidBitsPerSample. (Przykłady to związek, którego inny element członkowski, wValidSamplesPerBlock, jest używany zamiast wValidBitsPerSample dla niektórych skompresowanych formatów). Element członkowski wFormatTag , który bezpośrednio następuje po końcu struktury KSDATAFORMAT w buforze, określa, jakiego rodzaju informacje o formacie są zgodne z formatem KSDATAFORMAT.

W przeciwieństwie do WAVEFORMATEX, WAVEFORMATEXTENSIBLE może wykonywać następujące czynności:

  1. Określ liczbę bitów na próbkę oddzielnie od rozmiaru przykładowego kontenera. Na przykład próbka 20-bitowa może być przechowywana w kontenerze z trzema bajtami. WAVEFORMATEX, który nie może odróżnić liczby bitów danych na próbkę od rozmiaru kontenera próbki, nie może jednoznacznie opisać takiego formatu.

  2. Przypisz określone lokalizacje głośników do kanałów audio w strumieniach wielokanałowych. WAVEFORMATEX nie ma tej możliwości i może odpowiednio obsługiwać tylko strumienie stereo mono i (dwukanałowe).

Starsze użycie programu WAVEFORMATEX

Dowolny format opisany przez WAVEFORMATEX można również opisać za pomocą funkcji WAVEFORMATEXTENSIBLE. Aby uzyskać informacje na temat konwertowania struktury WAVEFORMATEX na format WAVEFORMATEXTENSIBLE, zobacz Konwertowanie między tagami formatu i identyfikatorami GUID formatu podrzędnego.

Funkcja WAVEFORMATEX jest wystarczająca do opisywania formatów o rozmiarach próbek 8 lub 16 bitów, ale funkcja WAVEFORMATEXTENSIBLE jest niezbędna do odpowiedniego opisywania formatów z dokładnością próbki większą niż 16 bitów. Oto dwa przykłady:

  • Strumień o przykładowej precyzji 24 bitów może używać 32-bitowego rozmiaru kontenera do wydajnego przetwarzania, ale można przekonwertować na użycie kontenera 24-bitowego w celu zwiększenia wydajności magazynu bez utraty danych.

  • Podczas przetwarzania strumienia z 24-bitowymi danymi przykładowymi urządzenie renderujące, które zapewnia tylko 20 bitów precyzji, może używać ditheringu, aby poprawić wierność sygnału wyjściowego. Dithering wymaga jednak dodatkowego czasu przetwarzania, a jeśli oryginalny strumień jest dokładny tylko do 20 bitów, dodatkowe przetwarzanie jest niepotrzebne.

W obu tych przykładach zachowanie jakości sygnału przy jednoczesnym dokonaniu odpowiedniego kompromisu między przetwarzaniem i wydajnością magazynowania jest możliwe tylko wtedy, gdy znana jest zarówno precyzja próbki, jak i rozmiar kontenera.

Jeśli prosty format można jednoznacznie opisać za pomocą struktury WAVEFORMATEX lub WAVEFORMATEXTENSIBLE, sterownik audio ma możliwość wybrania jednej struktury, aby opisać format. Jednak sterowniki audio zwykle używały WAVEFORMATEX do określania formatów PCM mono i stereo (dwukanałowych) z próbkami 8-bitowymi lub 16-bitowymi, a niektóre starsze aplikacje mogą oczekiwać, że wszystkie sterowniki audio będą używać WAVEFORMATEX do określania tych formatów.

Jeśli sterownik obsługuje format audio, który może być jednoznacznie określony jako WAVEFORMATEX lub WAVEFORMATEXTENSIBLE, sterownik powinien rozpoznać format niezależnie od tego, który z dwóch struktur aplikacji klienckiej lub składnika używa do określenia struktury. Jeśli na przykład urządzenie audio obsługuje format PCM 44,1 kHz, 16-bitowy, stereo, to obsługa właściwości KSPROPERTY_PIN_PROPOSEDATAFORMAT sterownika miniportu oraz jego implementacja metody NewStream powinny zaakceptować ten format, niezależnie od tego, czy jest on określony jako struktura WAVEFORMATEX lub WAVEFORMATEXTENSIBLE.

Aby uprościć przetwarzanie danych formatu, sterowniki zwykle używają struktur WAVEFORMATEXTENSIBLE do wewnętrznego reprezentowania formatów. Takie podejście może wymagać konwersji wejściowej struktury WAVEFORMATEX na wewnętrzną reprezentację WAVEFORMATEXTENSIBLE lub konwersji wewnętrznej reprezentacji WAVEFORMATEXTENSIBLE na wyjściową strukturę WAVEFORMATEX.

W pliku WAVEFORMATEXTENSIBLE dwBitsPerSample jest rozmiarem kontenera, a wValidBitsPerSample jest liczbą prawidłowych bitów danych na próbkę. Kontenery są zawsze wyjustowane do bajtów w pamięci, a rozmiar kontenera musi być określony jako wielokrotność 8 bitów.