Udostępnij przez


Urządzenia i typy danych

[Funkcja skojarzona z tą stroną, Waveform Audio, jest starszą funkcją. Został zastąpiony przez WASAPI i Audio Graphs. WASAPI i Audio Graph s zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał WASAPI i Audio Graphs zamiast Waveform Audio, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

W tej sekcji opisano pracę z urządzeniami audio waveform i zawiera informacje na temat otwierania, zamykania i wykonywania zapytań dotyczących ich możliwości. W tym artykule opisano również sposób śledzenia urządzeń w systemie przy użyciu uchwytów urządzeń i identyfikatorów urządzeń.

Otwieranie urządzeń wyjściowych Waveform-Audio

Użyj funkcji waveOutOpen, aby otworzyć urządzenie wyjściowe waveform-audio na potrzeby odtwarzania. Ta funkcja otwiera urządzenie skojarzone z określonym identyfikatorem urządzenia i zwraca uchwyt otwartego urządzenia, zapisując uchwyt określonej lokalizacji pamięci.

Niektóre komputery multimedialne mają wiele urządzeń wyjściowych waveform-audio. Jeśli nie chcesz otworzyć określonego urządzenia wyjściowego waveform-audio w systemie, należy użyć flagi WAVE_MAPPER identyfikatora urządzenia podczas otwierania urządzenia. Funkcja waveOutOpen wybiera urządzenie w systemie, które najlepiej umożliwia odtwarzanie określonego formatu danych.

Wykonywanie zapytań dotyczących urządzeń audio

System Windows udostępnia następujące funkcje, aby określić, ile urządzeń określonego typu jest dostępnych w systemie.

Funkcja Opis
auxGetNumDevs Pobiera liczbę pomocniczych urządzeń wyjściowych znajdujących się w systemie.
waveInGetNumDevs Pobiera liczbę urządzeń wejściowych waveform-audio znajdujących się w systemie.
waveOutGetNumDevs Pobiera liczbę urządzeń wyjściowych waveform-audio znajdujących się w systemie.

 

Urządzenia audio są identyfikowane przez identyfikator urządzenia. Identyfikator urządzenia jest określany niejawnie z liczby urządzeń znajdujących się w systemie. Identyfikatory urządzeń wahają się od zera do jednej mniejszej niż liczba obecnych urządzeń. Jeśli na przykład w systemie istnieją dwa urządzenia wyjściowe waveform-audio, prawidłowe identyfikatory urządzeń to 0 i 1.

Po określeniu, ile urządzeń określonego typu znajduje się w systemie, możesz użyć jednej z następujących funkcji, aby wykonać zapytanie dotyczące możliwości każdego urządzenia.

Funkcja Opis
auxGetDevCaps Pobiera możliwości określonego pomocniczego urządzenia wyjściowego.
waveInGetDevCaps Pobiera możliwości określonego urządzenia wejściowego waveform-audio.
waveOutGetDevCaps Pobiera możliwości określonego urządzenia wyjściowego waveform-audio.

 

Każda z tych funkcji wypełnia strukturę informacjami o możliwościach określonego urządzenia. W poniższej tabeli wymieniono struktury, które odpowiadają każdej z tych funkcji.

Funkcja Struktura
auxGetDevCaps AUXCAPS
waveInGetDevCaps WAVEINCAPS
waveOutGetDevCaps WAVEOUTCAPS

 

Formaty standardowe są wymienione w dwFormats składowej struktury WAVEOUTCAPS. Urządzenia waveform-audio mogą obsługiwać niestandardowe formaty. Aby określić, czy określony format (standardowy lub niestandardowy) jest obsługiwany przez urządzenie, możesz wywołać funkcję waveOutOpen z flagą WAVE_FORMAT_QUERY. Ta flaga nie otwiera urządzenia. Należy określić format w strukturzeWAVEFORMATEXwskazywanej przez parametr pwfx przekazany do waveOutOpen.

Urządzenia wyjściowe waveform-audio różnią się w zależności od możliwości, które obsługują. dwSupport element członkowski struktury WAVEOUTCAPS wskazuje, czy urządzenie obsługuje takie możliwości, jak zmiany głośności i skoku.

Uchwyty urządzeń i identyfikatory urządzeń

Każda funkcja, która otwiera urządzenie audio, określa identyfikator urządzenia, wskaźnik do lokalizacji pamięci i niektóre parametry, które są unikatowe dla każdego typu urządzenia. Lokalizacja pamięci jest wypełniona uchwytem urządzenia. Użyj tego uchwytu urządzenia, aby zidentyfikować otwarte urządzenie audio podczas wywoływania innych funkcji audio.

Różnica między identyfikatorami i uchwytami dla urządzeń audio jest subtelna, ale ważna:

Nie ma żadnych funkcji, które otwierają lub zamykają pomocnicze urządzenia audio. Pomocnicze urządzenia audio nie muszą być otwarte i zamknięte, takie jak urządzenia waveform-audio, ponieważ nie ma skojarzonego z nimi ciągłego transferu danych. Wszystkie pomocnicze funkcje audio używają identyfikatorów urządzeń do identyfikowania urządzeń.

typy danych wyjściowych Waveform-Audio

Następujące typy danych są definiowane dla funkcji wyjściowych waveform-audio.

Typ Opis
HWAVEOUT Dojmij do otwartego urządzenia wyjściowego waveform-audio.
WAVEFORMATEX Struktura określająca formaty danych obsługiwane przez określone urządzenie wejściowe waveform-audio. Ta struktura jest również używana dla urządzeń wejściowych waveform-audio.
WAVEHDR Struktura używana jako nagłówek bloku danych wejściowych waveform-audio. Ta struktura jest również używana dla urządzeń wejściowych waveform-audio.
WAVEOUTCAPS Struktura używana do wykonywania zapytań dotyczących możliwości określonego urządzenia wyjściowego waveform-audio.

 

Określanie formatów danych Waveform-Audio

Po wywołaniu funkcji waveOutOpen, aby otworzyć sterownik urządzenia do odtwarzania lub zapytać, czy sterownik obsługuje określony format danych, użyj parametru pwfx, aby określić wskaźnik do struktury WAVEFORMATEX zawierającej żądany format danych waveform-audio. WAVEFORMATEX zastępuje strukturyWAVE FORMAT iPCMWAVEFORMAT.

W przypadku danych audio rozdzielonych na więcej niż dwa kanały lub o rozmiarze próbki, który nie jest wielokrotnym 8, należy użyć WAVEFORMATEXTENSIBLE. Ta struktura po prostu konfiguruje dodatkowe bajty wskazywane przez cbSize elementu członkowskiego WAVEFORMATEX w celu podania dodatkowych informacji o formacie. WAVEFORMATEXTENSIBLE można rzutować jako WAVEFORMATEX.

Istnieją również dwa formaty schowka, których można użyć do reprezentowania danych audio: CF_WAVE i CF_RIFF. Użyj formatu CF_WAVE do reprezentowania danych w jednym ze standardowych formatów, takich jak 11 kHz lub 22 kHz PCM. Użyj formatu CF_RIFF, aby reprezentować bardziej złożone formaty danych, których nie można przedstawić jako standardowych plików waveform-audio.

Zapisywanie danych Waveform-Audio

Po pomyślnym otwarciu sterownika urządzenia wyjściowego waveform-audio można rozpocząć odtwarzanie dźwięku. System Windows udostępnia funkcję waveOutWrite do wysyłania bloków danych do urządzeń wyjściowych waveform-audio.

Użyj struktury WAVEHDR, aby określić wysyłany blok danych waveform-audio przy użyciu waveOutWrite. Ta struktura zawiera wskaźnik do zablokowanego bloku danych, długości bloku danych i niektórych flag. Przed użyciem tego bloku danych należy przygotować ten blok danych; Aby uzyskać informacje o przygotowaniu bloku danych, zobacz Audio Data Blocks.

Po wysłaniu bloku danych do urządzenia wyjściowego przy użyciu waveOutWritenależy poczekać na zakończenie sterownika urządzenia z blokiem danych przed jego zwolnieniem. Jeśli wysyłasz wiele bloków danych, musisz monitorować uzupełnianie bloków danych, aby wiedzieć, kiedy wysyłać dodatkowe bloki. Aby uzyskać więcej informacji na temat bloków danych, zobacz bloki danych audio.

Format danych Waveform-Audio PCM

Element lpData elementu członkowskiego WAVEHDR struktury wskazuje próbki danych waveform-audio. W przypadku 8-bitowych danych PCM każdy przykład jest reprezentowany przez jeden niepodpisany bajt danych. W przypadku 16-bitowych danych PCM każda próbka jest reprezentowana przez 16-bitową wartość ze znakiem. W poniższej tabeli przedstawiono podsumowanie wartości maksymalnej, minimalnej i średniej wartości dla danych dźwiękowych PCM waveform-audio.

Format danych Wartość maksymalna Wartość minimalna Wartość punktu środkowego
8-bitowy komputer PCM 255 (0xFF) 0 128 (0x80)
16-bitowy komputer PCM 32 767 (0x7FFF) –32 768 (0x8000) 0

 

Pakowanie danych PCM

Kolejność bajtów danych różni się w formatach 8-bitowych i 16-bitowych oraz między formatami mono i stereo. Poniższa lista zawiera opis pakowania danych dla różnych formatów danych waveform-audio PCM.

Format dźwięku w formacie waveform-audio PCM Opis
8-bitowy mono Każdy przykład to 1 bajt odpowiadający pojedynczemu kanałowi audio. Po przykładzie 1 następują próbki 2, 3, 4 itd.
8-bitowy stereo Każda próbka to 2 bajty. Po przykładzie 1 następują próbki 2, 3, 4 itd. Dla każdego przykładu pierwszy bajt to kanał 0 (lewy kanał), a drugi bajt to kanał 1 (prawy kanał).
16-bitowy mono Każda próbka to 2 bajty. Po przykładzie 1 następują próbki 2, 3, 4 itd. Dla każdej próbki pierwszy bajt jest bajtem o niskiej kolejności kanału 0, a drugi bajt to bajt o wysokiej kolejności kanału 0.
16-bitowy stereo Każda próbka to 4 bajty. Po przykładzie 1 następują próbki 2, 3, 4 itd. Dla każdej próbki pierwszy bajt to bajt o niskiej kolejności kanału 0 (lewy kanał); drugi bajt jest bajtem o wysokiej kolejności kanału 0; trzeci bajt to bajt o niskiej kolejności kanału 1 (prawy kanał); a czwarty bajt jest bajtem o wysokiej kolejności kanału 1.
Inni Każda próbka znajduje się w bloku, który jest wielokrotną 4 bajtami, ale próbki mogą być wyrównane bez bajtów. Rozmieszczenie kanałów jest określane przez maskę. Aby uzyskać więcej informacji, zobacz WAVEFORMATEXTENSIBLE.

 

Zamykanie urządzeń wyjściowych Waveform-Audio

Po zakończeniu odtwarzania waveform-audio wywołaj waveOutClose, aby zamknąć urządzenie wyjściowe. Jeśli waveOutClose jest wywoływana podczas odtwarzania pliku waveform-audio, operacja zamykania kończy się niepowodzeniem, a funkcja zwraca kod błędu wskazujący, że urządzenie nie zostało zamknięte. Jeśli nie chcesz czekać na zakończenie odtwarzania przed zamknięciem urządzenia, przed zamknięciem wywołaj funkcję waveOutReset. Spowoduje to zakończenie odtwarzania i umożliwia zamknięcie urządzenia. Przed zamknięciem urządzenia należy użyć funkcji waveOutUnprepareHeader.