Bloki danych audio
[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.]
Funkcje waveInAddBuffer i waveOutWrite wymagają, aby aplikacje przydzielały bloki danych do przekazywania do sterowników urządzeń na potrzeby nagrywania lub odtwarzania. Obie te funkcje używają struktury WAVEHDR do opisania bloku danych.
Przed użyciem jednej z tych funkcji w celu przekazania bloku danych do sterownika urządzenia należy przydzielić pamięć dla bloku danych i strukturę nagłówka, która opisuje blok danych. Nagłówki można przygotować i nieprzygotować przy użyciu następujących funkcji.
Funkcja | Opis |
---|---|
waveInPrepareHeader | Przygotowuje blok danych wejściowych typu waveform-audio. |
waveInUnprepareHeader | Czyści przygotowanie bloku danych wejściowych waveform-audio. |
waveOutPrepareHeader | Przygotowuje blok danych wyjściowych waveform-audio. |
waveOutUnprepareHeader | Czyści przygotowanie bloku danych wyjściowych waveform-audio. |
Przed przekazaniem bloku danych audio do sterownika urządzenia należy przygotować blok danych, przekazując go do waveInPrepareHeader lub waveOutPrepareHeader. Gdy sterownik urządzenia zostanie zakończony blokiem danych i zwróci go, należy wyczyścić ten preparat, przekazując blok danych do waveInUnprepareHeader lub waveOutUnprepareHeader przed zwolnieniem przydzielonej pamięci.
Chyba że dane wejściowe i wyjściowe waveform-audio są wystarczająco małe, aby znajdowały się w jednym bloku danych, aplikacje muszą stale dostarczać sterownik urządzenia z blokami danych do momentu zakończenia odtwarzania lub nagrywania.
Nawet jeśli jest używany pojedynczy blok danych, aplikacja musi mieć możliwość określenia, kiedy sterownik urządzenia jest gotowy z blokiem danych, aby aplikacja mogła zwolnić pamięć skojarzona z blokiem danych i strukturą nagłówka. Istnieje kilka sposobów określania, kiedy sterownik urządzenia jest gotowy z blokiem danych:
- Określając funkcję wywołania zwrotnego w celu odbierania komunikatu wysyłanego przez sterownik po zakończeniu z blokiem danych
- Przy użyciu wywołania zwrotnego zdarzeń
- Określając okno lub wątek do odbierania komunikatu wysłanego przez sterownik po zakończeniu z blokiem danych
- Sondując bit WHDR_DONE w dwFlags element członkowski struktury WAVEHDR wysyłanej z każdym blokiem danych
Jeśli aplikacja nie pobierze bloku danych do sterownika urządzenia w razie potrzeby, może wystąpić luka w odtwarzaniu lub utrata przychodzących zarejestrowanych informacji. Wymaga to co najmniej schematu podwójnego buforowania — pozostanie co najmniej jeden blok danych przed sterownikiem urządzenia.
W poniższych tematach opisano sposoby określania, kiedy sterownik urządzenia został zakończony blokiem danych:
Używanie funkcji wywołania zwrotnego do przetwarzania komunikatów sterowników
- używanie funkcji wywołania zwrotnego do przetwarzania komunikatów sterowników
- używanie wywołania zwrotnego zdarzeń do przetwarzania komunikatów sterowników
- używanie okna lub wątku do przetwarzania komunikatów sterowników
- zarządzanie blokami danych przez sondowanie