Udostępnij za pośrednictwem


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