Поделиться через


Блоки аудиоданных

[Функция, связанная с этой страницей, Waveform Audio, является устаревшей функцией. Он был заменен WASAPI и Audio Graphs. WasAPI и Audio Graphs оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде WASAPI и Звуковые графы вместо Waveform Audio, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]

Функции waveInAddBuffer и waveOutWrite требуют, чтобы приложения выделяли блоки данных для передачи драйверам устройств в целях записи или воспроизведения. Обе эти функции используют структуру WAVEHDR для описания своего блока данных.

Прежде чем использовать одну из этих функций для передачи блока данных драйверу устройства, необходимо выделить память для блока данных и структуры заголовка, описывающей блок данных. Заголовки можно подготовить и неподготовить с помощью следующих функций.

Функция Описание
waveInPrepareHeader Подготавливает блок входных данных waveform-audio.
waveInUnprepareHeader Очищает подготовку в блоке входных данных waveform-audio.
waveOutPrepareHeader Подготавливает блок выходных данных waveform-audio.
waveOutUnprepareHeader Очищает подготовку в блоке выходных данных waveform-audio.

 

Перед передачей блока звуковых данных драйверу устройства необходимо подготовить блок данных, передав его в waveInPrepareHeader или waveOutPrepareHeader. Когда драйвер устройства завершает работу с блоком данных и возвращает его, необходимо очистить эту подготовку, передав блок данных в waveInUnprepareHeader или waveOutUnprepareHeader , прежде чем можно будет освободить выделенную память.

Если входные и выходные данные waveform-audio достаточно малы, чтобы их можно было содержать в одном блоке данных, приложения должны постоянно предоставлять драйверу устройства блоки данных до завершения воспроизведения или записи.

Даже если используется один блок данных, приложение должно иметь возможность определить, когда драйвер устройства завершает работу с блоком данных, чтобы приложение могло освободить память, связанную со структурой блока данных и заголовка. Существует несколько способов определить, когда драйвер устройства завершает работу с блоком данных.

  • Путем указания функции обратного вызова для получения сообщения, отправленного драйвером после завершения работы с блоком данных.
  • С помощью обратного вызова события
  • Путем указания окна или потока для получения сообщения, отправленного драйвером после завершения работы с блоком данных.
  • Опрос бита WHDR_DONE в элементе dwFlags структуры WAVEHDR , отправленной с каждым блоком данных

Если приложение не получает блок данных для драйвера устройства при необходимости, может возникнуть звуковой разрыв в воспроизведении или потеря входящей записанной информации. Для этого требуется по крайней мере схема двойной буферизации— по крайней мере один блок данных опережает драйвер устройства.

В следующих разделах описаны способы определения завершения работы драйвера устройства с блоком данных.

Использование функции обратного вызова для обработки сообщений драйвера