Windows环境下的麦克风录音系统
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,
UINT bwh );
给输入设备增加一个缓存
MMRESULT waveInAddBuffer( HWAVEIN hwi,
LPWAVEHDR pwh,
UINT cbwh );
开始录音
MMRESULT waveInStart( HWAVEIN hwi );
清除缓存
MMRESULT waveInUnprepareHeader( HWAVEIN hwi,
LPWAVEHDR pwh,
UINT cbwh);
停止录音
MMRESULT waveInReset( HWAVEIN hwi );
关闭录音设备
MMRESULT waveInClose( HWAVEIN hwi );
Wave_audio数据格式
typedef struct {
WORD wFormatTag; // 数据格式,一般为WAVE_FORMAT_PCM即
// 脉冲编码
WORD nChannels; // 声道
DWORD nSamplesPerSec; // 采样频率
DWORD nAvgBytesPerSec; // 每秒数据量
WORD nBlockAlign;
WORD wBitsPerSample; // 样本大小
WORD cbSize;
} WAVEFORMATEX;
waveform-audio 缓存格式
typedef struct {
LPSTR lpData; // 内存指针
DWORD dwBufferLength; // 长度
DWORD dwBytesRecorded; // 已录音的字节长度
DWORD dwUser;
DWORD dwFlags;
DWORD dwLoops; // 循环次数
struct wavehdr_tag * lpNext;
DWORD reserved;
} WAVEHDR;
相关消息
MM_WIM_OPEN:打开设备时消息,在此期间我们可以进行一些初始化工作
MM_WIM_DATA:当缓存已满或者停止录音时的消息,处理这个消息可以对
缓存进行重新分配,实现不限长度录音
MM_WIM_CLOSE:关闭录音设备时的消息。
5. Multimedia File I/O
Multimedia File I/O APIs是Microsoft提供的另外一套强大的针对媒体文件I/O的API,我们知道许多像MediaPlay,RealOne这样的多媒体程序对媒体文件的读写性能要求很高,它们几乎要求实时的将磁盘上的媒体文件以流的形式读入,但是对于一般的文件I/O形式如图1:
图7
1.文件从磁盘上被读入操作系统的File I/O的buffer;
2.然后拷贝到应用程序自己的buffer中;
3.应用程序这时候才能读取文件内容.
上述的过程对于多媒体应用程序来说是低效的而且浪费宝贵的内存资源,如果文件和大的话势必还要采取分段读取等机制,Multimedia File I/O采取了一种直接存取机制(如图2),使得应用程序可以直接读取操作系统的File I/O buffer,大大提高了效率.后面我们会利用此套API实现录音文件的存储.
图2