图3
wave文件是非常简单的一种riff文件,它的格式类型为"wave"。riff块包含两个子块,这两个子块的id分别是"fmt"和"data",其中"fmt"子块由结构pcmwaveformat所组成,其子块的大小就是sizeofof(pcmwaveformat),数据组成就是pcmwaveformat结构中的数据。wave文件的结构如下图4所示:
图4
pcmwaveformat结构定义如下:
typedef struct{ waveformat wf; // 波形格式,前面已经提过了; word wbitspersample;// wave文件的采样大小;}pcmwaveformat;
"data"子块包含wave文件的数字化波形声音数据,其存放格式依赖于"fmt"子块中wformattag成员指定的格式种类,在多声道wave文件中,样本是交替出现的。如16bit的单声道wave文件和双声道wave文件的数据采样格式分别如图5所示:
图5
4.硬件抽象层(hal,hardware abstraction layer)
hal是一个可加载的核心模块(hal.dll),它为运行在windows nt架构(包括windowsnt4.0,windows2000,windowsxp)上的硬件平台提供低级接口,hal隐藏各种与硬件有关的细节,例如:i/o接口,中断控制器,声卡…这样的话如果用户需要访问声卡硬件的话只能通过该声卡的驱动程序来实现,声卡驱动程序再调用hal中的相应例程来实现,下图显示了hal,声卡驱动程序,waveform audio apis,我们的麦克录音程序之间的关系:

图6
5.waveform audio
waveform audio apis是microsoft提供给广大win32程序员用来给自己的应用程序添加声音支持的一套强大的api,它提供的功能如下:
1.打开/关闭/查询声音设备;
2.播放波形文件;
3.设置播放速度;
4.播放进度控制;
5.录音;
6.得到当前的播放位置;
7.调节音量.
下面简单介绍一下这套api提供的主要函数:
打开录音设备函数
mmresult waveinopen(
lphwavein phwi, // 输入设备句柄
uint udeviceid, // 输入设备id
lpwaveformatex pwfx, // 录音格式指针
dword dwcallback, // 处理mm_wim_***消息的回调函数或窗
// 口句柄,线程id
dword dwcallbackinstance,
dword fdwopen //处理消息方式的符号位
);
为录音设备准备缓存函数
mmresult waveinprepareheader( hwavein hwi,
lpwavehdr pwh,