音频数据块

[与此页面关联的功能(波形音频)是一项旧功能。 它已被 WASAPIAudio Graphs取代。 WASAPIAudio Graph 已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 WASAPIAudio Graph,而不是 波形音频。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

waveInAddBufferwaveOutWrite 函数要求应用程序分配数据块,以便将数据块传递给设备驱动程序以进行录制或播放。 这两个函数都使用 WAVEHDR 结构来描述其数据块。

在使用其中一个函数将数据块传递给设备驱动程序之前,必须为数据块和描述数据块的标头结构分配内存。 可以使用以下函数准备和未准备标头。

功能 描述
waveInPrepareHeader 准备波形音频输入数据块。
waveInUnprepareHeader 清理波形音频输入数据块的准备。
waveOutPrepareHeader 准备波形音频输出数据块。
waveOutUnprepareHeader 清理波形音频输出数据块的准备。

 

在将音频数据块传递给设备驱动程序之前,必须将其传递给 waveInPrepareHeaderwaveOutPrepareHeader来准备数据块。 当设备驱动程序完成数据块并返回数据块后,必须将数据块传递到 waveInUnprepareHeaderwaveOutUnprepareHeader,然后才能释放任何已分配的内存,从而清理此准备。

除非波形音频输入和输出数据足够小,才能包含在单个数据块中,否则应用程序必须持续向设备驱动程序提供数据块,直到播放或录制完成。

即使使用单个数据块,应用程序也必须能够确定设备驱动程序何时使用数据块完成,以便应用程序可以释放与数据块和标头结构关联的内存。 可通过多种方式来确定设备驱动程序何时使用数据块完成:

  • 通过指定回调函数来接收驱动程序在使用数据块完成时发送的消息
  • 使用事件回调
  • 指定窗口或线程以在驱动程序完成数据块时接收消息
  • 通过轮询 dwFlags 中的WHDR_DONE位,WAVEHDR 结构的成员随每个数据块一起发送

如果需要,如果应用程序未收到设备驱动程序的数据块,则播放时可能存在可听到的间隙或传入的记录信息丢失。 这至少需要双缓冲方案 - 在设备驱动程序之前至少保持一个数据块。

以下主题介绍了确定设备驱动程序何时完成数据块的方法:

使用回调函数处理驱动程序消息