Блоки звуковых данных
[Функция, связанная с этой страницей, Audiowaveform, является устаревшей функцией. Он был заменен WASAPI и звуковых графов. WASAPI и Звуковые графы оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код WASAPI и звуковых графов вместо аудиоформата. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
Функции waveInAddBuffer и waveOutWrite требуют от приложений выделения блоков данных для передачи драйверам устройств для записи или воспроизведения. Обе эти функции используют структуруWAVEHDR для описания своего блока данных.
Прежде чем использовать одну из этих функций для передачи блока данных драйверу устройства, необходимо выделить память для блока данных и структуры заголовков, описывающей блок данных. Заголовки могут быть подготовлены и неподготовлены с помощью следующих функций.
Функция | Описание |
---|---|
волнаInPrepareHeader | Подготавливает блок входных данных waveform-audio. |
waveInUnprepareHeader | Очищает подготовку к блоку входных данных waveform-audio. |
waveOutPrepareHeader | Подготавливает блок выходных данных waveform-audio. |
waveOutUnprepareHeader | Очищает подготовку к блоку выходных данных в формате волны. |
Перед передачей блока звуковых данных драйверу устройства необходимо подготовить блок данных, передав его в waveInPrepareHeader или waveOutPrepareHeader. После завершения работы драйвера устройства с блоком данных и его возврата необходимо очистить, передав блок данных в waveInUnprepareHeader или waveOutUnprepareHeader перед освобождением выделенной памяти.
Если входные и выходные данные в формате волны достаточно малы, чтобы содержаться в одном блоке данных, приложения должны постоянно предоставлять драйверу устройства блоки данных до тех пор, пока воспроизведение или запись не завершится.
Даже если используется один блок данных, приложение должно иметь возможность определить, когда драйвер устройства завершит работу с блоком данных, чтобы приложение могло освободить память, связанную со структурой блока данных и заголовка. Существует несколько способов определить, когда драйвер устройства завершен с блоком данных:
- Указав функцию обратного вызова для получения сообщения, отправленного драйвером после завершения работы с блоком данных
- Использование обратного вызова события
- Указав окно или поток для получения сообщения, отправленного драйвером после завершения работы с блоком данных
- Опрос WHDR_DONE бита в dwFlags члена структуры WAVEHDR, отправленной с каждым блоком данных.
Если приложение не получает блок данных драйверу устройства при необходимости, может возникнуть разрыв в воспроизведении или потере входящих записываемых сведений. Для этого требуется по крайней мере схема двойного буферизации — не менее одного блока данных перед драйвером устройства.
В следующих разделах описаны способы определения завершения работы драйвера устройства с блоком данных:
Использование функции обратного вызова для обработки сообщений драйвера
- использование функции обратного вызова для обработки сообщений драйвера
- Использование обратного вызова событий для сообщений драйвера обработки
- использование окна или потока для обработки сообщений драйвера
- управление блоками данных путем опроса