音频数据块

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

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

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

函数 说明
waveInPrepareHeader 准备波形音频输入数据块。
waveInUnprepareHeader 清理波形音频输入数据块上的准备工作。
waveOutPrepareHeader 准备波形音频输出数据块。
waveOutUnprepareHeader 清理波形音频输出数据块上的准备工作。

 

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

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

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

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

如果应用程序未在需要时获取设备驱动程序的数据块,则播放时可能会有声音间隙或丢失传入的录制信息。 这至少需要双重缓冲方案 - 至少在设备驱动程序之前保留一个数据块。

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

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