Waveform Audio[译]

音频数据块

waveInAddBuffer和waveOutWrite函数要求应用程序分配数据块传递给设备驱动来录制和播放。这两个函数使用WAVEHDR结构来描述它们的数据块。

在使用这几个函数传递一个数据块给设备驱动之前,你必须给数据块和描述数据块的头分配内存。这个头可以准备和无准备的使用以下几个函数。

函数                                                         描述

waveInPrepareHeader                                 准备一个波形音频输入数据块

waveInUnPrepareHeader                             回收一个已经准备好的波形音频输入数据块

waveOutPrepareHeader                               准备一个波形音频输出数据块

waveOutUnPrepareHeader                           回收一个已经准备好的波形音频输出数据块

在你把一个音频数据块传递给设备驱动之前,你必须通过waveInPrepareHeader或者waveOutPrepareHeader回收准备一个数据块。当设备驱动完成数据块返回时,你必须通过waveInUnPrepareHeader或者waveOutUnPrepareHeader回收准备好的数据块,所有这些分配的内存可以被释放。

除非波形音频输入和输出数据是小到可以在一个单一的数据块,否则应用程序必须持续的提供数据块给设备驱动,直到播放或录制停止。

即使一个单一的数据块正在使用,应用程序必须能够确定当一个设备驱动完成一个数据块使得应用程序可以释放数据块和头结构所占用内存。有几种方法来确认设备驱动完成了一个数据块。

①指定一个回调函数来接收一个驱动完成数据块的消息。

②使用一个事件回调。

③指定一个窗口或线程来接收一个驱动完成数据块的消息。

④使用WHDR_DONE来查询WAVEHDR结构的成员dwFlag,发送每个数据块。

如果当应用程序需要数据块的时候应用程序没有得到,就会在播放的时候产生一个停顿。这就要求至少使用两个缓冲区的模式-至少保持一个数据块可以被设备驱动使用。